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.
Files changed (307) hide show
  1. package/dist/cjs/__tests__/db/ms/@gen-types/test-table_schema.js +3 -0
  2. package/dist/cjs/__tests__/db/ms/@gen-types/test-table_schema.js.map +1 -0
  3. package/dist/cjs/__tests__/db/ms/ddl/column-schema-for-test-table-schema-ms.json +216 -0
  4. package/dist/cjs/__tests__/db/ms/ms-get-sql.spec.js +190 -0
  5. package/dist/cjs/__tests__/db/ms/ms-get-sql.spec.js.map +1 -0
  6. package/dist/cjs/__tests__/db/ms/ms-prepare-sql-value.spec.js +584 -0
  7. package/dist/cjs/__tests__/db/ms/ms-prepare-sql-value.spec.js.map +1 -0
  8. package/dist/cjs/__tests__/db/ms/ms-table-schema.spec.js +107 -0
  9. package/dist/cjs/__tests__/db/ms/ms-table-schema.spec.js.map +1 -0
  10. package/dist/cjs/__tests__/db/pg/@gen-types/test-hard_case.js +3 -0
  11. package/dist/cjs/__tests__/db/pg/@gen-types/test-hard_case.js.map +1 -0
  12. package/dist/cjs/__tests__/db/pg/@gen-types/test-only_one_serial.js +3 -0
  13. package/dist/cjs/__tests__/db/pg/@gen-types/test-only_one_serial.js.map +1 -0
  14. package/dist/cjs/__tests__/db/pg/@gen-types/test-only_one_uniq.js +3 -0
  15. package/dist/cjs/__tests__/db/pg/@gen-types/test-only_one_uniq.js.map +1 -0
  16. package/dist/cjs/__tests__/db/pg/@gen-types/test-serial_and_uniq.js +3 -0
  17. package/dist/cjs/__tests__/db/pg/@gen-types/test-serial_and_uniq.js.map +1 -0
  18. package/dist/cjs/__tests__/db/pg/@gen-types/test-table_schema.js +3 -0
  19. package/dist/cjs/__tests__/db/pg/@gen-types/test-table_schema.js.map +1 -0
  20. package/dist/cjs/__tests__/db/pg/ddl/column-schema-for-test-table-schema-pg.json +170 -0
  21. package/dist/cjs/__tests__/db/pg/gen-table-interfaces-4-test-pg.js +36 -0
  22. package/dist/cjs/__tests__/db/pg/gen-table-interfaces-4-test-pg.js.map +1 -0
  23. package/dist/cjs/__tests__/db/pg/pg-get-sql.spec.js +261 -0
  24. package/dist/cjs/__tests__/db/pg/pg-get-sql.spec.js.map +1 -0
  25. package/dist/cjs/__tests__/db/pg/pg-insert.spec.js +294 -0
  26. package/dist/cjs/__tests__/db/pg/pg-insert.spec.js.map +1 -0
  27. package/dist/cjs/__tests__/db/pg/pg-prepare-sql-value.spec.js +575 -0
  28. package/dist/cjs/__tests__/db/pg/pg-prepare-sql-value.spec.js.map +1 -0
  29. package/dist/cjs/__tests__/db/pg/pg-table-schema.spec.js +117 -0
  30. package/dist/cjs/__tests__/db/pg/pg-table-schema.spec.js.map +1 -0
  31. package/dist/cjs/src/@types/i-data-types-ms.js +3 -0
  32. package/dist/cjs/src/@types/i-data-types-ms.js.map +1 -0
  33. package/dist/cjs/src/@types/i-data-types-pg.js +7 -0
  34. package/dist/cjs/src/@types/i-data-types-pg.js.map +1 -0
  35. package/dist/cjs/src/@types/i-pg.js +0 -21
  36. package/dist/cjs/src/@types/i-pg.js.map +1 -1
  37. package/dist/cjs/src/common.js +6 -5
  38. package/dist/cjs/src/common.js.map +1 -1
  39. package/dist/cjs/src/index.js +75 -54
  40. package/dist/cjs/src/index.js.map +1 -1
  41. package/dist/cjs/src/ms/gen-table-interfaces-ms.js +64 -0
  42. package/dist/cjs/src/ms/gen-table-interfaces-ms.js.map +1 -0
  43. package/dist/cjs/src/ms/get-sql/insert.js +37 -0
  44. package/dist/cjs/src/ms/get-sql/insert.js.map +1 -0
  45. package/dist/cjs/src/ms/get-sql/merge.js +93 -0
  46. package/dist/cjs/src/ms/get-sql/merge.js.map +1 -0
  47. package/dist/cjs/src/ms/get-sql/update.js +32 -0
  48. package/dist/cjs/src/ms/get-sql/update.js.map +1 -0
  49. package/dist/cjs/src/{mssql → ms}/pool-ms.js +6 -23
  50. package/dist/cjs/src/ms/pool-ms.js.map +1 -0
  51. package/dist/cjs/src/ms/prepare-value.js +178 -0
  52. package/dist/cjs/src/ms/prepare-value.js.map +1 -0
  53. package/dist/cjs/src/{mssql → ms}/query-ms.js +1 -1
  54. package/dist/cjs/src/ms/query-ms.js.map +1 -0
  55. package/dist/cjs/src/ms/table-schema-ms.js +241 -0
  56. package/dist/cjs/src/ms/table-schema-ms.js.map +1 -0
  57. package/dist/cjs/src/ms/utils-ms.js +92 -0
  58. package/dist/cjs/src/ms/utils-ms.js.map +1 -0
  59. package/dist/cjs/src/ms/wrap-transaction-ms.js +32 -0
  60. package/dist/cjs/src/ms/wrap-transaction-ms.js.map +1 -0
  61. package/dist/cjs/src/pg/gen-table-interfaces-pg.js +83 -0
  62. package/dist/cjs/src/pg/gen-table-interfaces-pg.js.map +1 -0
  63. package/dist/cjs/src/pg/get-sql/insert.js +38 -0
  64. package/dist/cjs/src/pg/get-sql/insert.js.map +1 -0
  65. package/dist/cjs/src/pg/get-sql/merge.js +60 -0
  66. package/dist/cjs/src/pg/get-sql/merge.js.map +1 -0
  67. package/dist/cjs/src/pg/get-sql/update.js +32 -0
  68. package/dist/cjs/src/pg/get-sql/update.js.map +1 -0
  69. package/dist/cjs/src/pg/{insert.js → insert-pg.js} +10 -10
  70. package/dist/cjs/src/pg/insert-pg.js.map +1 -0
  71. package/dist/cjs/src/pg/is-table-or-view-exists.js +1 -2
  72. package/dist/cjs/src/pg/is-table-or-view-exists.js.map +1 -1
  73. package/dist/cjs/src/pg/{pg-pool.js → pool-pg.js} +6 -7
  74. package/dist/cjs/src/pg/pool-pg.js.map +1 -0
  75. package/dist/cjs/src/pg/prepare-value.js +116 -69
  76. package/dist/cjs/src/pg/prepare-value.js.map +1 -1
  77. package/dist/cjs/src/pg/query-pg.js +2 -2
  78. package/dist/cjs/src/pg/query-pg.js.map +1 -1
  79. package/dist/cjs/src/pg/table-schema-pg.js +183 -0
  80. package/dist/cjs/src/pg/table-schema-pg.js.map +1 -0
  81. package/dist/cjs/src/pg/utils-pg.js +99 -0
  82. package/dist/cjs/src/pg/utils-pg.js.map +1 -0
  83. package/dist/cjs/src/utils/utils-array.js +152 -0
  84. package/dist/cjs/src/utils/utils-array.js.map +1 -0
  85. package/dist/cjs/src/utils/utils-dt.js +121 -0
  86. package/dist/cjs/src/utils/utils-dt.js.map +1 -0
  87. package/dist/cjs/src/utils/utils-num.js +127 -0
  88. package/dist/cjs/src/utils/utils-num.js.map +1 -0
  89. package/dist/cjs/src/utils/utils.js +66 -0
  90. package/dist/cjs/src/utils/utils.js.map +1 -0
  91. package/dist/esm/src/@types/i-data-types-ms.js +2 -0
  92. package/dist/esm/src/@types/i-data-types-ms.js.map +1 -0
  93. package/dist/esm/src/@types/i-data-types-pg.js +6 -0
  94. package/dist/esm/src/@types/i-data-types-pg.js.map +1 -0
  95. package/dist/esm/src/@types/i-pg.js +1 -20
  96. package/dist/esm/src/@types/i-pg.js.map +1 -1
  97. package/dist/esm/src/common.js +3 -2
  98. package/dist/esm/src/common.js.map +1 -1
  99. package/dist/esm/src/index.js +24 -15
  100. package/dist/esm/src/index.js.map +1 -1
  101. package/dist/esm/src/ms/gen-table-interfaces-ms.js +36 -0
  102. package/dist/esm/src/ms/gen-table-interfaces-ms.js.map +1 -0
  103. package/dist/esm/src/ms/get-sql/insert.js +33 -0
  104. package/dist/esm/src/ms/get-sql/insert.js.map +1 -0
  105. package/dist/esm/src/ms/get-sql/merge.js +89 -0
  106. package/dist/esm/src/ms/get-sql/merge.js.map +1 -0
  107. package/dist/esm/src/ms/get-sql/update.js +28 -0
  108. package/dist/esm/src/ms/get-sql/update.js.map +1 -0
  109. package/dist/esm/src/{mssql → ms}/pool-ms.js +5 -20
  110. package/dist/esm/src/ms/pool-ms.js.map +1 -0
  111. package/dist/esm/src/ms/prepare-value.js +149 -0
  112. package/dist/esm/src/ms/prepare-value.js.map +1 -0
  113. package/dist/esm/src/{mssql → ms}/query-ms.js +1 -1
  114. package/dist/esm/src/ms/query-ms.js.map +1 -0
  115. package/dist/esm/src/ms/table-schema-ms.js +213 -0
  116. package/dist/esm/src/ms/table-schema-ms.js.map +1 -0
  117. package/dist/esm/src/ms/utils-ms.js +65 -0
  118. package/dist/esm/src/ms/utils-ms.js.map +1 -0
  119. package/dist/esm/src/ms/wrap-transaction-ms.js +28 -0
  120. package/dist/esm/src/ms/wrap-transaction-ms.js.map +1 -0
  121. package/dist/esm/src/pg/gen-table-interfaces-pg.js +55 -0
  122. package/dist/esm/src/pg/gen-table-interfaces-pg.js.map +1 -0
  123. package/dist/esm/src/pg/get-sql/insert.js +34 -0
  124. package/dist/esm/src/pg/get-sql/insert.js.map +1 -0
  125. package/dist/esm/src/pg/get-sql/merge.js +56 -0
  126. package/dist/esm/src/pg/get-sql/merge.js.map +1 -0
  127. package/dist/esm/src/pg/get-sql/update.js +28 -0
  128. package/dist/esm/src/pg/get-sql/update.js.map +1 -0
  129. package/dist/esm/src/pg/{insert.js → insert-pg.js} +10 -10
  130. package/dist/esm/src/pg/insert-pg.js.map +1 -0
  131. package/dist/esm/src/pg/is-table-or-view-exists.js +1 -2
  132. package/dist/esm/src/pg/is-table-or-view-exists.js.map +1 -1
  133. package/dist/esm/src/pg/{pg-pool.js → pool-pg.js} +6 -7
  134. package/dist/esm/src/pg/pool-pg.js.map +1 -0
  135. package/dist/esm/src/pg/prepare-value.js +113 -67
  136. package/dist/esm/src/pg/prepare-value.js.map +1 -1
  137. package/dist/esm/src/pg/query-pg.js +1 -1
  138. package/dist/esm/src/pg/query-pg.js.map +1 -1
  139. package/dist/esm/src/pg/table-schema-pg.js +178 -0
  140. package/dist/esm/src/pg/table-schema-pg.js.map +1 -0
  141. package/dist/esm/src/pg/utils-pg.js +93 -0
  142. package/dist/esm/src/pg/utils-pg.js.map +1 -0
  143. package/dist/esm/src/utils/utils-array.js +125 -0
  144. package/dist/esm/src/utils/utils-array.js.map +1 -0
  145. package/dist/esm/src/utils/utils-dt.js +114 -0
  146. package/dist/esm/src/utils/utils-dt.js.map +1 -0
  147. package/dist/esm/src/utils/utils-num.js +117 -0
  148. package/dist/esm/src/utils/utils-num.js.map +1 -0
  149. package/dist/esm/src/utils/utils.js +58 -0
  150. package/dist/esm/src/utils/utils.js.map +1 -0
  151. package/dist/types/src/@types/i-common.d.ts +35 -3
  152. package/dist/types/src/@types/i-common.d.ts.map +1 -1
  153. package/dist/types/src/@types/i-data-types-ms.d.ts +3 -0
  154. package/dist/types/src/@types/i-data-types-ms.d.ts.map +1 -0
  155. package/dist/types/src/@types/i-data-types-pg.d.ts +35 -0
  156. package/dist/types/src/@types/i-data-types-pg.d.ts.map +1 -0
  157. package/dist/types/src/@types/i-ms.d.ts +26 -126
  158. package/dist/types/src/@types/i-ms.d.ts.map +1 -1
  159. package/dist/types/src/@types/i-pg.d.ts +11 -35
  160. package/dist/types/src/@types/i-pg.d.ts.map +1 -1
  161. package/dist/types/src/common.d.ts +1 -0
  162. package/dist/types/src/common.d.ts.map +1 -1
  163. package/dist/types/src/index.d.ts +28 -16
  164. package/dist/types/src/index.d.ts.map +1 -1
  165. package/dist/types/src/ms/gen-table-interfaces-ms.d.ts +3 -0
  166. package/dist/types/src/ms/gen-table-interfaces-ms.d.ts.map +1 -0
  167. package/dist/types/src/ms/get-sql/insert.d.ts +9 -0
  168. package/dist/types/src/ms/get-sql/insert.d.ts.map +1 -0
  169. package/dist/types/src/ms/get-sql/merge.d.ts +14 -0
  170. package/dist/types/src/ms/get-sql/merge.d.ts.map +1 -0
  171. package/dist/types/src/ms/get-sql/update.d.ts +9 -0
  172. package/dist/types/src/ms/get-sql/update.d.ts.map +1 -0
  173. package/dist/types/src/{mssql → ms}/pool-ms.d.ts +0 -8
  174. package/dist/types/src/ms/pool-ms.d.ts.map +1 -0
  175. package/dist/types/src/ms/prepare-value.d.ts +12 -0
  176. package/dist/types/src/ms/prepare-value.d.ts.map +1 -0
  177. package/dist/types/src/ms/query-ms.d.ts +3 -0
  178. package/dist/types/src/ms/query-ms.d.ts.map +1 -0
  179. package/dist/types/src/ms/table-schema-ms.d.ts +9 -0
  180. package/dist/types/src/ms/table-schema-ms.d.ts.map +1 -0
  181. package/dist/types/src/ms/utils-ms.d.ts +3 -0
  182. package/dist/types/src/ms/utils-ms.d.ts.map +1 -0
  183. package/dist/types/src/ms/wrap-transaction-ms.d.ts +5 -0
  184. package/dist/types/src/ms/wrap-transaction-ms.d.ts.map +1 -0
  185. package/dist/types/src/pg/gen-table-interfaces-pg.d.ts +3 -0
  186. package/dist/types/src/pg/gen-table-interfaces-pg.d.ts.map +1 -0
  187. package/dist/types/src/pg/get-sql/insert.d.ts +9 -0
  188. package/dist/types/src/pg/get-sql/insert.d.ts.map +1 -0
  189. package/dist/types/src/pg/get-sql/merge.d.ts +10 -0
  190. package/dist/types/src/pg/get-sql/merge.d.ts.map +1 -0
  191. package/dist/types/src/pg/get-sql/update.d.ts +9 -0
  192. package/dist/types/src/pg/get-sql/update.d.ts.map +1 -0
  193. package/dist/types/src/pg/{insert.d.ts → insert-pg.d.ts} +3 -3
  194. package/dist/types/src/pg/insert-pg.d.ts.map +1 -0
  195. package/dist/types/src/pg/{pg-pool.d.ts → pool-pg.d.ts} +1 -1
  196. package/dist/types/src/pg/{pg-pool.d.ts.map → pool-pg.d.ts.map} +1 -1
  197. package/dist/types/src/pg/prepare-value.d.ts +3 -1
  198. package/dist/types/src/pg/prepare-value.d.ts.map +1 -1
  199. package/dist/types/src/pg/query-pg.d.ts +3 -2
  200. package/dist/types/src/pg/query-pg.d.ts.map +1 -1
  201. package/dist/types/src/pg/table-schema-pg.d.ts +12 -0
  202. package/dist/types/src/pg/table-schema-pg.d.ts.map +1 -0
  203. package/dist/types/src/pg/utils-pg.d.ts +5 -0
  204. package/dist/types/src/pg/utils-pg.d.ts.map +1 -0
  205. package/dist/types/src/utils/utils-array.d.ts +5 -0
  206. package/dist/types/src/utils/utils-array.d.ts.map +1 -0
  207. package/dist/types/src/utils/utils-dt.d.ts +15 -0
  208. package/dist/types/src/utils/utils-dt.d.ts.map +1 -0
  209. package/dist/types/src/utils/utils-num.d.ts +9 -0
  210. package/dist/types/src/utils/utils-num.d.ts.map +1 -0
  211. package/dist/types/src/utils/utils.d.ts +18 -0
  212. package/dist/types/src/utils/utils.d.ts.map +1 -0
  213. package/package.json +13 -13
  214. package/src/@types/i-common.ts +42 -4
  215. package/src/@types/i-data-types-ms.ts +81 -0
  216. package/src/@types/i-data-types-pg.ts +120 -0
  217. package/src/@types/i-ms.ts +29 -153
  218. package/src/@types/i-pg.ts +11 -36
  219. package/src/common.ts +4 -2
  220. package/src/index.ts +101 -59
  221. package/src/ms/gen-table-interfaces-ms.ts +52 -0
  222. package/src/ms/get-sql/insert.ts +45 -0
  223. package/src/ms/get-sql/merge.ts +118 -0
  224. package/src/ms/get-sql/update.ts +46 -0
  225. package/src/{mssql → ms}/pool-ms.ts +0 -16
  226. package/src/ms/prepare-value.ts +175 -0
  227. package/src/{mssql → ms}/query-ms.ts +2 -2
  228. package/src/ms/table-schema-ms.ts +231 -0
  229. package/src/ms/utils-ms.ts +72 -0
  230. package/src/ms/wrap-transaction-ms.ts +27 -0
  231. package/src/pg/gen-table-interfaces-pg.ts +74 -0
  232. package/src/pg/get-sql/insert.ts +46 -0
  233. package/src/pg/get-sql/merge.ts +70 -0
  234. package/src/pg/get-sql/update.ts +46 -0
  235. package/src/pg/{insert.ts → insert-pg.ts} +9 -9
  236. package/src/pg/prepare-value.ts +129 -67
  237. package/src/pg/query-pg.ts +4 -3
  238. package/src/pg/table-schema-pg.ts +196 -0
  239. package/src/pg/utils-pg.ts +97 -0
  240. package/src/utils/utils-array.ts +133 -0
  241. package/src/utils/utils-dt.ts +123 -0
  242. package/src/utils/utils-num.ts +131 -0
  243. package/src/utils/utils.ts +64 -0
  244. package/dist/cjs/__tests__/02_getValueForSqlMs.spec.js +0 -50
  245. package/dist/cjs/__tests__/02_getValueForSqlMs.spec.js.map +0 -1
  246. package/dist/cjs/src/mssql/get-value-for-sql.js +0 -277
  247. package/dist/cjs/src/mssql/get-value-for-sql.js.map +0 -1
  248. package/dist/cjs/src/mssql/pool-ms.js.map +0 -1
  249. package/dist/cjs/src/mssql/query-ms.js.map +0 -1
  250. package/dist/cjs/src/mssql/sql.js +0 -427
  251. package/dist/cjs/src/mssql/sql.js.map +0 -1
  252. package/dist/cjs/src/mssql/utils.js +0 -36
  253. package/dist/cjs/src/mssql/utils.js.map +0 -1
  254. package/dist/cjs/src/pg/get-merge-sql.js +0 -52
  255. package/dist/cjs/src/pg/get-merge-sql.js.map +0 -1
  256. package/dist/cjs/src/pg/get-update-sql.js +0 -30
  257. package/dist/cjs/src/pg/get-update-sql.js.map +0 -1
  258. package/dist/cjs/src/pg/insert.js.map +0 -1
  259. package/dist/cjs/src/pg/pg-pool.js.map +0 -1
  260. package/dist/cjs/src/pg/table-schema.js +0 -179
  261. package/dist/cjs/src/pg/table-schema.js.map +0 -1
  262. package/dist/cjs/src/utils.js +0 -17
  263. package/dist/cjs/src/utils.js.map +0 -1
  264. package/dist/esm/src/mssql/get-value-for-sql.js +0 -272
  265. package/dist/esm/src/mssql/get-value-for-sql.js.map +0 -1
  266. package/dist/esm/src/mssql/pool-ms.js.map +0 -1
  267. package/dist/esm/src/mssql/query-ms.js.map +0 -1
  268. package/dist/esm/src/mssql/sql.js +0 -390
  269. package/dist/esm/src/mssql/sql.js.map +0 -1
  270. package/dist/esm/src/mssql/utils.js +0 -31
  271. package/dist/esm/src/mssql/utils.js.map +0 -1
  272. package/dist/esm/src/pg/get-merge-sql.js +0 -48
  273. package/dist/esm/src/pg/get-merge-sql.js.map +0 -1
  274. package/dist/esm/src/pg/get-update-sql.js +0 -26
  275. package/dist/esm/src/pg/get-update-sql.js.map +0 -1
  276. package/dist/esm/src/pg/insert.js.map +0 -1
  277. package/dist/esm/src/pg/pg-pool.js.map +0 -1
  278. package/dist/esm/src/pg/table-schema.js +0 -174
  279. package/dist/esm/src/pg/table-schema.js.map +0 -1
  280. package/dist/esm/src/utils.js +0 -14
  281. package/dist/esm/src/utils.js.map +0 -1
  282. package/dist/types/src/mssql/get-value-for-sql.d.ts +0 -11
  283. package/dist/types/src/mssql/get-value-for-sql.d.ts.map +0 -1
  284. package/dist/types/src/mssql/pool-ms.d.ts.map +0 -1
  285. package/dist/types/src/mssql/query-ms.d.ts +0 -3
  286. package/dist/types/src/mssql/query-ms.d.ts.map +0 -1
  287. package/dist/types/src/mssql/sql.d.ts +0 -57
  288. package/dist/types/src/mssql/sql.d.ts.map +0 -1
  289. package/dist/types/src/mssql/utils.d.ts +0 -10
  290. package/dist/types/src/mssql/utils.d.ts.map +0 -1
  291. package/dist/types/src/pg/get-merge-sql.d.ts +0 -9
  292. package/dist/types/src/pg/get-merge-sql.d.ts.map +0 -1
  293. package/dist/types/src/pg/get-update-sql.d.ts +0 -3
  294. package/dist/types/src/pg/get-update-sql.d.ts.map +0 -1
  295. package/dist/types/src/pg/insert.d.ts.map +0 -1
  296. package/dist/types/src/pg/table-schema.d.ts +0 -12
  297. package/dist/types/src/pg/table-schema.d.ts.map +0 -1
  298. package/dist/types/src/utils.d.ts +0 -9
  299. package/dist/types/src/utils.d.ts.map +0 -1
  300. package/src/mssql/get-value-for-sql.ts +0 -325
  301. package/src/mssql/sql.ts +0 -430
  302. package/src/mssql/utils.ts +0 -31
  303. package/src/pg/get-merge-sql.ts +0 -62
  304. package/src/pg/get-update-sql.ts +0 -32
  305. package/src/pg/table-schema.ts +0 -189
  306. package/src/utils.ts +0 -14
  307. /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<any> | undefined> => {
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
+ };