af-db-ts 1.0.5 → 2.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 (173) hide show
  1. package/README.md +3 -3
  2. package/dist/cjs/__tests__/01_node_env.spec.js +7 -0
  3. package/dist/cjs/__tests__/01_node_env.spec.js.map +1 -0
  4. package/dist/cjs/__tests__/02_getValueForSqlMs.spec.js +50 -0
  5. package/dist/cjs/__tests__/02_getValueForSqlMs.spec.js.map +1 -0
  6. package/dist/cjs/__tests__/global-setup.js +7 -0
  7. package/dist/cjs/__tests__/global-setup.js.map +1 -0
  8. package/dist/cjs/__tests__/global-teardown.js +7 -0
  9. package/dist/cjs/__tests__/global-teardown.js.map +1 -0
  10. package/dist/cjs/{interfaces.js → src/@types/i-common.js} +1 -1
  11. package/dist/cjs/src/@types/i-common.js.map +1 -0
  12. package/dist/cjs/src/@types/i-config.js +3 -0
  13. package/dist/cjs/src/@types/i-config.js.map +1 -0
  14. package/dist/cjs/src/@types/i-ms.js +3 -0
  15. package/dist/cjs/src/@types/i-ms.js.map +1 -0
  16. package/dist/cjs/src/@types/i-pg.js +24 -0
  17. package/dist/cjs/src/@types/i-pg.js.map +1 -0
  18. package/dist/cjs/src/common.js +30 -0
  19. package/dist/cjs/src/common.js.map +1 -0
  20. package/dist/cjs/src/index.js +59 -0
  21. package/dist/cjs/src/index.js.map +1 -0
  22. package/dist/cjs/src/logger-error.js +10 -0
  23. package/dist/cjs/src/logger-error.js.map +1 -0
  24. package/dist/cjs/{get-value-for-sql.js → src/mssql/get-value-for-sql.js} +12 -8
  25. package/dist/cjs/src/mssql/get-value-for-sql.js.map +1 -0
  26. package/dist/cjs/{db.js → src/mssql/pool-ms.js} +73 -77
  27. package/dist/cjs/src/mssql/pool-ms.js.map +1 -0
  28. package/dist/cjs/src/mssql/query-ms.js +47 -0
  29. package/dist/cjs/src/mssql/query-ms.js.map +1 -0
  30. package/dist/cjs/{sql.js → src/mssql/sql.js} +72 -49
  31. package/dist/cjs/src/mssql/sql.js.map +1 -0
  32. package/dist/cjs/src/mssql/utils.js.map +1 -0
  33. package/dist/cjs/src/pg/get-merge-sql.js +50 -0
  34. package/dist/cjs/src/pg/get-merge-sql.js.map +1 -0
  35. package/dist/cjs/src/pg/get-update-sql.js +29 -0
  36. package/dist/cjs/src/pg/get-update-sql.js.map +1 -0
  37. package/dist/cjs/src/pg/insert.js +93 -0
  38. package/dist/cjs/src/pg/insert.js.map +1 -0
  39. package/dist/cjs/src/pg/is-table-or-view-exists.js +21 -0
  40. package/dist/cjs/src/pg/is-table-or-view-exists.js.map +1 -0
  41. package/dist/cjs/src/pg/pg-pool.js +52 -0
  42. package/dist/cjs/src/pg/pg-pool.js.map +1 -0
  43. package/dist/cjs/src/pg/prepare-value.js +84 -0
  44. package/dist/cjs/src/pg/prepare-value.js.map +1 -0
  45. package/dist/cjs/src/pg/query-pg.js +23 -0
  46. package/dist/cjs/src/pg/query-pg.js.map +1 -0
  47. package/dist/cjs/src/pg/table-schema.js +169 -0
  48. package/dist/cjs/src/pg/table-schema.js.map +1 -0
  49. package/dist/esm/src/@types/i-common.js +2 -0
  50. package/dist/esm/src/@types/i-common.js.map +1 -0
  51. package/dist/esm/src/@types/i-config.js +2 -0
  52. package/dist/esm/src/@types/i-config.js.map +1 -0
  53. package/dist/esm/src/@types/i-ms.js +2 -0
  54. package/dist/esm/src/@types/i-ms.js.map +1 -0
  55. package/dist/esm/src/@types/i-pg.js +21 -0
  56. package/dist/esm/src/@types/i-pg.js.map +1 -0
  57. package/dist/esm/src/common.js +25 -0
  58. package/dist/esm/src/common.js.map +1 -0
  59. package/dist/esm/src/index.js +15 -0
  60. package/dist/esm/src/index.js.map +1 -0
  61. package/dist/esm/src/logger-error.js +6 -0
  62. package/dist/esm/src/logger-error.js.map +1 -0
  63. package/dist/esm/{get-value-for-sql.js → src/mssql/get-value-for-sql.js} +11 -7
  64. package/dist/esm/src/mssql/get-value-for-sql.js.map +1 -0
  65. package/dist/esm/{db.js → src/mssql/pool-ms.js} +35 -62
  66. package/dist/esm/src/mssql/pool-ms.js.map +1 -0
  67. package/dist/esm/src/mssql/query-ms.js +20 -0
  68. package/dist/esm/src/mssql/query-ms.js.map +1 -0
  69. package/dist/esm/{sql.js → src/mssql/sql.js} +36 -36
  70. package/dist/esm/src/mssql/sql.js.map +1 -0
  71. package/dist/esm/src/mssql/utils.js.map +1 -0
  72. package/dist/esm/src/pg/get-merge-sql.js +46 -0
  73. package/dist/esm/src/pg/get-merge-sql.js.map +1 -0
  74. package/dist/esm/src/pg/get-update-sql.js +25 -0
  75. package/dist/esm/src/pg/get-update-sql.js.map +1 -0
  76. package/dist/esm/src/pg/insert.js +89 -0
  77. package/dist/esm/src/pg/insert.js.map +1 -0
  78. package/dist/esm/src/pg/is-table-or-view-exists.js +17 -0
  79. package/dist/esm/src/pg/is-table-or-view-exists.js.map +1 -0
  80. package/dist/esm/src/pg/pg-pool.js +43 -0
  81. package/dist/esm/src/pg/pg-pool.js.map +1 -0
  82. package/dist/esm/src/pg/prepare-value.js +79 -0
  83. package/dist/esm/src/pg/prepare-value.js.map +1 -0
  84. package/dist/esm/src/pg/query-pg.js +19 -0
  85. package/dist/esm/src/pg/query-pg.js.map +1 -0
  86. package/dist/esm/src/pg/table-schema.js +164 -0
  87. package/dist/esm/src/pg/table-schema.js.map +1 -0
  88. package/dist/types/src/@types/i-common.d.ts +35 -0
  89. package/dist/types/src/@types/i-common.d.ts.map +1 -0
  90. package/dist/types/src/@types/i-config.d.ts +60 -0
  91. package/dist/types/src/@types/i-config.d.ts.map +1 -0
  92. package/dist/types/{interfaces.d.ts → src/@types/i-ms.d.ts} +30 -77
  93. package/dist/types/src/@types/i-ms.d.ts.map +1 -0
  94. package/dist/types/src/@types/i-pg.d.ts +62 -0
  95. package/dist/types/src/@types/i-pg.d.ts.map +1 -0
  96. package/dist/types/src/common.d.ts +6 -0
  97. package/dist/types/src/common.d.ts.map +1 -0
  98. package/dist/types/src/index.d.ts +18 -0
  99. package/dist/types/src/index.d.ts.map +1 -0
  100. package/dist/types/src/logger-error.d.ts +7 -0
  101. package/dist/types/src/logger-error.d.ts.map +1 -0
  102. package/dist/types/src/mssql/get-value-for-sql.d.ts +11 -0
  103. package/dist/types/src/mssql/get-value-for-sql.d.ts.map +1 -0
  104. package/dist/types/{db.d.ts → src/mssql/pool-ms.d.ts} +18 -15
  105. package/dist/types/src/mssql/pool-ms.d.ts.map +1 -0
  106. package/dist/types/src/mssql/query-ms.d.ts +3 -0
  107. package/dist/types/src/mssql/query-ms.d.ts.map +1 -0
  108. package/dist/types/{sql.d.ts → src/mssql/sql.d.ts} +17 -16
  109. package/dist/types/src/mssql/sql.d.ts.map +1 -0
  110. package/dist/types/src/mssql/utils.d.ts.map +1 -0
  111. package/dist/types/src/pg/get-merge-sql.d.ts +9 -0
  112. package/dist/types/src/pg/get-merge-sql.d.ts.map +1 -0
  113. package/dist/types/src/pg/get-update-sql.d.ts +3 -0
  114. package/dist/types/src/pg/get-update-sql.d.ts.map +1 -0
  115. package/dist/types/src/pg/insert.d.ts +15 -0
  116. package/dist/types/src/pg/insert.d.ts.map +1 -0
  117. package/dist/types/src/pg/is-table-or-view-exists.d.ts +2 -0
  118. package/dist/types/src/pg/is-table-or-view-exists.d.ts.map +1 -0
  119. package/dist/types/src/pg/pg-pool.d.ts +6 -0
  120. package/dist/types/src/pg/pg-pool.d.ts.map +1 -0
  121. package/dist/types/src/pg/prepare-value.d.ts +7 -0
  122. package/dist/types/src/pg/prepare-value.d.ts.map +1 -0
  123. package/dist/types/src/pg/query-pg.d.ts +3 -0
  124. package/dist/types/src/pg/query-pg.d.ts.map +1 -0
  125. package/dist/types/src/pg/table-schema.d.ts +12 -0
  126. package/dist/types/src/pg/table-schema.d.ts.map +1 -0
  127. package/package.json +21 -24
  128. package/src/@types/i-common.ts +39 -0
  129. package/src/@types/i-config.ts +75 -0
  130. package/src/{interfaces.ts → @types/i-ms.ts} +29 -86
  131. package/src/@types/i-pg.ts +67 -0
  132. package/src/common.ts +26 -0
  133. package/src/index.ts +104 -42
  134. package/src/logger-error.ts +11 -0
  135. package/src/{get-value-for-sql.ts → mssql/get-value-for-sql.ts} +15 -9
  136. package/src/{db.ts → mssql/pool-ms.ts} +40 -71
  137. package/src/mssql/query-ms.ts +25 -0
  138. package/src/{sql.ts → mssql/sql.ts} +56 -59
  139. package/src/pg/get-merge-sql.ts +60 -0
  140. package/src/pg/get-update-sql.ts +31 -0
  141. package/src/pg/insert.ts +118 -0
  142. package/src/pg/is-table-or-view-exists.ts +21 -0
  143. package/src/pg/pg-pool.ts +49 -0
  144. package/src/pg/prepare-value.ts +90 -0
  145. package/src/pg/query-pg.ts +26 -0
  146. package/src/pg/table-schema.ts +178 -0
  147. package/dist/cjs/db.js.map +0 -1
  148. package/dist/cjs/get-value-for-sql.js.map +0 -1
  149. package/dist/cjs/index.js +0 -21
  150. package/dist/cjs/index.js.map +0 -1
  151. package/dist/cjs/interfaces.js.map +0 -1
  152. package/dist/cjs/sql.js.map +0 -1
  153. package/dist/cjs/utils.js.map +0 -1
  154. package/dist/esm/db.js.map +0 -1
  155. package/dist/esm/get-value-for-sql.js.map +0 -1
  156. package/dist/esm/index.js +0 -4
  157. package/dist/esm/index.js.map +0 -1
  158. package/dist/esm/interfaces.js +0 -2
  159. package/dist/esm/interfaces.js.map +0 -1
  160. package/dist/esm/sql.js.map +0 -1
  161. package/dist/esm/utils.js.map +0 -1
  162. package/dist/types/db.d.ts.map +0 -1
  163. package/dist/types/get-value-for-sql.d.ts +0 -7
  164. package/dist/types/get-value-for-sql.d.ts.map +0 -1
  165. package/dist/types/index.d.ts +0 -5
  166. package/dist/types/index.d.ts.map +0 -1
  167. package/dist/types/interfaces.d.ts.map +0 -1
  168. package/dist/types/sql.d.ts.map +0 -1
  169. package/dist/types/utils.d.ts.map +0 -1
  170. /package/dist/cjs/{utils.js → src/mssql/utils.js} +0 -0
  171. /package/dist/esm/{utils.js → src/mssql/utils.js} +0 -0
  172. /package/dist/types/{utils.d.ts → src/mssql/utils.d.ts} +0 -0
  173. /package/src/{utils.ts → mssql/utils.ts} +0 -0
