af-db-ts 1.0.2

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.
Files changed (44) hide show
  1. package/README.md +3 -0
  2. package/dist/cjs/db.js +199 -0
  3. package/dist/cjs/db.js.map +1 -0
  4. package/dist/cjs/get-value-for-sql.js +256 -0
  5. package/dist/cjs/get-value-for-sql.js.map +1 -0
  6. package/dist/cjs/index.js +20 -0
  7. package/dist/cjs/index.js.map +1 -0
  8. package/dist/cjs/interfaces.js +3 -0
  9. package/dist/cjs/interfaces.js.map +1 -0
  10. package/dist/cjs/sql.js +375 -0
  11. package/dist/cjs/sql.js.map +1 -0
  12. package/dist/cjs/utils.js +36 -0
  13. package/dist/cjs/utils.js.map +1 -0
  14. package/dist/esm/db.js +185 -0
  15. package/dist/esm/db.js.map +1 -0
  16. package/dist/esm/get-value-for-sql.js +251 -0
  17. package/dist/esm/get-value-for-sql.js.map +1 -0
  18. package/dist/esm/index.js +4 -0
  19. package/dist/esm/index.js.map +1 -0
  20. package/dist/esm/interfaces.js +2 -0
  21. package/dist/esm/interfaces.js.map +1 -0
  22. package/dist/esm/sql.js +361 -0
  23. package/dist/esm/sql.js.map +1 -0
  24. package/dist/esm/utils.js +31 -0
  25. package/dist/esm/utils.js.map +1 -0
  26. package/dist/types/db.d.ts +39 -0
  27. package/dist/types/db.d.ts.map +1 -0
  28. package/dist/types/get-value-for-sql.d.ts +7 -0
  29. package/dist/types/get-value-for-sql.d.ts.map +1 -0
  30. package/dist/types/index.d.ts +5 -0
  31. package/dist/types/index.d.ts.map +1 -0
  32. package/dist/types/interfaces.d.ts +181 -0
  33. package/dist/types/interfaces.d.ts.map +1 -0
  34. package/dist/types/sql.d.ts +56 -0
  35. package/dist/types/sql.d.ts.map +1 -0
  36. package/dist/types/utils.d.ts +10 -0
  37. package/dist/types/utils.d.ts.map +1 -0
  38. package/package.json +75 -0
  39. package/src/db.ts +195 -0
  40. package/src/get-value-for-sql.ts +271 -0
  41. package/src/index.ts +47 -0
  42. package/src/interfaces.ts +232 -0
  43. package/src/sql.ts +403 -0
  44. package/src/utils.ts +31 -0
