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
package/src/mssql/sql.ts DELETED
@@ -1,430 +0,0 @@
1
- // noinspection SqlResolve
2
- import * as sql from 'mssql';
3
- import { IColumnMetadata, IResult } from 'mssql';
4
- import { echo } from 'af-echo-ts';
5
- import * as cache from 'memory-cache';
6
- import { each, omit, pick } from 'af-tools-ts';
7
- import * as db from './pool-ms';
8
- import { q, mssqlEscape } from './utils';
9
- import { getValueForSqlMs } from './get-value-for-sql';
10
- import { IFieldSchemaMs, IGetMergeSQLOptionsMs,
11
- IGetValueForSqlArgsMs,
12
- IPrepareRecordForSqlArgsMs,
13
- IPrepareSqlStringArgsMs, ISchemaArrayMs,
14
- TFieldTypeCorrectionMs,
15
- TGetRecordSchemaOptionsMs, TGetRecordSchemaResultMs,
16
- TRecordSchemaAssocMs,
17
- TRecordSchemaMs } from '../@types/i-ms';
18
- import { TDBRecord, TFieldName, TRecordSet } from '../@types/i-common';
19
- import { IDBConfigMs } from '../@types/i-config';
20
- import { schemaTable } from '../utils';
21
-
22
- export { sql };
23
-
24
- /**
25
- * Подготовка строки для передачи в SQL
26
- */
27
- export const prepareSqlStringMs = (args: IPrepareSqlStringArgsMs): string | null => {
28
- const { value, defaultValue = null, length = 0, nullable = false, noQuotes = false, escapeOnlySingleQuotes = false } = args;
29
- if (value == null) {
30
- if (nullable) {
31
- return 'NULL';
32
- }
33
- if (defaultValue) {
34
- return q(defaultValue, noQuotes);
35
- }
36
- return ''; // Это нештатная ситуация, т.к. поле не получит никакого значения ( ,, )
37
- }
38
- if (value === '') {
39
- if (noQuotes) {
40
- return ''; // Это нештатная ситуация, т.к. поле не получит никакого значения ( ,, )
41
- }
42
- return `''`;
43
- }
44
- let val = mssqlEscape(String(value), escapeOnlySingleQuotes);
45
- if (length > 0) {
46
- val = val.substring(0, length);
47
- }
48
- return q(val, noQuotes);
49
- };
50
-
51
- const FIELD_SCHEMA_PROPS = ['index', 'name', 'length', 'type', 'scale', 'precision', 'nullable', 'caseSensitive',
52
- 'identity', 'mergeIdentity', 'readOnly', 'inputDateFormat', 'defaultValue'];
53
-
54
- /**
55
- * Корректировка схемы таблицы
56
- * Поля с суффиксом _json получают тип "json". Остальные корректировки берутся из fieldTypeCorrection
57
- * Например, для полей типа datetime можно передавать свойство inputDateFormat
58
- */
59
- export const correctRecordSchemaMs = (
60
- recordSchemaAssoc: TRecordSchemaAssocMs,
61
- // объект корректировок
62
- fieldTypeCorrection?: TFieldTypeCorrectionMs,
63
- ) => {
64
- each(recordSchemaAssoc, (fieldSchema: IFieldSchemaMs, fieldName: TFieldName) => {
65
- if (/_json$/i.test(fieldName)) {
66
- fieldSchema.type = 'json';
67
- }
68
- switch (fieldSchema.type) {
69
- case sql.NChar:
70
- case sql.NText:
71
- case sql.NVarChar:
72
- if (fieldSchema.length) {
73
- fieldSchema.length = Math.floor(fieldSchema.length / 2);
74
- }
75
- break;
76
- case sql.UniqueIdentifier:
77
- fieldSchema.length = 36;
78
- break;
79
- default:
80
- }
81
- });
82
- if (fieldTypeCorrection && typeof fieldTypeCorrection === 'object') {
83
- each(fieldTypeCorrection, (correction: IFieldSchemaMs, fieldName: TFieldName) => {
84
- FIELD_SCHEMA_PROPS.forEach((prop) => {
85
- if (correction[prop] !== undefined) {
86
- if (!recordSchemaAssoc[fieldName]) {
87
- recordSchemaAssoc[fieldName] = {} as IFieldSchemaMs;
88
- }
89
- recordSchemaAssoc[fieldName][prop] = correction[prop];
90
- }
91
- });
92
- });
93
- }
94
- };
95
-
96
- /**
97
- * Подготовка значений записи для использования в SQL
98
- *
99
- * Все поля записи обрабатываются функцией getValueForSqlMs
100
- */
101
- export const prepareRecordForSqlMs = (record: TDBRecord, args: IPrepareRecordForSqlArgsMs) => {
102
- const { recordSchema, addValues4NotNullableFields, addMissingFields } = args;
103
- const { dateTimeOptions, needValidate, escapeOnlySingleQuotes, dialect } = args;
104
- const options: IGetValueForSqlArgsMs = {
105
- value: null,
106
- fieldSchema: '',
107
- needValidate,
108
- escapeOnlySingleQuotes,
109
- dialect,
110
- dateTimeOptions: { ...(recordSchema.dateTimeOptions || {}), ...(dateTimeOptions || {}) },
111
- };
112
- recordSchema.forEach((fieldSchema: IFieldSchemaMs) => {
113
- const { name = '_#foo#_', readOnly } = fieldSchema;
114
- if (readOnly) {
115
- return;
116
- }
117
- if (Object.prototype.hasOwnProperty.call(record, name)) {
118
- record[name] = getValueForSqlMs({ ...options, value: record[name], fieldSchema });
119
- } else if ((!fieldSchema.nullable && addValues4NotNullableFields) || addMissingFields) {
120
- record[name] = getValueForSqlMs({ ...options, value: null, fieldSchema });
121
- }
122
- });
123
- };
124
-
125
- /**
126
- * Подготовка данных для SQL
127
- *
128
- * Все поля всех записей обрабатываются функцией getValueForSqlMs
129
- */
130
- export const prepareDataForSqlMs = (recordSet: TRecordSet, args: IPrepareRecordForSqlArgsMs) => {
131
- if (recordSet._isPreparedForSQL) {
132
- return;
133
- }
134
- recordSet.forEach((record) => {
135
- prepareRecordForSqlMs(record, args);
136
- });
137
- recordSet._isPreparedForSQL = true;
138
- };
139
-
140
- /**
141
- * Возвращает рекорд, в котором все значения преобразованы в строки и подготовлены для прямой вставки в SQL
142
- * В частности, если значение типа строка, то оно уже заключено в одинарные кавычки
143
- */
144
- export const getRecordValuesForSqlMs = (record: TDBRecord, recordSchema: TRecordSchemaMs): TDBRecord => {
145
- const recordValuesForSQL = {};
146
- recordSchema.forEach((fieldSchema) => {
147
- const { name = '_#foo#_', readOnly } = fieldSchema;
148
- if (readOnly) {
149
- return;
150
- }
151
- if (Object.prototype.hasOwnProperty.call(record, name)) {
152
- recordValuesForSQL[name] = getValueForSqlMs({
153
- value: record[name],
154
- fieldSchema,
155
- escapeOnlySingleQuotes: true,
156
- dateTimeOptions: recordSchema.dateTimeOptions,
157
- dialect: recordSchema.dialect,
158
- });
159
- }
160
- });
161
- return recordValuesForSQL;
162
- };
163
-
164
- /**
165
- * Возвращает схему полей таблицы БД. Либо в виде объекта, либо в виде массива
166
- * Если asArray = true, то вернет TRecordSchemaMs, при этом удалит поля, указанные в omitFields
167
- * Иначе вернет TRecordSchemaAssocMs
168
- */
169
- export const getRecordSchemaMs = async (
170
- // ID соединения (borf|cep|hr|global)
171
- connectionId: string,
172
- // Субъект в выражении FROM для таблицы, схему которой нужно вернуть
173
- commonSchemaAndTable: string,
174
- // Массив имен полей, которые нужно удалить из схемы (не учитывается, если asArray = false)
175
- options: TGetRecordSchemaOptionsMs = {} as TGetRecordSchemaOptionsMs,
176
- ): Promise<TGetRecordSchemaResultMs | undefined> => {
177
- commonSchemaAndTable = schemaTable.to.common(commonSchemaAndTable);
178
- const propertyPath = `schemas.${connectionId}.${commonSchemaAndTable}`;
179
- const schemaTableMs = schemaTable.to.pg(commonSchemaAndTable);
180
-
181
- let result: TGetRecordSchemaResultMs | undefined = cache.get(propertyPath) as TGetRecordSchemaResultMs | undefined;
182
- if (result) {
183
- return result;
184
- }
185
- const {
186
- omitFields,
187
- pickFields,
188
- fieldTypeCorrection,
189
- mergeRules: {
190
- mergeIdentity = [],
191
- excludeFromInsert = [],
192
- noUpdateIfNull = false,
193
- correction: mergeCorrection,
194
- withClause,
195
- } = {},
196
- noReturnMergeResult,
197
- dateTimeOptions,
198
- } = options;
199
- const cPool = await db.getPoolConnectionMs(connectionId, { prefix: 'getRecordSchemaMs' });
200
- const request = new sql.Request(cPool);
201
- request.stream = false;
202
- let res: IResult<any>;
203
- try {
204
- res = await request.query(`SELECT TOP(1) *
205
- FROM ${schemaTableMs}`);
206
- } catch (err) {
207
- echo.error(`getRecordSchemaMs SQL ERROR`);
208
- echo.error(err);
209
- throw err;
210
- }
211
- const { columns } = res.recordset;
212
- const readOnlyFields = Object.entries(columns).filter(([, { readOnly: ro }]) => ro).map(([f]) => f);
213
- const omitFields2 = [...readOnlyFields, ...(Array.isArray(omitFields) ? omitFields : [])];
214
- let schemaAssoc: Partial<IColumnMetadata> = omit(columns, omitFields2);
215
- schemaAssoc = Array.isArray(pickFields) ? pick(schemaAssoc, pickFields) : schemaAssoc;
216
- correctRecordSchemaMs(schemaAssoc as TRecordSchemaAssocMs, fieldTypeCorrection);
217
- const schema: ISchemaArrayMs = Object.values(schemaAssoc)
218
- .sort((a, b) => {
219
- const ai = (a?.index || 0);
220
- const bi = (b?.index || 0);
221
- if (ai > bi) return 1;
222
- if (ai < bi) return -1;
223
- return 0;
224
- }) as ISchemaArrayMs;
225
- schema.dateTimeOptions = dateTimeOptions;
226
-
227
- const fields = schema.map((o) => o?.name).filter(Boolean) as string[];
228
- const fieldsList = fields.map((fName) => `[${fName}]`)
229
- .join(', ');
230
-
231
- const onClause = `(${mergeIdentity.map((fName) => (`target.[${fName}] = source.[${fName}]`))
232
- .join(' AND ')})`;
233
- const insertFields = fields.filter((fName) => (!excludeFromInsert.includes(fName)));
234
- const insertSourceList = insertFields.map((fName) => (`source.[${fName}]`))
235
- .join(', ');
236
- const insertFieldsList = insertFields.map((fName) => `[${fName}]`)
237
- .join(', ');
238
- const updateFields = fields.filter((fName) => (!mergeIdentity.includes(fName)));
239
- let updateFieldsList: string;
240
- if (noUpdateIfNull) {
241
- updateFieldsList = updateFields.map((fName) => (`target.[${fName}] = COALESCE(source.[${fName}], target.[${fName}])`)).join(', ');
242
- } else {
243
- updateFieldsList = updateFields.map((fName) => (`target.[${fName}] = source.[${fName}]`)).join(', ');
244
- }
245
- const dbConfig = db.getDbConfigMs<IDBConfigMs>(connectionId, false, true) as IDBConfigMs;
246
- const dbSchemaAndTable = `[${dbConfig.database}].${schemaTableMs}`;
247
-
248
- result = {
249
- connectionId,
250
- dbConfig,
251
- schemaAndTable: commonSchemaAndTable,
252
- schemaTableMs,
253
- dbSchemaAndTable,
254
- columns,
255
- schemaAssoc,
256
- schema,
257
- fields,
258
- insertFields,
259
- insertFieldsList,
260
- withClause,
261
- updateFields,
262
- mergeIdentity,
263
- getMergeSQL (packet: TRecordSet, prepareOptions: IGetMergeSQLOptionsMs = {}): string {
264
- if (prepareOptions.isPrepareForSQL) {
265
- prepareDataForSqlMs(packet, { recordSchema: this.schema, ...prepareOptions });
266
- }
267
- const values = `(${packet.map((r) => (fields.map((fName) => (r[fName]))
268
- .join(',')))
269
- .join(`)\n,(`)})`;
270
- let mergeSQL = `
271
- MERGE ${schemaTableMs} ${withClause || ''} AS target
272
- USING
273
- (
274
- SELECT * FROM
275
- ( VALUES
276
- ${values}
277
- )
278
- AS s (
279
- ${fieldsList}
280
- )
281
- )
282
- AS source
283
- ON ${onClause}
284
- WHEN MATCHED THEN
285
- UPDATE SET
286
- ${updateFieldsList}
287
- WHEN NOT MATCHED THEN
288
- INSERT (
289
- ${insertFieldsList}
290
- )
291
- VALUES (
292
- ${insertSourceList}
293
- )`;
294
- if (!noReturnMergeResult) {
295
- mergeSQL = `
296
- ${'DECLARE'} @t TABLE ( act VARCHAR(20));
297
- DECLARE @total AS INTEGER;
298
- DECLARE @i AS INTEGER;
299
- DECLARE @u AS INTEGER;
300
- ${mergeSQL}
301
- OUTPUT $action INTO @t;
302
- SET @total = @@ROWCOUNT;
303
- SELECT @i = COUNT(*) FROM @t WHERE act = 'INSERT';
304
- SELECT @u = COUNT(*) FROM @t WHERE act != 'INSERT';
305
- SELECT @total as total, @i as inserted, @u as updated;
306
- `;
307
- } else {
308
- mergeSQL += `;\n`;
309
- }
310
- return typeof mergeCorrection === 'function' ? mergeCorrection(mergeSQL) : mergeSQL;
311
- },
312
-
313
- getInsertSQL (packet: TRecordSet, addOutputInserted = false): string {
314
- if (!Array.isArray(packet)) {
315
- packet = [packet];
316
- }
317
- const values = `(${packet.map((r) => (insertFields.map((fName) => (r[fName] === undefined ? 'NULL' : r[fName]))
318
- .join(',')))
319
- .join(`)\n,(`)})`;
320
- return `INSERT INTO ${schemaTableMs} (${insertFieldsList}) ${addOutputInserted ? ' OUTPUT inserted.* ' : ''} VALUES ${values}`;
321
- },
322
-
323
- getUpdateSQL (record: TRecordSet) {
324
- const recordForSQL = getRecordValuesForSqlMs(record, this.schema);
325
- const setArray: string[] = [];
326
- updateFields.forEach((fName) => {
327
- if (recordForSQL[fName] !== undefined) {
328
- setArray.push(`[${fName}] = ${recordForSQL[fName]}`);
329
- }
330
- });
331
- const where = `(${mergeIdentity.map((fName) => (`[${fName}] = ${recordForSQL[fName]}`))
332
- .join(' AND ')})`;
333
- return `UPDATE ${schemaTableMs}
334
- SET ${setArray.join(', ')}
335
- WHERE ${where};`;
336
- },
337
- };
338
-
339
- cache.put(propertyPath, result);
340
- return result;
341
- };
342
-
343
- /**
344
- * Оборачивает инструкции SQL в транзакцию
345
- */
346
- export const wrapTransactionMs = (strSQL: string): string => `BEGIN TRY
347
- BEGIN TRANSACTION;
348
-
349
- ${strSQL}
350
-
351
- COMMIT TRANSACTION;
352
- END TRY
353
- BEGIN CATCH
354
- DECLARE @ErrorMessage NVARCHAR(MAX)
355
- , @ErrorSeverity INT
356
- , @ErrorState INT;
357
-
358
- SELECT
359
- @ErrorMessage = ERROR_MESSAGE() + ' Line ' + CAST(ERROR_LINE() AS NVARCHAR(5))
360
- , @ErrorSeverity = ERROR_SEVERITY()
361
- , @ErrorState = ERROR_STATE();
362
-
363
- IF @@trancount > 0
364
- BEGIN
365
- ROLLBACK TRANSACTION;
366
- END;
367
-
368
- RAISERROR(@ErrorMessage, @ErrorSeverity, @ErrorState);
369
- END CATCH;`;
370
-
371
- /**
372
- * Возвращает проверенное и серилизованное значение
373
- */
374
- export const serializeMs = (args: IGetValueForSqlArgsMs): string | number | null => {
375
- const val = getValueForSqlMs(args);
376
- if (val == null || val === 'NULL') {
377
- return null;
378
- }
379
- if (typeof val === 'number') {
380
- return val;
381
- }
382
- return String(val).replace(/(^')|('$)/g, '');
383
- };
384
-
385
- /**
386
- * Возвращает подготовленное выражение SET для использования в UPDATE
387
- */
388
- export const getSqlSetExpressionMs = (record: TDBRecord, recordSchema: TRecordSchemaMs): string => {
389
- const setArray: string[] = [];
390
- const { dateTimeOptions } = recordSchema;
391
- recordSchema.forEach((fieldSchema) => {
392
- const { name = '_#foo#_' } = fieldSchema;
393
- if (Object.prototype.hasOwnProperty.call(record, name)) {
394
- setArray.push(`[${name}] = ${getValueForSqlMs({
395
- value: record[name],
396
- fieldSchema,
397
- dateTimeOptions,
398
- escapeOnlySingleQuotes: true,
399
- })}`);
400
- }
401
- });
402
- return `SET ${setArray.join(', ')}`;
403
- };
404
-
405
- /**
406
- * Возвращает подготовленное выражение (...поля...) VALUES (...значения...) для использования в INSERT
407
- *
408
- * addOutputInserted - Если true, добавляется выражение OUTPUT inserted.* перед VALUES
409
- */
410
- export const getSqlValuesExpressionMs = (record: TDBRecord, recordSchema: TRecordSchemaMs, addOutputInserted: boolean = false): string => {
411
- const fieldsArray: string[] = [];
412
- const valuesArray: string[] = [];
413
- const { dateTimeOptions } = recordSchema;
414
- recordSchema.forEach((fieldSchema) => {
415
- const { name = '_#foo#_' } = fieldSchema;
416
- if (Object.prototype.hasOwnProperty.call(record, name)) {
417
- fieldsArray.push(name);
418
- const val = getValueForSqlMs({
419
- value: record[name],
420
- fieldSchema,
421
- dateTimeOptions,
422
- escapeOnlySingleQuotes: true,
423
- });
424
- valuesArray.push(String(val));
425
- }
426
- });
427
- return `([${fieldsArray.join('], [')}]) ${addOutputInserted ? ' OUTPUT inserted.* ' : ''} VALUES (${valuesArray.join(', ')})`;
428
- };
429
-
430
- export const getRowsAffectedMs = (qResult: any) => (qResult.rowsAffected && qResult.rowsAffected.reduce((a: number, v: number) => a + v, 0)) || 0;
@@ -1,31 +0,0 @@
1
- /**
2
- * Оборачивает строку в одинарные кавычки, если второй аргумент не true
3
- */
4
- export const q = (val: string, noQuotes?: boolean): string => (noQuotes ? val : `'${val}'`);
5
-
6
- /**
7
- * Экранирование одинарной кавычки и символа % для использования строки в SQL запросе
8
- * onlySingleQuotes - true - не экранировать %
9
- */
10
- export const mssqlEscape = (str: any, onlySingleQuotes: boolean = false): string => {
11
- if (str == null) {
12
- str = '';
13
- }
14
- switch (typeof str) {
15
- case 'number':
16
- str = String(str);
17
- break;
18
- case 'string':
19
- break;
20
- case 'boolean':
21
- str = str ? '1' : '0';
22
- break;
23
- default:
24
- str = String(str || '');
25
- }
26
- str = str.replace(/'/g, `''`);
27
- if (onlySingleQuotes) {
28
- return str;
29
- }
30
- return str.replace(/%/g, '%%');
31
- };
@@ -1,62 +0,0 @@
1
- import { QueryResultRow } from 'pg';
2
- import { getTableSchemaPg } from './table-schema';
3
- import { prepareSqlValuePg } from './prepare-value';
4
- import { ITableSchemaPg } from '../@types/i-pg';
5
- import { schemaTable } from '../utils';
6
-
7
- export const getMergeSqlPg = async <U extends QueryResultRow = QueryResultRow> (arg: {
8
- connectionId: string,
9
- targetSchemaAndTable: string,
10
- recordset: U[],
11
- omitFields?: string[],
12
- noUpdateIfNull?: boolean,
13
- }): Promise<string> => {
14
- const { connectionId, targetSchemaAndTable, recordset, omitFields = [], noUpdateIfNull } = arg;
15
- if (!recordset?.length) {
16
- return '';
17
- }
18
- const schemaTablePg = schemaTable.to.pg(targetSchemaAndTable);
19
- const tableSchema: ITableSchemaPg = await getTableSchemaPg(connectionId, targetSchemaAndTable);
20
- const { recordSchema, pk, fieldsWoSerials, defaults } = tableSchema;
21
-
22
- let insertFieldsList: string[] = fieldsWoSerials;
23
- if (omitFields.length) {
24
- const set = new Set(omitFields);
25
- insertFieldsList = fieldsWoSerials.filter((fieldName) => !set.has(fieldName));
26
- }
27
-
28
- const insertValues = recordset.map((record: U) => {
29
- const preparedValues: (string | number)[] = [];
30
-
31
- insertFieldsList.forEach((fieldName) => {
32
- const value = record[fieldName];
33
- let pgSqlValue = prepareSqlValuePg({ value, fieldDef: recordSchema[fieldName] });
34
- if (defaults[fieldName] != null && pgSqlValue === 'null') {
35
- pgSqlValue = defaults[fieldName];
36
- }
37
- preparedValues.push(pgSqlValue);
38
- });
39
- return `(${preparedValues.join(', ')})`;
40
- }).join(',\n').trim();
41
-
42
- const upsertFields = insertFieldsList.map((f) => {
43
- const vArr = [`EXCLUDED."${f}"`];
44
- if (noUpdateIfNull) {
45
- vArr.push(`${schemaTablePg}."${f}"`);
46
- }
47
- if (defaults[f]) {
48
- vArr.push(defaults[f]);
49
- }
50
- return `"${f}" = ${vArr.length > 1 ? `COALESCE(${vArr.join(', ')})` : vArr[0]}`;
51
- }).join(',\n');
52
-
53
- // noinspection UnnecessaryLocalVariableJS
54
- const mergeSQL = `${'INSERT'} INTO ${schemaTablePg}
55
- (${insertFieldsList.map((f) => `"${f}"`).join(', ')})
56
- VALUES ${insertValues}
57
- ON CONFLICT (${pk.map((f) => `"${f}"`).join(', ')})
58
- DO UPDATE SET ${upsertFields}
59
- `;
60
-
61
- return mergeSQL;
62
- };
@@ -1,32 +0,0 @@
1
- import { getTableSchemaPg } from './table-schema';
2
- import { prepareSqlValuePg } from './prepare-value';
3
- import { ITableSchemaPg } from '../@types/i-pg';
4
- import { TDBRecord } from '../@types/i-common';
5
- import { schemaTable } from '../utils';
6
-
7
- export const getUpdateSqlPg = async (
8
- connectionId: string,
9
- commonSchemaAndTable: string,
10
- record: TDBRecord,
11
- customSets: TDBRecord = {},
12
- ): Promise<string> => {
13
- const tableSchema: ITableSchemaPg = await getTableSchemaPg(connectionId, commonSchemaAndTable);
14
- const { recordSchema, pk, fieldsWoSerials } = tableSchema;
15
- const sqlValue = (fieldName: string) => prepareSqlValuePg({ value: record[fieldName], fieldDef: recordSchema[fieldName] });
16
- const preparedRecord: TDBRecord = {};
17
- fieldsWoSerials.forEach((f) => {
18
- if (pk.includes(f)) {
19
- return;
20
- }
21
- if (customSets[f] !== undefined) {
22
- preparedRecord[f] = customSets[f];
23
- } else if (record[f] !== undefined) {
24
- preparedRecord[f] = sqlValue(f);
25
- }
26
- });
27
- const sets = Object.entries(preparedRecord).map(([f, v]) => `"${f}" = ${v}`).join(', ');
28
- const where = pk.map((f) => `"${f}" = ${sqlValue(f)}`).join(' AND ');
29
- return `${'UPDATE'} ${schemaTable.to.pg(commonSchemaAndTable)} SET
30
- ${sets}
31
- WHERE ${where};`;
32
- };