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,251 @@
1
+ import { DateTime } from 'luxon';
2
+ import { getBool, rn } from 'af-tools-ts';
3
+ import { prepareSqlString, sql } from './sql';
4
+ import { mssqlEscape, q } from './utils';
5
+ export const binToHexString = (value) => (value ? `0x${value.toString(16).toUpperCase()}` : null);
6
+ const getTypeOfDateInput = (v) => {
7
+ const type = typeof v;
8
+ if (type === 'string' || type === 'number') {
9
+ return type;
10
+ }
11
+ if (type === 'boolean' || !v) {
12
+ return 'null';
13
+ }
14
+ if (type === 'object') {
15
+ if (Object.prototype.toString.call(v) === '[object Date]') {
16
+ return 'date';
17
+ }
18
+ if (v.isLuxonDateTime) {
19
+ return 'luxon';
20
+ }
21
+ if (v._isAMomentObject) {
22
+ return 'moment';
23
+ }
24
+ }
25
+ return 'any';
26
+ };
27
+ /**
28
+ * Возвращает значение, готовое для использования в строке SQL запроса
29
+ */
30
+ export const getValueForSQL = (args) => {
31
+ let { value, fieldSchema, escapeOnlySingleQuotes } = args;
32
+ const { dateTimeOptions, needValidate } = args;
33
+ if (typeof fieldSchema === 'string') {
34
+ fieldSchema = { type: fieldSchema };
35
+ }
36
+ const { type, arrayType, length = 0, scale, nullable = true, inputDateFormat, defaultValue, noQuotes = false, name, } = fieldSchema;
37
+ let val;
38
+ const IS_POSTGRES = args.dialect === 'pg';
39
+ if (escapeOnlySingleQuotes == null) {
40
+ ({ escapeOnlySingleQuotes } = fieldSchema);
41
+ }
42
+ if (escapeOnlySingleQuotes == null) {
43
+ escapeOnlySingleQuotes = false;
44
+ }
45
+ function prepareNumber(min, max, value_ = value) {
46
+ if (value_ === 'null' || value_ == null || Number.isNaN(value_)) {
47
+ if (nullable) {
48
+ return 'NULL';
49
+ }
50
+ return (defaultValue || defaultValue === 0) ? `${defaultValue}` : null;
51
+ }
52
+ val = Number(value_);
53
+ if (needValidate && (val < min || val > max)) {
54
+ // throwValidateError()
55
+ throw new Error(`Type [${type}] validate error. Value: ${val} / FName: ${name}`);
56
+ }
57
+ return `${val}`;
58
+ }
59
+ const prepareSqlStringArgs = {
60
+ value, nullable, length, defaultValue, noQuotes, escapeOnlySingleQuotes,
61
+ };
62
+ switch (type) {
63
+ case 'json':
64
+ if (Array.isArray(value) || typeof value === 'object') {
65
+ value = JSON.stringify(value);
66
+ }
67
+ return prepareSqlString({ ...prepareSqlStringArgs, value });
68
+ case 'string':
69
+ case sql.Char:
70
+ case sql.NChar:
71
+ case sql.Text:
72
+ case sql.NText:
73
+ case sql.VarChar:
74
+ case sql.NVarChar:
75
+ case sql.Xml:
76
+ return prepareSqlString(prepareSqlStringArgs);
77
+ case 'uid':
78
+ case 'uuid':
79
+ case 'uniqueIdentifier':
80
+ case sql.UniqueIdentifier:
81
+ if (!value || typeof value !== 'string' || !/^[A-F\d]{8}(-[A-F\d]{4}){4}[A-F\d]{8}/i.test(value)) {
82
+ value = null;
83
+ }
84
+ else {
85
+ value = value.substring(0, 36).toUpperCase();
86
+ }
87
+ return prepareSqlString({ ...prepareSqlStringArgs, value, length: 0 });
88
+ case 'datetime':
89
+ case 'date':
90
+ case 'time':
91
+ case sql.DateTime:
92
+ case sql.DateTime2:
93
+ case sql.Time:
94
+ case sql.Date:
95
+ case sql.SmallDateTime:
96
+ case sql.DateTimeOffset: {
97
+ let millis = 0;
98
+ val = value;
99
+ let inputType = getTypeOfDateInput(value); // 'string' | 'number' | 'date' | 'luxon' | 'moment' | 'any' | 'null'
100
+ if (inputType === 'null') {
101
+ if (nullable) {
102
+ return 'NULL';
103
+ }
104
+ inputType = 'number';
105
+ val = 0;
106
+ }
107
+ else if (inputType === 'any') {
108
+ inputType = 'string';
109
+ val = String(value);
110
+ }
111
+ switch (inputType) {
112
+ case 'number':
113
+ millis = val;
114
+ break;
115
+ case 'date':
116
+ millis = +val;
117
+ break;
118
+ case 'luxon':
119
+ millis = val.isValid ? val.toMillis() : 0;
120
+ break;
121
+ case 'moment':
122
+ millis = val.isValid() ? +val : 0;
123
+ break;
124
+ // string and other
125
+ default: {
126
+ val = String(value);
127
+ millis = (inputDateFormat
128
+ ? DateTime.fromFormat(val, inputDateFormat, dateTimeOptions)
129
+ : DateTime.fromISO(val, dateTimeOptions)).toMillis();
130
+ break;
131
+ }
132
+ }
133
+ millis = Math.max(millis + ((dateTimeOptions === null || dateTimeOptions === void 0 ? void 0 : dateTimeOptions.correctionMillis) || 0), 0);
134
+ const luxonDate = DateTime.fromMillis(millis);
135
+ switch (type) {
136
+ case 'datetime':
137
+ case sql.DateTime:
138
+ case sql.DateTime2:
139
+ return q(luxonDate.toISO({ includeOffset: false }) || '', noQuotes); // 2023-09-05T02:23:54.105
140
+ case 'time':
141
+ case sql.Time:
142
+ return q((luxonDate.toISOTime() || '').substring(0, 12), noQuotes); // 02:22:17.368
143
+ case 'date':
144
+ case sql.Date:
145
+ return q(luxonDate.toSQLDate() || '', noQuotes); // 2023-09-05
146
+ case sql.SmallDateTime:
147
+ return q(`${(luxonDate.toISO() || '').substring(0, 17)}00`, noQuotes); // 2023-09-05T02:20:00
148
+ case sql.DateTimeOffset: { // VVQ TESTS
149
+ const dotScale = scale == null ? 3 : scale;
150
+ const re = /\.(\d+)(?=[^.]*$)/;
151
+ let str = luxonDate.toISO({ includeOffset: false }) || '';
152
+ if (!dotScale) {
153
+ str = str.replace(re, `.000`);
154
+ }
155
+ else {
156
+ val = inputType === 'string' ? value : str;
157
+ let [, fracSeconds = '0'] = re.exec(val) || [];
158
+ let floatSeconds = parseFloat((`1.${fracSeconds}`));
159
+ floatSeconds = rn(floatSeconds, dotScale);
160
+ fracSeconds = (`${floatSeconds}0000000`).substring(2, 2 + dotScale);
161
+ str = str.replace(re, `.${fracSeconds}`);
162
+ }
163
+ return q(str, noQuotes);
164
+ }
165
+ default:
166
+ return q(luxonDate.toISO({ includeOffset: false }) || '', noQuotes); // 2023-09-05T02:23:54.105
167
+ }
168
+ }
169
+ case 'boolean':
170
+ case sql.Bit: {
171
+ val = getBool(value);
172
+ if (IS_POSTGRES) {
173
+ return val ? 'true' : 'false';
174
+ }
175
+ return val ? '1' : '0';
176
+ }
177
+ case sql.TinyInt:
178
+ return prepareNumber(0, 255);
179
+ case 'smallint':
180
+ case sql.SmallInt:
181
+ return prepareNumber(-32768, 32767);
182
+ case 'int':
183
+ case sql.Int:
184
+ case 'integer':
185
+ return prepareNumber(-2147483648, 2147483647);
186
+ case sql.BigInt:
187
+ // eslint-disable-next-line no-loss-of-precision
188
+ return prepareNumber(-9223372036854775808, 9223372036854775807);
189
+ case 'number':
190
+ case sql.Decimal:
191
+ case sql.Float:
192
+ case sql.Money:
193
+ case sql.Numeric:
194
+ case sql.SmallMoney:
195
+ case sql.Real:
196
+ if (value == null) {
197
+ if (nullable) {
198
+ return 'NULL';
199
+ }
200
+ return (defaultValue || defaultValue === 0) ? `${defaultValue}` : null;
201
+ }
202
+ return `${value}`;
203
+ case sql.Binary:
204
+ case sql.VarBinary:
205
+ case sql.Image:
206
+ if (value == null) {
207
+ if (nullable) {
208
+ return 'NULL';
209
+ }
210
+ if (!defaultValue)
211
+ return null;
212
+ }
213
+ return binToHexString(value);
214
+ case sql.UDT:
215
+ case sql.Geography:
216
+ case sql.Geometry:
217
+ case sql.Variant:
218
+ return prepareSqlString(prepareSqlStringArgs);
219
+ case 'array': {
220
+ let arr = [];
221
+ if (Array.isArray(value) && value.length) {
222
+ switch (arrayType) {
223
+ case 'int':
224
+ case 'integer':
225
+ arr = value.map((v) => prepareNumber(-2147483648, 2147483647, v));
226
+ break;
227
+ default: // + case 'string'
228
+ arr = value.map((v) => {
229
+ if (v === '') {
230
+ return v;
231
+ }
232
+ if (v == null) {
233
+ return null;
234
+ }
235
+ return mssqlEscape(String(value));
236
+ })
237
+ .filter((v) => v != null)
238
+ .map((v) => `"${v}"`);
239
+ break;
240
+ }
241
+ }
242
+ if (arr.length) {
243
+ return `{${arr.join(',')}`;
244
+ }
245
+ return '{}';
246
+ }
247
+ default:
248
+ return prepareSqlString(prepareSqlStringArgs);
249
+ }
250
+ };
251
+ //# sourceMappingURL=get-value-for-sql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-value-for-sql.js","sourceRoot":"","sources":["../../src/get-value-for-sql.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export * as db from './db';
2
+ export { prepareSqlString, correctRecordSchema, getRecordSchema, wrapTransaction, serialize, getRecordValuesForSQL, getSqlSetExpression, getSqlValuesExpression, prepareRecordForSQL, prepareDataForSQL, getRowsAffected, } from './sql';
3
+ export { binToHexString, getValueForSQL, } from './get-value-for-sql';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,MAAM,CAAC;AAE3B,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,eAAe,EACf,eAAe,EACf,SAAS,EACT,qBAAqB,EACrB,mBAAmB,EACnB,sBAAsB,EACtB,mBAAmB,EACnB,iBAAiB,EACjB,eAAe,GAChB,MAAM,OAAO,CAAC;AAEf,OAAO,EACL,cAAc,EACd,cAAc,GACf,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=interfaces.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../../src/interfaces.ts"],"names":[],"mappings":""}
@@ -0,0 +1,361 @@
1
+ // noinspection SqlResolve
2
+ import * as sql from 'mssql';
3
+ import * as _ from 'lodash';
4
+ import { echo } from 'af-echo-ts';
5
+ import * as cache from 'memory-cache';
6
+ import * as db from './db';
7
+ import { q, mssqlEscape } from './utils';
8
+ import { getValueForSQL } from './get-value-for-sql';
9
+ export { sql };
10
+ /**
11
+ * Подготовка строки для передачи в SQL
12
+ */
13
+ export const prepareSqlString = (args) => {
14
+ const { value, defaultValue = null, length = 0, nullable = false, noQuotes = false, escapeOnlySingleQuotes = false } = args;
15
+ if (value == null) {
16
+ if (nullable) {
17
+ return 'NULL';
18
+ }
19
+ if (defaultValue) {
20
+ return q(defaultValue, noQuotes);
21
+ }
22
+ return ''; // Это нештатная ситуация, т.к. поле не получит никакого значения ( ,, )
23
+ }
24
+ if (value === '') {
25
+ if (noQuotes) {
26
+ return ''; // Это нештатная ситуация, т.к. поле не получит никакого значения ( ,, )
27
+ }
28
+ return `''`;
29
+ }
30
+ let val = mssqlEscape(String(value), escapeOnlySingleQuotes);
31
+ if (length > 0) {
32
+ val = val.substring(0, length);
33
+ }
34
+ return q(val, noQuotes);
35
+ };
36
+ const FIELD_SCHEMA_PROPS = ['index', 'name', 'length', 'type', 'scale', 'precision', 'nullable', 'caseSensitive',
37
+ 'identity', 'mergeIdentity', 'readOnly', 'inputDateFormat', 'defaultValue'];
38
+ /**
39
+ * Корректировка схемы таблицы
40
+ * Поля с суффиксом _json получают тип "json". Остальные корректировки берутся из fieldTypeCorrection
41
+ * Например, для полей типа datetime можно передавать свойство inputDateFormat
42
+ */
43
+ export const correctRecordSchema = (recordSchemaAssoc,
44
+ // объект корректировок
45
+ fieldTypeCorrection) => {
46
+ _.each(recordSchemaAssoc, (fieldSchema, fieldName) => {
47
+ if (/_json$/i.test(fieldName)) {
48
+ fieldSchema.type = 'json';
49
+ }
50
+ switch (fieldSchema.type) {
51
+ case sql.NChar:
52
+ case sql.NText:
53
+ case sql.NVarChar:
54
+ if (fieldSchema.length) {
55
+ fieldSchema.length = Math.floor(fieldSchema.length / 2);
56
+ }
57
+ break;
58
+ case sql.UniqueIdentifier:
59
+ fieldSchema.length = 36;
60
+ break;
61
+ default:
62
+ }
63
+ });
64
+ if (fieldTypeCorrection && typeof fieldTypeCorrection === 'object') {
65
+ _.each(fieldTypeCorrection, (correction, fieldName) => {
66
+ FIELD_SCHEMA_PROPS.forEach((prop) => {
67
+ if (correction[prop] !== undefined) {
68
+ if (!recordSchemaAssoc[fieldName]) {
69
+ recordSchemaAssoc[fieldName] = {};
70
+ }
71
+ recordSchemaAssoc[fieldName][prop] = correction[prop];
72
+ }
73
+ });
74
+ });
75
+ }
76
+ };
77
+ /**
78
+ * Подготовка значений записи для использования в SQL
79
+ *
80
+ * Все поля записи обрабатываются функцией getValueForSQL
81
+ */
82
+ export const prepareRecordForSQL = (record, args) => {
83
+ const { addValues4NotNullableFields, addMissingFields } = args;
84
+ const { dateTimeOptions, needValidate, escapeOnlySingleQuotes, dialect } = args;
85
+ const options = {
86
+ value: null, fieldSchema: '', dateTimeOptions, needValidate, escapeOnlySingleQuotes, dialect,
87
+ };
88
+ args.recordSchema.forEach((fieldSchema) => {
89
+ const { name = '_#foo#_', readOnly } = fieldSchema;
90
+ if (readOnly) {
91
+ return;
92
+ }
93
+ if (Object.prototype.hasOwnProperty.call(record, name)) {
94
+ record[name] = getValueForSQL({ ...options, value: record[name], fieldSchema });
95
+ }
96
+ else if ((!fieldSchema.nullable && addValues4NotNullableFields) || addMissingFields) {
97
+ record[name] = getValueForSQL({ ...options, value: null, fieldSchema });
98
+ }
99
+ });
100
+ };
101
+ /**
102
+ * Подготовка данных для SQL
103
+ *
104
+ * Все поля всех записей обрабатываются функцией getValueForSQL
105
+ */
106
+ export const prepareDataForSQL = (recordSet, args) => {
107
+ if (recordSet._isPreparedForSQL) {
108
+ return;
109
+ }
110
+ recordSet.forEach((record) => {
111
+ prepareRecordForSQL(record, args);
112
+ });
113
+ recordSet._isPreparedForSQL = true;
114
+ };
115
+ /**
116
+ * Возвращает рекорд, в котором все значения преобразованы в строки и подготовлены для прямой вставки в SQL
117
+ * В частности, если значение типа строка, то оно уже заключено в одинарные кавычки
118
+ */
119
+ export const getRecordValuesForSQL = (record, recordSchema) => {
120
+ const recordValuesForSQL = {};
121
+ recordSchema.forEach((fieldSchema) => {
122
+ const { name = '_#foo#_', readOnly } = fieldSchema;
123
+ if (readOnly) {
124
+ return;
125
+ }
126
+ if (Object.prototype.hasOwnProperty.call(record, name)) {
127
+ recordValuesForSQL[name] = getValueForSQL({ value: record[name], fieldSchema, escapeOnlySingleQuotes: true });
128
+ }
129
+ });
130
+ return recordValuesForSQL;
131
+ };
132
+ /**
133
+ * Возвращает схему полей таблицы БД. Либо в виде объекта, либо в виде массива
134
+ * Если asArray = true, то вернет TRecordSchema, при этом удалит поля, указанные в omitFields
135
+ * Иначе вернет TRecordSchemaAssoc
136
+ */
137
+ export const getRecordSchema = async (
138
+ // ID соединения (borf|cep|hr|global)
139
+ connectionId,
140
+ // Субъект в выражении FROM для таблицы, схему которой нужно вернуть
141
+ schemaAndTable,
142
+ // Массив имен полей, которые нужно удалить из схемы (не учитывается, если asArray = false)
143
+ options = {}) => {
144
+ const propertyPath = `schemas.${connectionId}.${schemaAndTable}`;
145
+ let result = cache.get(propertyPath);
146
+ if (result) {
147
+ return result;
148
+ }
149
+ const { omitFields, pickFields, fieldTypeCorrection, mergeRules: { mergeIdentity = [], excludeFromInsert = [], noUpdateIfNull = false, correction: mergeCorrection, withClause, } = {}, noReturnMergeResult, } = options;
150
+ const cPool = await db.getPoolConnection(connectionId, { prefix: 'getRecordSchema' });
151
+ const request = new sql.Request(cPool);
152
+ request.stream = false;
153
+ let res;
154
+ try {
155
+ res = await request.query(`SELECT TOP(1) *
156
+ FROM ${schemaAndTable}`);
157
+ }
158
+ catch (err) {
159
+ echo.error(`getRecordSchema SQL ERROR`);
160
+ echo.error(err);
161
+ throw err;
162
+ }
163
+ const { columns } = res.recordset;
164
+ const readOnlyFields = Object.entries(columns).filter(([, { readOnly: ro }]) => ro).map(([f]) => f);
165
+ const omitFields2 = [...readOnlyFields, ...(Array.isArray(omitFields) ? omitFields : [])];
166
+ let schemaAssoc = _.omit(columns, omitFields2);
167
+ schemaAssoc = Array.isArray(pickFields) ? _.pick(schemaAssoc, pickFields) : schemaAssoc;
168
+ correctRecordSchema(schemaAssoc, fieldTypeCorrection);
169
+ const schema = _.map(schemaAssoc, (fo) => (fo))
170
+ .sort((a, b) => {
171
+ const ai = ((a === null || a === void 0 ? void 0 : a.index) || 0);
172
+ const bi = ((b === null || b === void 0 ? void 0 : b.index) || 0);
173
+ if (ai > bi)
174
+ return 1;
175
+ if (ai < bi)
176
+ return -1;
177
+ return 0;
178
+ });
179
+ const fields = schema.map((o) => o === null || o === void 0 ? void 0 : o.name).filter(Boolean);
180
+ const fieldsList = fields.map((fName) => `[${fName}]`)
181
+ .join(', ');
182
+ const onClause = `(${mergeIdentity.map((fName) => (`target.[${fName}] = source.[${fName}]`))
183
+ .join(' AND ')})`;
184
+ const insertFields = fields.filter((fName) => (!excludeFromInsert.includes(fName)));
185
+ const insertSourceList = insertFields.map((fName) => (`source.[${fName}]`))
186
+ .join(', ');
187
+ const insertFieldsList = insertFields.map((fName) => `[${fName}]`)
188
+ .join(', ');
189
+ const updateFields = fields.filter((fName) => (!mergeIdentity.includes(fName)));
190
+ let updateFieldsList;
191
+ if (noUpdateIfNull) {
192
+ updateFieldsList = updateFields.map((fName) => (`target.[${fName}] = COALESCE(source.[${fName}], target.[${fName}])`)).join(', ');
193
+ }
194
+ else {
195
+ updateFieldsList = updateFields.map((fName) => (`target.[${fName}] = source.[${fName}]`)).join(', ');
196
+ }
197
+ const dbConfig = db.getDbConfig(connectionId);
198
+ const dbSchemaAndTable = `[${dbConfig.database}].${schemaAndTable}`;
199
+ result = {
200
+ connectionId,
201
+ dbConfig,
202
+ schemaAndTable,
203
+ dbSchemaAndTable,
204
+ columns,
205
+ schemaAssoc,
206
+ schema,
207
+ fields,
208
+ insertFields,
209
+ insertFieldsList,
210
+ withClause,
211
+ updateFields,
212
+ mergeIdentity,
213
+ getMergeSQL(packet, prepareOptions = {}) {
214
+ if (prepareOptions.isPrepareForSQL) {
215
+ prepareDataForSQL(packet, { recordSchema: this.schema, ...prepareOptions });
216
+ }
217
+ const values = `(${packet.map((r) => (fields.map((fName) => (r[fName]))
218
+ .join(',')))
219
+ .join(`)\n,(`)})`;
220
+ let mergeSQL = `
221
+ MERGE ${schemaAndTable} ${withClause || ''} AS target
222
+ USING
223
+ (
224
+ SELECT * FROM
225
+ ( VALUES
226
+ ${values}
227
+ )
228
+ AS s (
229
+ ${fieldsList}
230
+ )
231
+ )
232
+ AS source
233
+ ON ${onClause}
234
+ WHEN MATCHED THEN
235
+ UPDATE SET
236
+ ${updateFieldsList}
237
+ WHEN NOT MATCHED THEN
238
+ INSERT (
239
+ ${insertFieldsList}
240
+ )
241
+ VALUES (
242
+ ${insertSourceList}
243
+ )`;
244
+ if (!noReturnMergeResult) {
245
+ mergeSQL = `
246
+ ${'DECLARE'} @t TABLE ( act VARCHAR(20));
247
+ DECLARE @total AS INTEGER;
248
+ DECLARE @i AS INTEGER;
249
+ DECLARE @u AS INTEGER;
250
+ ${mergeSQL}
251
+ OUTPUT $action INTO @t;
252
+ SET @total = @@ROWCOUNT;
253
+ SELECT @i = COUNT(*) FROM @t WHERE act = 'INSERT';
254
+ SELECT @u = COUNT(*) FROM @t WHERE act != 'INSERT';
255
+ SELECT @total as total, @i as inserted, @u as updated;
256
+ `;
257
+ }
258
+ else {
259
+ mergeSQL += `;\n`;
260
+ }
261
+ return typeof mergeCorrection === 'function' ? mergeCorrection(mergeSQL) : mergeSQL;
262
+ },
263
+ getInsertSQL(packet, addOutputInserted = false) {
264
+ if (!Array.isArray(packet)) {
265
+ packet = [packet];
266
+ }
267
+ const values = `(${packet.map((r) => (insertFields.map((fName) => (r[fName] === undefined ? 'NULL' : r[fName]))
268
+ .join(',')))
269
+ .join(`)\n,(`)})`;
270
+ return `INSERT INTO ${schemaAndTable} (${insertFieldsList}) ${addOutputInserted ? ' OUTPUT inserted.* ' : ''} VALUES ${values}`;
271
+ },
272
+ getUpdateSQL(record) {
273
+ const recordForSQL = getRecordValuesForSQL(record, this.schema);
274
+ const setArray = [];
275
+ updateFields.forEach((fName) => {
276
+ if (recordForSQL[fName] !== undefined) {
277
+ setArray.push(`[${fName}] = ${recordForSQL[fName]}`);
278
+ }
279
+ });
280
+ const where = `(${mergeIdentity.map((fName) => (`[${fName}] = ${recordForSQL[fName]}`))
281
+ .join(' AND ')})`;
282
+ return `UPDATE ${schemaAndTable}
283
+ SET ${setArray.join(', ')}
284
+ WHERE ${where};`;
285
+ },
286
+ };
287
+ cache.put(propertyPath, result);
288
+ return result;
289
+ };
290
+ /**
291
+ * Оборачивает инструкции SQL в транзакцию
292
+ */
293
+ export const wrapTransaction = (strSQL) => `BEGIN TRY
294
+ BEGIN TRANSACTION;
295
+
296
+ ${strSQL}
297
+
298
+ COMMIT TRANSACTION;
299
+ END TRY
300
+ BEGIN CATCH
301
+ DECLARE @ErrorMessage NVARCHAR(MAX)
302
+ , @ErrorSeverity INT
303
+ , @ErrorState INT;
304
+
305
+ SELECT
306
+ @ErrorMessage = ERROR_MESSAGE() + ' Line ' + CAST(ERROR_LINE() AS NVARCHAR(5))
307
+ , @ErrorSeverity = ERROR_SEVERITY()
308
+ , @ErrorState = ERROR_STATE();
309
+
310
+ IF @@trancount > 0
311
+ BEGIN
312
+ ROLLBACK TRANSACTION;
313
+ END;
314
+
315
+ RAISERROR(@ErrorMessage, @ErrorSeverity, @ErrorState);
316
+ END CATCH;`;
317
+ /**
318
+ * Возвращает проверенное и серилизованное значение
319
+ */
320
+ export const serialize = (value, fieldSchema) => {
321
+ const val = getValueForSQL({ value, fieldSchema });
322
+ if (val == null || val === 'NULL') {
323
+ return null;
324
+ }
325
+ if (typeof val === 'number') {
326
+ return val;
327
+ }
328
+ return String(val).replace(/(^')|('$)/g, '');
329
+ };
330
+ /**
331
+ * Возвращает подготовленное выражение SET для использования в UPDATE
332
+ */
333
+ export const getSqlSetExpression = (record, recordSchema) => {
334
+ const setArray = [];
335
+ recordSchema.forEach((fieldSchema) => {
336
+ const { name = '_#foo#_' } = fieldSchema;
337
+ if (Object.prototype.hasOwnProperty.call(record, name)) {
338
+ setArray.push(`[${name}] = ${getValueForSQL({ value: record[name], fieldSchema, escapeOnlySingleQuotes: true })}`);
339
+ }
340
+ });
341
+ return `SET ${setArray.join(', ')}`;
342
+ };
343
+ /**
344
+ * Возвращает подготовленное выражение (...поля...) VALUES (...значения...) для использования в INSERT
345
+ *
346
+ * addOutputInserted - Если true, добавляется выражение OUTPUT inserted.* перед VALUES
347
+ */
348
+ export const getSqlValuesExpression = (record, recordSchema, addOutputInserted = false) => {
349
+ const fieldsArray = [];
350
+ const valuesArray = [];
351
+ recordSchema.forEach((fieldSchema) => {
352
+ const { name = '_#foo#_' } = fieldSchema;
353
+ if (Object.prototype.hasOwnProperty.call(record, name)) {
354
+ fieldsArray.push(name);
355
+ valuesArray.push(String(getValueForSQL({ value: record[name], fieldSchema, escapeOnlySingleQuotes: true })));
356
+ }
357
+ });
358
+ return `([${fieldsArray.join('], [')}]) ${addOutputInserted ? ' OUTPUT inserted.* ' : ''} VALUES (${valuesArray.join(', ')})`;
359
+ };
360
+ export const getRowsAffected = (qResult) => (qResult.rowsAffected && qResult.rowsAffected.reduce((a, v) => a + v, 0)) || 0;
361
+ //# sourceMappingURL=sql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql.js","sourceRoot":"","sources":["../../src/sql.ts"],"names":[],"mappings":"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"}