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.
- package/README.md +3 -0
- package/dist/cjs/db.js +199 -0
- package/dist/cjs/db.js.map +1 -0
- package/dist/cjs/get-value-for-sql.js +256 -0
- package/dist/cjs/get-value-for-sql.js.map +1 -0
- package/dist/cjs/index.js +20 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/interfaces.js +3 -0
- package/dist/cjs/interfaces.js.map +1 -0
- package/dist/cjs/sql.js +375 -0
- package/dist/cjs/sql.js.map +1 -0
- package/dist/cjs/utils.js +36 -0
- package/dist/cjs/utils.js.map +1 -0
- package/dist/esm/db.js +185 -0
- package/dist/esm/db.js.map +1 -0
- package/dist/esm/get-value-for-sql.js +251 -0
- package/dist/esm/get-value-for-sql.js.map +1 -0
- package/dist/esm/index.js +4 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/interfaces.js +2 -0
- package/dist/esm/interfaces.js.map +1 -0
- package/dist/esm/sql.js +361 -0
- package/dist/esm/sql.js.map +1 -0
- package/dist/esm/utils.js +31 -0
- package/dist/esm/utils.js.map +1 -0
- package/dist/types/db.d.ts +39 -0
- package/dist/types/db.d.ts.map +1 -0
- package/dist/types/get-value-for-sql.d.ts +7 -0
- package/dist/types/get-value-for-sql.d.ts.map +1 -0
- package/dist/types/index.d.ts +5 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/interfaces.d.ts +181 -0
- package/dist/types/interfaces.d.ts.map +1 -0
- package/dist/types/sql.d.ts +56 -0
- package/dist/types/sql.d.ts.map +1 -0
- package/dist/types/utils.d.ts +10 -0
- package/dist/types/utils.d.ts.map +1 -0
- package/package.json +75 -0
- package/src/db.ts +195 -0
- package/src/get-value-for-sql.ts +271 -0
- package/src/index.ts +47 -0
- package/src/interfaces.ts +232 -0
- package/src/sql.ts +403 -0
- package/src/utils.ts +31 -0
package/dist/cjs/sql.js
ADDED
|
@@ -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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"}
|