@@ -1,19 +1,18 @@
1
- import * as config from 'config';
2
- import { magenta } from 'af-color';
1
+ import config from 'config';
3
2
  import { echo } from 'af-echo-ts';
4
3
  import * as sql from 'mssql';
5
- import * as _ from 'lodash';
6
4
  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 = {};
5
+ import { logSqlError } from '../common';
6
+ const mssqlConfigs = config.get('db.postgres');
7
+ export const getDbConfigMs = (connectionId) => mssqlConfigs.dbs[connectionId];
8
+ export const poolsCacheMs = {};
10
9
  /**
11
10
  * Возвращает пул соединений для БД, соответствующей преданному ID соединения (borf|cep|hr|global)
12
11
  * В случае, если не удается создать пул или открыть соединение, прерывает работу скрипта
13
12
  */
14
- export const getPoolConnection = async (connectionId, options = {}) => {
13
+ export const getPoolConnectionMs = async (connectionId, options = {}) => {
15
14
  const { prefix = '', errorCode = 0 } = options;
16
- let pool = pools[connectionId];
15
+ let pool = poolsCacheMs[connectionId];
17
16
  if (pool === null || pool === void 0 ? void 0 : pool.connected) {
18
17
  return pool;
19
18
  }
@@ -48,11 +47,11 @@ export const getPoolConnection = async (connectionId, options = {}) => {
48
47
  if (typeof pool !== 'object') {
49
48
  resume(`Can't create connection pool "${connectionId}"`);
50
49
  }
51
- pools[connectionId] = pool;
50
+ poolsCacheMs[connectionId] = pool;
52
51
  // @ts-ignore
53
52
  pool._connectionId = connectionId;
54
53
  pool.on('close', () => {
55
- delete pools[connectionId];
54
+ delete poolsCacheMs[connectionId];
56
55
  });
57
56
  pool.on('error', (err) => {
58
57
  echo.error('POOL-ERROR', err);
@@ -72,7 +71,7 @@ export const getPoolConnection = async (connectionId, options = {}) => {
72
71
  * prefix - Префикс в сообщении о закрытии пула (название синхронизации)
73
72
  * noEcho - подавление сообщений о закрытии соединения
74
73
  */
75
- export const closeDbConnections = async (poolsToClose, prefix, noEcho) => {
74
+ export const closeDbConnectionsMs = async (poolsToClose, prefix, noEcho) => {
76
75
  if (!Array.isArray(poolsToClose)) {
77
76
  // @ts-ignore
78
77
  poolsToClose = [poolsToClose];
@@ -84,14 +83,14 @@ export const closeDbConnections = async (poolsToClose, prefix, noEcho) => {
84
83
  if (pool) {
85
84
  if (typeof pool === 'string') {
86
85
  connectionId = pool;
87
- pool = pools[connectionId];
86
+ pool = poolsCacheMs[connectionId];
88
87
  }
89
88
  else if (typeof pool === 'object') {
90
89
  // @ts-ignore
91
90
  connectionId = pool._connectionId;
92
91
  }
93
92
  if (connectionId) {
94
- delete pools[connectionId];
93
+ delete poolsCacheMs[connectionId];
95
94
  }
96
95
  if (pool && pool.close) {
97
96
  try {
@@ -114,15 +113,29 @@ export const closeDbConnections = async (poolsToClose, prefix, noEcho) => {
114
113
  }
115
114
  }
116
115
  };
116
+ /**
117
+ * @deprecated since version 2.0.0
118
+ */
119
+ export const closeAllDbConnections = async (prefix, noEcho) => {
120
+ const poolsToClose = Object.values(poolsCacheMs);
121
+ await closeDbConnectionsMs(poolsToClose, prefix, noEcho);
122
+ };
117
123
  /**
118
124
  * Закрывает все соединения с БД
119
125
  *
120
126
  * prefix - Префикс в сообщении о закрытии пула (название синхронизации)
121
127
  * noEcho - подавление сообщений о закрытии соединения
122
128
  */
123
- export const closeAllDbConnections = async (prefix, noEcho) => {
124
- const poolsToClose = _.map(pools, (p) => p);
125
- await closeDbConnections(poolsToClose, prefix, noEcho);
129
+ export const closeAllDbConnectionsMs = async (prefix, noEcho) => {
130
+ const poolsToClose = Object.values(poolsCacheMs);
131
+ await closeDbConnectionsMs(poolsToClose, prefix, noEcho);
132
+ };
133
+ /**
134
+ * @deprecated since version 2.0.0
135
+ */
136
+ export const closeDbConnectionsAndExit = async (poolsToClose, prefix) => {
137
+ await closeDbConnectionsMs(poolsToClose, prefix);
138
+ process.exit(0);
126
139
  };
127
140
  /**
128
141
  * Закрывает указанные соединения с БД и прерывает работу скрипта
@@ -130,56 +143,16 @@ export const closeAllDbConnections = async (prefix, noEcho) => {
130
143
  * poolsToClose - пул или массив пулов
131
144
  * prefix - Префикс в сообщении о закрытии пула (название синхронизации)
132
145
  */
133
- export const closeDbConnectionsAndExit = async (poolsToClose, prefix) => {
134
- await closeDbConnections(poolsToClose, prefix);
146
+ export const closeDbConnectionsAndExitMs = async (poolsToClose, prefix) => {
147
+ await closeDbConnectionsMs(poolsToClose, prefix);
135
148
  process.exit(0);
136
149
  };
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;
150
+ export const getPoolMs = async (connectionId, throwError) => {
177
151
  try {
178
- res = await request.query(textSQL);
179
- return res;
152
+ return getPoolConnectionMs(connectionId);
180
153
  }
181
154
  catch (err) {
182
- logSqlError(err, noThrow, textSQL, prefix);
155
+ logSqlError(err, throwError, `Error while open connection to DB ${connectionId}`);
183
156
  }
184
157
  };
185
- //# sourceMappingURL=db.js.map
158
+ //# sourceMappingURL=pool-ms.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pool-ms.js","sourceRoot":"","sources":["../../../../src/mssql/pool-ms.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import * as sql from 'mssql';
2
+ import { logSqlError } from '../common';
3
+ import { closeDbConnectionsMs, getPoolMs } from './pool-ms';
4
+ export const queryMs = async (connectionId, sqlText, throwError, prefix) => {
5
+ const pool = await getPoolMs(connectionId, throwError);
6
+ if (!(pool === null || pool === void 0 ? void 0 : pool.connected) && !(pool === null || pool === void 0 ? void 0 : pool.connecting)) {
7
+ await closeDbConnectionsMs(connectionId);
8
+ return;
9
+ }
10
+ const request = new sql.Request(pool);
11
+ let res;
12
+ try {
13
+ res = await request.query(sqlText);
14
+ return res;
15
+ }
16
+ catch (err) {
17
+ logSqlError(err, !throwError, sqlText, prefix);
18
+ }
19
+ };
20
+ //# sourceMappingURL=query-ms.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-ms.js","sourceRoot":"","sources":["../../../../src/mssql/query-ms.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,GAAG,MAAM,OAAO,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,oBAAoB,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAE5D,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,EAC1B,YAAoB,EACpB,OAAe,EACf,UAAoB,EACpB,MAAe,EACoB,EAAE;IACrC,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;IACvD,IAAI,CAAC,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,SAAS,CAAA,IAAI,CAAC,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,UAAU,CAAA,EAAE;QACzC,MAAM,oBAAoB,CAAC,YAAY,CAAC,CAAC;QACzC,OAAO;KACR;IACD,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,IAAI,GAAiB,CAAC;IACtB,IAAI;QACF,GAAG,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACnC,OAAO,GAAG,CAAC;KACZ;IAAC,OAAO,GAAG,EAAE;QACZ,WAAW,CAAC,GAAG,EAAE,CAAC,UAAU,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;KAChD;AACH,CAAC,CAAC"}
@@ -1,16 +1,16 @@
1
1
  // noinspection SqlResolve
2
2
  import * as sql from 'mssql';
3
- import * as _ from 'lodash';
4
3
  import { echo } from 'af-echo-ts';
5
4
  import * as cache from 'memory-cache';
6
- import * as db from './db';
5
+ import { each, omit, pick } from 'af-tools-ts';
6
+ import * as db from './pool-ms';
7
7
  import { q, mssqlEscape } from './utils';
8
- import { getValueForSQL } from './get-value-for-sql';
8
+ import { getValueForSqlMs } from './get-value-for-sql';
9
9
  export { sql };
10
10
  /**
11
11
  * Подготовка строки для передачи в SQL
12
12
  */
13
- export const prepareSqlString = (args) => {
13
+ export const prepareSqlStringMs = (args) => {
14
14
  const { value, defaultValue = null, length = 0, nullable = false, noQuotes = false, escapeOnlySingleQuotes = false } = args;
15
15
  if (value == null) {
16
16
  if (nullable) {
@@ -40,10 +40,10 @@ const FIELD_SCHEMA_PROPS = ['index', 'name', 'length', 'type', 'scale', 'precisi
40
40
  * Поля с суффиксом _json получают тип "json". Остальные корректировки берутся из fieldTypeCorrection
41
41
  * Например, для полей типа datetime можно передавать свойство inputDateFormat
42
42
  */
43
- export const correctRecordSchema = (recordSchemaAssoc,
43
+ export const correctRecordSchemaMs = (recordSchemaAssoc,
44
44
  // объект корректировок
45
45
  fieldTypeCorrection) => {
46
- _.each(recordSchemaAssoc, (fieldSchema, fieldName) => {
46
+ each(recordSchemaAssoc, (fieldSchema, fieldName) => {
47
47
  if (/_json$/i.test(fieldName)) {
48
48
  fieldSchema.type = 'json';
49
49
  }
@@ -62,7 +62,7 @@ fieldTypeCorrection) => {
62
62
  }
63
63
  });
64
64
  if (fieldTypeCorrection && typeof fieldTypeCorrection === 'object') {
65
- _.each(fieldTypeCorrection, (correction, fieldName) => {
65
+ each(fieldTypeCorrection, (correction, fieldName) => {
66
66
  FIELD_SCHEMA_PROPS.forEach((prop) => {
67
67
  if (correction[prop] !== undefined) {
68
68
  if (!recordSchemaAssoc[fieldName]) {
@@ -77,9 +77,9 @@ fieldTypeCorrection) => {
77
77
  /**
78
78
  * Подготовка значений записи для использования в SQL
79
79
  *
80
- * Все поля записи обрабатываются функцией getValueForSQL
80
+ * Все поля записи обрабатываются функцией getValueForSqlMs
81
81
  */
82
- export const prepareRecordForSQL = (record, args) => {
82
+ export const prepareRecordForSqlMs = (record, args) => {
83
83
  const { recordSchema, addValues4NotNullableFields, addMissingFields } = args;
84
84
  const { dateTimeOptions, needValidate, escapeOnlySingleQuotes, dialect } = args;
85
85
  const options = {
@@ -96,24 +96,24 @@ export const prepareRecordForSQL = (record, args) => {
96
96
  return;
97
97
  }
98
98
  if (Object.prototype.hasOwnProperty.call(record, name)) {
99
- record[name] = getValueForSQL({ ...options, value: record[name], fieldSchema });
99
+ record[name] = getValueForSqlMs({ ...options, value: record[name], fieldSchema });
100
100
  }
101
101
  else if ((!fieldSchema.nullable && addValues4NotNullableFields) || addMissingFields) {
102
- record[name] = getValueForSQL({ ...options, value: null, fieldSchema });
102
+ record[name] = getValueForSqlMs({ ...options, value: null, fieldSchema });
103
103
  }
104
104
  });
105
105
  };
106
106
  /**
107
107
  * Подготовка данных для SQL
108
108
  *
109
- * Все поля всех записей обрабатываются функцией getValueForSQL
109
+ * Все поля всех записей обрабатываются функцией getValueForSqlMs
110
110
  */
111
- export const prepareDataForSQL = (recordSet, args) => {
111
+ export const prepareDataForSqlMs = (recordSet, args) => {
112
112
  if (recordSet._isPreparedForSQL) {
113
113
  return;
114
114
  }
115
115
  recordSet.forEach((record) => {
116
- prepareRecordForSQL(record, args);
116
+ prepareRecordForSqlMs(record, args);
117
117
  });
118
118
  recordSet._isPreparedForSQL = true;
119
119
  };
@@ -121,7 +121,7 @@ export const prepareDataForSQL = (recordSet, args) => {
121
121
  * Возвращает рекорд, в котором все значения преобразованы в строки и подготовлены для прямой вставки в SQL
122
122
  * В частности, если значение типа строка, то оно уже заключено в одинарные кавычки
123
123
  */
124
- export const getRecordValuesForSQL = (record, recordSchema) => {
124
+ export const getRecordValuesForSqlMs = (record, recordSchema) => {
125
125
  const recordValuesForSQL = {};
126
126
  recordSchema.forEach((fieldSchema) => {
127
127
  const { name = '_#foo#_', readOnly } = fieldSchema;
@@ -129,7 +129,7 @@ export const getRecordValuesForSQL = (record, recordSchema) => {
129
129
  return;
130
130
  }
131
131
  if (Object.prototype.hasOwnProperty.call(record, name)) {
132
- recordValuesForSQL[name] = getValueForSQL({
132
+ recordValuesForSQL[name] = getValueForSqlMs({
133
133
  value: record[name],
134
134
  fieldSchema,
135
135
  escapeOnlySingleQuotes: true,
@@ -142,10 +142,10 @@ export const getRecordValuesForSQL = (record, recordSchema) => {
142
142
  };
143
143
  /**
144
144
  * Возвращает схему полей таблицы БД. Либо в виде объекта, либо в виде массива
145
- * Если asArray = true, то вернет TRecordSchema, при этом удалит поля, указанные в omitFields
146
- * Иначе вернет TRecordSchemaAssoc
145
+ * Если asArray = true, то вернет TRecordSchemaMs, при этом удалит поля, указанные в omitFields
146
+ * Иначе вернет TRecordSchemaAssocMs
147
147
  */
148
- export const getRecordSchema = async (
148
+ export const getRecordSchemaMs = async (
149
149
  // ID соединения (borf|cep|hr|global)
150
150
  connectionId,
151
151
  // Субъект в выражении FROM для таблицы, схему которой нужно вернуть
@@ -158,7 +158,7 @@ options = {}) => {
158
158
  return result;
159
159
  }
160
160
  const { omitFields, pickFields, fieldTypeCorrection, mergeRules: { mergeIdentity = [], excludeFromInsert = [], noUpdateIfNull = false, correction: mergeCorrection, withClause, } = {}, noReturnMergeResult, dateTimeOptions, } = options;
161
- const cPool = await db.getPoolConnection(connectionId, { prefix: 'getRecordSchema' });
161
+ const cPool = await db.getPoolConnectionMs(connectionId, { prefix: 'getRecordSchemaMs' });
162
162
  const request = new sql.Request(cPool);
163
163
  request.stream = false;
164
164
  let res;
@@ -167,17 +167,17 @@ options = {}) => {
167
167
  FROM ${schemaAndTable}`);
168
168
  }
169
169
  catch (err) {
170
- echo.error(`getRecordSchema SQL ERROR`);
170
+ echo.error(`getRecordSchemaMs SQL ERROR`);
171
171
  echo.error(err);
172
172
  throw err;
173
173
  }
174
174
  const { columns } = res.recordset;
175
175
  const readOnlyFields = Object.entries(columns).filter(([, { readOnly: ro }]) => ro).map(([f]) => f);
176
176
  const omitFields2 = [...readOnlyFields, ...(Array.isArray(omitFields) ? omitFields : [])];
177
- let schemaAssoc = _.omit(columns, omitFields2);
178
- schemaAssoc = Array.isArray(pickFields) ? _.pick(schemaAssoc, pickFields) : schemaAssoc;
179
- correctRecordSchema(schemaAssoc, fieldTypeCorrection);
180
- const schema = _.map(schemaAssoc, (fo) => (fo))
177
+ let schemaAssoc = omit(columns, omitFields2);
178
+ schemaAssoc = Array.isArray(pickFields) ? pick(schemaAssoc, pickFields) : schemaAssoc;
179
+ correctRecordSchemaMs(schemaAssoc, fieldTypeCorrection);
180
+ const schema = Object.values(schemaAssoc)
181
181
  .sort((a, b) => {
182
182
  const ai = ((a === null || a === void 0 ? void 0 : a.index) || 0);
183
183
  const bi = ((b === null || b === void 0 ? void 0 : b.index) || 0);
@@ -206,7 +206,7 @@ options = {}) => {
206
206
  else {
207
207
  updateFieldsList = updateFields.map((fName) => (`target.[${fName}] = source.[${fName}]`)).join(', ');
208
208
  }
209
- const dbConfig = db.getDbConfig(connectionId);
209
+ const dbConfig = db.getDbConfigMs(connectionId);
210
210
  const dbSchemaAndTable = `[${dbConfig.database}].${schemaAndTable}`;
211
211
  result = {
212
212
  connectionId,
@@ -224,7 +224,7 @@ options = {}) => {
224
224
  mergeIdentity,
225
225
  getMergeSQL(packet, prepareOptions = {}) {
226
226
  if (prepareOptions.isPrepareForSQL) {
227
- prepareDataForSQL(packet, { recordSchema: this.schema, ...prepareOptions });
227
+ prepareDataForSqlMs(packet, { recordSchema: this.schema, ...prepareOptions });
228
228
  }
229
229
  const values = `(${packet.map((r) => (fields.map((fName) => (r[fName]))
230
230
  .join(',')))
@@ -282,7 +282,7 @@ SELECT @total as total, @i as inserted, @u as updated;
282
282
  return `INSERT INTO ${schemaAndTable} (${insertFieldsList}) ${addOutputInserted ? ' OUTPUT inserted.* ' : ''} VALUES ${values}`;
283
283
  },
284
284
  getUpdateSQL(record) {
285
- const recordForSQL = getRecordValuesForSQL(record, this.schema);
285
+ const recordForSQL = getRecordValuesForSqlMs(record, this.schema);
286
286
  const setArray = [];
287
287
  updateFields.forEach((fName) => {
288
288
  if (recordForSQL[fName] !== undefined) {
@@ -302,7 +302,7 @@ SELECT @total as total, @i as inserted, @u as updated;
302
302
  /**
303
303
  * Оборачивает инструкции SQL в транзакцию
304
304
  */
305
- export const wrapTransaction = (strSQL) => `BEGIN TRY
305
+ export const wrapTransactionMs = (strSQL) => `BEGIN TRY
306
306
  BEGIN TRANSACTION;
307
307
 
308
308
  ${strSQL}
@@ -329,8 +329,8 @@ END CATCH;`;
329
329
  /**
330
330
  * Возвращает проверенное и серилизованное значение
331
331
  */
332
- export const serialize = (args) => {
333
- const val = getValueForSQL(args);
332
+ export const serializeMs = (args) => {
333
+ const val = getValueForSqlMs(args);
334
334
  if (val == null || val === 'NULL') {
335
335
  return null;
336
336
  }
@@ -342,13 +342,13 @@ export const serialize = (args) => {
342
342
  /**
343
343
  * Возвращает подготовленное выражение SET для использования в UPDATE
344
344
  */
345
- export const getSqlSetExpression = (record, recordSchema) => {
345
+ export const getSqlSetExpressionMs = (record, recordSchema) => {
346
346
  const setArray = [];
347
347
  const { dateTimeOptions } = recordSchema;
348
348
  recordSchema.forEach((fieldSchema) => {
349
349
  const { name = '_#foo#_' } = fieldSchema;
350
350
  if (Object.prototype.hasOwnProperty.call(record, name)) {
351
- setArray.push(`[${name}] = ${getValueForSQL({
351
+ setArray.push(`[${name}] = ${getValueForSqlMs({
352
352
  value: record[name],
353
353
  fieldSchema,
354
354
  dateTimeOptions,
@@ -363,7 +363,7 @@ export const getSqlSetExpression = (record, recordSchema) => {
363
363
  *
364
364
  * addOutputInserted - Если true, добавляется выражение OUTPUT inserted.* перед VALUES
365
365
  */
366
- export const getSqlValuesExpression = (record, recordSchema, addOutputInserted = false) => {
366
+ export const getSqlValuesExpressionMs = (record, recordSchema, addOutputInserted = false) => {
367
367
  const fieldsArray = [];
368
368
  const valuesArray = [];
369
369
  const { dateTimeOptions } = recordSchema;
@@ -371,7 +371,7 @@ export const getSqlValuesExpression = (record, recordSchema, addOutputInserted =
371
371
  const { name = '_#foo#_' } = fieldSchema;
372
372
  if (Object.prototype.hasOwnProperty.call(record, name)) {
373
373
  fieldsArray.push(name);
374
- const val = getValueForSQL({
374
+ const val = getValueForSqlMs({
375
375
  value: record[name],
376
376
  fieldSchema,
377
377
  dateTimeOptions,
@@ -382,5 +382,5 @@ export const getSqlValuesExpression = (record, recordSchema, addOutputInserted =
382
382
  });
383
383
  return `([${fieldsArray.join('], [')}]) ${addOutputInserted ? ' OUTPUT inserted.* ' : ''} VALUES (${valuesArray.join(', ')})`;
384
384
  };
385
- export const getRowsAffected = (qResult) => (qResult.rowsAffected && qResult.rowsAffected.reduce((a, v) => a + v, 0)) || 0;
385
+ export const getRowsAffectedMs = (qResult) => (qResult.rowsAffected && qResult.rowsAffected.reduce((a, v) => a + v, 0)) || 0;
386
386
  //# sourceMappingURL=sql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql.js","sourceRoot":"","sources":["../../../../src/mssql/sql.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/mssql/utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,GAAW,EAAE,QAAkB,EAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC;AAE5F;;;GAGG;AACH,MAAM,CAAC,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"}
@@ -0,0 +1,46 @@
1
+ import { getTableSchemaPg } from './table-schema';
2
+ import { prepareSqlValuePg } from './prepare-value';
3
+ export const getMergeSqlPg = async (arg) => {
4
+ const { connectionId, targetSchemaAndTable, recordset, omitFields = [], noUpdateIfNull } = arg;
5
+ if (!(recordset === null || recordset === void 0 ? void 0 : recordset.length)) {
6
+ return '';
7
+ }
8
+ const tableSchema = await getTableSchemaPg(connectionId, targetSchemaAndTable);
9
+ const { recordSchema, pk, fieldsWoSerials, defaults } = tableSchema;
10
+ let insertFieldsList = fieldsWoSerials;
11
+ if (omitFields.length) {
12
+ const set = new Set(omitFields);
13
+ insertFieldsList = fieldsWoSerials.filter((fieldName) => !set.has(fieldName));
14
+ }
15
+ const insertValues = recordset.map((record) => {
16
+ const preparedValues = [];
17
+ insertFieldsList.forEach((fieldName) => {
18
+ const value = record[fieldName];
19
+ let pgSqlValue = prepareSqlValuePg({ value, fieldDef: recordSchema[fieldName] });
20
+ if (defaults[fieldName] != null && pgSqlValue === 'null') {
21
+ pgSqlValue = defaults[fieldName];
22
+ }
23
+ preparedValues.push(pgSqlValue);
24
+ });
25
+ return `(${preparedValues.join(', ')})`;
26
+ }).join(',\n').trim();
27
+ const upsertFields = insertFieldsList.map((f) => {
28
+ const vArr = [`EXCLUDED."${f}"`];
29
+ if (noUpdateIfNull) {
30
+ vArr.push(`${targetSchemaAndTable}."${f}"`);
31
+ }
32
+ if (defaults[f]) {
33
+ vArr.push(defaults[f]);
34
+ }
35
+ return `"${f}" = ${vArr.length > 1 ? `COALESCE(${vArr.join(', ')})` : vArr[0]}`;
36
+ }).join(',\n');
37
+ // noinspection UnnecessaryLocalVariableJS
38
+ const mergeSQL = `${'INSERT'} INTO ${targetSchemaAndTable}
39
+ (${insertFieldsList.join(', ')})
40
+ VALUES ${insertValues}
41
+ ON CONFLICT (${pk.map((f) => `"${f}"`).join(', ')})
42
+ DO UPDATE SET ${upsertFields}
43
+ `;
44
+ return mergeSQL;
45
+ };
46
+ //# sourceMappingURL=get-merge-sql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-merge-sql.js","sourceRoot":"","sources":["../../../../src/pg/get-merge-sql.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { getTableSchemaPg } from './table-schema';
2
+ import { prepareSqlValuePg } from './prepare-value';
3
+ export const getUpdateSqlPg = async (connectionId, schemaAndTable, record, customSets = {}) => {
4
+ const tableSchema = await getTableSchemaPg(connectionId, schemaAndTable);
5
+ const { recordSchema, pk, fieldsWoSerials } = tableSchema;
6
+ const sqlValue = (fieldName) => prepareSqlValuePg({ value: record[fieldName], fieldDef: recordSchema[fieldName] });
7
+ const preparedRecord = {};
8
+ fieldsWoSerials.forEach((f) => {
9
+ if (pk.includes(f)) {
10
+ return;
11
+ }
12
+ if (customSets[f] !== undefined) {
13
+ preparedRecord[f] = customSets[f];
14
+ }
15
+ else if (record[f] !== undefined) {
16
+ preparedRecord[f] = sqlValue(f);
17
+ }
18
+ });
19
+ const sets = Object.entries(preparedRecord).map(([f, v]) => `"${f}" = ${v}`).join(', ');
20
+ const where = pk.map((f) => `"${f}" = ${sqlValue(f)}`).join(' AND ');
21
+ return `${'UPDATE'} ${schemaAndTable} SET
22
+ ${sets}
23
+ WHERE ${where};`;
24
+ };
25
+ //# sourceMappingURL=get-update-sql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-update-sql.js","sourceRoot":"","sources":["../../../../src/pg/get-update-sql.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAIpD,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EACjC,YAAoB,EACpB,cAAsB,EACtB,MAAiB,EACjB,aAAwB,EAAE,EACT,EAAE;IACnB,MAAM,WAAW,GAAmB,MAAM,gBAAgB,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;IACzF,MAAM,EAAE,YAAY,EAAE,EAAE,EAAE,eAAe,EAAE,GAAG,WAAW,CAAC;IAC1D,MAAM,QAAQ,GAAG,CAAC,SAAiB,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,YAAY,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IAC3H,MAAM,cAAc,GAAc,EAAE,CAAC;IACrC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;QAC5B,IAAI,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE;YAClB,OAAO;SACR;QACD,IAAI,UAAU,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE;YAC/B,cAAc,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;SACnC;aAAM,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE;YAClC,cAAc,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;SACjC;IACH,CAAC,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxF,MAAM,KAAK,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACrE,OAAO,GAAG,QAAQ,IAAI,cAAc;MAChC,IAAI;UACA,KAAK,GAAG,CAAC;AACnB,CAAC,CAAC"}
@@ -0,0 +1,89 @@
1
+ import { omitBy } from 'af-tools-ts';
2
+ import { getFieldsAndValuesPg, getTableSchemaPg } from './table-schema';
3
+ import { queryPg } from './query-pg';
4
+ import { logger } from '../logger-error';
5
+ export var EUpdateLevel;
6
+ (function (EUpdateLevel) {
7
+ EUpdateLevel[EUpdateLevel["NEVER_UPDATE"] = 0] = "NEVER_UPDATE";
8
+ EUpdateLevel[EUpdateLevel["UPDATE_IF_NOT_FOUND"] = 1] = "UPDATE_IF_NOT_FOUND";
9
+ EUpdateLevel[EUpdateLevel["UPDATE_ALWAYS"] = 2] = "UPDATE_ALWAYS";
10
+ })(EUpdateLevel || (EUpdateLevel = {}));
11
+ const hasAllValues = (fieldList, record) => (fieldList === null || fieldList === void 0 ? void 0 : fieldList.length) && fieldList.every((f) => record[f] !== undefined);
12
+ const selectByAnyIdentity = async (connectionId, identities, record, source) => {
13
+ var _a, _b;
14
+ const identityAlternativesArr = [];
15
+ let pos = 0;
16
+ const positionValues = [];
17
+ identities.forEach((identityFieldList) => {
18
+ if (hasAllValues(identityFieldList, record)) {
19
+ identityAlternativesArr.push(identityFieldList.map((f) => `${f} = $${positionValues.push(record[f]) && ++pos}`).join(' AND '));
20
+ }
21
+ });
22
+ let selectSql = '';
23
+ if (identityAlternativesArr.length) {
24
+ const identityWhere = identityAlternativesArr.map((v) => `( ${v} )`).join(' OR ');
25
+ selectSql = `SELECT *
26
+ FROM ${source}
27
+ WHERE ${identityWhere}`;
28
+ const result = await queryPg(connectionId, selectSql, positionValues);
29
+ if ((_a = result === null || result === void 0 ? void 0 : result.rows) === null || _a === void 0 ? void 0 : _a[0]) {
30
+ return (_b = result === null || result === void 0 ? void 0 : result.rows) === null || _b === void 0 ? void 0 : _b[0];
31
+ }
32
+ }
33
+ };
34
+ export const insertPg = async ({ connectionId, record, target, source, isThrow, updateLevel, }) => {
35
+ const { recordSchema, pk = [], serials = [], uc = [] } = await getTableSchemaPg(connectionId, target);
36
+ // Cleaning the record: deleting properties not included in the set of fields, with the value undefined and auto-incrementing fields
37
+ const recordWoSerials = omitBy(record, (fieldValue, fieldName) => !recordSchema[fieldName] || fieldValue === undefined || serials.includes(fieldName));
38
+ // We form all possible sets of fields, which we then use to search for an added (or already existing) record
39
+ // Normalize (sort) sets
40
+ let identities = [pk, ...serials.map((f) => [f]), ...Object.values(uc)].filter((a) => a.length).map((a) => a.sort());
41
+ // Removing duplicates
42
+ identities = [...(new Set(identities.map((a) => a.join('|'))))].map((s) => s.split('|'));
43
+ source = source || target;
44
+ if (!updateLevel) {
45
+ updateLevel = EUpdateLevel.NEVER_UPDATE;
46
+ }
47
+ let foundRow;
48
+ try {
49
+ if (updateLevel !== EUpdateLevel.UPDATE_ALWAYS) {
50
+ // First, let's look for a suitable entry in the database if there are enough identification fields to search.
51
+ // Most often, there are no identification fields among the inserted fields and are expected
52
+ // appearance of an auto-incrementing identifier after insertion
53
+ foundRow = await selectByAnyIdentity(connectionId, identities, record, source);
54
+ if (foundRow && updateLevel === EUpdateLevel.NEVER_UPDATE) {
55
+ return foundRow;
56
+ }
57
+ }
58
+ // There is no suitable record in the database, we insert it
59
+ const { values, positionsList, fieldsList, upsertFields } = getFieldsAndValuesPg(recordWoSerials, recordSchema);
60
+ const insertSQL = `INSERT INTO ${target} (${fieldsList})
61
+ VALUES (${positionsList}) ON CONFLICT ${updateLevel === EUpdateLevel.NEVER_UPDATE
62
+ ? 'DO NOTHING'
63
+ : `(${pk.join(', ')}) DO UPDATE SET ${upsertFields}`}
64
+ RETURNING *`;
65
+ const result = await queryPg(connectionId, insertSQL, values);
66
+ const { rows = [] } = result || {};
67
+ if (!rows[0] && !identities.length) {
68
+ // Hard case
69
+ logger.error(`The insert into table ${target} was not performed and there is no identification field set to search for an existing record.\nrecord: ${JSON.stringify(record)}`);
70
+ return undefined;
71
+ }
72
+ // The insertion is done. Add auto-incrementing identifiers to the array of identification field sets
73
+ const rowInserted = rows[0];
74
+ const summaryRow = { ...recordWoSerials, ...rowInserted };
75
+ foundRow = await selectByAnyIdentity(connectionId, identities, summaryRow, source);
76
+ if (foundRow) {
77
+ return foundRow;
78
+ }
79
+ // If we could not find a record in the source by identifiers, we return what was returned after insertion.
80
+ return summaryRow;
81
+ }
82
+ catch (err) {
83
+ logger.error(err);
84
+ if (isThrow) {
85
+ throw err;
86
+ }
87
+ }
88
+ };
89
+ //# sourceMappingURL=insert.js.map