@@ -0,0 +1,375 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getRowsAffected = exports.getSqlValuesExpression = exports.getSqlSetExpression = exports.serialize = exports.wrapTransaction = exports.getRecordSchema = exports.getRecordValuesForSQL = exports.prepareDataForSQL = exports.prepareRecordForSQL = exports.correctRecordSchema = exports.prepareSqlString = exports.sql = void 0;
4
+ // noinspection SqlResolve
5
+ const sql = require("mssql");
6
+ exports.sql = sql;
7
+ const _ = require("lodash");
8
+ const af_echo_ts_1 = require("af-echo-ts");
9
+ const cache = require("memory-cache");
10
+ const db = require("./db");
11
+ const utils_1 = require("./utils");
12
+ const get_value_for_sql_1 = require("./get-value-for-sql");
13
+ /**
14
+ * Подготовка строки для передачи в SQL
15
+ */
16
+ const prepareSqlString = (args) => {
17
+ const { value, defaultValue = null, length = 0, nullable = false, noQuotes = false, escapeOnlySingleQuotes = false } = args;
18
+ if (value == null) {
19
+ if (nullable) {
20
+ return 'NULL';
21
+ }
22
+ if (defaultValue) {
23
+ return (0, utils_1.q)(defaultValue, noQuotes);
24
+ }
25
+ return ''; // Это нештатная ситуация, т.к. поле не получит никакого значения ( ,, )
26
+ }
27
+ if (value === '') {
28
+ if (noQuotes) {
29
+ return ''; // Это нештатная ситуация, т.к. поле не получит никакого значения ( ,, )
30
+ }
31
+ return `''`;
32
+ }
33
+ let val = (0, utils_1.mssqlEscape)(String(value), escapeOnlySingleQuotes);
34
+ if (length > 0) {
35
+ val = val.substring(0, length);
36
+ }
37
+ return (0, utils_1.q)(val, noQuotes);
38
+ };
39
+ exports.prepareSqlString = prepareSqlString;
40
+ const FIELD_SCHEMA_PROPS = ['index', 'name', 'length', 'type', 'scale', 'precision', 'nullable', 'caseSensitive',
41
+ 'identity', 'mergeIdentity', 'readOnly', 'inputDateFormat', 'defaultValue'];
42
+ /**
43
+ * Корректировка схемы таблицы
44
+ * Поля с суффиксом _json получают тип "json". Остальные корректировки берутся из fieldTypeCorrection
45
+ * Например, для полей типа datetime можно передавать свойство inputDateFormat
46
+ */
47
+ const correctRecordSchema = (recordSchemaAssoc,
48
+ // объект корректировок
49
+ fieldTypeCorrection) => {
50
+ _.each(recordSchemaAssoc, (fieldSchema, fieldName) => {
51
+ if (/_json$/i.test(fieldName)) {
52
+ fieldSchema.type = 'json';
53
+ }
54
+ switch (fieldSchema.type) {
55
+ case sql.NChar:
56
+ case sql.NText:
57
+ case sql.NVarChar:
58
+ if (fieldSchema.length) {
59
+ fieldSchema.length = Math.floor(fieldSchema.length / 2);
60
+ }
61
+ break;
62
+ case sql.UniqueIdentifier:
63
+ fieldSchema.length = 36;
64
+ break;
65
+ default:
66
+ }
67
+ });
68
+ if (fieldTypeCorrection && typeof fieldTypeCorrection === 'object') {
69
+ _.each(fieldTypeCorrection, (correction, fieldName) => {
70
+ FIELD_SCHEMA_PROPS.forEach((prop) => {
71
+ if (correction[prop] !== undefined) {
72
+ if (!recordSchemaAssoc[fieldName]) {
73
+ recordSchemaAssoc[fieldName] = {};
74
+ }
75
+ recordSchemaAssoc[fieldName][prop] = correction[prop];
76
+ }
77
+ });
78
+ });
79
+ }
80
+ };
81
+ exports.correctRecordSchema = correctRecordSchema;
82
+ /**
83
+ * Подготовка значений записи для использования в SQL
84
+ *
85
+ * Все поля записи обрабатываются функцией getValueForSQL
86
+ */
87
+ const prepareRecordForSQL = (record, args) => {
88
+ const { addValues4NotNullableFields, addMissingFields } = args;
89
+ const { dateTimeOptions, needValidate, escapeOnlySingleQuotes, dialect } = args;
90
+ const options = {
91
+ value: null, fieldSchema: '', dateTimeOptions, needValidate, escapeOnlySingleQuotes, dialect,
92
+ };
93
+ args.recordSchema.forEach((fieldSchema) => {
94
+ const { name = '_#foo#_', readOnly } = fieldSchema;
95
+ if (readOnly) {
96
+ return;
97
+ }
98
+ if (Object.prototype.hasOwnProperty.call(record, name)) {
99
+ record[name] = (0, get_value_for_sql_1.getValueForSQL)({ ...options, value: record[name], fieldSchema });
100
+ }
101
+ else if ((!fieldSchema.nullable && addValues4NotNullableFields) || addMissingFields) {
102
+ record[name] = (0, get_value_for_sql_1.getValueForSQL)({ ...options, value: null, fieldSchema });
103
+ }
104
+ });
105
+ };
106
+ exports.prepareRecordForSQL = prepareRecordForSQL;
107
+ /**
108
+ * Подготовка данных для SQL
109
+ *
110
+ * Все поля всех записей обрабатываются функцией getValueForSQL
111
+ */
112
+ const prepareDataForSQL = (recordSet, args) => {
113
+ if (recordSet._isPreparedForSQL) {
114
+ return;
115
+ }
116
+ recordSet.forEach((record) => {
117
+ (0, exports.prepareRecordForSQL)(record, args);
118
+ });
119
+ recordSet._isPreparedForSQL = true;
120
+ };
121
+ exports.prepareDataForSQL = prepareDataForSQL;
122
+ /**
123
+ * Возвращает рекорд, в котором все значения преобразованы в строки и подготовлены для прямой вставки в SQL
124
+ * В частности, если значение типа строка, то оно уже заключено в одинарные кавычки
125
+ */
126
+ const getRecordValuesForSQL = (record, recordSchema) => {
127
+ const recordValuesForSQL = {};
128
+ recordSchema.forEach((fieldSchema) => {
129
+ const { name = '_#foo#_', readOnly } = fieldSchema;
130
+ if (readOnly) {
131
+ return;
132
+ }
133
+ if (Object.prototype.hasOwnProperty.call(record, name)) {
134
+ recordValuesForSQL[name] = (0, get_value_for_sql_1.getValueForSQL)({ value: record[name], fieldSchema, escapeOnlySingleQuotes: true });
135
+ }
136
+ });
137
+ return recordValuesForSQL;
138
+ };
139
+ exports.getRecordValuesForSQL = getRecordValuesForSQL;
140
+ /**
141
+ * Возвращает схему полей таблицы БД. Либо в виде объекта, либо в виде массива
142
+ * Если asArray = true, то вернет TRecordSchema, при этом удалит поля, указанные в omitFields
143
+ * Иначе вернет TRecordSchemaAssoc
144
+ */
145
+ const getRecordSchema = async (
146
+ // ID соединения (borf|cep|hr|global)
147
+ connectionId,
148
+ // Субъект в выражении FROM для таблицы, схему которой нужно вернуть
149
+ schemaAndTable,
150
+ // Массив имен полей, которые нужно удалить из схемы (не учитывается, если asArray = false)
151
+ options = {}) => {
152
+ const propertyPath = `schemas.${connectionId}.${schemaAndTable}`;
153
+ let result = cache.get(propertyPath);
154
+ if (result) {
155
+ return result;
156
+ }
157
+ const { omitFields, pickFields, fieldTypeCorrection, mergeRules: { mergeIdentity = [], excludeFromInsert = [], noUpdateIfNull = false, correction: mergeCorrection, withClause, } = {}, noReturnMergeResult, } = options;
158
+ const cPool = await db.getPoolConnection(connectionId, { prefix: 'getRecordSchema' });
159
+ const request = new sql.Request(cPool);
160
+ request.stream = false;
161
+ let res;
162
+ try {
163
+ res = await request.query(`SELECT TOP(1) *
164
+ FROM ${schemaAndTable}`);
165
+ }
166
+ catch (err) {
167
+ af_echo_ts_1.echo.error(`getRecordSchema SQL ERROR`);
168
+ af_echo_ts_1.echo.error(err);
169
+ throw err;
170
+ }
171
+ const { columns } = res.recordset;
172
+ const readOnlyFields = Object.entries(columns).filter(([, { readOnly: ro }]) => ro).map(([f]) => f);
173
+ const omitFields2 = [...readOnlyFields, ...(Array.isArray(omitFields) ? omitFields : [])];
174
+ let schemaAssoc = _.omit(columns, omitFields2);
175
+ schemaAssoc = Array.isArray(pickFields) ? _.pick(schemaAssoc, pickFields) : schemaAssoc;
176
+ (0, exports.correctRecordSchema)(schemaAssoc, fieldTypeCorrection);
177
+ const schema = _.map(schemaAssoc, (fo) => (fo))
178
+ .sort((a, b) => {
179
+ const ai = ((a === null || a === void 0 ? void 0 : a.index) || 0);
180
+ const bi = ((b === null || b === void 0 ? void 0 : b.index) || 0);
181
+ if (ai > bi)
182
+ return 1;
183
+ if (ai < bi)
184
+ return -1;
185
+ return 0;
186
+ });
187
+ const fields = schema.map((o) => o === null || o === void 0 ? void 0 : o.name).filter(Boolean);
188
+ const fieldsList = fields.map((fName) => `[${fName}]`)
189
+ .join(', ');
190
+ const onClause = `(${mergeIdentity.map((fName) => (`target.[${fName}] = source.[${fName}]`))
191
+ .join(' AND ')})`;
192
+ const insertFields = fields.filter((fName) => (!excludeFromInsert.includes(fName)));
193
+ const insertSourceList = insertFields.map((fName) => (`source.[${fName}]`))
194
+ .join(', ');
195
+ const insertFieldsList = insertFields.map((fName) => `[${fName}]`)
196
+ .join(', ');
197
+ const updateFields = fields.filter((fName) => (!mergeIdentity.includes(fName)));
198
+ let updateFieldsList;
199
+ if (noUpdateIfNull) {
200
+ updateFieldsList = updateFields.map((fName) => (`target.[${fName}] = COALESCE(source.[${fName}], target.[${fName}])`)).join(', ');
201
+ }
202
+ else {
203
+ updateFieldsList = updateFields.map((fName) => (`target.[${fName}] = source.[${fName}]`)).join(', ');
204
+ }
205
+ const dbConfig = db.getDbConfig(connectionId);
206
+ const dbSchemaAndTable = `[${dbConfig.database}].${schemaAndTable}`;
207
+ result = {
208
+ connectionId,
209
+ dbConfig,
210
+ schemaAndTable,
211
+ dbSchemaAndTable,
212
+ columns,
213
+ schemaAssoc,
214
+ schema,
215
+ fields,
216
+ insertFields,
217
+ insertFieldsList,
218
+ withClause,
219
+ updateFields,
220
+ mergeIdentity,
221
+ getMergeSQL(packet, prepareOptions = {}) {
222
+ if (prepareOptions.isPrepareForSQL) {
223
+ (0, exports.prepareDataForSQL)(packet, { recordSchema: this.schema, ...prepareOptions });
224
+ }
225
+ const values = `(${packet.map((r) => (fields.map((fName) => (r[fName]))
226
+ .join(',')))
227
+ .join(`)\n,(`)})`;
228
+ let mergeSQL = `
229
+ MERGE ${schemaAndTable} ${withClause || ''} AS target
230
+ USING
231
+ (
232
+ SELECT * FROM
233
+ ( VALUES
234
+ ${values}
235
+ )
236
+ AS s (
237
+ ${fieldsList}
238
+ )
239
+ )
240
+ AS source
241
+ ON ${onClause}
242
+ WHEN MATCHED THEN
243
+ UPDATE SET
244
+ ${updateFieldsList}
245
+ WHEN NOT MATCHED THEN
246
+ INSERT (
247
+ ${insertFieldsList}
248
+ )
249
+ VALUES (
250
+ ${insertSourceList}
251
+ )`;
252
+ if (!noReturnMergeResult) {
253
+ mergeSQL = `
254
+ ${'DECLARE'} @t TABLE ( act VARCHAR(20));
255
+ DECLARE @total AS INTEGER;
256
+ DECLARE @i AS INTEGER;
257
+ DECLARE @u AS INTEGER;
258
+ ${mergeSQL}
259
+ OUTPUT $action INTO @t;
260
+ SET @total = @@ROWCOUNT;
261
+ SELECT @i = COUNT(*) FROM @t WHERE act = 'INSERT';
262
+ SELECT @u = COUNT(*) FROM @t WHERE act != 'INSERT';
263
+ SELECT @total as total, @i as inserted, @u as updated;
264
+ `;
265
+ }
266
+ else {
267
+ mergeSQL += `;\n`;
268
+ }
269
+ return typeof mergeCorrection === 'function' ? mergeCorrection(mergeSQL) : mergeSQL;
270
+ },
271
+ getInsertSQL(packet, addOutputInserted = false) {
272
+ if (!Array.isArray(packet)) {
273
+ packet = [packet];
274
+ }
275
+ const values = `(${packet.map((r) => (insertFields.map((fName) => (r[fName] === undefined ? 'NULL' : r[fName]))
276
+ .join(',')))
277
+ .join(`)\n,(`)})`;
278
+ return `INSERT INTO ${schemaAndTable} (${insertFieldsList}) ${addOutputInserted ? ' OUTPUT inserted.* ' : ''} VALUES ${values}`;
279
+ },
280
+ getUpdateSQL(record) {
281
+ const recordForSQL = (0, exports.getRecordValuesForSQL)(record, this.schema);
282
+ const setArray = [];
283
+ updateFields.forEach((fName) => {
284
+ if (recordForSQL[fName] !== undefined) {
285
+ setArray.push(`[${fName}] = ${recordForSQL[fName]}`);
286
+ }
287
+ });
288
+ const where = `(${mergeIdentity.map((fName) => (`[${fName}] = ${recordForSQL[fName]}`))
289
+ .join(' AND ')})`;
290
+ return `UPDATE ${schemaAndTable}
291
+ SET ${setArray.join(', ')}
292
+ WHERE ${where};`;
293
+ },
294
+ };
295
+ cache.put(propertyPath, result);
296
+ return result;
297
+ };
298
+ exports.getRecordSchema = getRecordSchema;
299
+ /**
300
+ * Оборачивает инструкции SQL в транзакцию
301
+ */
302
+ const wrapTransaction = (strSQL) => `BEGIN TRY
303
+ BEGIN TRANSACTION;
304
+
305
+ ${strSQL}
306
+
307
+ COMMIT TRANSACTION;
308
+ END TRY
309
+ BEGIN CATCH
310
+ DECLARE @ErrorMessage NVARCHAR(MAX)
311
+ , @ErrorSeverity INT
312
+ , @ErrorState INT;
313
+
314
+ SELECT
315
+ @ErrorMessage = ERROR_MESSAGE() + ' Line ' + CAST(ERROR_LINE() AS NVARCHAR(5))
316
+ , @ErrorSeverity = ERROR_SEVERITY()
317
+ , @ErrorState = ERROR_STATE();
318
+
319
+ IF @@trancount > 0
320
+ BEGIN
321
+ ROLLBACK TRANSACTION;
322
+ END;
323
+
324
+ RAISERROR(@ErrorMessage, @ErrorSeverity, @ErrorState);
325
+ END CATCH;`;
326
+ exports.wrapTransaction = wrapTransaction;
327
+ /**
328
+ * Возвращает проверенное и серилизованное значение
329
+ */
330
+ const serialize = (value, fieldSchema) => {
331
+ const val = (0, get_value_for_sql_1.getValueForSQL)({ value, fieldSchema });
332
+ if (val == null || val === 'NULL') {
333
+ return null;
334
+ }
335
+ if (typeof val === 'number') {
336
+ return val;
337
+ }
338
+ return String(val).replace(/(^')|('$)/g, '');
339
+ };
340
+ exports.serialize = serialize;
341
+ /**
342
+ * Возвращает подготовленное выражение SET для использования в UPDATE
343
+ */
344
+ const getSqlSetExpression = (record, recordSchema) => {
345
+ const setArray = [];
346
+ recordSchema.forEach((fieldSchema) => {
347
+ const { name = '_#foo#_' } = fieldSchema;
348
+ if (Object.prototype.hasOwnProperty.call(record, name)) {
349
+ setArray.push(`[${name}] = ${(0, get_value_for_sql_1.getValueForSQL)({ value: record[name], fieldSchema, escapeOnlySingleQuotes: true })}`);
350
+ }
351
+ });
352
+ return `SET ${setArray.join(', ')}`;
353
+ };
354
+ exports.getSqlSetExpression = getSqlSetExpression;
355
+ /**
356
+ * Возвращает подготовленное выражение (...поля...) VALUES (...значения...) для использования в INSERT
357
+ *
358
+ * addOutputInserted - Если true, добавляется выражение OUTPUT inserted.* перед VALUES
359
+ */
360
+ const getSqlValuesExpression = (record, recordSchema, addOutputInserted = false) => {
361
+ const fieldsArray = [];
362
+ const valuesArray = [];
363
+ recordSchema.forEach((fieldSchema) => {
364
+ const { name = '_#foo#_' } = fieldSchema;
365
+ if (Object.prototype.hasOwnProperty.call(record, name)) {
366
+ fieldsArray.push(name);
367
+ valuesArray.push(String((0, get_value_for_sql_1.getValueForSQL)({ value: record[name], fieldSchema, escapeOnlySingleQuotes: true })));
368
+ }
369
+ });
370
+ return `([${fieldsArray.join('], [')}]) ${addOutputInserted ? ' OUTPUT inserted.* ' : ''} VALUES (${valuesArray.join(', ')})`;
371
+ };
372
+ exports.getSqlValuesExpression = getSqlValuesExpression;
373
+ const getRowsAffected = (qResult) => (qResult.rowsAffected && qResult.rowsAffected.reduce((a, v) => a + v, 0)) || 0;
374
+ exports.getRowsAffected = getRowsAffected;
375
+ //# sourceMappingURL=sql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql.js","sourceRoot":"","sources":["../../src/sql.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.mssqlEscape = exports.q = void 0;
4
+ /**
5
+ * Оборачивает строку в одинарные кавычки, если второй аргумент не true
6
+ */
7
+ const q = (val, noQuotes) => (noQuotes ? val : `'${val}'`);
8
+ exports.q = q;
9
+ /**
10
+ * Экранирование одинарной кавычки и символа % для использования строки в SQL запросе
11
+ * onlySingleQuotes - true - не экранировать %
12
+ */
13
+ const mssqlEscape = (str, onlySingleQuotes = false) => {
14
+ if (str == null) {
15
+ str = '';
16
+ }
17
+ switch (typeof str) {
18
+ case 'number':
19
+ str = String(str);
20
+ break;
21
+ case 'string':
22
+ break;
23
+ case 'boolean':
24
+ str = str ? '1' : '0';
25
+ break;
26
+ default:
27
+ str = String(str || '');
28
+ }
29
+ str = str.replace(/'/g, `''`);
30
+ if (onlySingleQuotes) {
31
+ return str;
32
+ }
33
+ return str.replace(/%/g, '%%');
34
+ };
35
+ exports.mssqlEscape = mssqlEscape;
36
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACI,MAAM,CAAC,GAAG,CAAC,GAAW,EAAE,QAAkB,EAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC;AAA/E,QAAA,CAAC,KAA8E;AAE5F;;;GAGG;AACI,MAAM,WAAW,GAAG,CAAC,GAAQ,EAAE,mBAA4B,KAAK,EAAU,EAAE;IACjF,IAAI,GAAG,IAAI,IAAI,EAAE;QACf,GAAG,GAAG,EAAE,CAAC;KACV;IACD,QAAQ,OAAO,GAAG,EAAE;QAClB,KAAK,QAAQ;YACX,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;YAClB,MAAM;QACR,KAAK,QAAQ;YACX,MAAM;QACR,KAAK,SAAS;YACZ,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YACtB,MAAM;QACR;YACE,GAAG,GAAG,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;KAC3B;IACD,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC9B,IAAI,gBAAgB,EAAE;QACpB,OAAO,GAAG,CAAC;KACZ;IACD,OAAO,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AACjC,CAAC,CAAC;AArBW,QAAA,WAAW,eAqBtB"}
package/dist/esm/db.js ADDED
@@ -0,0 +1,185 @@
1
+ import * as config from 'config';
2
+ import { magenta } from 'af-color';
3
+ import { echo } from 'af-echo-ts';
4
+ import * as sql from 'mssql';
5
+ import * as _ from 'lodash';
6
+ import { sleep } from 'af-tools-ts';
7
+ export const getFirstConfigId = () => Object.keys(config.get('database') || {}).filter((v) => !['dialect', '_common_'].includes(v))[0];
8
+ export const getDbConfig = (connectionId) => config.get(`database.${connectionId}`);
9
+ export const pools = {};
10
+ /**
11
+ * Возвращает пул соединений для БД, соответствующей преданному ID соединения (borf|cep|hr|global)
12
+ * В случае, если не удается создать пул или открыть соединение, прерывает работу скрипта
13
+ */
14
+ export const getPoolConnection = async (connectionId, options = {}) => {
15
+ const { prefix = '', errorCode = 0 } = options;
16
+ let pool = pools[connectionId];
17
+ if (pool === null || pool === void 0 ? void 0 : pool.connected) {
18
+ return pool;
19
+ }
20
+ const resume = (errMsg) => {
21
+ if (options.onError === 'exit') {
22
+ echo.error(prefix, `${errMsg}\nEXIT PROCESS`);
23
+ process.exit(errorCode);
24
+ }
25
+ else {
26
+ throw new Error(errMsg);
27
+ }
28
+ };
29
+ try {
30
+ const cfg = config.get('database');
31
+ const namedDbConfig = cfg[connectionId];
32
+ if (!namedDbConfig) {
33
+ resume(`Missing configuration for DB id "${connectionId}"`);
34
+ }
35
+ const dbConfig = config.util.extendDeep({}, cfg._common_ || {}, cfg[connectionId]);
36
+ if (pool === null || pool === void 0 ? void 0 : pool.connecting) {
37
+ const startTs = Date.now();
38
+ while ((pool === null || pool === void 0 ? void 0 : pool.connecting) && (Date.now() - startTs < dbConfig.connectionTimeout)) {
39
+ // eslint-disable-next-line no-await-in-loop
40
+ await sleep(100);
41
+ }
42
+ if (pool === null || pool === void 0 ? void 0 : pool.connected) {
43
+ return pool;
44
+ }
45
+ echo.error(prefix, `Can't connect connectionId "${connectionId}"`);
46
+ }
47
+ pool = new sql.ConnectionPool(dbConfig);
48
+ if (typeof pool !== 'object') {
49
+ resume(`Can't create connection pool "${connectionId}"`);
50
+ }
51
+ pools[connectionId] = pool;
52
+ // @ts-ignore
53
+ pool._connectionId = connectionId;
54
+ pool.on('close', () => {
55
+ delete pools[connectionId];
56
+ });
57
+ pool.on('error', (err) => {
58
+ echo.error('POOL-ERROR', err);
59
+ });
60
+ await pool.connect();
61
+ return pool;
62
+ }
63
+ catch (err) {
64
+ echo.error(err);
65
+ resume(`Cant connect to "${connectionId}" db`);
66
+ }
67
+ };
68
+ /**
69
+ * Закрывает указанные соединения с БД
70
+ *
71
+ * poolsToClose - пул или массив пулов
72
+ * prefix - Префикс в сообщении о закрытии пула (название синхронизации)
73
+ * noEcho - подавление сообщений о закрытии соединения
74
+ */
75
+ export const closeDbConnections = async (poolsToClose, prefix, noEcho) => {
76
+ if (!Array.isArray(poolsToClose)) {
77
+ // @ts-ignore
78
+ poolsToClose = [poolsToClose];
79
+ }
80
+ // @ts-ignore
81
+ for (let i = 0; i < poolsToClose.length; i++) {
82
+ let pool = poolsToClose[i];
83
+ let connectionId = '';
84
+ if (pool) {
85
+ if (typeof pool === 'string') {
86
+ connectionId = pool;
87
+ pool = pools[connectionId];
88
+ }
89
+ else if (typeof pool === 'object') {
90
+ // @ts-ignore
91
+ connectionId = pool._connectionId;
92
+ }
93
+ if (connectionId) {
94
+ delete pools[connectionId];
95
+ }
96
+ if (pool && pool.close) {
97
+ try {
98
+ // eslint-disable-next-line no-await-in-loop
99
+ await pool.close();
100
+ if (!noEcho && connectionId) {
101
+ const msg = `pool "${connectionId}" closed`;
102
+ if (prefix) {
103
+ echo.info(prefix, msg);
104
+ }
105
+ else {
106
+ echo.info(msg);
107
+ }
108
+ }
109
+ }
110
+ catch (err) {
111
+ //
112
+ }
113
+ }
114
+ }
115
+ }
116
+ };
117
+ /**
118
+ * Закрывает все соединения с БД
119
+ *
120
+ * prefix - Префикс в сообщении о закрытии пула (название синхронизации)
121
+ * noEcho - подавление сообщений о закрытии соединения
122
+ */
123
+ export const closeAllDbConnections = async (prefix, noEcho) => {
124
+ const poolsToClose = _.map(pools, (p) => p);
125
+ await closeDbConnections(poolsToClose, prefix, noEcho);
126
+ };
127
+ /**
128
+ * Закрывает указанные соединения с БД и прерывает работу скрипта
129
+ *
130
+ * poolsToClose - пул или массив пулов
131
+ * prefix - Префикс в сообщении о закрытии пула (название синхронизации)
132
+ */
133
+ export const closeDbConnectionsAndExit = async (poolsToClose, prefix) => {
134
+ await closeDbConnections(poolsToClose, prefix);
135
+ process.exit(0);
136
+ };
137
+ export const Request = async (connectionId, strSQL) => {
138
+ const pool = await getPoolConnection(connectionId, { onError: 'throw' });
139
+ const request = new sql.Request(pool);
140
+ if (strSQL) {
141
+ return request.query(strSQL);
142
+ }
143
+ return request;
144
+ };
145
+ let logger = echo;
146
+ export const setLogger = (logger_) => {
147
+ logger = logger_;
148
+ };
149
+ export const logSqlError = (err, noThrow, textSQL, prefix) => {
150
+ if (prefix) {
151
+ logger.error(prefix);
152
+ }
153
+ if (textSQL) {
154
+ logger.error(`SQL Error:\n${magenta}${textSQL}`);
155
+ }
156
+ logger.error(err);
157
+ if (!noThrow) {
158
+ throw err;
159
+ }
160
+ };
161
+ export const getPool = async (dbId, noThrow = false) => {
162
+ try {
163
+ return getPoolConnection(dbId);
164
+ }
165
+ catch (err) {
166
+ logSqlError(err, noThrow, `Error while open connection to DB ${dbId}`);
167
+ }
168
+ };
169
+ export const query = async (dbId, textSQL, noThrow, prefix) => {
170
+ const pool = await getPool(dbId, noThrow);
171
+ if (!(pool === null || pool === void 0 ? void 0 : pool.connected) && !(pool === null || pool === void 0 ? void 0 : pool.connecting)) {
172
+ await closeDbConnections(dbId);
173
+ return;
174
+ }
175
+ const request = new sql.Request(pool);
176
+ let res;
177
+ try {
178
+ res = await request.query(textSQL);
179
+ return res;
180
+ }
181
+ catch (err) {
182
+ logSqlError(err, noThrow, textSQL, prefix);
183
+ }
184
+ };
185
+ //# sourceMappingURL=db.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/db.ts"],"names":[],"mappings":"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"}