af-db-ts 2.0.19 → 2.0.73
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/dist/cjs/__tests__/db/ms/@gen-types/test-table_schema.js +3 -0
- package/dist/cjs/__tests__/db/ms/@gen-types/test-table_schema.js.map +1 -0
- package/dist/cjs/__tests__/db/ms/ddl/column-schema-for-test-table-schema-ms.json +216 -0
- package/dist/cjs/__tests__/db/ms/ms-get-sql.spec.js +190 -0
- package/dist/cjs/__tests__/db/ms/ms-get-sql.spec.js.map +1 -0
- package/dist/cjs/__tests__/db/ms/ms-prepare-sql-value.spec.js +584 -0
- package/dist/cjs/__tests__/db/ms/ms-prepare-sql-value.spec.js.map +1 -0
- package/dist/cjs/__tests__/db/ms/ms-table-schema.spec.js +107 -0
- package/dist/cjs/__tests__/db/ms/ms-table-schema.spec.js.map +1 -0
- package/dist/cjs/__tests__/db/pg/@gen-types/test-hard_case.js +3 -0
- package/dist/cjs/__tests__/db/pg/@gen-types/test-hard_case.js.map +1 -0
- package/dist/cjs/__tests__/db/pg/@gen-types/test-only_one_serial.js +3 -0
- package/dist/cjs/__tests__/db/pg/@gen-types/test-only_one_serial.js.map +1 -0
- package/dist/cjs/__tests__/db/pg/@gen-types/test-only_one_uniq.js +3 -0
- package/dist/cjs/__tests__/db/pg/@gen-types/test-only_one_uniq.js.map +1 -0
- package/dist/cjs/__tests__/db/pg/@gen-types/test-serial_and_uniq.js +3 -0
- package/dist/cjs/__tests__/db/pg/@gen-types/test-serial_and_uniq.js.map +1 -0
- package/dist/cjs/__tests__/db/pg/@gen-types/test-table_schema.js +3 -0
- package/dist/cjs/__tests__/db/pg/@gen-types/test-table_schema.js.map +1 -0
- package/dist/cjs/__tests__/db/pg/ddl/column-schema-for-test-table-schema-pg.json +170 -0
- package/dist/cjs/__tests__/db/pg/gen-table-interfaces-4-test-pg.js +36 -0
- package/dist/cjs/__tests__/db/pg/gen-table-interfaces-4-test-pg.js.map +1 -0
- package/dist/cjs/__tests__/db/pg/pg-get-sql.spec.js +261 -0
- package/dist/cjs/__tests__/db/pg/pg-get-sql.spec.js.map +1 -0
- package/dist/cjs/__tests__/db/pg/pg-insert.spec.js +294 -0
- package/dist/cjs/__tests__/db/pg/pg-insert.spec.js.map +1 -0
- package/dist/cjs/__tests__/db/pg/pg-prepare-sql-value.spec.js +575 -0
- package/dist/cjs/__tests__/db/pg/pg-prepare-sql-value.spec.js.map +1 -0
- package/dist/cjs/__tests__/db/pg/pg-table-schema.spec.js +117 -0
- package/dist/cjs/__tests__/db/pg/pg-table-schema.spec.js.map +1 -0
- package/dist/cjs/src/@types/i-data-types-ms.js +3 -0
- package/dist/cjs/src/@types/i-data-types-ms.js.map +1 -0
- package/dist/cjs/src/@types/i-data-types-pg.js +7 -0
- package/dist/cjs/src/@types/i-data-types-pg.js.map +1 -0
- package/dist/cjs/src/@types/i-pg.js +0 -21
- package/dist/cjs/src/@types/i-pg.js.map +1 -1
- package/dist/cjs/src/common.js +6 -5
- package/dist/cjs/src/common.js.map +1 -1
- package/dist/cjs/src/index.js +75 -54
- package/dist/cjs/src/index.js.map +1 -1
- package/dist/cjs/src/ms/gen-table-interfaces-ms.js +64 -0
- package/dist/cjs/src/ms/gen-table-interfaces-ms.js.map +1 -0
- package/dist/cjs/src/ms/get-sql/insert.js +37 -0
- package/dist/cjs/src/ms/get-sql/insert.js.map +1 -0
- package/dist/cjs/src/ms/get-sql/merge.js +93 -0
- package/dist/cjs/src/ms/get-sql/merge.js.map +1 -0
- package/dist/cjs/src/ms/get-sql/update.js +32 -0
- package/dist/cjs/src/ms/get-sql/update.js.map +1 -0
- package/dist/cjs/src/{mssql → ms}/pool-ms.js +6 -23
- package/dist/cjs/src/ms/pool-ms.js.map +1 -0
- package/dist/cjs/src/ms/prepare-value.js +178 -0
- package/dist/cjs/src/ms/prepare-value.js.map +1 -0
- package/dist/cjs/src/{mssql → ms}/query-ms.js +1 -1
- package/dist/cjs/src/ms/query-ms.js.map +1 -0
- package/dist/cjs/src/ms/table-schema-ms.js +241 -0
- package/dist/cjs/src/ms/table-schema-ms.js.map +1 -0
- package/dist/cjs/src/ms/utils-ms.js +92 -0
- package/dist/cjs/src/ms/utils-ms.js.map +1 -0
- package/dist/cjs/src/ms/wrap-transaction-ms.js +32 -0
- package/dist/cjs/src/ms/wrap-transaction-ms.js.map +1 -0
- package/dist/cjs/src/pg/gen-table-interfaces-pg.js +83 -0
- package/dist/cjs/src/pg/gen-table-interfaces-pg.js.map +1 -0
- package/dist/cjs/src/pg/get-sql/insert.js +38 -0
- package/dist/cjs/src/pg/get-sql/insert.js.map +1 -0
- package/dist/cjs/src/pg/get-sql/merge.js +60 -0
- package/dist/cjs/src/pg/get-sql/merge.js.map +1 -0
- package/dist/cjs/src/pg/get-sql/update.js +32 -0
- package/dist/cjs/src/pg/get-sql/update.js.map +1 -0
- package/dist/cjs/src/pg/{insert.js → insert-pg.js} +10 -10
- package/dist/cjs/src/pg/insert-pg.js.map +1 -0
- package/dist/cjs/src/pg/is-table-or-view-exists.js +1 -2
- package/dist/cjs/src/pg/is-table-or-view-exists.js.map +1 -1
- package/dist/cjs/src/pg/{pg-pool.js → pool-pg.js} +6 -7
- package/dist/cjs/src/pg/pool-pg.js.map +1 -0
- package/dist/cjs/src/pg/prepare-value.js +116 -69
- package/dist/cjs/src/pg/prepare-value.js.map +1 -1
- package/dist/cjs/src/pg/query-pg.js +2 -2
- package/dist/cjs/src/pg/query-pg.js.map +1 -1
- package/dist/cjs/src/pg/table-schema-pg.js +183 -0
- package/dist/cjs/src/pg/table-schema-pg.js.map +1 -0
- package/dist/cjs/src/pg/utils-pg.js +99 -0
- package/dist/cjs/src/pg/utils-pg.js.map +1 -0
- package/dist/cjs/src/utils/utils-array.js +152 -0
- package/dist/cjs/src/utils/utils-array.js.map +1 -0
- package/dist/cjs/src/utils/utils-dt.js +121 -0
- package/dist/cjs/src/utils/utils-dt.js.map +1 -0
- package/dist/cjs/src/utils/utils-num.js +127 -0
- package/dist/cjs/src/utils/utils-num.js.map +1 -0
- package/dist/cjs/src/utils/utils.js +66 -0
- package/dist/cjs/src/utils/utils.js.map +1 -0
- package/dist/esm/src/@types/i-data-types-ms.js +2 -0
- package/dist/esm/src/@types/i-data-types-ms.js.map +1 -0
- package/dist/esm/src/@types/i-data-types-pg.js +6 -0
- package/dist/esm/src/@types/i-data-types-pg.js.map +1 -0
- package/dist/esm/src/@types/i-pg.js +1 -20
- package/dist/esm/src/@types/i-pg.js.map +1 -1
- package/dist/esm/src/common.js +3 -2
- package/dist/esm/src/common.js.map +1 -1
- package/dist/esm/src/index.js +24 -15
- package/dist/esm/src/index.js.map +1 -1
- package/dist/esm/src/ms/gen-table-interfaces-ms.js +36 -0
- package/dist/esm/src/ms/gen-table-interfaces-ms.js.map +1 -0
- package/dist/esm/src/ms/get-sql/insert.js +33 -0
- package/dist/esm/src/ms/get-sql/insert.js.map +1 -0
- package/dist/esm/src/ms/get-sql/merge.js +89 -0
- package/dist/esm/src/ms/get-sql/merge.js.map +1 -0
- package/dist/esm/src/ms/get-sql/update.js +28 -0
- package/dist/esm/src/ms/get-sql/update.js.map +1 -0
- package/dist/esm/src/{mssql → ms}/pool-ms.js +5 -20
- package/dist/esm/src/ms/pool-ms.js.map +1 -0
- package/dist/esm/src/ms/prepare-value.js +149 -0
- package/dist/esm/src/ms/prepare-value.js.map +1 -0
- package/dist/esm/src/{mssql → ms}/query-ms.js +1 -1
- package/dist/esm/src/ms/query-ms.js.map +1 -0
- package/dist/esm/src/ms/table-schema-ms.js +213 -0
- package/dist/esm/src/ms/table-schema-ms.js.map +1 -0
- package/dist/esm/src/ms/utils-ms.js +65 -0
- package/dist/esm/src/ms/utils-ms.js.map +1 -0
- package/dist/esm/src/ms/wrap-transaction-ms.js +28 -0
- package/dist/esm/src/ms/wrap-transaction-ms.js.map +1 -0
- package/dist/esm/src/pg/gen-table-interfaces-pg.js +55 -0
- package/dist/esm/src/pg/gen-table-interfaces-pg.js.map +1 -0
- package/dist/esm/src/pg/get-sql/insert.js +34 -0
- package/dist/esm/src/pg/get-sql/insert.js.map +1 -0
- package/dist/esm/src/pg/get-sql/merge.js +56 -0
- package/dist/esm/src/pg/get-sql/merge.js.map +1 -0
- package/dist/esm/src/pg/get-sql/update.js +28 -0
- package/dist/esm/src/pg/get-sql/update.js.map +1 -0
- package/dist/esm/src/pg/{insert.js → insert-pg.js} +10 -10
- package/dist/esm/src/pg/insert-pg.js.map +1 -0
- package/dist/esm/src/pg/is-table-or-view-exists.js +1 -2
- package/dist/esm/src/pg/is-table-or-view-exists.js.map +1 -1
- package/dist/esm/src/pg/{pg-pool.js → pool-pg.js} +6 -7
- package/dist/esm/src/pg/pool-pg.js.map +1 -0
- package/dist/esm/src/pg/prepare-value.js +113 -67
- package/dist/esm/src/pg/prepare-value.js.map +1 -1
- package/dist/esm/src/pg/query-pg.js +1 -1
- package/dist/esm/src/pg/query-pg.js.map +1 -1
- package/dist/esm/src/pg/table-schema-pg.js +178 -0
- package/dist/esm/src/pg/table-schema-pg.js.map +1 -0
- package/dist/esm/src/pg/utils-pg.js +93 -0
- package/dist/esm/src/pg/utils-pg.js.map +1 -0
- package/dist/esm/src/utils/utils-array.js +125 -0
- package/dist/esm/src/utils/utils-array.js.map +1 -0
- package/dist/esm/src/utils/utils-dt.js +114 -0
- package/dist/esm/src/utils/utils-dt.js.map +1 -0
- package/dist/esm/src/utils/utils-num.js +117 -0
- package/dist/esm/src/utils/utils-num.js.map +1 -0
- package/dist/esm/src/utils/utils.js +58 -0
- package/dist/esm/src/utils/utils.js.map +1 -0
- package/dist/types/src/@types/i-common.d.ts +35 -3
- package/dist/types/src/@types/i-common.d.ts.map +1 -1
- package/dist/types/src/@types/i-data-types-ms.d.ts +3 -0
- package/dist/types/src/@types/i-data-types-ms.d.ts.map +1 -0
- package/dist/types/src/@types/i-data-types-pg.d.ts +35 -0
- package/dist/types/src/@types/i-data-types-pg.d.ts.map +1 -0
- package/dist/types/src/@types/i-ms.d.ts +26 -126
- package/dist/types/src/@types/i-ms.d.ts.map +1 -1
- package/dist/types/src/@types/i-pg.d.ts +11 -35
- package/dist/types/src/@types/i-pg.d.ts.map +1 -1
- package/dist/types/src/common.d.ts +1 -0
- package/dist/types/src/common.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +28 -16
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/ms/gen-table-interfaces-ms.d.ts +3 -0
- package/dist/types/src/ms/gen-table-interfaces-ms.d.ts.map +1 -0
- package/dist/types/src/ms/get-sql/insert.d.ts +9 -0
- package/dist/types/src/ms/get-sql/insert.d.ts.map +1 -0
- package/dist/types/src/ms/get-sql/merge.d.ts +14 -0
- package/dist/types/src/ms/get-sql/merge.d.ts.map +1 -0
- package/dist/types/src/ms/get-sql/update.d.ts +9 -0
- package/dist/types/src/ms/get-sql/update.d.ts.map +1 -0
- package/dist/types/src/{mssql → ms}/pool-ms.d.ts +0 -8
- package/dist/types/src/ms/pool-ms.d.ts.map +1 -0
- package/dist/types/src/ms/prepare-value.d.ts +12 -0
- package/dist/types/src/ms/prepare-value.d.ts.map +1 -0
- package/dist/types/src/ms/query-ms.d.ts +3 -0
- package/dist/types/src/ms/query-ms.d.ts.map +1 -0
- package/dist/types/src/ms/table-schema-ms.d.ts +9 -0
- package/dist/types/src/ms/table-schema-ms.d.ts.map +1 -0
- package/dist/types/src/ms/utils-ms.d.ts +3 -0
- package/dist/types/src/ms/utils-ms.d.ts.map +1 -0
- package/dist/types/src/ms/wrap-transaction-ms.d.ts +5 -0
- package/dist/types/src/ms/wrap-transaction-ms.d.ts.map +1 -0
- package/dist/types/src/pg/gen-table-interfaces-pg.d.ts +3 -0
- package/dist/types/src/pg/gen-table-interfaces-pg.d.ts.map +1 -0
- package/dist/types/src/pg/get-sql/insert.d.ts +9 -0
- package/dist/types/src/pg/get-sql/insert.d.ts.map +1 -0
- package/dist/types/src/pg/get-sql/merge.d.ts +10 -0
- package/dist/types/src/pg/get-sql/merge.d.ts.map +1 -0
- package/dist/types/src/pg/get-sql/update.d.ts +9 -0
- package/dist/types/src/pg/get-sql/update.d.ts.map +1 -0
- package/dist/types/src/pg/{insert.d.ts → insert-pg.d.ts} +3 -3
- package/dist/types/src/pg/insert-pg.d.ts.map +1 -0
- package/dist/types/src/pg/{pg-pool.d.ts → pool-pg.d.ts} +1 -1
- package/dist/types/src/pg/{pg-pool.d.ts.map → pool-pg.d.ts.map} +1 -1
- package/dist/types/src/pg/prepare-value.d.ts +3 -1
- package/dist/types/src/pg/prepare-value.d.ts.map +1 -1
- package/dist/types/src/pg/query-pg.d.ts +3 -2
- package/dist/types/src/pg/query-pg.d.ts.map +1 -1
- package/dist/types/src/pg/table-schema-pg.d.ts +12 -0
- package/dist/types/src/pg/table-schema-pg.d.ts.map +1 -0
- package/dist/types/src/pg/utils-pg.d.ts +5 -0
- package/dist/types/src/pg/utils-pg.d.ts.map +1 -0
- package/dist/types/src/utils/utils-array.d.ts +5 -0
- package/dist/types/src/utils/utils-array.d.ts.map +1 -0
- package/dist/types/src/utils/utils-dt.d.ts +15 -0
- package/dist/types/src/utils/utils-dt.d.ts.map +1 -0
- package/dist/types/src/utils/utils-num.d.ts +9 -0
- package/dist/types/src/utils/utils-num.d.ts.map +1 -0
- package/dist/types/src/utils/utils.d.ts +18 -0
- package/dist/types/src/utils/utils.d.ts.map +1 -0
- package/package.json +13 -13
- package/src/@types/i-common.ts +42 -4
- package/src/@types/i-data-types-ms.ts +81 -0
- package/src/@types/i-data-types-pg.ts +120 -0
- package/src/@types/i-ms.ts +29 -153
- package/src/@types/i-pg.ts +11 -36
- package/src/common.ts +4 -2
- package/src/index.ts +101 -59
- package/src/ms/gen-table-interfaces-ms.ts +52 -0
- package/src/ms/get-sql/insert.ts +45 -0
- package/src/ms/get-sql/merge.ts +118 -0
- package/src/ms/get-sql/update.ts +46 -0
- package/src/{mssql → ms}/pool-ms.ts +0 -16
- package/src/ms/prepare-value.ts +175 -0
- package/src/{mssql → ms}/query-ms.ts +2 -2
- package/src/ms/table-schema-ms.ts +231 -0
- package/src/ms/utils-ms.ts +72 -0
- package/src/ms/wrap-transaction-ms.ts +27 -0
- package/src/pg/gen-table-interfaces-pg.ts +74 -0
- package/src/pg/get-sql/insert.ts +46 -0
- package/src/pg/get-sql/merge.ts +70 -0
- package/src/pg/get-sql/update.ts +46 -0
- package/src/pg/{insert.ts → insert-pg.ts} +9 -9
- package/src/pg/prepare-value.ts +129 -67
- package/src/pg/query-pg.ts +4 -3
- package/src/pg/table-schema-pg.ts +196 -0
- package/src/pg/utils-pg.ts +97 -0
- package/src/utils/utils-array.ts +133 -0
- package/src/utils/utils-dt.ts +123 -0
- package/src/utils/utils-num.ts +131 -0
- package/src/utils/utils.ts +64 -0
- package/dist/cjs/__tests__/02_getValueForSqlMs.spec.js +0 -50
- package/dist/cjs/__tests__/02_getValueForSqlMs.spec.js.map +0 -1
- package/dist/cjs/src/mssql/get-value-for-sql.js +0 -277
- package/dist/cjs/src/mssql/get-value-for-sql.js.map +0 -1
- package/dist/cjs/src/mssql/pool-ms.js.map +0 -1
- package/dist/cjs/src/mssql/query-ms.js.map +0 -1
- package/dist/cjs/src/mssql/sql.js +0 -427
- package/dist/cjs/src/mssql/sql.js.map +0 -1
- package/dist/cjs/src/mssql/utils.js +0 -36
- package/dist/cjs/src/mssql/utils.js.map +0 -1
- package/dist/cjs/src/pg/get-merge-sql.js +0 -52
- package/dist/cjs/src/pg/get-merge-sql.js.map +0 -1
- package/dist/cjs/src/pg/get-update-sql.js +0 -30
- package/dist/cjs/src/pg/get-update-sql.js.map +0 -1
- package/dist/cjs/src/pg/insert.js.map +0 -1
- package/dist/cjs/src/pg/pg-pool.js.map +0 -1
- package/dist/cjs/src/pg/table-schema.js +0 -179
- package/dist/cjs/src/pg/table-schema.js.map +0 -1
- package/dist/cjs/src/utils.js +0 -17
- package/dist/cjs/src/utils.js.map +0 -1
- package/dist/esm/src/mssql/get-value-for-sql.js +0 -272
- package/dist/esm/src/mssql/get-value-for-sql.js.map +0 -1
- package/dist/esm/src/mssql/pool-ms.js.map +0 -1
- package/dist/esm/src/mssql/query-ms.js.map +0 -1
- package/dist/esm/src/mssql/sql.js +0 -390
- package/dist/esm/src/mssql/sql.js.map +0 -1
- package/dist/esm/src/mssql/utils.js +0 -31
- package/dist/esm/src/mssql/utils.js.map +0 -1
- package/dist/esm/src/pg/get-merge-sql.js +0 -48
- package/dist/esm/src/pg/get-merge-sql.js.map +0 -1
- package/dist/esm/src/pg/get-update-sql.js +0 -26
- package/dist/esm/src/pg/get-update-sql.js.map +0 -1
- package/dist/esm/src/pg/insert.js.map +0 -1
- package/dist/esm/src/pg/pg-pool.js.map +0 -1
- package/dist/esm/src/pg/table-schema.js +0 -174
- package/dist/esm/src/pg/table-schema.js.map +0 -1
- package/dist/esm/src/utils.js +0 -14
- package/dist/esm/src/utils.js.map +0 -1
- package/dist/types/src/mssql/get-value-for-sql.d.ts +0 -11
- package/dist/types/src/mssql/get-value-for-sql.d.ts.map +0 -1
- package/dist/types/src/mssql/pool-ms.d.ts.map +0 -1
- package/dist/types/src/mssql/query-ms.d.ts +0 -3
- package/dist/types/src/mssql/query-ms.d.ts.map +0 -1
- package/dist/types/src/mssql/sql.d.ts +0 -57
- package/dist/types/src/mssql/sql.d.ts.map +0 -1
- package/dist/types/src/mssql/utils.d.ts +0 -10
- package/dist/types/src/mssql/utils.d.ts.map +0 -1
- package/dist/types/src/pg/get-merge-sql.d.ts +0 -9
- package/dist/types/src/pg/get-merge-sql.d.ts.map +0 -1
- package/dist/types/src/pg/get-update-sql.d.ts +0 -3
- package/dist/types/src/pg/get-update-sql.d.ts.map +0 -1
- package/dist/types/src/pg/insert.d.ts.map +0 -1
- package/dist/types/src/pg/table-schema.d.ts +0 -12
- package/dist/types/src/pg/table-schema.d.ts.map +0 -1
- package/dist/types/src/utils.d.ts +0 -9
- package/dist/types/src/utils.d.ts.map +0 -1
- package/src/mssql/get-value-for-sql.ts +0 -325
- package/src/mssql/sql.ts +0 -430
- package/src/mssql/utils.ts +0 -31
- package/src/pg/get-merge-sql.ts +0 -62
- package/src/pg/get-update-sql.ts +0 -32
- package/src/pg/table-schema.ts +0 -189
- package/src/utils.ts +0 -14
- /package/src/pg/{pg-pool.ts → pool-pg.ts} +0 -0
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
// noinspection SqlResolve
|
|
2
|
+
import { DateTime } from 'luxon';
|
|
3
|
+
import { getBool } from 'af-tools-ts';
|
|
4
|
+
import * as sql from 'mssql';
|
|
5
|
+
import { IFieldDefMs } from '../@types/i-ms';
|
|
6
|
+
import { binToHexString, prepareJSON, prepareUUID, q } from '../utils/utils';
|
|
7
|
+
import { dateTimeValue, getDatetimeWithPrecisionAndOffset } from '../utils/utils-dt';
|
|
8
|
+
import { parseIntNumberS, prepareBigIntNumber, prepareFloatNumber } from '../utils/utils-num';
|
|
9
|
+
import { NULL } from '../common';
|
|
10
|
+
import { TDataTypeMs } from '../@types/i-data-types-ms';
|
|
11
|
+
import { IFieldDef } from '../@types/i-common';
|
|
12
|
+
import { arrayToJsonList } from '../utils/utils-array';
|
|
13
|
+
|
|
14
|
+
export const escapeStringMs = (value: any, escapeOnlySingleQuotes: boolean = false): string | typeof NULL => {
|
|
15
|
+
if (value == null) {
|
|
16
|
+
return NULL;
|
|
17
|
+
}
|
|
18
|
+
let v = String(value);
|
|
19
|
+
v = v.replace(/'/g, `''`);
|
|
20
|
+
if (!escapeOnlySingleQuotes) {
|
|
21
|
+
v = v.replace(/%/g, '%%');
|
|
22
|
+
}
|
|
23
|
+
return v;
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Подготовка строки для передачи в SQL
|
|
28
|
+
*/
|
|
29
|
+
export const prepareSqlStringMs = (value: any, fieldDef: IFieldDefMs): string | typeof NULL => {
|
|
30
|
+
if (value == null) {
|
|
31
|
+
return NULL;
|
|
32
|
+
}
|
|
33
|
+
let v = escapeStringMs(value, fieldDef.escapeOnlySingleQuotes);
|
|
34
|
+
const { length = 0, noQuotes } = fieldDef;
|
|
35
|
+
if (length > 0 && v.length > length) {
|
|
36
|
+
v = v.substring(0, length);
|
|
37
|
+
}
|
|
38
|
+
return q(v, noQuotes);
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
const prepareDateTimeOffset = (
|
|
42
|
+
value: any,
|
|
43
|
+
fieldDef: IFieldDef,
|
|
44
|
+
): string | typeof NULL => getDatetimeWithPrecisionAndOffset({ value, fieldDef });
|
|
45
|
+
|
|
46
|
+
export const prepareSqlValueMs = (arg: { value: any, fieldDef: IFieldDefMs, }): string | typeof NULL => {
|
|
47
|
+
const { value, fieldDef } = arg;
|
|
48
|
+
if (value == null) {
|
|
49
|
+
return NULL;
|
|
50
|
+
}
|
|
51
|
+
const { noQuotes } = fieldDef;
|
|
52
|
+
let { dataType } = fieldDef;
|
|
53
|
+
if (typeof dataType === 'string') {
|
|
54
|
+
dataType = dataType.toLowerCase() as TDataTypeMs;
|
|
55
|
+
}
|
|
56
|
+
let v: any = value;
|
|
57
|
+
switch (dataType) {
|
|
58
|
+
case 'bool':
|
|
59
|
+
case 'boolean':
|
|
60
|
+
case 'bit':
|
|
61
|
+
case sql.Bit:
|
|
62
|
+
return getBool(value) ? '1' : '0';
|
|
63
|
+
|
|
64
|
+
case 'tinyint':
|
|
65
|
+
case sql.TinyInt:
|
|
66
|
+
return String(parseIntNumberS(value, 'tinyint'));
|
|
67
|
+
case 'smallint':
|
|
68
|
+
case sql.SmallInt:
|
|
69
|
+
return String(parseIntNumberS(value, 'smallint'));
|
|
70
|
+
case 'int':
|
|
71
|
+
case 'integer':
|
|
72
|
+
case sql.Int:
|
|
73
|
+
return String(parseIntNumberS(value, 'int'));
|
|
74
|
+
|
|
75
|
+
case 'bigint':
|
|
76
|
+
case sql.BigInt:
|
|
77
|
+
return prepareBigIntNumber(value);
|
|
78
|
+
|
|
79
|
+
case 'number':
|
|
80
|
+
case 'decimal':
|
|
81
|
+
case 'float':
|
|
82
|
+
case 'money':
|
|
83
|
+
case 'numeric':
|
|
84
|
+
case 'smallmoney':
|
|
85
|
+
case 'real':
|
|
86
|
+
case sql.Decimal:
|
|
87
|
+
case sql.Float:
|
|
88
|
+
case sql.Money:
|
|
89
|
+
case sql.Numeric:
|
|
90
|
+
case sql.SmallMoney:
|
|
91
|
+
case sql.Real:
|
|
92
|
+
return prepareFloatNumber(value);
|
|
93
|
+
|
|
94
|
+
case 'json':
|
|
95
|
+
v = prepareJSON(v);
|
|
96
|
+
return v === NULL ? NULL : q(v, noQuotes);
|
|
97
|
+
|
|
98
|
+
case 'string':
|
|
99
|
+
case 'char':
|
|
100
|
+
case 'nchar':
|
|
101
|
+
case 'text':
|
|
102
|
+
case 'ntext':
|
|
103
|
+
case 'varchar':
|
|
104
|
+
case 'nvarchar':
|
|
105
|
+
case 'xml':
|
|
106
|
+
case sql.Char:
|
|
107
|
+
case sql.NChar:
|
|
108
|
+
case sql.Text:
|
|
109
|
+
case sql.NText:
|
|
110
|
+
case sql.VarChar:
|
|
111
|
+
case sql.NVarChar:
|
|
112
|
+
case sql.Xml:
|
|
113
|
+
return prepareSqlStringMs(v, fieldDef);
|
|
114
|
+
|
|
115
|
+
case 'uid':
|
|
116
|
+
case 'uuid':
|
|
117
|
+
case 'uniqueIdentifier':
|
|
118
|
+
case sql.UniqueIdentifier:
|
|
119
|
+
return prepareUUID(v, false, fieldDef.noQuotes);
|
|
120
|
+
|
|
121
|
+
case 'datetime':
|
|
122
|
+
case sql.DateTime:
|
|
123
|
+
case sql.DateTime2: {
|
|
124
|
+
const { includeOffset = false } = fieldDef.dateTimeOptions || {};
|
|
125
|
+
// 2023-09-05T02:23:54.105
|
|
126
|
+
return dateTimeValue(value, fieldDef, (dt: DateTime) => dt.toISO({ includeOffset }));
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
case 'date':
|
|
130
|
+
case sql.Date:
|
|
131
|
+
// 2023-09-05
|
|
132
|
+
return dateTimeValue(value, fieldDef, (dt: DateTime) => dt.toISODate());
|
|
133
|
+
|
|
134
|
+
case 'time':
|
|
135
|
+
case sql.Time:
|
|
136
|
+
// 02:22:17.368
|
|
137
|
+
return dateTimeValue(value, fieldDef, (dt: DateTime) => dt.toISOTime()?.substring(0, 12));
|
|
138
|
+
|
|
139
|
+
case 'smalldatetime':
|
|
140
|
+
case sql.SmallDateTime:
|
|
141
|
+
// 2023-09-05T02:20:00
|
|
142
|
+
return dateTimeValue(value, fieldDef, (dt: DateTime) => `${dt.toISO()?.substring(0, 17)}00`);
|
|
143
|
+
|
|
144
|
+
case 'datetimeoffset':
|
|
145
|
+
case sql.DateTimeOffset:
|
|
146
|
+
// 2023-09-05T02:20:00.1234567Z
|
|
147
|
+
return prepareDateTimeOffset(value, fieldDef);
|
|
148
|
+
|
|
149
|
+
case 'binary':
|
|
150
|
+
case 'varbinary':
|
|
151
|
+
case 'image':
|
|
152
|
+
case sql.Binary:
|
|
153
|
+
case sql.VarBinary:
|
|
154
|
+
case sql.Image:
|
|
155
|
+
v = binToHexString(value);
|
|
156
|
+
return v ? q(v, noQuotes) : NULL;
|
|
157
|
+
|
|
158
|
+
case 'udt':
|
|
159
|
+
case 'geography':
|
|
160
|
+
case 'geometry':
|
|
161
|
+
case 'variant':
|
|
162
|
+
case sql.UDT:
|
|
163
|
+
case sql.Geography:
|
|
164
|
+
case sql.Geometry:
|
|
165
|
+
case sql.Variant:
|
|
166
|
+
return prepareSqlStringMs(v, fieldDef);
|
|
167
|
+
|
|
168
|
+
case 'array':
|
|
169
|
+
v = arrayToJsonList(value, fieldDef.arrayType);
|
|
170
|
+
return v === NULL ? NULL : q(`[${escapeStringMs(v)}]`, fieldDef.noQuotes);
|
|
171
|
+
|
|
172
|
+
default:
|
|
173
|
+
return prepareSqlStringMs(v, fieldDef);
|
|
174
|
+
}
|
|
175
|
+
};
|
|
@@ -3,12 +3,12 @@ import * as sql from 'mssql';
|
|
|
3
3
|
import { logSqlError } from '../common';
|
|
4
4
|
import { closeDbConnectionsMs, getPoolMs } from './pool-ms';
|
|
5
5
|
|
|
6
|
-
export const queryMs = async (
|
|
6
|
+
export const queryMs = async <ColumnSetDescription = any>(
|
|
7
7
|
connectionId: string,
|
|
8
8
|
sqlText: string,
|
|
9
9
|
throwError?: boolean,
|
|
10
10
|
prefix?: string,
|
|
11
|
-
): Promise<IResult<
|
|
11
|
+
): Promise<IResult<ColumnSetDescription> | undefined> => {
|
|
12
12
|
try {
|
|
13
13
|
const pool = await getPoolMs(connectionId, throwError);
|
|
14
14
|
if (!pool?.connected && !pool?.connecting) {
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
// noinspection SqlResolve
|
|
2
|
+
import * as sql from 'mssql';
|
|
3
|
+
import { each } from 'af-tools-ts';
|
|
4
|
+
import { removePairBrackets, schemaTable } from '../utils/utils';
|
|
5
|
+
import { IFieldDefMs, ITableSchemaMs, TColumnsSchemaMs, TUniqueConstraintsMs } from '../@types/i-ms';
|
|
6
|
+
import { queryMs } from './query-ms';
|
|
7
|
+
import { logger } from '../logger-error';
|
|
8
|
+
import { graceExit } from '../common';
|
|
9
|
+
import { TFieldName } from '../@types/i-common';
|
|
10
|
+
import { TDataTypeMs } from '../@types/i-data-types-ms';
|
|
11
|
+
|
|
12
|
+
// commonSchemaAndTable: <schema>.<table> : Staff.nnPersones-personGuid
|
|
13
|
+
// schemaAndTableMs: "<schema>"."<table>" : "Staff"."nnPersones-personGuid"
|
|
14
|
+
|
|
15
|
+
const tableSchemaHash: { [commonSchemaAndTable: string]: ITableSchemaMs } = {};
|
|
16
|
+
|
|
17
|
+
const FIELD_SCHEMA_PROPS = [
|
|
18
|
+
'arrayType',
|
|
19
|
+
'caseSensitive',
|
|
20
|
+
'charSetName',
|
|
21
|
+
'collation',
|
|
22
|
+
'columnDefault',
|
|
23
|
+
'dataType',
|
|
24
|
+
'dateTimeOptions',
|
|
25
|
+
'dtPrecision',
|
|
26
|
+
'escapeOnlySingleQuotes',
|
|
27
|
+
'hasDefault',
|
|
28
|
+
'identity',
|
|
29
|
+
'index',
|
|
30
|
+
'inputDateFormat',
|
|
31
|
+
'isNullable',
|
|
32
|
+
'length',
|
|
33
|
+
'name',
|
|
34
|
+
'noQuotes',
|
|
35
|
+
'octetLength',
|
|
36
|
+
'precision',
|
|
37
|
+
'radix',
|
|
38
|
+
'readOnly',
|
|
39
|
+
'scale', // VVQ
|
|
40
|
+
];
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Корректировка схемы таблицы
|
|
44
|
+
* Поля с суффиксом _json получают тип "json". Остальные корректировки берутся из fieldTypeCorrection
|
|
45
|
+
* Например, для полей типа datetime можно передавать свойство inputDateFormat
|
|
46
|
+
*/
|
|
47
|
+
export const correctRecordSchemaMs = (
|
|
48
|
+
columnsSchema: TColumnsSchemaMs,
|
|
49
|
+
// объект корректировок
|
|
50
|
+
fieldTypeCorrection?: TColumnsSchemaMs,
|
|
51
|
+
) => {
|
|
52
|
+
each(columnsSchema, (fieldSchema: IFieldDefMs, fieldName: TFieldName) => {
|
|
53
|
+
if (/_json$/i.test(fieldName)) {
|
|
54
|
+
fieldSchema.dataType = 'json';
|
|
55
|
+
}
|
|
56
|
+
switch (fieldSchema.dataType) {
|
|
57
|
+
case sql.NChar:
|
|
58
|
+
case sql.NText:
|
|
59
|
+
case sql.NVarChar:
|
|
60
|
+
if (fieldSchema.length) {
|
|
61
|
+
fieldSchema.length = Math.floor(fieldSchema.length / 2);
|
|
62
|
+
}
|
|
63
|
+
break;
|
|
64
|
+
case sql.UniqueIdentifier:
|
|
65
|
+
fieldSchema.length = 36;
|
|
66
|
+
break;
|
|
67
|
+
default:
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
if (fieldTypeCorrection && typeof fieldTypeCorrection === 'object') {
|
|
71
|
+
each(fieldTypeCorrection, (correction: IFieldDefMs, fieldName: TFieldName) => {
|
|
72
|
+
FIELD_SCHEMA_PROPS.forEach((prop) => {
|
|
73
|
+
if (correction[prop] !== undefined) {
|
|
74
|
+
if (!columnsSchema[fieldName]) {
|
|
75
|
+
columnsSchema[fieldName] = {} as IFieldDefMs;
|
|
76
|
+
}
|
|
77
|
+
columnsSchema[fieldName][prop] = correction[prop];
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
const getColumnsSchemaMs_ = async (
|
|
85
|
+
connectionId: string,
|
|
86
|
+
commonSchemaAndTable: string,
|
|
87
|
+
): Promise<TColumnsSchemaMs> => {
|
|
88
|
+
const [schema, table] = schemaTable.to.common(commonSchemaAndTable).split('.');
|
|
89
|
+
let sqlText = `
|
|
90
|
+
--
|
|
91
|
+
SELECT
|
|
92
|
+
TABLE_SCHEMA,
|
|
93
|
+
TABLE_NAME,
|
|
94
|
+
COLUMN_NAME,
|
|
95
|
+
IS_NULLABLE,
|
|
96
|
+
COLUMN_DEFAULT,
|
|
97
|
+
DATA_TYPE,
|
|
98
|
+
CHARACTER_MAXIMUM_LENGTH,
|
|
99
|
+
CHARACTER_OCTET_LENGTH,
|
|
100
|
+
NUMERIC_PRECISION,
|
|
101
|
+
NUMERIC_PRECISION_RADIX,
|
|
102
|
+
NUMERIC_SCALE,
|
|
103
|
+
DATETIME_PRECISION,
|
|
104
|
+
CHARACTER_SET_NAME,
|
|
105
|
+
COLLATION_NAME
|
|
106
|
+
FROM INFORMATION_SCHEMA.COLUMNS
|
|
107
|
+
WHERE TABLE_NAME = '${table}' AND TABLE_SCHEMA = '${schema}';
|
|
108
|
+
`;
|
|
109
|
+
|
|
110
|
+
let res = await queryMs(connectionId, sqlText, true, `getRecordSchemaMs SQL ERROR`);
|
|
111
|
+
const columnsSchema: TColumnsSchemaMs = {};
|
|
112
|
+
(res?.recordset || []).forEach((fieldDef) => {
|
|
113
|
+
const name = fieldDef.COLUMN_NAME;
|
|
114
|
+
const columnDefault = fieldDef.COLUMN_DEFAULT != null ? removePairBrackets(fieldDef.COLUMN_DEFAULT) : undefined;
|
|
115
|
+
// noinspection UnnecessaryLocalVariableJS
|
|
116
|
+
const fieldSchema: IFieldDefMs = {
|
|
117
|
+
name,
|
|
118
|
+
isNullable: /YES/i.test(fieldDef.IS_NULLABLE || ''),
|
|
119
|
+
columnDefault,
|
|
120
|
+
hasDefault: columnDefault != null,
|
|
121
|
+
dataType: fieldDef.DATA_TYPE,
|
|
122
|
+
length: fieldDef.CHARACTER_MAXIMUM_LENGTH,
|
|
123
|
+
octetLength: fieldDef.CHARACTER_OCTET_LENGTH,
|
|
124
|
+
precision: fieldDef.NUMERIC_PRECISION, // VVq Числовые?
|
|
125
|
+
radix: fieldDef.NUMERIC_PRECISION_RADIX,
|
|
126
|
+
scale: fieldDef.NUMERIC_SCALENUMERIC_SCALE, // VVQ
|
|
127
|
+
dtPrecision: fieldDef.DATETIME_PRECISION,
|
|
128
|
+
charSetName: fieldDef.CHARACTER_SET_NAME, // cp1251
|
|
129
|
+
collation: fieldDef.COLLATION_NAME, // Cyrillic_General_BIN
|
|
130
|
+
};
|
|
131
|
+
columnsSchema[name] = fieldSchema;
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
sqlText = `/**/ SELECT TOP(1) * FROM ${schemaTable.to.ms(commonSchemaAndTable)}`;
|
|
135
|
+
res = await queryMs(connectionId, sqlText, true, 'getRecordSchemaMs() SQL ERROR');
|
|
136
|
+
const { columns = {} } = res?.recordset || {};
|
|
137
|
+
Object.entries(columns).forEach(([fieldName, fieldDefC]) => {
|
|
138
|
+
const fieldDef = columnsSchema[fieldName];
|
|
139
|
+
if (fieldDef) {
|
|
140
|
+
fieldDef.dataType = fieldDefC.type as TDataTypeMs;
|
|
141
|
+
fieldDef.arrayType = fieldDefC.udt; // VVQ
|
|
142
|
+
fieldDef.caseSensitive = fieldDefC.caseSensitive;
|
|
143
|
+
fieldDef.identity = fieldDefC.identity; // boolean;
|
|
144
|
+
fieldDef.readOnly = fieldDefC.readOnly; // boolean;
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
return columnsSchema;
|
|
148
|
+
};
|
|
149
|
+
|
|
150
|
+
const getPrimaryKey = async (connectionId: string, commonSchemaAndTable: string): Promise<string[]> => {
|
|
151
|
+
const [schema, table] = schemaTable.to.common(commonSchemaAndTable).split('.');
|
|
152
|
+
const sqlText = `
|
|
153
|
+
--
|
|
154
|
+
SELECT
|
|
155
|
+
C.COLUMN_NAME AS f
|
|
156
|
+
FROM
|
|
157
|
+
INFORMATION_SCHEMA.TABLE_CONSTRAINTS T
|
|
158
|
+
JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE C ON C.CONSTRAINT_NAME = T.CONSTRAINT_NAME
|
|
159
|
+
WHERE
|
|
160
|
+
C.TABLE_SCHEMA = '${schema}'
|
|
161
|
+
AND C.TABLE_NAME = '${table}'
|
|
162
|
+
AND T.CONSTRAINT_TYPE='PRIMARY KEY'`;
|
|
163
|
+
const res = await queryMs(connectionId, sqlText, true, 'getPrimaryKey() SQL ERROR');
|
|
164
|
+
return (res?.recordset || []).map(({ f }) => f);
|
|
165
|
+
};
|
|
166
|
+
|
|
167
|
+
const getUniqueConstraints = async (connectionId: string, commonSchemaAndTable: string): Promise<TUniqueConstraintsMs> => {
|
|
168
|
+
const schemaTableMs = schemaTable.to.ms(commonSchemaAndTable);
|
|
169
|
+
const sqlText = `EXEC sp_helpindex '${schemaTableMs}'`;
|
|
170
|
+
const res = await queryMs(connectionId, sqlText, true, 'getUniqueConstraints() SQL ERROR');
|
|
171
|
+
const uc: TUniqueConstraintsMs = {};
|
|
172
|
+
(res?.recordset || []).forEach((row) => {
|
|
173
|
+
const { index_description: d } = row;
|
|
174
|
+
const isUc = d.includes('unique') && !d.includes('primary key');
|
|
175
|
+
if (isUc) {
|
|
176
|
+
uc[row.index_name] = row.index_keys.split(/,\s*/);
|
|
177
|
+
}
|
|
178
|
+
});
|
|
179
|
+
return uc;
|
|
180
|
+
};
|
|
181
|
+
|
|
182
|
+
const getSerials = async (connectionId: string, commonSchemaAndTable: string): Promise<string[]> => {
|
|
183
|
+
const schemaTableMs = schemaTable.to.ms(commonSchemaAndTable);
|
|
184
|
+
const sqlText = `
|
|
185
|
+
---
|
|
186
|
+
SELECT
|
|
187
|
+
idc.name,
|
|
188
|
+
idc.seed_value,
|
|
189
|
+
idc.increment_value,
|
|
190
|
+
idc.last_value
|
|
191
|
+
FROM sys.identity_columns idc
|
|
192
|
+
WHERE
|
|
193
|
+
idc.object_id = OBJECT_ID('${schemaTableMs}')
|
|
194
|
+
`;
|
|
195
|
+
const res = await queryMs(connectionId, sqlText, true, 'getUniqueConstraints() SQL ERROR');
|
|
196
|
+
const serialFieldName = res?.recordset?.[0]?.name;
|
|
197
|
+
return [serialFieldName];
|
|
198
|
+
};
|
|
199
|
+
|
|
200
|
+
export const getTableSchemaMs = async (connectionId: string, commonSchemaAndTable: string): Promise<ITableSchemaMs> => {
|
|
201
|
+
let tableSchema: ITableSchemaMs = tableSchemaHash[commonSchemaAndTable];
|
|
202
|
+
if (tableSchema) {
|
|
203
|
+
return tableSchema;
|
|
204
|
+
}
|
|
205
|
+
try {
|
|
206
|
+
const columnsSchema = await getColumnsSchemaMs_(connectionId, commonSchemaAndTable);
|
|
207
|
+
const pk = await getPrimaryKey(connectionId, commonSchemaAndTable);
|
|
208
|
+
const uc = await getUniqueConstraints(connectionId, commonSchemaAndTable);
|
|
209
|
+
const serialsFields = await getSerials(connectionId, commonSchemaAndTable);
|
|
210
|
+
const defaults: { [fieldName: string]: string } = {};
|
|
211
|
+
Object.values(columnsSchema).forEach((fieldDef) => {
|
|
212
|
+
const { name: f = '', columnDefault, hasDefault } = fieldDef;
|
|
213
|
+
if (hasDefault && !serialsFields.includes(f)) {
|
|
214
|
+
defaults[f] = `${columnDefault}`;
|
|
215
|
+
}
|
|
216
|
+
});
|
|
217
|
+
const fieldsArray: string[] = Object.keys(columnsSchema);
|
|
218
|
+
const readOnlyFields: string[] = Object.values(columnsSchema).filter((s) => s.readOnly).map((s) => s.name as string);
|
|
219
|
+
const fieldsWoSerialsAndRO: string[] = fieldsArray.filter((f) => !serialsFields.includes(f) && !readOnlyFields.includes(f));
|
|
220
|
+
|
|
221
|
+
tableSchema = {
|
|
222
|
+
columnsSchema, pk, uc, defaults, serialsFields, fieldsArray, fieldsWoSerialsAndRO, readOnlyFields,
|
|
223
|
+
};
|
|
224
|
+
tableSchemaHash[commonSchemaAndTable] = tableSchema;
|
|
225
|
+
} catch (err) {
|
|
226
|
+
logger.error(`Failed to get schema for table ${commonSchemaAndTable}`);
|
|
227
|
+
logger.error(err);
|
|
228
|
+
await graceExit();
|
|
229
|
+
}
|
|
230
|
+
return tableSchema;
|
|
231
|
+
};
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import * as sql from 'mssql';
|
|
2
|
+
import { TDataTypeMs } from '../@types/i-data-types-ms';
|
|
3
|
+
|
|
4
|
+
export const getJsTypeByTypeMs = (dataType?: TDataTypeMs, arrayType?: TDataTypeMs): string => {
|
|
5
|
+
switch (dataType) {
|
|
6
|
+
case 'boolean':
|
|
7
|
+
case sql.Bit:
|
|
8
|
+
return 'boolean';
|
|
9
|
+
|
|
10
|
+
case 'bigint':
|
|
11
|
+
case sql.BigInt:
|
|
12
|
+
return 'string | number';
|
|
13
|
+
|
|
14
|
+
case 'tinyint':
|
|
15
|
+
case sql.TinyInt:
|
|
16
|
+
case 'smallint':
|
|
17
|
+
case sql.SmallInt:
|
|
18
|
+
case 'int':
|
|
19
|
+
case 'integer':
|
|
20
|
+
case sql.Int:
|
|
21
|
+
case 'number':
|
|
22
|
+
case sql.Decimal:
|
|
23
|
+
case sql.Float:
|
|
24
|
+
case sql.Money:
|
|
25
|
+
case sql.Numeric:
|
|
26
|
+
case sql.SmallMoney:
|
|
27
|
+
case sql.Real:
|
|
28
|
+
return 'number';
|
|
29
|
+
|
|
30
|
+
case 'string':
|
|
31
|
+
case sql.Char:
|
|
32
|
+
case sql.NChar:
|
|
33
|
+
case sql.Text:
|
|
34
|
+
case sql.NText:
|
|
35
|
+
case sql.VarChar:
|
|
36
|
+
case sql.NVarChar:
|
|
37
|
+
case sql.Xml:
|
|
38
|
+
case 'uid':
|
|
39
|
+
case 'uuid':
|
|
40
|
+
case 'uniqueIdentifier':
|
|
41
|
+
case sql.UniqueIdentifier:
|
|
42
|
+
return 'string';
|
|
43
|
+
|
|
44
|
+
case 'datetime':
|
|
45
|
+
case 'date':
|
|
46
|
+
case 'time':
|
|
47
|
+
case sql.DateTime:
|
|
48
|
+
case sql.DateTime2:
|
|
49
|
+
case sql.Time:
|
|
50
|
+
case sql.Date:
|
|
51
|
+
case sql.SmallDateTime:
|
|
52
|
+
case sql.DateTimeOffset:
|
|
53
|
+
return 'string | Date | number';
|
|
54
|
+
|
|
55
|
+
case sql.Binary:
|
|
56
|
+
case sql.VarBinary:
|
|
57
|
+
case sql.Image:
|
|
58
|
+
return 'any';
|
|
59
|
+
|
|
60
|
+
case sql.UDT:
|
|
61
|
+
case sql.Geography:
|
|
62
|
+
case sql.Geometry:
|
|
63
|
+
case sql.Variant:
|
|
64
|
+
return 'any';
|
|
65
|
+
case 'array': {
|
|
66
|
+
const jsType = getJsTypeByTypeMs(arrayType);
|
|
67
|
+
return `${jsType}[]`;
|
|
68
|
+
}
|
|
69
|
+
default:
|
|
70
|
+
return 'string';
|
|
71
|
+
}
|
|
72
|
+
};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Оборачивает инструкции SQL в транзакцию
|
|
3
|
+
*/
|
|
4
|
+
export const wrapTransactionMs = (strSQL: string): string => `BEGIN TRY
|
|
5
|
+
BEGIN TRANSACTION;
|
|
6
|
+
|
|
7
|
+
${strSQL}
|
|
8
|
+
|
|
9
|
+
COMMIT TRANSACTION;
|
|
10
|
+
END TRY
|
|
11
|
+
BEGIN CATCH
|
|
12
|
+
DECLARE @ErrorMessage NVARCHAR(MAX)
|
|
13
|
+
, @ErrorSeverity INT
|
|
14
|
+
, @ErrorState INT;
|
|
15
|
+
|
|
16
|
+
SELECT
|
|
17
|
+
@ErrorMessage = ERROR_MESSAGE() + ' Line ' + CAST(ERROR_LINE() AS NVARCHAR(5))
|
|
18
|
+
, @ErrorSeverity = ERROR_SEVERITY()
|
|
19
|
+
, @ErrorState = ERROR_STATE();
|
|
20
|
+
|
|
21
|
+
IF @@trancount > 0
|
|
22
|
+
BEGIN
|
|
23
|
+
ROLLBACK TRANSACTION;
|
|
24
|
+
END;
|
|
25
|
+
|
|
26
|
+
RAISERROR(@ErrorMessage, @ErrorSeverity, @ErrorState);
|
|
27
|
+
END CATCH;`;
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/* eslint-disable no-await-in-loop */
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import * as fs from 'fs';
|
|
4
|
+
import { echo } from 'af-echo-ts';
|
|
5
|
+
import { IFieldDefPg } from '../@types/i-pg';
|
|
6
|
+
import { getTableSchemaPg } from './table-schema-pg';
|
|
7
|
+
import { closeAllPgConnectionsPg } from './pool-pg';
|
|
8
|
+
import { getJsTypeByTypePg } from './utils-pg';
|
|
9
|
+
|
|
10
|
+
// export const getJsTypeByUdtNamePg = (udtName?: TArrayTypesPg): string => { // VVR
|
|
11
|
+
// switch (udtName) {
|
|
12
|
+
// case '_int2':
|
|
13
|
+
// case '_int4':
|
|
14
|
+
// case '_int8':
|
|
15
|
+
// case '_float8':
|
|
16
|
+
// case '_float4':
|
|
17
|
+
// case '_numeric':
|
|
18
|
+
// case '_money':
|
|
19
|
+
// return 'number';
|
|
20
|
+
// case '_text':
|
|
21
|
+
// case '_varchar':
|
|
22
|
+
// return 'string';
|
|
23
|
+
// case '_bool':
|
|
24
|
+
// return 'boolean';
|
|
25
|
+
// case '_time':
|
|
26
|
+
// case '_date':
|
|
27
|
+
// case '_timestamp':
|
|
28
|
+
// case '_timestamptz':
|
|
29
|
+
// return '(string | Date | number)';
|
|
30
|
+
// default:
|
|
31
|
+
// return 'any';
|
|
32
|
+
// }
|
|
33
|
+
// };
|
|
34
|
+
|
|
35
|
+
const getFieldDefinition = (
|
|
36
|
+
d: IFieldDefPg,
|
|
37
|
+
): string => `${d.name}${d.isNullable || d.hasDefault ? '?' : ''}: ${getJsTypeByTypePg(d.dataType)}${d.isNullable ? ' | null' : ''}`;
|
|
38
|
+
|
|
39
|
+
const TABLE_INTERFACES_DIR = __dirname.replace(/\\/g, '/').replace(/\/dist\//, '/');
|
|
40
|
+
|
|
41
|
+
export const genTableInterfacePg = async (
|
|
42
|
+
connectionId: string,
|
|
43
|
+
commonSchemaAndTable: string,
|
|
44
|
+
tableInterfacesDir: string = TABLE_INTERFACES_DIR,
|
|
45
|
+
): Promise<void> => {
|
|
46
|
+
const tableSchema = await getTableSchemaPg(connectionId, commonSchemaAndTable);
|
|
47
|
+
const interfaceName = `I${commonSchemaAndTable
|
|
48
|
+
.replace('.', '_')
|
|
49
|
+
.split('_')
|
|
50
|
+
.map((word) => word[0].toUpperCase() + word.substring(1)).join('')}Record`;
|
|
51
|
+
|
|
52
|
+
const linesArr = Object.values(tableSchema.columnsSchema).map(getFieldDefinition);
|
|
53
|
+
const content = `export interface ${interfaceName} {\n${linesArr.map((v) => ` ${v}`).join(',\n')},\n}\n`;
|
|
54
|
+
|
|
55
|
+
const fileName = `${commonSchemaAndTable.replace('.', '-').toLowerCase()}.ts`;
|
|
56
|
+
const filePath = path.resolve(path.join(tableInterfacesDir, fileName));
|
|
57
|
+
|
|
58
|
+
fs.writeFileSync(filePath, content);
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
export const genTableInterfacesPg = async (
|
|
62
|
+
connectionId: string,
|
|
63
|
+
tables: string[],
|
|
64
|
+
tableInterfacesDir: string = TABLE_INTERFACES_DIR,
|
|
65
|
+
): Promise<void> => {
|
|
66
|
+
for (let i = 0; i < tables.length; i++) {
|
|
67
|
+
const commonSchemaAndTable = tables[i];
|
|
68
|
+
await genTableInterfacePg(connectionId, commonSchemaAndTable, tableInterfacesDir);
|
|
69
|
+
}
|
|
70
|
+
echo.g(`Generated ${tables.length} table interfaces in folder '.${
|
|
71
|
+
tableInterfacesDir.replace(process.cwd().replace(/\\/g, '/'), '')}/'`);
|
|
72
|
+
await closeAllPgConnectionsPg();
|
|
73
|
+
process.exit(0);
|
|
74
|
+
};
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { getTableSchemaPg } from '../table-schema-pg';
|
|
2
|
+
import { prepareSqlValuePg } from '../prepare-value';
|
|
3
|
+
import { ITableSchemaPg } from '../../@types/i-pg';
|
|
4
|
+
import { TDBRecord, TRecordSet } from '../../@types/i-common';
|
|
5
|
+
import { schemaTable } from '../../utils/utils';
|
|
6
|
+
import { NULL } from '../../common';
|
|
7
|
+
|
|
8
|
+
export const getInsertSqlPg = async <U extends TDBRecord = TDBRecord> (arg: {
|
|
9
|
+
connectionId: string,
|
|
10
|
+
commonSchemaAndTable: string,
|
|
11
|
+
recordset: TRecordSet<U>,
|
|
12
|
+
excludeFromInsert?: string[],
|
|
13
|
+
addOutputInserted?: boolean,
|
|
14
|
+
}): Promise<string> => {
|
|
15
|
+
const { commonSchemaAndTable } = arg;
|
|
16
|
+
|
|
17
|
+
const tableSchema: ITableSchemaPg = await getTableSchemaPg(arg.connectionId, commonSchemaAndTable);
|
|
18
|
+
const { columnsSchema, fieldsWoSerialsAndRO, defaults } = tableSchema;
|
|
19
|
+
|
|
20
|
+
const insertFieldsArray = fieldsWoSerialsAndRO.filter((f) => (!(arg.excludeFromInsert || []).includes(f)));
|
|
21
|
+
const insertFieldsList = insertFieldsArray.map((f) => `"${f}"`).join(', ');
|
|
22
|
+
|
|
23
|
+
const preparedRowsArray = arg.recordset.map((record) => {
|
|
24
|
+
const preparedRecordValuesArray = insertFieldsArray.map((f) => {
|
|
25
|
+
const value = record[f];
|
|
26
|
+
const fieldDef = columnsSchema[f];
|
|
27
|
+
if (value != null) {
|
|
28
|
+
return prepareSqlValuePg({ value, fieldDef });
|
|
29
|
+
}
|
|
30
|
+
const defVal = defaults[f];
|
|
31
|
+
if (!fieldDef.isNullable && defVal != null) {
|
|
32
|
+
return defVal;
|
|
33
|
+
}
|
|
34
|
+
return NULL;
|
|
35
|
+
});
|
|
36
|
+
return preparedRecordValuesArray.join(',');
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
const values = preparedRowsArray.map((v) => `(${v})`).join('\n,');
|
|
40
|
+
const out = arg.addOutputInserted ? ' RETURNING * ' : '';
|
|
41
|
+
const target = schemaTable.to.pg(commonSchemaAndTable);
|
|
42
|
+
// noinspection UnnecessaryLocalVariableJS
|
|
43
|
+
const insertSQL = `INSERT INTO ${target} (${insertFieldsList})
|
|
44
|
+
VALUES ${values} ON CONFLICT DO NOTHING ${out};`;
|
|
45
|
+
return insertSQL;
|
|
46
|
+
};
|