@things-factory/integration-base 9.0.34 → 9.0.35

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -41,21 +41,101 @@ class MssqlConnector {
41
41
  var result = await pool.request().query(query);
42
42
  return result.recordset;
43
43
  },
44
- execute: async (procedure, params) => {
45
- let request = pool.request();
46
- Object.keys(params).forEach(key => {
47
- let { dir, type, val } = params[key];
48
- if (dir === 'in' || dir === 'inout') {
49
- request.input(key, type, val);
44
+ execute: async (procedure, params = {}) => {
45
+ const req = pool.request();
46
+ // 문자열 타입명을 mssql 타입으로 변환 + maxSize 처리
47
+ const toSqlType = (t, maxSize) => {
48
+ if (!t)
49
+ return undefined; // undefined면 아래에서 자동추론 사용
50
+ if (typeof t === 'object' || typeof t === 'function')
51
+ return t; // 이미 mssql 타입객체인 경우
52
+ const T = String(t).toUpperCase();
53
+ switch (T) {
54
+ case 'TINYINT':
55
+ return mssql.TinyInt;
56
+ case 'SMALLINT':
57
+ return mssql.SmallInt;
58
+ case 'INT':
59
+ return mssql.Int;
60
+ case 'BIGINT':
61
+ return mssql.BigInt;
62
+ case 'REAL':
63
+ return mssql.Real;
64
+ case 'FLOAT':
65
+ return mssql.Float;
66
+ case 'MONEY':
67
+ return mssql.Money;
68
+ case 'SMALLMONEY':
69
+ return mssql.SmallMoney;
70
+ case 'DECIMAL':
71
+ return maxSize ? mssql.Decimal(maxSize) : mssql.Decimal;
72
+ case 'NUMERIC':
73
+ return maxSize ? mssql.Numeric(maxSize) : mssql.Numeric;
74
+ case 'VARCHAR':
75
+ return maxSize ? mssql.VarChar(maxSize) : mssql.VarChar;
76
+ case 'NVARCHAR':
77
+ return maxSize ? mssql.NVarChar(maxSize) : mssql.NVarChar;
78
+ case 'CHAR':
79
+ return maxSize ? mssql.Char(maxSize) : mssql.Char;
80
+ case 'NCHAR':
81
+ return maxSize ? mssql.NChar(maxSize) : mssql.NChar;
82
+ case 'TEXT':
83
+ return mssql.Text;
84
+ case 'NTEXT':
85
+ return mssql.NText;
86
+ case 'DATE':
87
+ return mssql.Date;
88
+ case 'TIME':
89
+ return mssql.Time;
90
+ case 'DATETIME':
91
+ return mssql.DateTime;
92
+ case 'SMALLDATETIME':
93
+ return mssql.SmallDateTime;
94
+ case 'DATETIME2':
95
+ return mssql.DateTime2;
96
+ case 'BIT':
97
+ return mssql.Bit;
98
+ case 'UNIQUEIDENTIFIER':
99
+ return mssql.UniqueIdentifier;
100
+ case 'VARBINARY':
101
+ return maxSize ? mssql.VarBinary(maxSize) : mssql.VarBinary;
102
+ case 'STRING': // 호환용
103
+ return maxSize ? mssql.NVarChar(maxSize) : mssql.NVarChar(mssql.MAX);
104
+ default:
105
+ // 모르는 문자열 타입은 NVARCHAR(MAX)로 폴백
106
+ return mssql.NVarChar(mssql.MAX);
50
107
  }
51
- else if (dir === 'out') {
52
- request.output(key, type);
108
+ };
109
+ // 값이 undefined면 자동추론을 쓰도록 2-인자 형태 사용
110
+ const bindInput = (name, sqlType, value) => {
111
+ if (sqlType)
112
+ req.input(name, sqlType, value ?? null);
113
+ else
114
+ req.input(name, value ?? null); // 타입 생략 시 mssql이 추론
115
+ };
116
+ // 출력 타입이 없으면 NVARCHAR(MAX)로 폴백(OUTPUT은 추론 불가)
117
+ const bindOutput = (name, sqlType) => {
118
+ req.output(name, sqlType || mssql.NVarChar(mssql.MAX));
119
+ };
120
+ for (const [key, p] of Object.entries(params || {})) {
121
+ const { dir, type, val, maxSize } = p || {};
122
+ const direction = String(dir || 'in').toLowerCase();
123
+ const sqlType = toSqlType(type, maxSize);
124
+ if (direction === 'in') {
125
+ bindInput(key, sqlType, val);
126
+ }
127
+ else if (direction === 'out') {
128
+ bindOutput(key, sqlType);
129
+ }
130
+ else if (direction === 'inout') {
131
+ bindInput(key, sqlType, val);
132
+ bindOutput(key, sqlType);
53
133
  }
54
134
  else {
55
- console.error(`Invalid parameter direction(${dir}) for mssql stored procedure`);
135
+ console.error(`Invalid parameter direction(${dir}) for mssql stored procedure: ${key}`);
56
136
  }
57
- });
58
- var result = await request.execute(procedure);
137
+ }
138
+ const result = await req.execute(procedure);
59
139
  return result;
60
140
  },
61
141
  close: () => {
@@ -1 +1 @@
1
- {"version":3,"file":"mssql-connector.js","sourceRoot":"","sources":["../../../server/engine/connector/mssql-connector.ts"],"names":[],"mappings":"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","sourcesContent":["import { logger } from '@things-factory/env'\n\nimport { ConnectionManager } from '../connection-manager'\nimport { Connector } from '../types'\nimport { InputConnection } from '../../service/connection/connection-type'\n\ntry {\n var mssql = require('mssql')\n} catch (err) {\n logger.error('mssql module loading failed', err)\n}\n\nexport class MssqlConnector implements Connector {\n async ready(connectionConfigs: InputConnection[]) {\n await Promise.all(connectionConfigs.map(this.connect))\n\n ConnectionManager.logger.info('mssql-connector connections are ready')\n }\n\n async connect(connection: InputConnection) {\n const {\n endpoint,\n params: { user, password, database, poolMin = 0, poolMax = 4, encrypt = 'Y', trustServerCertificate }\n } = connection\n\n const [host, port = 1433] = endpoint.split(':')\n\n if (!mssql) {\n throw new Error('mssql module loading failed')\n }\n\n const pool = await mssql.connect({\n user,\n password,\n server: host,\n port: Number(port),\n database,\n pool: {\n max: Math.max(2, poolMax),\n min: Math.max(0, poolMin),\n idleTimeoutMillis: 30000\n },\n options: {\n encrypt: encrypt === 'Y',\n trustServerCertificate: trustServerCertificate === 'Y'\n }\n })\n\n ConnectionManager.addConnectionInstance(connection, {\n query: async (query, params) => {\n var result = await pool.request().query(query)\n return result.recordset\n },\n execute: async (procedure, params) => {\n let request = pool.request()\n\n Object.keys(params).forEach(key => {\n let { dir, type, val } = params[key]\n\n if (dir === 'in' || dir === 'inout') {\n request.input(key, type, val)\n } else if (dir === 'out') {\n request.output(key, type)\n } else {\n console.error(`Invalid parameter direction(${dir}) for mssql stored procedure`)\n }\n })\n\n var result = await request.execute(procedure)\n return result\n },\n close: () => {\n pool.close()\n }\n })\n\n ConnectionManager.logger.info(`MSSql Database(${connection.name}:${database}) at ${endpoint} connected.`)\n }\n\n async disconnect(connection: InputConnection) {\n var client = ConnectionManager.getConnectionInstance(connection)\n try {\n await client.close()\n ConnectionManager.logger.info(`MSSql Database(${connection.name}) closed.`)\n } catch (e) {\n ConnectionManager.logger.error(e)\n }\n\n ConnectionManager.removeConnectionInstance(connection)\n }\n\n get parameterSpec() {\n return [\n {\n type: 'string',\n name: 'user',\n label: 'user',\n useDomainAttribute: true\n },\n {\n type: 'secret',\n name: 'password',\n label: 'password',\n useDomainAttribute: true\n },\n {\n type: 'string',\n name: 'database',\n placeholder: 'SID',\n label: 'database'\n },\n {\n type: 'select',\n name: 'encrypt',\n label: 'encrypt',\n property: {\n options: ['Y', 'N']\n }\n },\n {\n type: 'number',\n name: 'poolMin',\n placeholder: 'minimum connection-pool size',\n label: 'pool-min',\n value: 0\n },\n {\n type: 'number',\n name: 'poolMax',\n placeholder: 'maximum connection-pool size',\n label: 'pool-max',\n value: 4\n },\n {\n type: 'select',\n name: 'trustServerCertificate',\n label: 'trust-server-certificate',\n property: {\n options: ['Y', 'N']\n }\n }\n ]\n }\n\n get taskPrefixes() {\n return ['database', 'mssql']\n }\n\n get help() {\n return 'integration/connector/mssql-connector'\n }\n}\n\nConnectionManager.registerConnector('mssql-connector', new MssqlConnector())\n"]}
1
+ {"version":3,"file":"mssql-connector.js","sourceRoot":"","sources":["../../../server/engine/connector/mssql-connector.ts"],"names":[],"mappings":";;;AAAA,6CAA4C;AAE5C,8DAAyD;AAIzD,IAAI,CAAC;IACH,IAAI,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;AAC9B,CAAC;AAAC,OAAO,GAAG,EAAE,CAAC;IACb,YAAM,CAAC,KAAK,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAA;AAClD,CAAC;AAED,MAAa,cAAc;IACzB,KAAK,CAAC,KAAK,CAAC,iBAAoC;QAC9C,MAAM,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAA;QAEtD,sCAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAA;IACxE,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,UAA2B;QACvC,MAAM,EACJ,QAAQ,EACR,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,GAAG,EAAE,sBAAsB,EAAE,EACtG,GAAG,UAAU,CAAA;QAEd,MAAM,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QAE/C,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAA;QAChD,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC;YAC/B,IAAI;YACJ,QAAQ;YACR,MAAM,EAAE,IAAI;YACZ,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC;YAClB,QAAQ;YACR,IAAI,EAAE;gBACJ,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC;gBACzB,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC;gBACzB,iBAAiB,EAAE,KAAK;aACzB;YACD,OAAO,EAAE;gBACP,OAAO,EAAE,OAAO,KAAK,GAAG;gBACxB,sBAAsB,EAAE,sBAAsB,KAAK,GAAG;aACvD;SACF,CAAC,CAAA;QAEF,sCAAiB,CAAC,qBAAqB,CAAC,UAAU,EAAE;YAClD,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;gBAC7B,IAAI,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;gBAC9C,OAAO,MAAM,CAAC,SAAS,CAAA;YACzB,CAAC;YACD,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,GAAG,EAAE,EAAE,EAAE;gBACxC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,CAAA;gBAE1B,sCAAsC;gBACtC,MAAM,SAAS,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE;oBAC/B,IAAI,CAAC,CAAC;wBAAE,OAAO,SAAS,CAAA,CAAC,0BAA0B;oBACnD,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,UAAU;wBAAE,OAAO,CAAC,CAAA,CAAC,oBAAoB;oBAEnF,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAA;oBACjC,QAAQ,CAAC,EAAE,CAAC;wBACV,KAAK,SAAS;4BACZ,OAAO,KAAK,CAAC,OAAO,CAAA;wBACtB,KAAK,UAAU;4BACb,OAAO,KAAK,CAAC,QAAQ,CAAA;wBACvB,KAAK,KAAK;4BACR,OAAO,KAAK,CAAC,GAAG,CAAA;wBAClB,KAAK,QAAQ;4BACX,OAAO,KAAK,CAAC,MAAM,CAAA;wBACrB,KAAK,MAAM;4BACT,OAAO,KAAK,CAAC,IAAI,CAAA;wBACnB,KAAK,OAAO;4BACV,OAAO,KAAK,CAAC,KAAK,CAAA;wBACpB,KAAK,OAAO;4BACV,OAAO,KAAK,CAAC,KAAK,CAAA;wBACpB,KAAK,YAAY;4BACf,OAAO,KAAK,CAAC,UAAU,CAAA;wBACzB,KAAK,SAAS;4BACZ,OAAO,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAA;wBACzD,KAAK,SAAS;4BACZ,OAAO,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAA;wBAEzD,KAAK,SAAS;4BACZ,OAAO,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAA;wBACzD,KAAK,UAAU;4BACb,OAAO,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAA;wBAC3D,KAAK,MAAM;4BACT,OAAO,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAA;wBACnD,KAAK,OAAO;4BACV,OAAO,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAA;wBACrD,KAAK,MAAM;4BACT,OAAO,KAAK,CAAC,IAAI,CAAA;wBACnB,KAAK,OAAO;4BACV,OAAO,KAAK,CAAC,KAAK,CAAA;wBAEpB,KAAK,MAAM;4BACT,OAAO,KAAK,CAAC,IAAI,CAAA;wBACnB,KAAK,MAAM;4BACT,OAAO,KAAK,CAAC,IAAI,CAAA;wBACnB,KAAK,UAAU;4BACb,OAAO,KAAK,CAAC,QAAQ,CAAA;wBACvB,KAAK,eAAe;4BAClB,OAAO,KAAK,CAAC,aAAa,CAAA;wBAC5B,KAAK,WAAW;4BACd,OAAO,KAAK,CAAC,SAAS,CAAA;wBAExB,KAAK,KAAK;4BACR,OAAO,KAAK,CAAC,GAAG,CAAA;wBAClB,KAAK,kBAAkB;4BACrB,OAAO,KAAK,CAAC,gBAAgB,CAAA;wBAC/B,KAAK,WAAW;4BACd,OAAO,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAA;wBAE7D,KAAK,QAAQ,EAAE,MAAM;4BACnB,OAAO,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;wBAEtE;4BACE,gCAAgC;4BAChC,OAAO,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;oBACpC,CAAC;gBACH,CAAC,CAAA;gBAED,qCAAqC;gBACrC,MAAM,SAAS,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;oBACzC,IAAI,OAAO;wBAAE,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,IAAI,CAAC,CAAA;;wBAC/C,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC,CAAA,CAAC,oBAAoB;gBAC1D,CAAC,CAAA;gBAED,8CAA8C;gBAC9C,MAAM,UAAU,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE;oBACnC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAA;gBACxD,CAAC,CAAA;gBAED,KAAK,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,CAAC;oBACpD,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,GAAI,CAA8D,IAAI,EAAE,CAAA;oBACzG,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC,WAAW,EAAE,CAAA;oBACnD,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;oBAExC,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;wBACvB,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,CAAC,CAAA;oBAC9B,CAAC;yBAAM,IAAI,SAAS,KAAK,KAAK,EAAE,CAAC;wBAC/B,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;oBAC1B,CAAC;yBAAM,IAAI,SAAS,KAAK,OAAO,EAAE,CAAC;wBACjC,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,CAAC,CAAA;wBAC5B,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;oBAC1B,CAAC;yBAAM,CAAC;wBACN,OAAO,CAAC,KAAK,CAAC,+BAA+B,GAAG,iCAAiC,GAAG,EAAE,CAAC,CAAA;oBACzF,CAAC;gBACH,CAAC;gBAED,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;gBAC3C,OAAO,MAAM,CAAA;YACf,CAAC;YACD,KAAK,EAAE,GAAG,EAAE;gBACV,IAAI,CAAC,KAAK,EAAE,CAAA;YACd,CAAC;SACF,CAAC,CAAA;QAEF,sCAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAkB,UAAU,CAAC,IAAI,IAAI,QAAQ,QAAQ,QAAQ,aAAa,CAAC,CAAA;IAC3G,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,UAA2B;QAC1C,IAAI,MAAM,GAAG,sCAAiB,CAAC,qBAAqB,CAAC,UAAU,CAAC,CAAA;QAChE,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,KAAK,EAAE,CAAA;YACpB,sCAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAkB,UAAU,CAAC,IAAI,WAAW,CAAC,CAAA;QAC7E,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,sCAAiB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QACnC,CAAC;QAED,sCAAiB,CAAC,wBAAwB,CAAC,UAAU,CAAC,CAAA;IACxD,CAAC;IAED,IAAI,aAAa;QACf,OAAO;YACL;gBACE,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,MAAM;gBACZ,KAAK,EAAE,MAAM;gBACb,kBAAkB,EAAE,IAAI;aACzB;YACD;gBACE,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,UAAU;gBAChB,KAAK,EAAE,UAAU;gBACjB,kBAAkB,EAAE,IAAI;aACzB;YACD;gBACE,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,UAAU;gBAChB,WAAW,EAAE,KAAK;gBAClB,KAAK,EAAE,UAAU;aAClB;YACD;gBACE,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,SAAS;gBACf,KAAK,EAAE,SAAS;gBAChB,QAAQ,EAAE;oBACR,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC;iBACpB;aACF;YACD;gBACE,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,8BAA8B;gBAC3C,KAAK,EAAE,UAAU;gBACjB,KAAK,EAAE,CAAC;aACT;YACD;gBACE,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,8BAA8B;gBAC3C,KAAK,EAAE,UAAU;gBACjB,KAAK,EAAE,CAAC;aACT;YACD;gBACE,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,wBAAwB;gBAC9B,KAAK,EAAE,0BAA0B;gBACjC,QAAQ,EAAE;oBACR,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC;iBACpB;aACF;SACF,CAAA;IACH,CAAC;IAED,IAAI,YAAY;QACd,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;IAC9B,CAAC;IAED,IAAI,IAAI;QACN,OAAO,uCAAuC,CAAA;IAChD,CAAC;CACF;AA/ND,wCA+NC;AAED,sCAAiB,CAAC,iBAAiB,CAAC,iBAAiB,EAAE,IAAI,cAAc,EAAE,CAAC,CAAA","sourcesContent":["import { logger } from '@things-factory/env'\n\nimport { ConnectionManager } from '../connection-manager'\nimport { Connector } from '../types'\nimport { InputConnection } from '../../service/connection/connection-type'\n\ntry {\n var mssql = require('mssql')\n} catch (err) {\n logger.error('mssql module loading failed', err)\n}\n\nexport class MssqlConnector implements Connector {\n async ready(connectionConfigs: InputConnection[]) {\n await Promise.all(connectionConfigs.map(this.connect))\n\n ConnectionManager.logger.info('mssql-connector connections are ready')\n }\n\n async connect(connection: InputConnection) {\n const {\n endpoint,\n params: { user, password, database, poolMin = 0, poolMax = 4, encrypt = 'Y', trustServerCertificate }\n } = connection\n\n const [host, port = 1433] = endpoint.split(':')\n\n if (!mssql) {\n throw new Error('mssql module loading failed')\n }\n\n const pool = await mssql.connect({\n user,\n password,\n server: host,\n port: Number(port),\n database,\n pool: {\n max: Math.max(2, poolMax),\n min: Math.max(0, poolMin),\n idleTimeoutMillis: 30000\n },\n options: {\n encrypt: encrypt === 'Y',\n trustServerCertificate: trustServerCertificate === 'Y'\n }\n })\n\n ConnectionManager.addConnectionInstance(connection, {\n query: async (query, params) => {\n var result = await pool.request().query(query)\n return result.recordset\n },\n execute: async (procedure, params = {}) => {\n const req = pool.request()\n\n // 문자열 타입명을 mssql 타입으로 변환 + maxSize 처리\n const toSqlType = (t, maxSize) => {\n if (!t) return undefined // undefined면 아래에서 자동추론 사용\n if (typeof t === 'object' || typeof t === 'function') return t // 이미 mssql 타입객체인 경우\n\n const T = String(t).toUpperCase()\n switch (T) {\n case 'TINYINT':\n return mssql.TinyInt\n case 'SMALLINT':\n return mssql.SmallInt\n case 'INT':\n return mssql.Int\n case 'BIGINT':\n return mssql.BigInt\n case 'REAL':\n return mssql.Real\n case 'FLOAT':\n return mssql.Float\n case 'MONEY':\n return mssql.Money\n case 'SMALLMONEY':\n return mssql.SmallMoney\n case 'DECIMAL':\n return maxSize ? mssql.Decimal(maxSize) : mssql.Decimal\n case 'NUMERIC':\n return maxSize ? mssql.Numeric(maxSize) : mssql.Numeric\n\n case 'VARCHAR':\n return maxSize ? mssql.VarChar(maxSize) : mssql.VarChar\n case 'NVARCHAR':\n return maxSize ? mssql.NVarChar(maxSize) : mssql.NVarChar\n case 'CHAR':\n return maxSize ? mssql.Char(maxSize) : mssql.Char\n case 'NCHAR':\n return maxSize ? mssql.NChar(maxSize) : mssql.NChar\n case 'TEXT':\n return mssql.Text\n case 'NTEXT':\n return mssql.NText\n\n case 'DATE':\n return mssql.Date\n case 'TIME':\n return mssql.Time\n case 'DATETIME':\n return mssql.DateTime\n case 'SMALLDATETIME':\n return mssql.SmallDateTime\n case 'DATETIME2':\n return mssql.DateTime2\n\n case 'BIT':\n return mssql.Bit\n case 'UNIQUEIDENTIFIER':\n return mssql.UniqueIdentifier\n case 'VARBINARY':\n return maxSize ? mssql.VarBinary(maxSize) : mssql.VarBinary\n\n case 'STRING': // 호환용\n return maxSize ? mssql.NVarChar(maxSize) : mssql.NVarChar(mssql.MAX)\n\n default:\n // 모르는 문자열 타입은 NVARCHAR(MAX)로 폴백\n return mssql.NVarChar(mssql.MAX)\n }\n }\n\n // 값이 undefined면 자동추론을 쓰도록 2-인자 형태 사용\n const bindInput = (name, sqlType, value) => {\n if (sqlType) req.input(name, sqlType, value ?? null)\n else req.input(name, value ?? null) // 타입 생략 시 mssql이 추론\n }\n\n // 출력 타입이 없으면 NVARCHAR(MAX)로 폴백(OUTPUT은 추론 불가)\n const bindOutput = (name, sqlType) => {\n req.output(name, sqlType || mssql.NVarChar(mssql.MAX))\n }\n\n for (const [key, p] of Object.entries(params || {})) {\n const { dir, type, val, maxSize } = (p as { dir: string; type: string; val: any; maxSize: number }) || {}\n const direction = String(dir || 'in').toLowerCase()\n const sqlType = toSqlType(type, maxSize)\n\n if (direction === 'in') {\n bindInput(key, sqlType, val)\n } else if (direction === 'out') {\n bindOutput(key, sqlType)\n } else if (direction === 'inout') {\n bindInput(key, sqlType, val)\n bindOutput(key, sqlType)\n } else {\n console.error(`Invalid parameter direction(${dir}) for mssql stored procedure: ${key}`)\n }\n }\n\n const result = await req.execute(procedure)\n return result\n },\n close: () => {\n pool.close()\n }\n })\n\n ConnectionManager.logger.info(`MSSql Database(${connection.name}:${database}) at ${endpoint} connected.`)\n }\n\n async disconnect(connection: InputConnection) {\n var client = ConnectionManager.getConnectionInstance(connection)\n try {\n await client.close()\n ConnectionManager.logger.info(`MSSql Database(${connection.name}) closed.`)\n } catch (e) {\n ConnectionManager.logger.error(e)\n }\n\n ConnectionManager.removeConnectionInstance(connection)\n }\n\n get parameterSpec() {\n return [\n {\n type: 'string',\n name: 'user',\n label: 'user',\n useDomainAttribute: true\n },\n {\n type: 'secret',\n name: 'password',\n label: 'password',\n useDomainAttribute: true\n },\n {\n type: 'string',\n name: 'database',\n placeholder: 'SID',\n label: 'database'\n },\n {\n type: 'select',\n name: 'encrypt',\n label: 'encrypt',\n property: {\n options: ['Y', 'N']\n }\n },\n {\n type: 'number',\n name: 'poolMin',\n placeholder: 'minimum connection-pool size',\n label: 'pool-min',\n value: 0\n },\n {\n type: 'number',\n name: 'poolMax',\n placeholder: 'maximum connection-pool size',\n label: 'pool-max',\n value: 4\n },\n {\n type: 'select',\n name: 'trustServerCertificate',\n label: 'trust-server-certificate',\n property: {\n options: ['Y', 'N']\n }\n }\n ]\n }\n\n get taskPrefixes() {\n return ['database', 'mssql']\n }\n\n get help() {\n return 'integration/connector/mssql-connector'\n }\n}\n\nConnectionManager.registerConnector('mssql-connector', new MssqlConnector())\n"]}
@@ -22,7 +22,7 @@ const NUMBER_TYPES = [
22
22
  'INT',
23
23
  'BIGINT',
24
24
  'FLOAT',
25
- 'READ',
25
+ 'REAL',
26
26
  'DECIMAL',
27
27
  'NUMERIC',
28
28
  'MONEY',
@@ -1 +1 @@
1
- {"version":3,"file":"mssql-procedure.js","sourceRoot":"","sources":["../../../server/engine/task/mssql-procedure.ts"],"names":[],"mappings":"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","sourcesContent":["import { logger } from '@things-factory/env'\nimport { access } from '@things-factory/utils'\nimport { ConnectionManager } from '../connection-manager'\nimport { TaskRegistry } from '../task-registry'\nimport { InputStep } from '../../service/step/step-type'\nimport { Context } from '../types'\nimport 'ses'\n\ntry {\n var mssql = require('mssql')\n} catch (err) {\n logger.error('mssql module loading failed', err)\n}\n\ntype ProcedureParameterType = {\n name: string\n dir: string\n type: string\n val?: any\n accessor?: string\n maxSize?: number\n}\n\ntype ValueType = {\n code?: string\n procedure?: string\n parameters?: ProcedureParameterType[]\n}\n\nconst DIR = {\n In: 'in',\n Out: 'out',\n Inout: 'inout' /* 초기값이 있는 out 파라미터 */\n}\n\nconst NUMBER_TYPES = [\n 'TINYINT',\n 'SMALLINT',\n 'INT',\n 'BIGINT',\n 'FLOAT',\n 'READ',\n 'DECIMAL',\n 'NUMERIC',\n 'MONEY',\n 'SMALLMONEY'\n]\n\nconst DATE_TYPES = ['DATE', 'TIME', 'DATETIME', 'SMALLDATETIME', 'DATETIME2']\nconst PARAMETERIZED_STRINGS = ['NCHAR', 'NVARCHAR', 'NTEXT', 'DECIMAL', 'NUMERIC']\n\nasync function MssqlProcedure(step: InputStep, context: Context) {\n var { domain, user, data, variables, lng } = context\n var { connection: connectionName, params } = step\n\n var { code = '', procedure = '', parameters = [] } = params.parameters as ValueType\n\n var dbconnection = await ConnectionManager.getConnectionInstanceByName(domain, connectionName)\n\n if (!code) {\n throw 'procedure code not defined'\n }\n\n const compartment = new Compartment({\n domain,\n user,\n lng,\n data,\n variables,\n console\n })\n\n let evalCode\n try {\n evalCode = compartment.evaluate('`' + code + '`')\n } catch (err) {\n throw new Error(`Failed to evaluate code: ${err.message}`)\n }\n\n code = evalCode\n\n const procedureParameters =\n parameters &&\n parameters.reduce((sum, { name, val, dir, type, accessor, maxSize }) => {\n sum[name] = {\n dir: DIR[dir],\n type\n }\n\n const calculated = accessor ? access(accessor, data) || val : val\n\n if (calculated !== undefined) {\n sum[name].val = NUMBER_TYPES.includes(type)\n ? Number(calculated)\n : DATE_TYPES.includes(type)\n ? new Date(calculated)\n : String(calculated)\n }\n\n if ((dir == DIR.In || dir == DIR.Inout) && maxSize > 0 && type == 'String') {\n sum[name].type = mssql?.VarChar(maxSize)\n sum[name].maxSize = maxSize\n }\n\n return sum\n }, {})\n\n const result = await dbconnection.execute(procedure, procedureParameters)\n\n return {\n data: result\n }\n}\n\nMssqlProcedure.parameterSpec = [\n {\n type: 'procedure-parameters',\n name: 'parameters',\n label: '',\n property: {\n dbtype: 'mssql'\n }\n }\n]\n\nMssqlProcedure.help = 'integration/task/mssql-procedure'\n\nTaskRegistry.registerTaskHandler('mssql-procedure', MssqlProcedure)\n"]}
1
+ {"version":3,"file":"mssql-procedure.js","sourceRoot":"","sources":["../../../server/engine/task/mssql-procedure.ts"],"names":[],"mappings":"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","sourcesContent":["import { logger } from '@things-factory/env'\nimport { access } from '@things-factory/utils'\nimport { ConnectionManager } from '../connection-manager'\nimport { TaskRegistry } from '../task-registry'\nimport { InputStep } from '../../service/step/step-type'\nimport { Context } from '../types'\nimport 'ses'\n\ntry {\n var mssql = require('mssql')\n} catch (err) {\n logger.error('mssql module loading failed', err)\n}\n\ntype ProcedureParameterType = {\n name: string\n dir: string\n type: string\n val?: any\n accessor?: string\n maxSize?: number\n}\n\ntype ValueType = {\n code?: string\n procedure?: string\n parameters?: ProcedureParameterType[]\n}\n\nconst DIR = {\n In: 'in',\n Out: 'out',\n Inout: 'inout' /* 초기값이 있는 out 파라미터 */\n}\n\nconst NUMBER_TYPES = [\n 'TINYINT',\n 'SMALLINT',\n 'INT',\n 'BIGINT',\n 'FLOAT',\n 'REAL',\n 'DECIMAL',\n 'NUMERIC',\n 'MONEY',\n 'SMALLMONEY'\n]\n\nconst DATE_TYPES = ['DATE', 'TIME', 'DATETIME', 'SMALLDATETIME', 'DATETIME2']\nconst PARAMETERIZED_STRINGS = ['NCHAR', 'NVARCHAR', 'NTEXT', 'DECIMAL', 'NUMERIC']\n\nasync function MssqlProcedure(step: InputStep, context: Context) {\n var { domain, user, data, variables, lng } = context\n var { connection: connectionName, params } = step\n\n var { code = '', procedure = '', parameters = [] } = params.parameters as ValueType\n\n var dbconnection = await ConnectionManager.getConnectionInstanceByName(domain, connectionName)\n\n if (!code) {\n throw 'procedure code not defined'\n }\n\n const compartment = new Compartment({\n domain,\n user,\n lng,\n data,\n variables,\n console\n })\n\n let evalCode\n try {\n evalCode = compartment.evaluate('`' + code + '`')\n } catch (err) {\n throw new Error(`Failed to evaluate code: ${err.message}`)\n }\n\n code = evalCode\n\n const procedureParameters =\n parameters &&\n parameters.reduce((sum, { name, val, dir, type, accessor, maxSize }) => {\n sum[name] = {\n dir: DIR[dir],\n type\n }\n\n const calculated = accessor ? access(accessor, data) || val : val\n\n if (calculated !== undefined) {\n sum[name].val = NUMBER_TYPES.includes(type)\n ? Number(calculated)\n : DATE_TYPES.includes(type)\n ? new Date(calculated)\n : String(calculated)\n }\n\n if ((dir == DIR.In || dir == DIR.Inout) && maxSize > 0 && type == 'String') {\n sum[name].type = mssql?.VarChar(maxSize)\n sum[name].maxSize = maxSize\n }\n\n return sum\n }, {})\n\n const result = await dbconnection.execute(procedure, procedureParameters)\n\n return {\n data: result\n }\n}\n\nMssqlProcedure.parameterSpec = [\n {\n type: 'procedure-parameters',\n name: 'parameters',\n label: '',\n property: {\n dbtype: 'mssql'\n }\n }\n]\n\nMssqlProcedure.help = 'integration/task/mssql-procedure'\n\nTaskRegistry.registerTaskHandler('mssql-procedure', MssqlProcedure)\n"]}