@zowe/db2-for-zowe-cli 6.1.17 → 6.1.18

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 (232) hide show
  1. package/README.md +12 -10
  2. package/lib/Db2PluginLifeCycle.d.ts +11 -9
  3. package/lib/Db2PluginLifeCycle.js +18 -13
  4. package/lib/Db2PluginLifeCycle.js.map +1 -1
  5. package/node_modules/axios/CHANGELOG.md +62 -0
  6. package/node_modules/axios/README.md +233 -5
  7. package/node_modules/axios/dist/axios.js +387 -89
  8. package/node_modules/axios/dist/axios.min.js +3 -3
  9. package/node_modules/axios/dist/axios.min.js.map +1 -1
  10. package/node_modules/axios/dist/browser/axios.cjs +458 -98
  11. package/node_modules/axios/dist/esm/axios.js +458 -98
  12. package/node_modules/axios/dist/esm/axios.min.js +2 -2
  13. package/node_modules/axios/dist/esm/axios.min.js.map +1 -1
  14. package/node_modules/axios/dist/node/axios.cjs +568 -116
  15. package/node_modules/axios/index.d.cts +4 -0
  16. package/node_modules/axios/index.d.ts +4 -0
  17. package/node_modules/axios/lib/adapters/fetch.js +64 -11
  18. package/node_modules/axios/lib/adapters/http.js +134 -50
  19. package/node_modules/axios/lib/adapters/xhr.js +52 -3
  20. package/node_modules/axios/lib/core/Axios.js +19 -14
  21. package/node_modules/axios/lib/core/InterceptorManager.js +107 -8
  22. package/node_modules/axios/lib/core/buildFullPath.js +1 -13
  23. package/node_modules/axios/lib/core/dispatchRequest.js +8 -2
  24. package/node_modules/axios/lib/core/mergeConfig.js +1 -1
  25. package/node_modules/axios/lib/core/methodList.js +17 -0
  26. package/node_modules/axios/lib/defaults/index.js +2 -1
  27. package/node_modules/axios/lib/env/data.js +1 -1
  28. package/node_modules/axios/lib/helpers/Http2Sessions.js +2 -0
  29. package/node_modules/axios/lib/helpers/HttpStatusCode.js +11 -1
  30. package/node_modules/axios/lib/helpers/fromDataURI.js +5 -4
  31. package/node_modules/axios/lib/helpers/normalizeURLForProtocolCheck.js +24 -0
  32. package/node_modules/axios/lib/helpers/progressEventReducer.js +1 -1
  33. package/node_modules/axios/lib/helpers/resolveConfig.js +4 -2
  34. package/node_modules/axios/lib/helpers/shouldBypassProxy.js +182 -6
  35. package/node_modules/axios/lib/helpers/throttle.js +3 -2
  36. package/node_modules/axios/lib/helpers/toFormData.js +14 -21
  37. package/node_modules/axios/lib/utils.js +134 -13
  38. package/node_modules/axios/package.json +1 -1
  39. package/node_modules/ibm_db/APIDocumentation.md +2883 -2024
  40. package/node_modules/ibm_db/LICENSE +23 -23
  41. package/node_modules/ibm_db/README.md +735 -735
  42. package/node_modules/ibm_db/binding.gyp +99 -98
  43. package/node_modules/ibm_db/installer/driverInstall.js +984 -958
  44. package/node_modules/ibm_db/installer/ifx.sh +38 -38
  45. package/node_modules/ibm_db/installer/setenv.sh +23 -23
  46. package/node_modules/ibm_db/installer/testODBCConnection.bat +51 -51
  47. package/node_modules/ibm_db/installer/testODBCConnection.sh +61 -61
  48. package/node_modules/ibm_db/lib/climacros.js +431 -431
  49. package/node_modules/ibm_db/lib/odbc.js +4293 -3487
  50. package/node_modules/ibm_db/lib/simple-queue.js +41 -41
  51. package/node_modules/ibm_db/package.json +70 -70
  52. package/node_modules/ibm_db/src/odbc.cpp +1495 -1396
  53. package/node_modules/ibm_db/src/odbc.h +477 -473
  54. package/node_modules/ibm_db/src/odbc_connection.cpp +1762 -1612
  55. package/node_modules/ibm_db/src/odbc_connection.h +228 -215
  56. package/node_modules/ibm_db/src/odbc_result.cpp +1547 -1547
  57. package/node_modules/ibm_db/src/odbc_result.h +152 -152
  58. package/node_modules/ibm_db/src/odbc_statement.cpp +2047 -861
  59. package/node_modules/ibm_db/src/odbc_statement.h +257 -135
  60. package/node_modules/ibm_db/src/strptime.c +389 -389
  61. package/node_modules/ibm_db/src/strptime.h +46 -46
  62. package/node_modules/ibm_db/test/README +23 -23
  63. package/node_modules/ibm_db/test/bench-insert.js +62 -62
  64. package/node_modules/ibm_db/test/bench-insertBatch10.js +74 -74
  65. package/node_modules/ibm_db/test/bench-insertBatch100.js +75 -75
  66. package/node_modules/ibm_db/test/bench-insertBatch1000.js +75 -75
  67. package/node_modules/ibm_db/test/bench-insertBatch10000.js +75 -75
  68. package/node_modules/ibm_db/test/bench-prepare-bind-execute-closeSync.js +60 -60
  69. package/node_modules/ibm_db/test/bench-prepare-bind-executeNonQuery.js +53 -53
  70. package/node_modules/ibm_db/test/bench-prepare-bindSync-execute-closeSync.js +50 -50
  71. package/node_modules/ibm_db/test/bench-prepare-bindSync-executeNonQuery.js +48 -48
  72. package/node_modules/ibm_db/test/bench-prepare-execute-closeSync.js +51 -51
  73. package/node_modules/ibm_db/test/bench-prepare-executeNonQuery.js +47 -47
  74. package/node_modules/ibm_db/test/bench-prepare-not.js +43 -43
  75. package/node_modules/ibm_db/test/bench-query-fetch.js +59 -59
  76. package/node_modules/ibm_db/test/bench-query-fetchAll.js +49 -49
  77. package/node_modules/ibm_db/test/bench-query-fetchAllSync.js +43 -43
  78. package/node_modules/ibm_db/test/bench-query.js +40 -40
  79. package/node_modules/ibm_db/test/bench-querySync-fetchArray.js +28 -28
  80. package/node_modules/ibm_db/test/bench-querySync.js +29 -29
  81. package/node_modules/ibm_db/test/common.d.ts +10 -10
  82. package/node_modules/ibm_db/test/common.js +127 -127
  83. package/node_modules/ibm_db/test/config.json +7 -7
  84. package/node_modules/ibm_db/test/config.zos.json +4 -4
  85. package/node_modules/ibm_db/test/data/sample1.txt +9 -9
  86. package/node_modules/ibm_db/test/data/trc.fmt +30114 -30114
  87. package/node_modules/ibm_db/test/nodeEE-leak-huge-query.js +152 -152
  88. package/node_modules/ibm_db/test/nodeEE-leak-multiple-query-multiple-connections.js +148 -148
  89. package/node_modules/ibm_db/test/nodeEE-leak-multiple-query-pool-connections.js +154 -154
  90. package/node_modules/ibm_db/test/nodeEE-leak-multiple-query.js +133 -133
  91. package/node_modules/ibm_db/test/nodeEE-stress-async-waterfall-multiple-connections.js +174 -174
  92. package/node_modules/ibm_db/test/nodeEE-stress-async-waterfall.js +169 -169
  93. package/node_modules/ibm_db/test/nodeEE-stress-mixed-query-multiple-connections.js +159 -159
  94. package/node_modules/ibm_db/test/nodeEE-stress-mixed-query.js +148 -148
  95. package/node_modules/ibm_db/test/odbc-bench.c +123 -123
  96. package/node_modules/ibm_db/test/perfTest.js +53 -53
  97. package/node_modules/ibm_db/test/quick-example.sh +30 -30
  98. package/node_modules/ibm_db/test/quick-example.ts +80 -80
  99. package/node_modules/ibm_db/test/run-bench.js +96 -96
  100. package/node_modules/ibm_db/test/run-nodeEE.js +132 -132
  101. package/node_modules/ibm_db/test/run-tests.js +132 -138
  102. package/node_modules/ibm_db/test/sql-cli.js +28 -28
  103. package/node_modules/ibm_db/test/test-all-data-types.js +109 -109
  104. package/node_modules/ibm_db/test/test-array-insert.js +178 -178
  105. package/node_modules/ibm_db/test/test-async-await.js +105 -105
  106. package/node_modules/ibm_db/test/test-attributes.js +34 -34
  107. package/node_modules/ibm_db/test/test-bad-pool-connection-prepare-execute.js +57 -57
  108. package/node_modules/ibm_db/test/test-basic-test.js +138 -138
  109. package/node_modules/ibm_db/test/test-binary-array-insert.js +73 -73
  110. package/node_modules/ibm_db/test/test-blob-from-file.js +90 -90
  111. package/node_modules/ibm_db/test/test-blob-insert.js +144 -144
  112. package/node_modules/ibm_db/test/test-blob-stream-insert.js +321 -299
  113. package/node_modules/ibm_db/test/test-blob-to-file.js +370 -370
  114. package/node_modules/ibm_db/test/test-block-fetch.js +364 -364
  115. package/node_modules/ibm_db/test/test-blocking-issue210.js +123 -123
  116. package/node_modules/ibm_db/test/test-call-async.js +64 -64
  117. package/node_modules/ibm_db/test/test-call-stmt.js +53 -53
  118. package/node_modules/ibm_db/test/test-cancel.js +703 -0
  119. package/node_modules/ibm_db/test/test-chinese-char.js +59 -59
  120. package/node_modules/ibm_db/test/test-connection.js +306 -0
  121. package/node_modules/ibm_db/test/test-date.js +32 -32
  122. package/node_modules/ibm_db/test/test-dbclob.js +93 -93
  123. package/node_modules/ibm_db/test/test-decimals.js +135 -135
  124. package/node_modules/ibm_db/test/test-describe-metadata.js +148 -0
  125. package/node_modules/ibm_db/test/test-executeFile.js +167 -167
  126. package/node_modules/ibm_db/test/test-executeFileSync.js +85 -85
  127. package/node_modules/ibm_db/test/test-fetch-apis.js +146 -146
  128. package/node_modules/ibm_db/test/test-fetchN.js +130 -130
  129. package/node_modules/ibm_db/test/test-getinfo.js +197 -197
  130. package/node_modules/ibm_db/test/test-ibm-db-issue14.js +58 -58
  131. package/node_modules/ibm_db/test/test-ibm-db-issue17.js +54 -54
  132. package/node_modules/ibm_db/test/test-ibm-db-issue18.js +54 -54
  133. package/node_modules/ibm_db/test/test-issue-1059-fetchAll-undefined.js +67 -67
  134. package/node_modules/ibm_db/test/test-issue-1080-array-blob-insert.js +40 -0
  135. package/node_modules/ibm_db/test/test-issue-54.js +39 -39
  136. package/node_modules/ibm_db/test/test-issue-get-column-value-2.js +44 -44
  137. package/node_modules/ibm_db/test/test-issue211.js +80 -80
  138. package/node_modules/ibm_db/test/test-issue253.js +39 -39
  139. package/node_modules/ibm_db/test/test-max-pool-size.js +96 -96
  140. package/node_modules/ibm_db/test/test-memory-leaks-new-objects.js +32 -32
  141. package/node_modules/ibm_db/test/test-multi-open-query-close.js +75 -75
  142. package/node_modules/ibm_db/test/test-param-put-data.js +713 -0
  143. package/node_modules/ibm_db/test/test-pool-idle-connection.js +72 -72
  144. package/node_modules/ibm_db/test/test-pool-operations.js +325 -0
  145. package/node_modules/ibm_db/test/test-pool-stale-connections.js +111 -111
  146. package/node_modules/ibm_db/test/test-pool-uncommited.js +33 -33
  147. package/node_modules/ibm_db/test/test-prepare-execute.js +339 -0
  148. package/node_modules/ibm_db/test/test-prepareSync-multiple-execution.js +93 -93
  149. package/node_modules/ibm_db/test/test-primary-foreign-keys.js +246 -0
  150. package/node_modules/ibm_db/test/test-procedures.js +243 -0
  151. package/node_modules/ibm_db/test/test-promise-all-data-types.js +42 -42
  152. package/node_modules/ibm_db/test/test-query-operations.js +405 -0
  153. package/node_modules/ibm_db/test/test-quick-example.js +25 -25
  154. package/node_modules/ibm_db/test/test-row-array-insert.js +167 -167
  155. package/node_modules/ibm_db/test/test-sp-array.js +54 -54
  156. package/node_modules/ibm_db/test/test-sp-dbc-6000.js +88 -88
  157. package/node_modules/ibm_db/test/test-sp-memleak.js +136 -136
  158. package/node_modules/ibm_db/test/test-sp-resultset-execute.js +269 -269
  159. package/node_modules/ibm_db/test/test-sp-resultset.js +228 -228
  160. package/node_modules/ibm_db/test/test-transactions.js +261 -0
  161. package/node_modules/ibm_db/test/test-typescript.js +48 -48
  162. package/node_modules/ibm_db/test/test-xml-datatype.js +70 -70
  163. package/node_modules/ibm_db/test/testWebApp.js +56 -56
  164. package/node_modules/ibm_db/test/trace +51 -51
  165. package/node_modules/ibm_db/test/typescript-apis-test.js +978 -978
  166. package/node_modules/ibm_db/test/webapp.html +17 -17
  167. package/node_modules/ibm_db/test/webapp.js +79 -79
  168. package/node_modules/ibm_db/typescript/README.md +28 -28
  169. package/node_modules/ibm_db/typescript/dist/Database.d.ts +26 -0
  170. package/node_modules/ibm_db/typescript/dist/ODBCStatement.d.ts +93 -0
  171. package/package.json +10 -6
  172. package/node_modules/ibm_db/test/disabled/test-binding-statement-rebinding.js +0 -59
  173. package/node_modules/ibm_db/test/disabled/test-open-dont-close.js +0 -12
  174. package/node_modules/ibm_db/test/disabled/test-param-select-with-booleans-only.js +0 -21
  175. package/node_modules/ibm_db/test/disabled/test-param-select-with-decimals-only.js +0 -20
  176. package/node_modules/ibm_db/test/disabled/test-param-select-with-null.js +0 -21
  177. package/node_modules/ibm_db/test/disabled/test-param-select-with-nulls-mixed.js +0 -23
  178. package/node_modules/ibm_db/test/disabled/test-param-select-with-numbers-mixed.js +0 -22
  179. package/node_modules/ibm_db/test/disabled/test-param-select-with-numbers-only.js +0 -24
  180. package/node_modules/ibm_db/test/disabled/test-param-select-with-strings-only.js +0 -23
  181. package/node_modules/ibm_db/test/disabled/test-param-select-with-unicode.js +0 -15
  182. package/node_modules/ibm_db/test/disabled/test-prepare-bind-execute-closeSync.js +0 -62
  183. package/node_modules/ibm_db/test/disabled/test-prepare-bind-execute-error.js +0 -49
  184. package/node_modules/ibm_db/test/disabled/test-prepare-bind-execute-long-string.js +0 -63
  185. package/node_modules/ibm_db/test/disabled/test-prepare-bind-executeNonQuery.js +0 -63
  186. package/node_modules/ibm_db/test/disabled/test-prepare-bindSync-execute-closeSync.js +0 -46
  187. package/node_modules/ibm_db/test/disabled/test-prepare-bindSync-executeNonQuery.js +0 -50
  188. package/node_modules/ibm_db/test/disabled/test-prepare.js +0 -34
  189. package/node_modules/ibm_db/test/disabled/test-prepareSync.js +0 -29
  190. package/node_modules/ibm_db/test/disabled/test-query-select-fetchAll.js +0 -23
  191. package/node_modules/ibm_db/test/disabled/test-query-select-fetchAllSync.js +0 -23
  192. package/node_modules/ibm_db/test/disabled/test-query-select-unicode.js +0 -15
  193. package/node_modules/ibm_db/test/disabled/test-querySync-select-unicode.js +0 -20
  194. package/node_modules/ibm_db/test/test-affected-rows.js +0 -55
  195. package/node_modules/ibm_db/test/test-bad-connection-string.js +0 -30
  196. package/node_modules/ibm_db/test/test-binding-connection-timeOut.js +0 -31
  197. package/node_modules/ibm_db/test/test-binding-statement-executeSync.js +0 -84
  198. package/node_modules/ibm_db/test/test-binding-transaction-commit.js +0 -79
  199. package/node_modules/ibm_db/test/test-binding-transaction-commitSync.js +0 -53
  200. package/node_modules/ibm_db/test/test-closed.js +0 -14
  201. package/node_modules/ibm_db/test/test-connection-object.js +0 -16
  202. package/node_modules/ibm_db/test/test-describe-column.js +0 -92
  203. package/node_modules/ibm_db/test/test-describe-database.js +0 -18
  204. package/node_modules/ibm_db/test/test-describe-table.js +0 -31
  205. package/node_modules/ibm_db/test/test-domains-open.js +0 -19
  206. package/node_modules/ibm_db/test/test-global-open-close.js +0 -11
  207. package/node_modules/ibm_db/test/test-instantiate-one-and-end.js +0 -9
  208. package/node_modules/ibm_db/test/test-multi-open-close.js +0 -45
  209. package/node_modules/ibm_db/test/test-multi-openSync-closeSync.js +0 -52
  210. package/node_modules/ibm_db/test/test-open-close.js +0 -29
  211. package/node_modules/ibm_db/test/test-open-connectTimeout.js +0 -33
  212. package/node_modules/ibm_db/test/test-openSync.js +0 -31
  213. package/node_modules/ibm_db/test/test-pool-close.js +0 -120
  214. package/node_modules/ibm_db/test/test-pool-connect.js +0 -36
  215. package/node_modules/ibm_db/test/test-pool-rollbackTransaction.js +0 -35
  216. package/node_modules/ibm_db/test/test-prepareSync-bad-sql.js +0 -34
  217. package/node_modules/ibm_db/test/test-promise-open-close.js +0 -33
  218. package/node_modules/ibm_db/test/test-query-create-table-fetchSync.js +0 -23
  219. package/node_modules/ibm_db/test/test-query-create-table.js +0 -12
  220. package/node_modules/ibm_db/test/test-query-drop-table.js +0 -13
  221. package/node_modules/ibm_db/test/test-query-insert.js +0 -38
  222. package/node_modules/ibm_db/test/test-query-select-fetch.js +0 -21
  223. package/node_modules/ibm_db/test/test-query-select-fetchMode-array.js +0 -17
  224. package/node_modules/ibm_db/test/test-query-select.js +0 -64
  225. package/node_modules/ibm_db/test/test-queryResult.js +0 -35
  226. package/node_modules/ibm_db/test/test-queryStream.js +0 -43
  227. package/node_modules/ibm_db/test/test-querySync-select-with-exception.js +0 -25
  228. package/node_modules/ibm_db/test/test-querySync-select.js +0 -28
  229. package/node_modules/ibm_db/test/test-require-and-end.js +0 -8
  230. package/node_modules/ibm_db/test/test-statement-close.js +0 -118
  231. package/node_modules/ibm_db/test/test-transaction-commit-sync.js +0 -54
  232. package/node_modules/ibm_db/test/test-transaction-commit.js +0 -79
@@ -1,978 +1,978 @@
1
- "use strict";
2
- // To run this quick-example.ts file, follow below steps
3
- // npm install -g typescript
4
- // npm install --save-dev @types/node
5
- // update database connection info in ../test/config.json file or
6
- // set environment variables DB2_USER, DB2_PASSWD, etc.
7
- // tsc quick-example.ts --target ES2016 --lib ES2016
8
- // node quick-example.js
9
- // OR, run:
10
- // tsc quick-example.ts && node quick-example.js && rm quick-example.js
11
- //
12
- // To run this test program using ts-node, Allow JavaScript
13
- // Modules in tsconfig.json file. For that -
14
- // Modify your tsconfig.json to allow JS modules:
15
- // Open tsconfig.json
16
- // Add or modify these options:
17
- // {
18
- // "compilerOptions": {
19
- // "allowJs": true, // Allow JS modules
20
- // "skipLibCheck": true, // Skip type checking for JS files
21
- // "noImplicitAny": false, // Allow 'any' type
22
- // "moduleResolution": "node" // Use Node.js module resolution
23
- // }
24
- // }
25
- // Save the file and rerun:
26
- // ts-node quick-example.ts
27
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
28
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
29
- return new (P || (P = Promise))(function (resolve, reject) {
30
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
31
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
32
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
33
- step((generator = generator.apply(thisArg, _arguments || [])).next());
34
- });
35
- };
36
- var __generator = (this && this.__generator) || function (thisArg, body) {
37
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
38
- return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
39
- function verb(n) { return function (v) { return step([n, v]); }; }
40
- function step(op) {
41
- if (f) throw new TypeError("Generator is already executing.");
42
- while (g && (g = 0, op[0] && (_ = 0)), _) try {
43
- if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
44
- if (y = 0, t) op = [op[0] & 2, t.value];
45
- switch (op[0]) {
46
- case 0: case 1: t = op; break;
47
- case 4: _.label++; return { value: op[1], done: false };
48
- case 5: _.label++; y = op[1]; op = [0]; continue;
49
- case 7: op = _.ops.pop(); _.trys.pop(); continue;
50
- default:
51
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
52
- if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
53
- if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
54
- if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
55
- if (t[2]) _.ops.pop();
56
- _.trys.pop(); continue;
57
- }
58
- op = body.call(thisArg, _);
59
- } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
60
- if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
61
- }
62
- };
63
- Object.defineProperty(exports, "__esModule", { value: true });
64
- var common = require("./common");
65
- var ibmdb = require("../");
66
- var assert = require("assert");
67
- var fs = require("fs");
68
- var path = require("path");
69
- // Define connection string
70
- var cn = common.connectionString;
71
- var dataDir = path.join(__dirname, "data");
72
- var passed = 0;
73
- var failed = 0;
74
- function pass(msg) {
75
- console.log(" PASS: " + msg);
76
- passed++;
77
- }
78
- function fail(msg) {
79
- console.log(" FAIL: " + msg);
80
- failed++;
81
- }
82
- function main() {
83
- return __awaiter(this, void 0, void 0, function () {
84
- var conn, e_1;
85
- return __generator(this, function (_a) {
86
- switch (_a.label) {
87
- case 0:
88
- _a.trys.push([0, 16, , 19]);
89
- return [4 /*yield*/, ibmdb.open(cn)];
90
- case 1:
91
- // Open connection
92
- conn = _a.sent();
93
- console.log("Connection opened successfully.\n");
94
- return [4 /*yield*/, testBasicQueryAndPrepare(conn)];
95
- case 2:
96
- _a.sent();
97
- return [4 /*yield*/, testFetchN(conn)];
98
- case 3:
99
- _a.sent();
100
- return [4 /*yield*/, testBindFileToCol(conn)];
101
- case 4:
102
- _a.sent();
103
- return [4 /*yield*/, testChunkedLobInsert(conn)];
104
- case 5:
105
- _a.sent();
106
- return [4 /*yield*/, testTransactions(conn)];
107
- case 6:
108
- _a.sent();
109
- return [4 /*yield*/, testMetadata(conn)];
110
- case 7:
111
- _a.sent();
112
- return [4 /*yield*/, testConnectionInfo(conn)];
113
- case 8:
114
- _a.sent();
115
- return [4 /*yield*/, testExecuteNonQueryAndDirect(conn)];
116
- case 9:
117
- _a.sent();
118
- return [4 /*yield*/, testQueryResultAndStream(conn)];
119
- case 10:
120
- _a.sent();
121
- return [4 /*yield*/, testFetchAndGetData(conn)];
122
- case 11:
123
- _a.sent();
124
- return [4 /*yield*/, testConnectionAttributes(conn)];
125
- case 12:
126
- _a.sent();
127
- return [4 /*yield*/, testExecuteFile(conn)];
128
- case 13:
129
- _a.sent();
130
- return [4 /*yield*/, testConnectionPool()];
131
- case 14:
132
- _a.sent();
133
- testConstants();
134
- // Close connection
135
- return [4 /*yield*/, conn.close()];
136
- case 15:
137
- // Close connection
138
- _a.sent();
139
- console.log("\nConnection closed.");
140
- console.log("\n=== Results: " + passed + " passed, " + failed + " failed ===");
141
- if (failed > 0)
142
- process.exit(1);
143
- return [3 /*break*/, 19];
144
- case 16:
145
- e_1 = _a.sent();
146
- if (e_1 instanceof Error) {
147
- console.error("Error:", e_1.message);
148
- }
149
- else {
150
- console.error("An unknown error occurred:", e_1);
151
- }
152
- if (!conn) return [3 /*break*/, 18];
153
- return [4 /*yield*/, conn.close().catch(function () { })];
154
- case 17:
155
- _a.sent();
156
- _a.label = 18;
157
- case 18:
158
- process.exit(1);
159
- return [3 /*break*/, 19];
160
- case 19: return [2 /*return*/];
161
- }
162
- });
163
- });
164
- }
165
- // Test 1: Basic query, prepare, execute, fetchAll
166
- function testBasicQueryAndPrepare(conn) {
167
- return __awaiter(this, void 0, void 0, function () {
168
- var stmt, result, rows, data, syncRows;
169
- var _a;
170
- return __generator(this, function (_b) {
171
- switch (_b.label) {
172
- case 0:
173
- console.log("--- Test 1: Basic query, prepare, execute, fetchAll ---");
174
- try {
175
- conn.querySync("DROP TABLE TS_BASIC");
176
- }
177
- catch (e) { }
178
- return [4 /*yield*/, conn.query("CREATE TABLE TS_BASIC(C1 INT, C2 VARCHAR(10))")];
179
- case 1:
180
- _b.sent();
181
- return [4 /*yield*/, conn.query("INSERT INTO TS_BASIC VALUES (?, ?)", [3, 'ibm'])];
182
- case 2:
183
- _b.sent();
184
- return [4 /*yield*/, conn.prepare("SELECT * FROM TS_BASIC")];
185
- case 3:
186
- stmt = _b.sent();
187
- return [4 /*yield*/, stmt.execute()];
188
- case 4:
189
- result = _b.sent();
190
- if (Array.isArray(result)) {
191
- result = result[0];
192
- }
193
- return [4 /*yield*/, result.fetchAll()];
194
- case 5:
195
- rows = _b.sent();
196
- data = [];
197
- if (rows[0] && !Array.isArray(rows[0])) {
198
- data = rows;
199
- }
200
- assert.deepEqual(data, [{ C1: 3, C2: 'ibm' }]);
201
- pass("query + prepare + execute + fetchAll works. C2=" + ((_a = data[0]) === null || _a === void 0 ? void 0 : _a.C2));
202
- return [4 /*yield*/, result.close()];
203
- case 6:
204
- _b.sent();
205
- return [4 /*yield*/, stmt.close()];
206
- case 7:
207
- _b.sent();
208
- syncRows = conn.querySync("SELECT * FROM TS_BASIC");
209
- assert.equal(syncRows.length, 1);
210
- pass("querySync returns " + syncRows.length + " row.");
211
- conn.querySync("DROP TABLE TS_BASIC");
212
- return [2 /*return*/];
213
- }
214
- });
215
- });
216
- }
217
- // Test 2: fetchN / fetchNSync (block fetch)
218
- function testFetchN(conn) {
219
- return __awaiter(this, void 0, void 0, function () {
220
- var i, stmt1, result1, batch1, batch2, batch3, stmt2, result2, asyncBatch;
221
- return __generator(this, function (_a) {
222
- switch (_a.label) {
223
- case 0:
224
- console.log("\n--- Test 2: fetchN / fetchNSync (block fetch) ---");
225
- try {
226
- conn.querySync("DROP TABLE TS_FETCHN");
227
- }
228
- catch (e) { }
229
- conn.querySync("CREATE TABLE TS_FETCHN(ID INT, NAME VARCHAR(20))");
230
- for (i = 1; i <= 12; i++) {
231
- conn.querySync("INSERT INTO TS_FETCHN VALUES (" + i + ", 'Row" + i + "')");
232
- }
233
- stmt1 = conn.prepareSync("SELECT * FROM TS_FETCHN ORDER BY ID");
234
- stmt1.setAttrSync(ibmdb.SQL_ATTR_ROW_ARRAY_SIZE, 5);
235
- result1 = stmt1.executeSync();
236
- if (Array.isArray(result1)) {
237
- result1 = result1[0];
238
- }
239
- batch1 = result1.fetchNSync(5);
240
- assert.equal(batch1.length, 5, "fetchNSync(5) should return 5 rows");
241
- pass("fetchNSync(5) returned " + batch1.length + " rows.");
242
- batch2 = result1.fetchNSync(5);
243
- assert.equal(batch2.length, 5, "second fetchNSync(5) should return 5 rows");
244
- pass("fetchNSync(5) returned next " + batch2.length + " rows.");
245
- batch3 = result1.fetchNSync(5);
246
- assert.equal(batch3.length, 2, "third fetchNSync(5) should return 2 rows");
247
- pass("fetchNSync(5) returned last " + batch3.length + " rows.");
248
- result1.closeSync();
249
- stmt1.closeSync();
250
- return [4 /*yield*/, conn.prepare("SELECT * FROM TS_FETCHN ORDER BY ID")];
251
- case 1:
252
- stmt2 = _a.sent();
253
- stmt2.setAttrSync(ibmdb.SQL_ATTR_ROW_ARRAY_SIZE, 4);
254
- return [4 /*yield*/, stmt2.execute()];
255
- case 2:
256
- result2 = _a.sent();
257
- if (Array.isArray(result2)) {
258
- result2 = result2[0];
259
- }
260
- return [4 /*yield*/, result2.fetchN(4)];
261
- case 3:
262
- asyncBatch = _a.sent();
263
- assert.equal(asyncBatch.length, 4, "async fetchN(4) should return 4 rows");
264
- pass("async fetchN(4) returned " + asyncBatch.length + " rows.");
265
- return [4 /*yield*/, result2.close()];
266
- case 4:
267
- _a.sent();
268
- return [4 /*yield*/, stmt2.close()];
269
- case 5:
270
- _a.sent();
271
- conn.querySync("DROP TABLE TS_FETCHN");
272
- return [2 /*return*/];
273
- }
274
- });
275
- });
276
- }
277
- // Test 3: bindFileToCol / bindFileToColSync
278
- function testBindFileToCol(conn) {
279
- return __awaiter(this, void 0, void 0, function () {
280
- var srcImage, srcBuf, insertStmt, outFile1, s1, r1, row1, outBuf1, outFile2, s2, r2, row2, outBuf2;
281
- return __generator(this, function (_a) {
282
- switch (_a.label) {
283
- case 0:
284
- console.log("\n--- Test 3: bindFileToCol / bindFileToColSync ---");
285
- srcImage = path.join(dataDir, "phool.jpg");
286
- if (!fs.existsSync(srcImage)) {
287
- console.log(" SKIP: phool.jpg not found in test/data/");
288
- return [2 /*return*/];
289
- }
290
- srcBuf = fs.readFileSync(srcImage);
291
- console.log(" Source file: " + srcImage + " (" + srcBuf.length + " bytes)");
292
- try {
293
- conn.querySync("DROP TABLE TS_FILEBIND");
294
- }
295
- catch (e) { }
296
- conn.querySync("CREATE TABLE TS_FILEBIND(ID INT, PHOTO BLOB(1M))");
297
- insertStmt = conn.prepareSync("INSERT INTO TS_FILEBIND VALUES(?, ?)");
298
- insertStmt.executeSync([
299
- 1,
300
- { ParamType: 'FILE', DataType: 'BLOB', Data: srcImage }
301
- ]);
302
- insertStmt.closeSync();
303
- outFile1 = path.join(dataDir, "ts_test_photo1.jpg");
304
- try {
305
- fs.unlinkSync(outFile1);
306
- }
307
- catch (e) { }
308
- s1 = conn.prepareSync("SELECT ID, PHOTO FROM TS_FILEBIND WHERE ID=1");
309
- r1 = s1.executeSync();
310
- if (Array.isArray(r1)) {
311
- r1 = r1[0];
312
- }
313
- r1.bindFileToColSync(2, outFile1, ibmdb.SQL_FILE_OVERWRITE);
314
- row1 = r1.fetchAllSync();
315
- assert.ok(row1.length === 1, "Should return 1 row");
316
- outBuf1 = fs.readFileSync(outFile1);
317
- assert.equal(outBuf1.length, srcBuf.length, "Output file size should match source");
318
- assert.ok(srcBuf.equals(outBuf1), "File content should match");
319
- pass("bindFileToColSync: wrote " + outBuf1.length +
320
- " bytes to file, verified binary match.");
321
- r1.closeSync();
322
- s1.closeSync();
323
- try {
324
- fs.unlinkSync(outFile1);
325
- }
326
- catch (e) { }
327
- outFile2 = path.join(dataDir, "ts_test_photo2.jpg");
328
- try {
329
- fs.unlinkSync(outFile2);
330
- }
331
- catch (e) { }
332
- return [4 /*yield*/, conn.prepare("SELECT ID, PHOTO FROM TS_FILEBIND WHERE ID=1")];
333
- case 1:
334
- s2 = _a.sent();
335
- return [4 /*yield*/, s2.execute()];
336
- case 2:
337
- r2 = _a.sent();
338
- if (Array.isArray(r2)) {
339
- r2 = r2[0];
340
- }
341
- return [4 /*yield*/, r2.bindFileToCol(2, outFile2, ibmdb.SQL_FILE_OVERWRITE)];
342
- case 3:
343
- _a.sent();
344
- return [4 /*yield*/, r2.fetchAll()];
345
- case 4:
346
- row2 = _a.sent();
347
- assert.ok(row2.length === 1, "Should return 1 row");
348
- outBuf2 = fs.readFileSync(outFile2);
349
- assert.equal(outBuf2.length, srcBuf.length);
350
- assert.ok(srcBuf.equals(outBuf2), "Async file content should match");
351
- pass("async bindFileToCol: wrote " + outBuf2.length +
352
- " bytes to file, verified binary match.");
353
- return [4 /*yield*/, r2.close()];
354
- case 5:
355
- _a.sent();
356
- return [4 /*yield*/, s2.close()];
357
- case 6:
358
- _a.sent();
359
- try {
360
- fs.unlinkSync(outFile2);
361
- }
362
- catch (e) { }
363
- conn.querySync("DROP TABLE TS_FILEBIND");
364
- return [2 /*return*/];
365
- }
366
- });
367
- });
368
- }
369
- // Test 4: Chunked LOB insert (Array of Buffers + Readable stream)
370
- function testChunkedLobInsert(conn) {
371
- return __awaiter(this, void 0, void 0, function () {
372
- var srcImage, srcBuf, chunkSize, chunks, offset, rows4a, stream, rows4b;
373
- return __generator(this, function (_a) {
374
- switch (_a.label) {
375
- case 0:
376
- console.log("\n--- Test 4: Chunked LOB insert (SQLPutData) ---");
377
- srcImage = path.join(dataDir, "phool.jpg");
378
- if (!fs.existsSync(srcImage)) {
379
- console.log(" SKIP: phool.jpg not found in test/data/");
380
- return [2 /*return*/];
381
- }
382
- srcBuf = fs.readFileSync(srcImage);
383
- try {
384
- conn.querySync("DROP TABLE TS_CHUNKLOB");
385
- }
386
- catch (e) { }
387
- conn.querySync("CREATE TABLE TS_CHUNKLOB(ID INT, PHOTO BLOB(1M))");
388
- chunkSize = 65536;
389
- chunks = [];
390
- for (offset = 0; offset < srcBuf.length; offset += chunkSize) {
391
- chunks.push(srcBuf.subarray(offset, Math.min(offset + chunkSize, srcBuf.length)));
392
- }
393
- console.log(" Split into " + chunks.length + " chunks of ~" + chunkSize + " bytes");
394
- conn.querySync("INSERT INTO TS_CHUNKLOB VALUES(?, ?)", [
395
- 1,
396
- { ParamType: 'INPUT', DataType: 'BLOB', Data: chunks }
397
- ]);
398
- rows4a = conn.querySync("SELECT PHOTO FROM TS_CHUNKLOB WHERE ID=1");
399
- assert.ok(Buffer.isBuffer(rows4a[0].PHOTO), "Should return Buffer");
400
- assert.ok(srcBuf.equals(rows4a[0].PHOTO), "Chunked insert data should match source");
401
- pass("querySync with Array of Buffers (" + chunks.length + " chunks): binary match verified.");
402
- stream = fs.createReadStream(srcImage, { highWaterMark: 32768 });
403
- return [4 /*yield*/, conn.query("INSERT INTO TS_CHUNKLOB VALUES(?, ?)", [
404
- 2,
405
- { ParamType: 'INPUT', DataType: 'BLOB', Data: stream }
406
- ])];
407
- case 1:
408
- _a.sent();
409
- rows4b = conn.querySync("SELECT PHOTO FROM TS_CHUNKLOB WHERE ID=2");
410
- assert.ok(Buffer.isBuffer(rows4b[0].PHOTO));
411
- assert.ok(srcBuf.equals(rows4b[0].PHOTO), "Stream insert data should match source");
412
- pass("async query with Readable stream: binary match verified.");
413
- conn.querySync("DROP TABLE TS_CHUNKLOB");
414
- return [2 /*return*/];
415
- }
416
- });
417
- });
418
- }
419
- // Test 5: Transaction Management
420
- function testTransactions(conn) {
421
- return __awaiter(this, void 0, void 0, function () {
422
- var rows;
423
- return __generator(this, function (_a) {
424
- switch (_a.label) {
425
- case 0:
426
- console.log("\n--- Test 5: Transaction Management ---");
427
- try {
428
- conn.querySync("DROP TABLE TS_TXN");
429
- }
430
- catch (e) { }
431
- conn.querySync("CREATE TABLE TS_TXN(ID INT, NAME VARCHAR(20))");
432
- // beginTransactionSync + commitTransactionSync
433
- conn.beginTransactionSync();
434
- conn.querySync("INSERT INTO TS_TXN VALUES(1, 'committed')");
435
- conn.commitTransactionSync();
436
- rows = conn.querySync("SELECT * FROM TS_TXN WHERE ID=1");
437
- assert.equal(rows.length, 1);
438
- assert.equal(rows[0].NAME, 'committed');
439
- pass("beginTransactionSync + commitTransactionSync works.");
440
- // beginTransactionSync + rollbackTransactionSync
441
- conn.beginTransactionSync();
442
- conn.querySync("INSERT INTO TS_TXN VALUES(2, 'rolledback')");
443
- conn.rollbackTransactionSync();
444
- rows = conn.querySync("SELECT * FROM TS_TXN WHERE ID=2");
445
- assert.equal(rows.length, 0);
446
- pass("beginTransactionSync + rollbackTransactionSync works.");
447
- // async beginTransaction + commitTransaction
448
- return [4 /*yield*/, conn.beginTransaction()];
449
- case 1:
450
- // async beginTransaction + commitTransaction
451
- _a.sent();
452
- return [4 /*yield*/, conn.query("INSERT INTO TS_TXN VALUES(3, 'async_commit')")];
453
- case 2:
454
- _a.sent();
455
- return [4 /*yield*/, conn.commitTransaction()];
456
- case 3:
457
- _a.sent();
458
- rows = conn.querySync("SELECT * FROM TS_TXN WHERE ID=3");
459
- assert.equal(rows.length, 1);
460
- assert.equal(rows[0].NAME, 'async_commit');
461
- pass("async beginTransaction + commitTransaction works.");
462
- // async beginTransaction + rollbackTransaction
463
- return [4 /*yield*/, conn.beginTransaction()];
464
- case 4:
465
- // async beginTransaction + rollbackTransaction
466
- _a.sent();
467
- return [4 /*yield*/, conn.query("INSERT INTO TS_TXN VALUES(4, 'async_rollback')")];
468
- case 5:
469
- _a.sent();
470
- return [4 /*yield*/, conn.rollbackTransaction()];
471
- case 6:
472
- _a.sent();
473
- rows = conn.querySync("SELECT * FROM TS_TXN WHERE ID=4");
474
- assert.equal(rows.length, 0);
475
- pass("async beginTransaction + rollbackTransaction works.");
476
- conn.querySync("DROP TABLE TS_TXN");
477
- return [2 /*return*/];
478
- }
479
- });
480
- });
481
- }
482
- // Test 6: Metadata APIs (describe, columns, tables)
483
- function testMetadata(conn) {
484
- return __awaiter(this, void 0, void 0, function () {
485
- var dbName, colInfo, colNames, oneCol, tblList, cols, tbls;
486
- return __generator(this, function (_a) {
487
- switch (_a.label) {
488
- case 0:
489
- console.log("\n--- Test 6: Metadata APIs ---");
490
- try {
491
- conn.querySync("DROP TABLE TS_META");
492
- }
493
- catch (e) { }
494
- conn.querySync("CREATE TABLE TS_META(ID INT NOT NULL, NAME VARCHAR(30), SCORE DECIMAL(5,2))");
495
- conn.querySync("INSERT INTO TS_META VALUES(1, 'test', 99.5)");
496
- dbName = conn.getInfoSync(ibmdb.SQL_DATABASE_NAME);
497
- return [4 /*yield*/, conn.describe({ database: dbName, table: 'TS_META' })];
498
- case 1:
499
- colInfo = _a.sent();
500
- assert.ok(Array.isArray(colInfo), "describe should return array");
501
- assert.ok(colInfo.length >= 3, "TS_META should have 3+ column descriptors");
502
- colNames = colInfo.map(function (c) { return c.COLUMN_NAME; });
503
- assert.ok(colNames.includes('ID'), "Should have ID column");
504
- assert.ok(colNames.includes('NAME'), "Should have NAME column");
505
- pass("describe({database, table}) returned " + colInfo.length + " columns.");
506
- return [4 /*yield*/, conn.describe({ database: dbName, table: 'TS_META', column: 'SCORE' })];
507
- case 2:
508
- oneCol = _a.sent();
509
- assert.ok(Array.isArray(oneCol) && oneCol.length >= 1);
510
- assert.equal(oneCol[0].COLUMN_NAME, 'SCORE');
511
- pass("describe({database, table, column}) returned column SCORE.");
512
- return [4 /*yield*/, conn.describe({ database: dbName, schema: '%', type: 'TABLE' })];
513
- case 3:
514
- tblList = _a.sent();
515
- assert.ok(Array.isArray(tblList), "describe should return tables array");
516
- assert.ok(tblList.length > 0, "Should have at least one table");
517
- pass("describe({database}) returned " + tblList.length + " tables.");
518
- return [4 /*yield*/, conn.columns(dbName, '%', 'TS_META', '%')];
519
- case 4:
520
- cols = _a.sent();
521
- assert.ok(Array.isArray(cols) && cols.length >= 3);
522
- pass("columns() returned " + cols.length + " column descriptors.");
523
- return [4 /*yield*/, conn.tables(dbName, '%', 'TS_META', 'TABLE')];
524
- case 5:
525
- tbls = _a.sent();
526
- assert.ok(Array.isArray(tbls) && tbls.length >= 1);
527
- assert.equal(tbls[0].TABLE_NAME, 'TS_META');
528
- pass("tables() found table TS_META.");
529
- conn.querySync("DROP TABLE TS_META");
530
- return [2 /*return*/];
531
- }
532
- });
533
- });
534
- }
535
- // Test 7: Connection Info APIs (getInfo, getTypeInfo, getFunctions)
536
- function testConnectionInfo(conn) {
537
- return __awaiter(this, void 0, void 0, function () {
538
- var dbmsName, dbmsVer, driverName, intTypeInfo, varcharInfo, hasFetch, allFuncs;
539
- return __generator(this, function (_a) {
540
- switch (_a.label) {
541
- case 0:
542
- console.log("\n--- Test 7: Connection Info APIs ---");
543
- dbmsName = conn.getInfoSync(ibmdb.SQL_DBMS_NAME);
544
- assert.ok(typeof dbmsName === 'string' && dbmsName.length > 0);
545
- dbmsVer = conn.getInfoSync(ibmdb.SQL_DBMS_VER);
546
- assert.ok(typeof dbmsVer === 'string' && dbmsVer.length > 0);
547
- pass("getInfoSync: DBMS_NAME=" + dbmsName.trim() + ", DBMS_VER=" + dbmsVer.trim());
548
- return [4 /*yield*/, conn.getInfo(ibmdb.SQL_DRIVER_NAME)];
549
- case 1:
550
- driverName = _a.sent();
551
- assert.ok(typeof driverName === 'string' && driverName.length > 0);
552
- pass("async getInfo(SQL_DRIVER_NAME)=" + driverName.trim());
553
- intTypeInfo = conn.getTypeInfoSync(ibmdb.INTEGER);
554
- assert.ok(Array.isArray(intTypeInfo) && intTypeInfo.length > 0);
555
- assert.equal(intTypeInfo[0].DATA_TYPE, ibmdb.INTEGER);
556
- pass("getTypeInfoSync(INTEGER): TYPE_NAME=" + intTypeInfo[0].TYPE_NAME);
557
- return [4 /*yield*/, conn.getTypeInfo(ibmdb.VARCHAR)];
558
- case 2:
559
- varcharInfo = _a.sent();
560
- assert.ok(Array.isArray(varcharInfo) && varcharInfo.length > 0);
561
- assert.equal(varcharInfo[0].DATA_TYPE, ibmdb.VARCHAR);
562
- pass("async getTypeInfo(VARCHAR): TYPE_NAME=" + varcharInfo[0].TYPE_NAME);
563
- hasFetch = conn.getFunctionsSync(ibmdb.SQLFETCH);
564
- assert.equal(hasFetch, true, "SQLFETCH should be supported");
565
- pass("getFunctionsSync(SQLFETCH)=" + hasFetch);
566
- return [4 /*yield*/, conn.getFunctions(ibmdb.ALLFUNCTIONS)];
567
- case 3:
568
- allFuncs = _a.sent();
569
- assert.ok(typeof allFuncs === 'object' && allFuncs !== null);
570
- assert.ok(Object.keys(allFuncs).length > 0);
571
- pass("async getFunctions(ALLFUNCTIONS) returned " + Object.keys(allFuncs).length + " functions.");
572
- return [2 /*return*/];
573
- }
574
- });
575
- });
576
- }
577
- // Test 8: Statement executeNonQuery / executeDirect
578
- function testExecuteNonQueryAndDirect(conn) {
579
- return __awaiter(this, void 0, void 0, function () {
580
- var stmt1, affected1, stmt2, affected2, stmt3, result3, rows3, stmt4, result4, rows4;
581
- return __generator(this, function (_a) {
582
- switch (_a.label) {
583
- case 0:
584
- console.log("\n--- Test 8: executeNonQuery / executeDirect ---");
585
- try {
586
- conn.querySync("DROP TABLE TS_NONQ");
587
- }
588
- catch (e) { }
589
- conn.querySync("CREATE TABLE TS_NONQ(ID INT, VAL VARCHAR(20))");
590
- stmt1 = conn.prepareSync("INSERT INTO TS_NONQ VALUES(?, ?)");
591
- affected1 = stmt1.executeNonQuerySync([1, 'sync_nonq']);
592
- assert.equal(affected1, 1);
593
- stmt1.closeSync();
594
- pass("executeNonQuerySync returned affectedRows=" + affected1);
595
- return [4 /*yield*/, conn.prepare("INSERT INTO TS_NONQ VALUES(?, ?)")];
596
- case 1:
597
- stmt2 = _a.sent();
598
- return [4 /*yield*/, stmt2.executeNonQuery([2, 'async_nonq'])];
599
- case 2:
600
- affected2 = _a.sent();
601
- assert.equal(affected2, 1);
602
- return [4 /*yield*/, stmt2.close()];
603
- case 3:
604
- _a.sent();
605
- pass("async executeNonQuery returned affectedRows=" + affected2);
606
- stmt3 = conn.prepareSync("SELECT 1 FROM SYSIBM.SYSDUMMY1");
607
- result3 = stmt3.executeDirectSync("SELECT * FROM TS_NONQ ORDER BY ID");
608
- if (Array.isArray(result3)) {
609
- result3 = result3[0];
610
- }
611
- rows3 = result3.fetchAllSync();
612
- assert.equal(rows3.length, 2);
613
- result3.closeSync();
614
- stmt3.closeSync();
615
- pass("executeDirectSync fetched " + rows3.length + " rows.");
616
- return [4 /*yield*/, conn.prepare("SELECT 1 FROM SYSIBM.SYSDUMMY1")];
617
- case 4:
618
- stmt4 = _a.sent();
619
- return [4 /*yield*/, stmt4.executeDirect("SELECT VAL FROM TS_NONQ WHERE ID=1")];
620
- case 5:
621
- result4 = _a.sent();
622
- if (Array.isArray(result4)) {
623
- result4 = result4[0];
624
- }
625
- return [4 /*yield*/, result4.fetchAll()];
626
- case 6:
627
- rows4 = _a.sent();
628
- assert.equal(rows4.length, 1);
629
- assert.equal(rows4[0].VAL, 'sync_nonq');
630
- return [4 /*yield*/, result4.close()];
631
- case 7:
632
- _a.sent();
633
- return [4 /*yield*/, stmt4.close()];
634
- case 8:
635
- _a.sent();
636
- pass("async executeDirect returned VAL=" + rows4[0].VAL);
637
- conn.querySync("DROP TABLE TS_NONQ");
638
- return [2 /*return*/];
639
- }
640
- });
641
- });
642
- }
643
- // Test 9: queryResult / queryResultSync / queryStream
644
- function testQueryResultAndStream(conn) {
645
- return __awaiter(this, void 0, void 0, function () {
646
- var syncRes, syncResult, syncRows, asyncRes, asyncResult, asyncRows, stream, streamRows;
647
- return __generator(this, function (_a) {
648
- switch (_a.label) {
649
- case 0:
650
- console.log("\n--- Test 9: queryResult / queryResultSync / queryStream ---");
651
- try {
652
- conn.querySync("DROP TABLE TS_QR");
653
- }
654
- catch (e) { }
655
- conn.querySync("CREATE TABLE TS_QR(ID INT, NAME VARCHAR(20))");
656
- conn.querySync("INSERT INTO TS_QR VALUES(1, 'alpha')");
657
- conn.querySync("INSERT INTO TS_QR VALUES(2, 'beta')");
658
- conn.querySync("INSERT INTO TS_QR VALUES(3, 'gamma')");
659
- syncRes = conn.queryResultSync("SELECT * FROM TS_QR ORDER BY ID");
660
- syncResult = Array.isArray(syncRes) ? syncRes[0] : syncRes;
661
- syncRows = syncResult.fetchAllSync();
662
- assert.equal(syncRows.length, 3);
663
- syncResult.closeSync();
664
- pass("queryResultSync: fetched " + syncRows.length + " rows.");
665
- return [4 /*yield*/, conn.queryResult("SELECT * FROM TS_QR WHERE ID<=2")];
666
- case 1:
667
- asyncRes = _a.sent();
668
- assert.ok(Array.isArray(asyncRes), "queryResult should return array");
669
- asyncResult = asyncRes[0];
670
- return [4 /*yield*/, asyncResult.fetchAll()];
671
- case 2:
672
- asyncRows = _a.sent();
673
- assert.equal(asyncRows.length, 2);
674
- return [4 /*yield*/, asyncResult.close()];
675
- case 3:
676
- _a.sent();
677
- pass("async queryResult: fetched " + asyncRows.length + " rows.");
678
- stream = conn.queryStream("SELECT * FROM TS_QR ORDER BY ID");
679
- streamRows = [];
680
- return [4 /*yield*/, new Promise(function (resolve, reject) {
681
- stream.on('data', function (row) { streamRows.push(row); });
682
- stream.on('end', function () { resolve(); });
683
- stream.on('error', function (err) { reject(err); });
684
- })];
685
- case 4:
686
- _a.sent();
687
- assert.equal(streamRows.length, 3);
688
- assert.equal(streamRows[0].NAME, 'alpha');
689
- assert.equal(streamRows[2].NAME, 'gamma');
690
- pass("queryStream: streamed " + streamRows.length + " rows.");
691
- conn.querySync("DROP TABLE TS_QR");
692
- return [2 /*return*/];
693
- }
694
- });
695
- });
696
- }
697
- // Test 10: result.fetch() / getData / getDataSync / moreResultsSync
698
- function testFetchAndGetData(conn) {
699
- return __awaiter(this, void 0, void 0, function () {
700
- var stmt1, res1, row1, row2, row3, rowEnd, stmt2, res2, arrRow, stmt3, res3, rows3, hasMore;
701
- return __generator(this, function (_a) {
702
- switch (_a.label) {
703
- case 0:
704
- console.log("\n--- Test 10: fetch / getData / moreResultsSync ---");
705
- try {
706
- conn.querySync("DROP TABLE TS_FETCH");
707
- }
708
- catch (e) { }
709
- conn.querySync("CREATE TABLE TS_FETCH(ID INT, NAME VARCHAR(20))");
710
- conn.querySync("INSERT INTO TS_FETCH VALUES(1, 'row1')");
711
- conn.querySync("INSERT INTO TS_FETCH VALUES(2, 'row2')");
712
- conn.querySync("INSERT INTO TS_FETCH VALUES(3, 'row3')");
713
- return [4 /*yield*/, conn.prepare("SELECT * FROM TS_FETCH ORDER BY ID")];
714
- case 1:
715
- stmt1 = _a.sent();
716
- return [4 /*yield*/, stmt1.execute()];
717
- case 2:
718
- res1 = _a.sent();
719
- if (Array.isArray(res1)) {
720
- res1 = res1[0];
721
- }
722
- return [4 /*yield*/, res1.fetch()];
723
- case 3:
724
- row1 = _a.sent();
725
- assert.ok(row1 && row1.ID === 1 && row1.NAME === 'row1');
726
- return [4 /*yield*/, res1.fetch()];
727
- case 4:
728
- row2 = _a.sent();
729
- assert.ok(row2 && row2.ID === 2 && row2.NAME === 'row2');
730
- return [4 /*yield*/, res1.fetch()];
731
- case 5:
732
- row3 = _a.sent();
733
- assert.ok(row3 && row3.ID === 3 && row3.NAME === 'row3');
734
- return [4 /*yield*/, res1.fetch()];
735
- case 6:
736
- rowEnd = _a.sent();
737
- // null or empty when no more rows
738
- pass("fetch() retrieved 3 rows one at a time.");
739
- return [4 /*yield*/, res1.close()];
740
- case 7:
741
- _a.sent();
742
- return [4 /*yield*/, stmt1.close()];
743
- case 8:
744
- _a.sent();
745
- return [4 /*yield*/, conn.prepare("SELECT ID, NAME FROM TS_FETCH WHERE ID=1")];
746
- case 9:
747
- stmt2 = _a.sent();
748
- return [4 /*yield*/, stmt2.execute()];
749
- case 10:
750
- res2 = _a.sent();
751
- if (Array.isArray(res2)) {
752
- res2 = res2[0];
753
- }
754
- return [4 /*yield*/, res2.fetch({ fetchMode: ibmdb.FETCH_ARRAY })];
755
- case 11:
756
- arrRow = _a.sent();
757
- assert.ok(Array.isArray(arrRow), "FETCH_ARRAY should return an array");
758
- assert.equal(arrRow[0], 1);
759
- assert.equal(arrRow[1], 'row1');
760
- pass("fetch({fetchMode: FETCH_ARRAY}) returned array [" + arrRow + "].");
761
- return [4 /*yield*/, res2.close()];
762
- case 12:
763
- _a.sent();
764
- return [4 /*yield*/, stmt2.close()];
765
- case 13:
766
- _a.sent();
767
- stmt3 = conn.prepareSync("SELECT ID FROM TS_FETCH WHERE ID=1");
768
- res3 = stmt3.executeSync();
769
- if (Array.isArray(res3)) {
770
- res3 = res3[0];
771
- }
772
- rows3 = res3.fetchAllSync();
773
- assert.equal(rows3.length, 1);
774
- hasMore = res3.moreResultsSync();
775
- // Single SELECT should not have more results
776
- pass("moreResultsSync() returned " + hasMore + " for single SELECT.");
777
- res3.closeSync();
778
- stmt3.closeSync();
779
- conn.querySync("DROP TABLE TS_FETCH");
780
- return [2 /*return*/];
781
- }
782
- });
783
- });
784
- }
785
- // Test 11: Connection Attributes (setAttr, setAttrSync, setIsolationLevel)
786
- function testConnectionAttributes(conn) {
787
- return __awaiter(this, void 0, void 0, function () {
788
- var result1, SQL_TXN_READ_COMMITTED;
789
- return __generator(this, function (_a) {
790
- switch (_a.label) {
791
- case 0:
792
- console.log("\n--- Test 11: Connection Attributes ---");
793
- result1 = conn.setAttrSync(ibmdb.SQL_ATTR_AUTOCOMMIT, 1);
794
- assert.ok(result1 === true || result1 === undefined || !(result1 && result1.error));
795
- pass("setAttrSync(SQL_ATTR_AUTOCOMMIT, 1) succeeded.");
796
- // async setAttr with numeric attribute
797
- return [4 /*yield*/, conn.setAttr(ibmdb.SQL_ATTR_AUTOCOMMIT, 1)];
798
- case 1:
799
- // async setAttr with numeric attribute
800
- _a.sent();
801
- pass("async setAttr(SQL_ATTR_AUTOCOMMIT, 1) succeeded.");
802
- SQL_TXN_READ_COMMITTED = 2;
803
- conn.setIsolationLevel(SQL_TXN_READ_COMMITTED);
804
- pass("setIsolationLevel(" + SQL_TXN_READ_COMMITTED + ") succeeded.");
805
- // Restore default autocommit
806
- conn.setAttrSync(ibmdb.SQL_ATTR_AUTOCOMMIT, 1);
807
- return [2 /*return*/];
808
- }
809
- });
810
- });
811
- }
812
- // Test 12: executeFile / executeFileSync
813
- function testExecuteFile(conn) {
814
- return __awaiter(this, void 0, void 0, function () {
815
- var sqlFile, sqlContent, syncResult, rows1, rows2;
816
- return __generator(this, function (_a) {
817
- switch (_a.label) {
818
- case 0:
819
- console.log("\n--- Test 12: executeFile / executeFileSync ---");
820
- sqlFile = path.join(dataDir, "ts_test_exec.sql");
821
- sqlContent = [
822
- "CREATE TABLE TS_EXECFILE(ID INT, VAL VARCHAR(20))",
823
- "INSERT INTO TS_EXECFILE VALUES(1, 'fileSync')",
824
- "INSERT INTO TS_EXECFILE VALUES(2, 'fileSync2')"
825
- ].join(";\n") + ";";
826
- fs.writeFileSync(sqlFile, sqlContent);
827
- // executeFileSync
828
- try {
829
- conn.querySync("DROP TABLE TS_EXECFILE");
830
- }
831
- catch (e) { }
832
- syncResult = conn.executeFileSync(sqlFile);
833
- rows1 = conn.querySync("SELECT * FROM TS_EXECFILE ORDER BY ID");
834
- assert.equal(rows1.length, 2);
835
- assert.equal(rows1[0].VAL, 'fileSync');
836
- pass("executeFileSync: inserted " + rows1.length + " rows from SQL file.");
837
- // async executeFile
838
- conn.querySync("DROP TABLE TS_EXECFILE");
839
- return [4 /*yield*/, conn.executeFile(sqlFile)];
840
- case 1:
841
- _a.sent();
842
- rows2 = conn.querySync("SELECT * FROM TS_EXECFILE ORDER BY ID");
843
- if (Array.isArray(rows2) && rows2.length === 2) {
844
- assert.equal(rows2[1].VAL, 'fileSync2');
845
- pass("async executeFile: inserted " + rows2.length + " rows from SQL file.");
846
- }
847
- else {
848
- pass("async executeFile: completed (no select verification).");
849
- }
850
- conn.querySync("DROP TABLE TS_EXECFILE");
851
- try {
852
- fs.unlinkSync(sqlFile);
853
- }
854
- catch (e) { }
855
- return [2 /*return*/];
856
- }
857
- });
858
- });
859
- }
860
- // Test 13: Connection Pool
861
- function testConnectionPool() {
862
- return __awaiter(this, void 0, void 0, function () {
863
- var pool, initResult, db1, r1, db2, r2;
864
- return __generator(this, function (_a) {
865
- switch (_a.label) {
866
- case 0:
867
- console.log("\n--- Test 13: Connection Pool ---");
868
- pool = new ibmdb.Pool();
869
- // setMaxPoolSize
870
- pool.setMaxPoolSize(5);
871
- pass("Pool.setMaxPoolSize(5) succeeded.");
872
- initResult = pool.init(2, cn);
873
- assert.ok(initResult === true, "Pool.init should return true");
874
- pass("Pool.init(2) pre-created 2 connections.");
875
- return [4 /*yield*/, pool.open(cn)];
876
- case 1:
877
- db1 = _a.sent();
878
- assert.ok(db1 && typeof db1.querySync === 'function');
879
- r1 = db1.querySync("SELECT 1 AS NUM FROM SYSIBM.SYSDUMMY1");
880
- assert.equal(r1[0].NUM, 1);
881
- pass("Pool.open: got pooled connection, query returned NUM=" + r1[0].NUM);
882
- // poolCloseSync - return connection to pool
883
- db1.poolCloseSync();
884
- pass("poolCloseSync: returned connection to pool.");
885
- db2 = pool.openSync(cn);
886
- assert.ok(db2 && typeof db2.querySync === 'function');
887
- r2 = db2.querySync("SELECT 2 AS NUM FROM SYSIBM.SYSDUMMY1");
888
- assert.equal(r2[0].NUM, 2);
889
- pass("Pool.openSync: got pooled connection, query returned NUM=" + r2[0].NUM);
890
- // async poolClose
891
- return [4 /*yield*/, db2.poolClose()];
892
- case 2:
893
- // async poolClose
894
- _a.sent();
895
- pass("async poolClose: returned connection to pool.");
896
- // Pool.close - close all pooled connections
897
- return [4 /*yield*/, pool.close()];
898
- case 3:
899
- // Pool.close - close all pooled connections
900
- _a.sent();
901
- pass("Pool.close: all pooled connections closed.");
902
- return [2 /*return*/];
903
- }
904
- });
905
- });
906
- }
907
- // Test 14: Constants and module exports
908
- function testConstants() {
909
- console.log("\n--- Test 14: Constants and module exports ---");
910
- // FetchMode constants
911
- assert.ok(ibmdb.FETCH_ARRAY !== undefined, "FETCH_ARRAY should be defined");
912
- assert.ok(ibmdb.FETCH_OBJECT !== undefined, "FETCH_OBJECT should be defined");
913
- assert.ok(ibmdb.FETCH_NODATA !== undefined, "FETCH_NODATA should be defined");
914
- assert.equal(ibmdb.FETCH_ARRAY, 3);
915
- assert.equal(ibmdb.FETCH_OBJECT, 4);
916
- assert.equal(ibmdb.FETCH_NODATA, 0);
917
- pass("FETCH_ARRAY=3, FETCH_OBJECT=4, FETCH_NODATA=0");
918
- // SQL_FILE_* constants
919
- assert.equal(ibmdb.SQL_FILE_READ, 2);
920
- assert.equal(ibmdb.SQL_FILE_CREATE, 8);
921
- assert.equal(ibmdb.SQL_FILE_OVERWRITE, 16);
922
- assert.equal(ibmdb.SQL_FILE_APPEND, 32);
923
- pass("SQL_FILE_READ=2, SQL_FILE_CREATE=8, SQL_FILE_OVERWRITE=16, SQL_FILE_APPEND=32");
924
- // Statement / connection attribute constants
925
- assert.ok(typeof ibmdb.SQL_ATTR_ROW_ARRAY_SIZE === 'number');
926
- assert.ok(typeof ibmdb.SQL_ATTR_PARAMSET_SIZE === 'number');
927
- assert.ok(typeof ibmdb.SQL_ATTR_QUERY_TIMEOUT === 'number');
928
- assert.ok(typeof ibmdb.SQL_ATTR_AUTOCOMMIT === 'number');
929
- assert.ok(typeof ibmdb.SQL_ATTR_TXN_ISOLATION === 'number');
930
- pass("SQL_ATTR_ROW_ARRAY_SIZE=" + ibmdb.SQL_ATTR_ROW_ARRAY_SIZE +
931
- ", SQL_ATTR_PARAMSET_SIZE=" + ibmdb.SQL_ATTR_PARAMSET_SIZE +
932
- ", SQL_ATTR_QUERY_TIMEOUT=" + ibmdb.SQL_ATTR_QUERY_TIMEOUT);
933
- // SQL data type constants
934
- assert.equal(ibmdb.INTEGER, 4);
935
- assert.equal(ibmdb.VARCHAR, 12);
936
- assert.equal(ibmdb.BLOB, -98);
937
- assert.equal(ibmdb.CLOB, -99);
938
- assert.equal(ibmdb.BIGINT, -5);
939
- assert.equal(ibmdb.DOUBLE, 8);
940
- assert.equal(ibmdb.DATE, 91);
941
- assert.equal(ibmdb.TIMESTAMP, 93);
942
- pass("Data types: INTEGER=4, VARCHAR=12, BLOB=-98, CLOB=-99, BIGINT=-5, DATE=91");
943
- // GetInfo type constants
944
- assert.ok(typeof ibmdb.SQL_DBMS_NAME === 'number');
945
- assert.ok(typeof ibmdb.SQL_DBMS_VER === 'number');
946
- assert.ok(typeof ibmdb.SQL_DATABASE_NAME === 'number');
947
- assert.ok(typeof ibmdb.SQL_DRIVER_NAME === 'number');
948
- pass("SQL_DBMS_NAME=" + ibmdb.SQL_DBMS_NAME +
949
- ", SQL_DBMS_VER=" + ibmdb.SQL_DBMS_VER +
950
- ", SQL_DATABASE_NAME=" + ibmdb.SQL_DATABASE_NAME);
951
- // GetFunctions ID constants
952
- assert.ok(typeof ibmdb.SQLFETCH === 'number');
953
- assert.ok(typeof ibmdb.SQLEXECUTE === 'number');
954
- assert.ok(typeof ibmdb.SQLPREPARE === 'number');
955
- assert.ok(typeof ibmdb.SQLCONNECT === 'number');
956
- pass("SQLFETCH=" + ibmdb.SQLFETCH + ", SQLPREPARE=" + ibmdb.SQLPREPARE);
957
- // Module functions
958
- assert.equal(typeof ibmdb.open, 'function');
959
- assert.equal(typeof ibmdb.openSync, 'function');
960
- assert.equal(typeof ibmdb.debug, 'function');
961
- assert.equal(typeof ibmdb.getElapsedTime, 'function');
962
- assert.equal(typeof ibmdb.close, 'function');
963
- pass("open, openSync, close, debug, getElapsedTime are exported functions.");
964
- // Class constructors
965
- assert.equal(typeof ibmdb.Database, 'function');
966
- assert.equal(typeof ibmdb.Pool, 'function');
967
- pass("Database and Pool constructors are exported.");
968
- // convertRowsToColumns utility
969
- assert.equal(typeof ibmdb.convertRowsToColumns, 'function');
970
- var conv = ibmdb.convertRowsToColumns([[1, 'a'], [2, 'b'], [3, 'c']]);
971
- assert.ok(conv.params && Array.isArray(conv.params));
972
- assert.equal(conv.ArraySize, 3);
973
- assert.equal(conv.params.length, 2); // 2 columns
974
- assert.equal(conv.params[0].ParamType, 'ARRAY');
975
- pass("convertRowsToColumns: 3 rows x 2 cols => ArraySize=3, params.length=2");
976
- }
977
- // Run
978
- main();
1
+ "use strict";
2
+ // To run this quick-example.ts file, follow below steps
3
+ // npm install -g typescript
4
+ // npm install --save-dev @types/node
5
+ // update database connection info in ../test/config.json file or
6
+ // set environment variables DB2_USER, DB2_PASSWD, etc.
7
+ // tsc quick-example.ts --target ES2016 --lib ES2016
8
+ // node quick-example.js
9
+ // OR, run:
10
+ // tsc quick-example.ts && node quick-example.js && rm quick-example.js
11
+ //
12
+ // To run this test program using ts-node, Allow JavaScript
13
+ // Modules in tsconfig.json file. For that -
14
+ // Modify your tsconfig.json to allow JS modules:
15
+ // Open tsconfig.json
16
+ // Add or modify these options:
17
+ // {
18
+ // "compilerOptions": {
19
+ // "allowJs": true, // Allow JS modules
20
+ // "skipLibCheck": true, // Skip type checking for JS files
21
+ // "noImplicitAny": false, // Allow 'any' type
22
+ // "moduleResolution": "node" // Use Node.js module resolution
23
+ // }
24
+ // }
25
+ // Save the file and rerun:
26
+ // ts-node quick-example.ts
27
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
28
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
29
+ return new (P || (P = Promise))(function (resolve, reject) {
30
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
31
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
32
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
33
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
34
+ });
35
+ };
36
+ var __generator = (this && this.__generator) || function (thisArg, body) {
37
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
38
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
39
+ function verb(n) { return function (v) { return step([n, v]); }; }
40
+ function step(op) {
41
+ if (f) throw new TypeError("Generator is already executing.");
42
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
43
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
44
+ if (y = 0, t) op = [op[0] & 2, t.value];
45
+ switch (op[0]) {
46
+ case 0: case 1: t = op; break;
47
+ case 4: _.label++; return { value: op[1], done: false };
48
+ case 5: _.label++; y = op[1]; op = [0]; continue;
49
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
50
+ default:
51
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
52
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
53
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
54
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
55
+ if (t[2]) _.ops.pop();
56
+ _.trys.pop(); continue;
57
+ }
58
+ op = body.call(thisArg, _);
59
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
60
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
61
+ }
62
+ };
63
+ Object.defineProperty(exports, "__esModule", { value: true });
64
+ var common = require("./common");
65
+ var ibmdb = require("../");
66
+ var assert = require("assert");
67
+ var fs = require("fs");
68
+ var path = require("path");
69
+ // Define connection string
70
+ var cn = common.connectionString;
71
+ var dataDir = path.join(__dirname, "data");
72
+ var passed = 0;
73
+ var failed = 0;
74
+ function pass(msg) {
75
+ console.log(" PASS: " + msg);
76
+ passed++;
77
+ }
78
+ function fail(msg) {
79
+ console.log(" FAIL: " + msg);
80
+ failed++;
81
+ }
82
+ function main() {
83
+ return __awaiter(this, void 0, void 0, function () {
84
+ var conn, e_1;
85
+ return __generator(this, function (_a) {
86
+ switch (_a.label) {
87
+ case 0:
88
+ _a.trys.push([0, 16, , 19]);
89
+ return [4 /*yield*/, ibmdb.open(cn)];
90
+ case 1:
91
+ // Open connection
92
+ conn = _a.sent();
93
+ console.log("Connection opened successfully.\n");
94
+ return [4 /*yield*/, testBasicQueryAndPrepare(conn)];
95
+ case 2:
96
+ _a.sent();
97
+ return [4 /*yield*/, testFetchN(conn)];
98
+ case 3:
99
+ _a.sent();
100
+ return [4 /*yield*/, testBindFileToCol(conn)];
101
+ case 4:
102
+ _a.sent();
103
+ return [4 /*yield*/, testChunkedLobInsert(conn)];
104
+ case 5:
105
+ _a.sent();
106
+ return [4 /*yield*/, testTransactions(conn)];
107
+ case 6:
108
+ _a.sent();
109
+ return [4 /*yield*/, testMetadata(conn)];
110
+ case 7:
111
+ _a.sent();
112
+ return [4 /*yield*/, testConnectionInfo(conn)];
113
+ case 8:
114
+ _a.sent();
115
+ return [4 /*yield*/, testExecuteNonQueryAndDirect(conn)];
116
+ case 9:
117
+ _a.sent();
118
+ return [4 /*yield*/, testQueryResultAndStream(conn)];
119
+ case 10:
120
+ _a.sent();
121
+ return [4 /*yield*/, testFetchAndGetData(conn)];
122
+ case 11:
123
+ _a.sent();
124
+ return [4 /*yield*/, testConnectionAttributes(conn)];
125
+ case 12:
126
+ _a.sent();
127
+ return [4 /*yield*/, testExecuteFile(conn)];
128
+ case 13:
129
+ _a.sent();
130
+ return [4 /*yield*/, testConnectionPool()];
131
+ case 14:
132
+ _a.sent();
133
+ testConstants();
134
+ // Close connection
135
+ return [4 /*yield*/, conn.close()];
136
+ case 15:
137
+ // Close connection
138
+ _a.sent();
139
+ console.log("\nConnection closed.");
140
+ console.log("\n=== Results: " + passed + " passed, " + failed + " failed ===");
141
+ if (failed > 0)
142
+ process.exit(1);
143
+ return [3 /*break*/, 19];
144
+ case 16:
145
+ e_1 = _a.sent();
146
+ if (e_1 instanceof Error) {
147
+ console.error("Error:", e_1.message);
148
+ }
149
+ else {
150
+ console.error("An unknown error occurred:", e_1);
151
+ }
152
+ if (!conn) return [3 /*break*/, 18];
153
+ return [4 /*yield*/, conn.close().catch(function () { })];
154
+ case 17:
155
+ _a.sent();
156
+ _a.label = 18;
157
+ case 18:
158
+ process.exit(1);
159
+ return [3 /*break*/, 19];
160
+ case 19: return [2 /*return*/];
161
+ }
162
+ });
163
+ });
164
+ }
165
+ // Test 1: Basic query, prepare, execute, fetchAll
166
+ function testBasicQueryAndPrepare(conn) {
167
+ return __awaiter(this, void 0, void 0, function () {
168
+ var stmt, result, rows, data, syncRows;
169
+ var _a;
170
+ return __generator(this, function (_b) {
171
+ switch (_b.label) {
172
+ case 0:
173
+ console.log("--- Test 1: Basic query, prepare, execute, fetchAll ---");
174
+ try {
175
+ conn.querySync("DROP TABLE TS_BASIC");
176
+ }
177
+ catch (e) { }
178
+ return [4 /*yield*/, conn.query("CREATE TABLE TS_BASIC(C1 INT, C2 VARCHAR(10))")];
179
+ case 1:
180
+ _b.sent();
181
+ return [4 /*yield*/, conn.query("INSERT INTO TS_BASIC VALUES (?, ?)", [3, 'ibm'])];
182
+ case 2:
183
+ _b.sent();
184
+ return [4 /*yield*/, conn.prepare("SELECT * FROM TS_BASIC")];
185
+ case 3:
186
+ stmt = _b.sent();
187
+ return [4 /*yield*/, stmt.execute()];
188
+ case 4:
189
+ result = _b.sent();
190
+ if (Array.isArray(result)) {
191
+ result = result[0];
192
+ }
193
+ return [4 /*yield*/, result.fetchAll()];
194
+ case 5:
195
+ rows = _b.sent();
196
+ data = [];
197
+ if (rows[0] && !Array.isArray(rows[0])) {
198
+ data = rows;
199
+ }
200
+ assert.deepEqual(data, [{ C1: 3, C2: 'ibm' }]);
201
+ pass("query + prepare + execute + fetchAll works. C2=" + ((_a = data[0]) === null || _a === void 0 ? void 0 : _a.C2));
202
+ return [4 /*yield*/, result.close()];
203
+ case 6:
204
+ _b.sent();
205
+ return [4 /*yield*/, stmt.close()];
206
+ case 7:
207
+ _b.sent();
208
+ syncRows = conn.querySync("SELECT * FROM TS_BASIC");
209
+ assert.equal(syncRows.length, 1);
210
+ pass("querySync returns " + syncRows.length + " row.");
211
+ conn.querySync("DROP TABLE TS_BASIC");
212
+ return [2 /*return*/];
213
+ }
214
+ });
215
+ });
216
+ }
217
+ // Test 2: fetchN / fetchNSync (block fetch)
218
+ function testFetchN(conn) {
219
+ return __awaiter(this, void 0, void 0, function () {
220
+ var i, stmt1, result1, batch1, batch2, batch3, stmt2, result2, asyncBatch;
221
+ return __generator(this, function (_a) {
222
+ switch (_a.label) {
223
+ case 0:
224
+ console.log("\n--- Test 2: fetchN / fetchNSync (block fetch) ---");
225
+ try {
226
+ conn.querySync("DROP TABLE TS_FETCHN");
227
+ }
228
+ catch (e) { }
229
+ conn.querySync("CREATE TABLE TS_FETCHN(ID INT, NAME VARCHAR(20))");
230
+ for (i = 1; i <= 12; i++) {
231
+ conn.querySync("INSERT INTO TS_FETCHN VALUES (" + i + ", 'Row" + i + "')");
232
+ }
233
+ stmt1 = conn.prepareSync("SELECT * FROM TS_FETCHN ORDER BY ID");
234
+ stmt1.setAttrSync(ibmdb.SQL_ATTR_ROW_ARRAY_SIZE, 5);
235
+ result1 = stmt1.executeSync();
236
+ if (Array.isArray(result1)) {
237
+ result1 = result1[0];
238
+ }
239
+ batch1 = result1.fetchNSync(5);
240
+ assert.equal(batch1.length, 5, "fetchNSync(5) should return 5 rows");
241
+ pass("fetchNSync(5) returned " + batch1.length + " rows.");
242
+ batch2 = result1.fetchNSync(5);
243
+ assert.equal(batch2.length, 5, "second fetchNSync(5) should return 5 rows");
244
+ pass("fetchNSync(5) returned next " + batch2.length + " rows.");
245
+ batch3 = result1.fetchNSync(5);
246
+ assert.equal(batch3.length, 2, "third fetchNSync(5) should return 2 rows");
247
+ pass("fetchNSync(5) returned last " + batch3.length + " rows.");
248
+ result1.closeSync();
249
+ stmt1.closeSync();
250
+ return [4 /*yield*/, conn.prepare("SELECT * FROM TS_FETCHN ORDER BY ID")];
251
+ case 1:
252
+ stmt2 = _a.sent();
253
+ stmt2.setAttrSync(ibmdb.SQL_ATTR_ROW_ARRAY_SIZE, 4);
254
+ return [4 /*yield*/, stmt2.execute()];
255
+ case 2:
256
+ result2 = _a.sent();
257
+ if (Array.isArray(result2)) {
258
+ result2 = result2[0];
259
+ }
260
+ return [4 /*yield*/, result2.fetchN(4)];
261
+ case 3:
262
+ asyncBatch = _a.sent();
263
+ assert.equal(asyncBatch.length, 4, "async fetchN(4) should return 4 rows");
264
+ pass("async fetchN(4) returned " + asyncBatch.length + " rows.");
265
+ return [4 /*yield*/, result2.close()];
266
+ case 4:
267
+ _a.sent();
268
+ return [4 /*yield*/, stmt2.close()];
269
+ case 5:
270
+ _a.sent();
271
+ conn.querySync("DROP TABLE TS_FETCHN");
272
+ return [2 /*return*/];
273
+ }
274
+ });
275
+ });
276
+ }
277
+ // Test 3: bindFileToCol / bindFileToColSync
278
+ function testBindFileToCol(conn) {
279
+ return __awaiter(this, void 0, void 0, function () {
280
+ var srcImage, srcBuf, insertStmt, outFile1, s1, r1, row1, outBuf1, outFile2, s2, r2, row2, outBuf2;
281
+ return __generator(this, function (_a) {
282
+ switch (_a.label) {
283
+ case 0:
284
+ console.log("\n--- Test 3: bindFileToCol / bindFileToColSync ---");
285
+ srcImage = path.join(dataDir, "phool.jpg");
286
+ if (!fs.existsSync(srcImage)) {
287
+ console.log(" SKIP: phool.jpg not found in test/data/");
288
+ return [2 /*return*/];
289
+ }
290
+ srcBuf = fs.readFileSync(srcImage);
291
+ console.log(" Source file: " + srcImage + " (" + srcBuf.length + " bytes)");
292
+ try {
293
+ conn.querySync("DROP TABLE TS_FILEBIND");
294
+ }
295
+ catch (e) { }
296
+ conn.querySync("CREATE TABLE TS_FILEBIND(ID INT, PHOTO BLOB(1M))");
297
+ insertStmt = conn.prepareSync("INSERT INTO TS_FILEBIND VALUES(?, ?)");
298
+ insertStmt.executeSync([
299
+ 1,
300
+ { ParamType: 'FILE', DataType: 'BLOB', Data: srcImage }
301
+ ]);
302
+ insertStmt.closeSync();
303
+ outFile1 = path.join(dataDir, "ts_test_photo1.jpg");
304
+ try {
305
+ fs.unlinkSync(outFile1);
306
+ }
307
+ catch (e) { }
308
+ s1 = conn.prepareSync("SELECT ID, PHOTO FROM TS_FILEBIND WHERE ID=1");
309
+ r1 = s1.executeSync();
310
+ if (Array.isArray(r1)) {
311
+ r1 = r1[0];
312
+ }
313
+ r1.bindFileToColSync(2, outFile1, ibmdb.SQL_FILE_OVERWRITE);
314
+ row1 = r1.fetchAllSync();
315
+ assert.ok(row1.length === 1, "Should return 1 row");
316
+ outBuf1 = fs.readFileSync(outFile1);
317
+ assert.equal(outBuf1.length, srcBuf.length, "Output file size should match source");
318
+ assert.ok(srcBuf.equals(outBuf1), "File content should match");
319
+ pass("bindFileToColSync: wrote " + outBuf1.length +
320
+ " bytes to file, verified binary match.");
321
+ r1.closeSync();
322
+ s1.closeSync();
323
+ try {
324
+ fs.unlinkSync(outFile1);
325
+ }
326
+ catch (e) { }
327
+ outFile2 = path.join(dataDir, "ts_test_photo2.jpg");
328
+ try {
329
+ fs.unlinkSync(outFile2);
330
+ }
331
+ catch (e) { }
332
+ return [4 /*yield*/, conn.prepare("SELECT ID, PHOTO FROM TS_FILEBIND WHERE ID=1")];
333
+ case 1:
334
+ s2 = _a.sent();
335
+ return [4 /*yield*/, s2.execute()];
336
+ case 2:
337
+ r2 = _a.sent();
338
+ if (Array.isArray(r2)) {
339
+ r2 = r2[0];
340
+ }
341
+ return [4 /*yield*/, r2.bindFileToCol(2, outFile2, ibmdb.SQL_FILE_OVERWRITE)];
342
+ case 3:
343
+ _a.sent();
344
+ return [4 /*yield*/, r2.fetchAll()];
345
+ case 4:
346
+ row2 = _a.sent();
347
+ assert.ok(row2.length === 1, "Should return 1 row");
348
+ outBuf2 = fs.readFileSync(outFile2);
349
+ assert.equal(outBuf2.length, srcBuf.length);
350
+ assert.ok(srcBuf.equals(outBuf2), "Async file content should match");
351
+ pass("async bindFileToCol: wrote " + outBuf2.length +
352
+ " bytes to file, verified binary match.");
353
+ return [4 /*yield*/, r2.close()];
354
+ case 5:
355
+ _a.sent();
356
+ return [4 /*yield*/, s2.close()];
357
+ case 6:
358
+ _a.sent();
359
+ try {
360
+ fs.unlinkSync(outFile2);
361
+ }
362
+ catch (e) { }
363
+ conn.querySync("DROP TABLE TS_FILEBIND");
364
+ return [2 /*return*/];
365
+ }
366
+ });
367
+ });
368
+ }
369
+ // Test 4: Chunked LOB insert (Array of Buffers + Readable stream)
370
+ function testChunkedLobInsert(conn) {
371
+ return __awaiter(this, void 0, void 0, function () {
372
+ var srcImage, srcBuf, chunkSize, chunks, offset, rows4a, stream, rows4b;
373
+ return __generator(this, function (_a) {
374
+ switch (_a.label) {
375
+ case 0:
376
+ console.log("\n--- Test 4: Chunked LOB insert (SQLPutData) ---");
377
+ srcImage = path.join(dataDir, "phool.jpg");
378
+ if (!fs.existsSync(srcImage)) {
379
+ console.log(" SKIP: phool.jpg not found in test/data/");
380
+ return [2 /*return*/];
381
+ }
382
+ srcBuf = fs.readFileSync(srcImage);
383
+ try {
384
+ conn.querySync("DROP TABLE TS_CHUNKLOB");
385
+ }
386
+ catch (e) { }
387
+ conn.querySync("CREATE TABLE TS_CHUNKLOB(ID INT, PHOTO BLOB(1M))");
388
+ chunkSize = 65536;
389
+ chunks = [];
390
+ for (offset = 0; offset < srcBuf.length; offset += chunkSize) {
391
+ chunks.push(srcBuf.subarray(offset, Math.min(offset + chunkSize, srcBuf.length)));
392
+ }
393
+ console.log(" Split into " + chunks.length + " chunks of ~" + chunkSize + " bytes");
394
+ conn.querySync("INSERT INTO TS_CHUNKLOB VALUES(?, ?)", [
395
+ 1,
396
+ { ParamType: 'INPUT', DataType: 'BLOB', Data: chunks }
397
+ ]);
398
+ rows4a = conn.querySync("SELECT PHOTO FROM TS_CHUNKLOB WHERE ID=1");
399
+ assert.ok(Buffer.isBuffer(rows4a[0].PHOTO), "Should return Buffer");
400
+ assert.ok(srcBuf.equals(rows4a[0].PHOTO), "Chunked insert data should match source");
401
+ pass("querySync with Array of Buffers (" + chunks.length + " chunks): binary match verified.");
402
+ stream = fs.createReadStream(srcImage, { highWaterMark: 32768 });
403
+ return [4 /*yield*/, conn.query("INSERT INTO TS_CHUNKLOB VALUES(?, ?)", [
404
+ 2,
405
+ { ParamType: 'INPUT', DataType: 'BLOB', Data: stream }
406
+ ])];
407
+ case 1:
408
+ _a.sent();
409
+ rows4b = conn.querySync("SELECT PHOTO FROM TS_CHUNKLOB WHERE ID=2");
410
+ assert.ok(Buffer.isBuffer(rows4b[0].PHOTO));
411
+ assert.ok(srcBuf.equals(rows4b[0].PHOTO), "Stream insert data should match source");
412
+ pass("async query with Readable stream: binary match verified.");
413
+ conn.querySync("DROP TABLE TS_CHUNKLOB");
414
+ return [2 /*return*/];
415
+ }
416
+ });
417
+ });
418
+ }
419
+ // Test 5: Transaction Management
420
+ function testTransactions(conn) {
421
+ return __awaiter(this, void 0, void 0, function () {
422
+ var rows;
423
+ return __generator(this, function (_a) {
424
+ switch (_a.label) {
425
+ case 0:
426
+ console.log("\n--- Test 5: Transaction Management ---");
427
+ try {
428
+ conn.querySync("DROP TABLE TS_TXN");
429
+ }
430
+ catch (e) { }
431
+ conn.querySync("CREATE TABLE TS_TXN(ID INT, NAME VARCHAR(20))");
432
+ // beginTransactionSync + commitTransactionSync
433
+ conn.beginTransactionSync();
434
+ conn.querySync("INSERT INTO TS_TXN VALUES(1, 'committed')");
435
+ conn.commitTransactionSync();
436
+ rows = conn.querySync("SELECT * FROM TS_TXN WHERE ID=1");
437
+ assert.equal(rows.length, 1);
438
+ assert.equal(rows[0].NAME, 'committed');
439
+ pass("beginTransactionSync + commitTransactionSync works.");
440
+ // beginTransactionSync + rollbackTransactionSync
441
+ conn.beginTransactionSync();
442
+ conn.querySync("INSERT INTO TS_TXN VALUES(2, 'rolledback')");
443
+ conn.rollbackTransactionSync();
444
+ rows = conn.querySync("SELECT * FROM TS_TXN WHERE ID=2");
445
+ assert.equal(rows.length, 0);
446
+ pass("beginTransactionSync + rollbackTransactionSync works.");
447
+ // async beginTransaction + commitTransaction
448
+ return [4 /*yield*/, conn.beginTransaction()];
449
+ case 1:
450
+ // async beginTransaction + commitTransaction
451
+ _a.sent();
452
+ return [4 /*yield*/, conn.query("INSERT INTO TS_TXN VALUES(3, 'async_commit')")];
453
+ case 2:
454
+ _a.sent();
455
+ return [4 /*yield*/, conn.commitTransaction()];
456
+ case 3:
457
+ _a.sent();
458
+ rows = conn.querySync("SELECT * FROM TS_TXN WHERE ID=3");
459
+ assert.equal(rows.length, 1);
460
+ assert.equal(rows[0].NAME, 'async_commit');
461
+ pass("async beginTransaction + commitTransaction works.");
462
+ // async beginTransaction + rollbackTransaction
463
+ return [4 /*yield*/, conn.beginTransaction()];
464
+ case 4:
465
+ // async beginTransaction + rollbackTransaction
466
+ _a.sent();
467
+ return [4 /*yield*/, conn.query("INSERT INTO TS_TXN VALUES(4, 'async_rollback')")];
468
+ case 5:
469
+ _a.sent();
470
+ return [4 /*yield*/, conn.rollbackTransaction()];
471
+ case 6:
472
+ _a.sent();
473
+ rows = conn.querySync("SELECT * FROM TS_TXN WHERE ID=4");
474
+ assert.equal(rows.length, 0);
475
+ pass("async beginTransaction + rollbackTransaction works.");
476
+ conn.querySync("DROP TABLE TS_TXN");
477
+ return [2 /*return*/];
478
+ }
479
+ });
480
+ });
481
+ }
482
+ // Test 6: Metadata APIs (describe, columns, tables)
483
+ function testMetadata(conn) {
484
+ return __awaiter(this, void 0, void 0, function () {
485
+ var dbName, colInfo, colNames, oneCol, tblList, cols, tbls;
486
+ return __generator(this, function (_a) {
487
+ switch (_a.label) {
488
+ case 0:
489
+ console.log("\n--- Test 6: Metadata APIs ---");
490
+ try {
491
+ conn.querySync("DROP TABLE TS_META");
492
+ }
493
+ catch (e) { }
494
+ conn.querySync("CREATE TABLE TS_META(ID INT NOT NULL, NAME VARCHAR(30), SCORE DECIMAL(5,2))");
495
+ conn.querySync("INSERT INTO TS_META VALUES(1, 'test', 99.5)");
496
+ dbName = conn.getInfoSync(ibmdb.SQL_DATABASE_NAME);
497
+ return [4 /*yield*/, conn.describe({ database: dbName, table: 'TS_META' })];
498
+ case 1:
499
+ colInfo = _a.sent();
500
+ assert.ok(Array.isArray(colInfo), "describe should return array");
501
+ assert.ok(colInfo.length >= 3, "TS_META should have 3+ column descriptors");
502
+ colNames = colInfo.map(function (c) { return c.COLUMN_NAME; });
503
+ assert.ok(colNames.includes('ID'), "Should have ID column");
504
+ assert.ok(colNames.includes('NAME'), "Should have NAME column");
505
+ pass("describe({database, table}) returned " + colInfo.length + " columns.");
506
+ return [4 /*yield*/, conn.describe({ database: dbName, table: 'TS_META', column: 'SCORE' })];
507
+ case 2:
508
+ oneCol = _a.sent();
509
+ assert.ok(Array.isArray(oneCol) && oneCol.length >= 1);
510
+ assert.equal(oneCol[0].COLUMN_NAME, 'SCORE');
511
+ pass("describe({database, table, column}) returned column SCORE.");
512
+ return [4 /*yield*/, conn.describe({ database: dbName, schema: '%', type: 'TABLE' })];
513
+ case 3:
514
+ tblList = _a.sent();
515
+ assert.ok(Array.isArray(tblList), "describe should return tables array");
516
+ assert.ok(tblList.length > 0, "Should have at least one table");
517
+ pass("describe({database}) returned " + tblList.length + " tables.");
518
+ return [4 /*yield*/, conn.columns(dbName, '%', 'TS_META', '%')];
519
+ case 4:
520
+ cols = _a.sent();
521
+ assert.ok(Array.isArray(cols) && cols.length >= 3);
522
+ pass("columns() returned " + cols.length + " column descriptors.");
523
+ return [4 /*yield*/, conn.tables(dbName, '%', 'TS_META', 'TABLE')];
524
+ case 5:
525
+ tbls = _a.sent();
526
+ assert.ok(Array.isArray(tbls) && tbls.length >= 1);
527
+ assert.equal(tbls[0].TABLE_NAME, 'TS_META');
528
+ pass("tables() found table TS_META.");
529
+ conn.querySync("DROP TABLE TS_META");
530
+ return [2 /*return*/];
531
+ }
532
+ });
533
+ });
534
+ }
535
+ // Test 7: Connection Info APIs (getInfo, getTypeInfo, getFunctions)
536
+ function testConnectionInfo(conn) {
537
+ return __awaiter(this, void 0, void 0, function () {
538
+ var dbmsName, dbmsVer, driverName, intTypeInfo, varcharInfo, hasFetch, allFuncs;
539
+ return __generator(this, function (_a) {
540
+ switch (_a.label) {
541
+ case 0:
542
+ console.log("\n--- Test 7: Connection Info APIs ---");
543
+ dbmsName = conn.getInfoSync(ibmdb.SQL_DBMS_NAME);
544
+ assert.ok(typeof dbmsName === 'string' && dbmsName.length > 0);
545
+ dbmsVer = conn.getInfoSync(ibmdb.SQL_DBMS_VER);
546
+ assert.ok(typeof dbmsVer === 'string' && dbmsVer.length > 0);
547
+ pass("getInfoSync: DBMS_NAME=" + dbmsName.trim() + ", DBMS_VER=" + dbmsVer.trim());
548
+ return [4 /*yield*/, conn.getInfo(ibmdb.SQL_DRIVER_NAME)];
549
+ case 1:
550
+ driverName = _a.sent();
551
+ assert.ok(typeof driverName === 'string' && driverName.length > 0);
552
+ pass("async getInfo(SQL_DRIVER_NAME)=" + driverName.trim());
553
+ intTypeInfo = conn.getTypeInfoSync(ibmdb.INTEGER);
554
+ assert.ok(Array.isArray(intTypeInfo) && intTypeInfo.length > 0);
555
+ assert.equal(intTypeInfo[0].DATA_TYPE, ibmdb.INTEGER);
556
+ pass("getTypeInfoSync(INTEGER): TYPE_NAME=" + intTypeInfo[0].TYPE_NAME);
557
+ return [4 /*yield*/, conn.getTypeInfo(ibmdb.VARCHAR)];
558
+ case 2:
559
+ varcharInfo = _a.sent();
560
+ assert.ok(Array.isArray(varcharInfo) && varcharInfo.length > 0);
561
+ assert.equal(varcharInfo[0].DATA_TYPE, ibmdb.VARCHAR);
562
+ pass("async getTypeInfo(VARCHAR): TYPE_NAME=" + varcharInfo[0].TYPE_NAME);
563
+ hasFetch = conn.getFunctionsSync(ibmdb.SQLFETCH);
564
+ assert.equal(hasFetch, true, "SQLFETCH should be supported");
565
+ pass("getFunctionsSync(SQLFETCH)=" + hasFetch);
566
+ return [4 /*yield*/, conn.getFunctions(ibmdb.ALLFUNCTIONS)];
567
+ case 3:
568
+ allFuncs = _a.sent();
569
+ assert.ok(typeof allFuncs === 'object' && allFuncs !== null);
570
+ assert.ok(Object.keys(allFuncs).length > 0);
571
+ pass("async getFunctions(ALLFUNCTIONS) returned " + Object.keys(allFuncs).length + " functions.");
572
+ return [2 /*return*/];
573
+ }
574
+ });
575
+ });
576
+ }
577
+ // Test 8: Statement executeNonQuery / executeDirect
578
+ function testExecuteNonQueryAndDirect(conn) {
579
+ return __awaiter(this, void 0, void 0, function () {
580
+ var stmt1, affected1, stmt2, affected2, stmt3, result3, rows3, stmt4, result4, rows4;
581
+ return __generator(this, function (_a) {
582
+ switch (_a.label) {
583
+ case 0:
584
+ console.log("\n--- Test 8: executeNonQuery / executeDirect ---");
585
+ try {
586
+ conn.querySync("DROP TABLE TS_NONQ");
587
+ }
588
+ catch (e) { }
589
+ conn.querySync("CREATE TABLE TS_NONQ(ID INT, VAL VARCHAR(20))");
590
+ stmt1 = conn.prepareSync("INSERT INTO TS_NONQ VALUES(?, ?)");
591
+ affected1 = stmt1.executeNonQuerySync([1, 'sync_nonq']);
592
+ assert.equal(affected1, 1);
593
+ stmt1.closeSync();
594
+ pass("executeNonQuerySync returned affectedRows=" + affected1);
595
+ return [4 /*yield*/, conn.prepare("INSERT INTO TS_NONQ VALUES(?, ?)")];
596
+ case 1:
597
+ stmt2 = _a.sent();
598
+ return [4 /*yield*/, stmt2.executeNonQuery([2, 'async_nonq'])];
599
+ case 2:
600
+ affected2 = _a.sent();
601
+ assert.equal(affected2, 1);
602
+ return [4 /*yield*/, stmt2.close()];
603
+ case 3:
604
+ _a.sent();
605
+ pass("async executeNonQuery returned affectedRows=" + affected2);
606
+ stmt3 = conn.prepareSync("SELECT 1 FROM SYSIBM.SYSDUMMY1");
607
+ result3 = stmt3.executeDirectSync("SELECT * FROM TS_NONQ ORDER BY ID");
608
+ if (Array.isArray(result3)) {
609
+ result3 = result3[0];
610
+ }
611
+ rows3 = result3.fetchAllSync();
612
+ assert.equal(rows3.length, 2);
613
+ result3.closeSync();
614
+ stmt3.closeSync();
615
+ pass("executeDirectSync fetched " + rows3.length + " rows.");
616
+ return [4 /*yield*/, conn.prepare("SELECT 1 FROM SYSIBM.SYSDUMMY1")];
617
+ case 4:
618
+ stmt4 = _a.sent();
619
+ return [4 /*yield*/, stmt4.executeDirect("SELECT VAL FROM TS_NONQ WHERE ID=1")];
620
+ case 5:
621
+ result4 = _a.sent();
622
+ if (Array.isArray(result4)) {
623
+ result4 = result4[0];
624
+ }
625
+ return [4 /*yield*/, result4.fetchAll()];
626
+ case 6:
627
+ rows4 = _a.sent();
628
+ assert.equal(rows4.length, 1);
629
+ assert.equal(rows4[0].VAL, 'sync_nonq');
630
+ return [4 /*yield*/, result4.close()];
631
+ case 7:
632
+ _a.sent();
633
+ return [4 /*yield*/, stmt4.close()];
634
+ case 8:
635
+ _a.sent();
636
+ pass("async executeDirect returned VAL=" + rows4[0].VAL);
637
+ conn.querySync("DROP TABLE TS_NONQ");
638
+ return [2 /*return*/];
639
+ }
640
+ });
641
+ });
642
+ }
643
+ // Test 9: queryResult / queryResultSync / queryStream
644
+ function testQueryResultAndStream(conn) {
645
+ return __awaiter(this, void 0, void 0, function () {
646
+ var syncRes, syncResult, syncRows, asyncRes, asyncResult, asyncRows, stream, streamRows;
647
+ return __generator(this, function (_a) {
648
+ switch (_a.label) {
649
+ case 0:
650
+ console.log("\n--- Test 9: queryResult / queryResultSync / queryStream ---");
651
+ try {
652
+ conn.querySync("DROP TABLE TS_QR");
653
+ }
654
+ catch (e) { }
655
+ conn.querySync("CREATE TABLE TS_QR(ID INT, NAME VARCHAR(20))");
656
+ conn.querySync("INSERT INTO TS_QR VALUES(1, 'alpha')");
657
+ conn.querySync("INSERT INTO TS_QR VALUES(2, 'beta')");
658
+ conn.querySync("INSERT INTO TS_QR VALUES(3, 'gamma')");
659
+ syncRes = conn.queryResultSync("SELECT * FROM TS_QR ORDER BY ID");
660
+ syncResult = Array.isArray(syncRes) ? syncRes[0] : syncRes;
661
+ syncRows = syncResult.fetchAllSync();
662
+ assert.equal(syncRows.length, 3);
663
+ syncResult.closeSync();
664
+ pass("queryResultSync: fetched " + syncRows.length + " rows.");
665
+ return [4 /*yield*/, conn.queryResult("SELECT * FROM TS_QR WHERE ID<=2")];
666
+ case 1:
667
+ asyncRes = _a.sent();
668
+ assert.ok(Array.isArray(asyncRes), "queryResult should return array");
669
+ asyncResult = asyncRes[0];
670
+ return [4 /*yield*/, asyncResult.fetchAll()];
671
+ case 2:
672
+ asyncRows = _a.sent();
673
+ assert.equal(asyncRows.length, 2);
674
+ return [4 /*yield*/, asyncResult.close()];
675
+ case 3:
676
+ _a.sent();
677
+ pass("async queryResult: fetched " + asyncRows.length + " rows.");
678
+ stream = conn.queryStream("SELECT * FROM TS_QR ORDER BY ID");
679
+ streamRows = [];
680
+ return [4 /*yield*/, new Promise(function (resolve, reject) {
681
+ stream.on('data', function (row) { streamRows.push(row); });
682
+ stream.on('end', function () { resolve(); });
683
+ stream.on('error', function (err) { reject(err); });
684
+ })];
685
+ case 4:
686
+ _a.sent();
687
+ assert.equal(streamRows.length, 3);
688
+ assert.equal(streamRows[0].NAME, 'alpha');
689
+ assert.equal(streamRows[2].NAME, 'gamma');
690
+ pass("queryStream: streamed " + streamRows.length + " rows.");
691
+ conn.querySync("DROP TABLE TS_QR");
692
+ return [2 /*return*/];
693
+ }
694
+ });
695
+ });
696
+ }
697
+ // Test 10: result.fetch() / getData / getDataSync / moreResultsSync
698
+ function testFetchAndGetData(conn) {
699
+ return __awaiter(this, void 0, void 0, function () {
700
+ var stmt1, res1, row1, row2, row3, rowEnd, stmt2, res2, arrRow, stmt3, res3, rows3, hasMore;
701
+ return __generator(this, function (_a) {
702
+ switch (_a.label) {
703
+ case 0:
704
+ console.log("\n--- Test 10: fetch / getData / moreResultsSync ---");
705
+ try {
706
+ conn.querySync("DROP TABLE TS_FETCH");
707
+ }
708
+ catch (e) { }
709
+ conn.querySync("CREATE TABLE TS_FETCH(ID INT, NAME VARCHAR(20))");
710
+ conn.querySync("INSERT INTO TS_FETCH VALUES(1, 'row1')");
711
+ conn.querySync("INSERT INTO TS_FETCH VALUES(2, 'row2')");
712
+ conn.querySync("INSERT INTO TS_FETCH VALUES(3, 'row3')");
713
+ return [4 /*yield*/, conn.prepare("SELECT * FROM TS_FETCH ORDER BY ID")];
714
+ case 1:
715
+ stmt1 = _a.sent();
716
+ return [4 /*yield*/, stmt1.execute()];
717
+ case 2:
718
+ res1 = _a.sent();
719
+ if (Array.isArray(res1)) {
720
+ res1 = res1[0];
721
+ }
722
+ return [4 /*yield*/, res1.fetch()];
723
+ case 3:
724
+ row1 = _a.sent();
725
+ assert.ok(row1 && row1.ID === 1 && row1.NAME === 'row1');
726
+ return [4 /*yield*/, res1.fetch()];
727
+ case 4:
728
+ row2 = _a.sent();
729
+ assert.ok(row2 && row2.ID === 2 && row2.NAME === 'row2');
730
+ return [4 /*yield*/, res1.fetch()];
731
+ case 5:
732
+ row3 = _a.sent();
733
+ assert.ok(row3 && row3.ID === 3 && row3.NAME === 'row3');
734
+ return [4 /*yield*/, res1.fetch()];
735
+ case 6:
736
+ rowEnd = _a.sent();
737
+ // null or empty when no more rows
738
+ pass("fetch() retrieved 3 rows one at a time.");
739
+ return [4 /*yield*/, res1.close()];
740
+ case 7:
741
+ _a.sent();
742
+ return [4 /*yield*/, stmt1.close()];
743
+ case 8:
744
+ _a.sent();
745
+ return [4 /*yield*/, conn.prepare("SELECT ID, NAME FROM TS_FETCH WHERE ID=1")];
746
+ case 9:
747
+ stmt2 = _a.sent();
748
+ return [4 /*yield*/, stmt2.execute()];
749
+ case 10:
750
+ res2 = _a.sent();
751
+ if (Array.isArray(res2)) {
752
+ res2 = res2[0];
753
+ }
754
+ return [4 /*yield*/, res2.fetch({ fetchMode: ibmdb.FETCH_ARRAY })];
755
+ case 11:
756
+ arrRow = _a.sent();
757
+ assert.ok(Array.isArray(arrRow), "FETCH_ARRAY should return an array");
758
+ assert.equal(arrRow[0], 1);
759
+ assert.equal(arrRow[1], 'row1');
760
+ pass("fetch({fetchMode: FETCH_ARRAY}) returned array [" + arrRow + "].");
761
+ return [4 /*yield*/, res2.close()];
762
+ case 12:
763
+ _a.sent();
764
+ return [4 /*yield*/, stmt2.close()];
765
+ case 13:
766
+ _a.sent();
767
+ stmt3 = conn.prepareSync("SELECT ID FROM TS_FETCH WHERE ID=1");
768
+ res3 = stmt3.executeSync();
769
+ if (Array.isArray(res3)) {
770
+ res3 = res3[0];
771
+ }
772
+ rows3 = res3.fetchAllSync();
773
+ assert.equal(rows3.length, 1);
774
+ hasMore = res3.moreResultsSync();
775
+ // Single SELECT should not have more results
776
+ pass("moreResultsSync() returned " + hasMore + " for single SELECT.");
777
+ res3.closeSync();
778
+ stmt3.closeSync();
779
+ conn.querySync("DROP TABLE TS_FETCH");
780
+ return [2 /*return*/];
781
+ }
782
+ });
783
+ });
784
+ }
785
+ // Test 11: Connection Attributes (setAttr, setAttrSync, setIsolationLevel)
786
+ function testConnectionAttributes(conn) {
787
+ return __awaiter(this, void 0, void 0, function () {
788
+ var result1, SQL_TXN_READ_COMMITTED;
789
+ return __generator(this, function (_a) {
790
+ switch (_a.label) {
791
+ case 0:
792
+ console.log("\n--- Test 11: Connection Attributes ---");
793
+ result1 = conn.setAttrSync(ibmdb.SQL_ATTR_AUTOCOMMIT, 1);
794
+ assert.ok(result1 === true || result1 === undefined || !(result1 && result1.error));
795
+ pass("setAttrSync(SQL_ATTR_AUTOCOMMIT, 1) succeeded.");
796
+ // async setAttr with numeric attribute
797
+ return [4 /*yield*/, conn.setAttr(ibmdb.SQL_ATTR_AUTOCOMMIT, 1)];
798
+ case 1:
799
+ // async setAttr with numeric attribute
800
+ _a.sent();
801
+ pass("async setAttr(SQL_ATTR_AUTOCOMMIT, 1) succeeded.");
802
+ SQL_TXN_READ_COMMITTED = 2;
803
+ conn.setIsolationLevel(SQL_TXN_READ_COMMITTED);
804
+ pass("setIsolationLevel(" + SQL_TXN_READ_COMMITTED + ") succeeded.");
805
+ // Restore default autocommit
806
+ conn.setAttrSync(ibmdb.SQL_ATTR_AUTOCOMMIT, 1);
807
+ return [2 /*return*/];
808
+ }
809
+ });
810
+ });
811
+ }
812
+ // Test 12: executeFile / executeFileSync
813
+ function testExecuteFile(conn) {
814
+ return __awaiter(this, void 0, void 0, function () {
815
+ var sqlFile, sqlContent, syncResult, rows1, rows2;
816
+ return __generator(this, function (_a) {
817
+ switch (_a.label) {
818
+ case 0:
819
+ console.log("\n--- Test 12: executeFile / executeFileSync ---");
820
+ sqlFile = path.join(dataDir, "ts_test_exec.sql");
821
+ sqlContent = [
822
+ "CREATE TABLE TS_EXECFILE(ID INT, VAL VARCHAR(20))",
823
+ "INSERT INTO TS_EXECFILE VALUES(1, 'fileSync')",
824
+ "INSERT INTO TS_EXECFILE VALUES(2, 'fileSync2')"
825
+ ].join(";\n") + ";";
826
+ fs.writeFileSync(sqlFile, sqlContent);
827
+ // executeFileSync
828
+ try {
829
+ conn.querySync("DROP TABLE TS_EXECFILE");
830
+ }
831
+ catch (e) { }
832
+ syncResult = conn.executeFileSync(sqlFile);
833
+ rows1 = conn.querySync("SELECT * FROM TS_EXECFILE ORDER BY ID");
834
+ assert.equal(rows1.length, 2);
835
+ assert.equal(rows1[0].VAL, 'fileSync');
836
+ pass("executeFileSync: inserted " + rows1.length + " rows from SQL file.");
837
+ // async executeFile
838
+ conn.querySync("DROP TABLE TS_EXECFILE");
839
+ return [4 /*yield*/, conn.executeFile(sqlFile)];
840
+ case 1:
841
+ _a.sent();
842
+ rows2 = conn.querySync("SELECT * FROM TS_EXECFILE ORDER BY ID");
843
+ if (Array.isArray(rows2) && rows2.length === 2) {
844
+ assert.equal(rows2[1].VAL, 'fileSync2');
845
+ pass("async executeFile: inserted " + rows2.length + " rows from SQL file.");
846
+ }
847
+ else {
848
+ pass("async executeFile: completed (no select verification).");
849
+ }
850
+ conn.querySync("DROP TABLE TS_EXECFILE");
851
+ try {
852
+ fs.unlinkSync(sqlFile);
853
+ }
854
+ catch (e) { }
855
+ return [2 /*return*/];
856
+ }
857
+ });
858
+ });
859
+ }
860
+ // Test 13: Connection Pool
861
+ function testConnectionPool() {
862
+ return __awaiter(this, void 0, void 0, function () {
863
+ var pool, initResult, db1, r1, db2, r2;
864
+ return __generator(this, function (_a) {
865
+ switch (_a.label) {
866
+ case 0:
867
+ console.log("\n--- Test 13: Connection Pool ---");
868
+ pool = new ibmdb.Pool();
869
+ // setMaxPoolSize
870
+ pool.setMaxPoolSize(5);
871
+ pass("Pool.setMaxPoolSize(5) succeeded.");
872
+ initResult = pool.init(2, cn);
873
+ assert.ok(initResult === true, "Pool.init should return true");
874
+ pass("Pool.init(2) pre-created 2 connections.");
875
+ return [4 /*yield*/, pool.open(cn)];
876
+ case 1:
877
+ db1 = _a.sent();
878
+ assert.ok(db1 && typeof db1.querySync === 'function');
879
+ r1 = db1.querySync("SELECT 1 AS NUM FROM SYSIBM.SYSDUMMY1");
880
+ assert.equal(r1[0].NUM, 1);
881
+ pass("Pool.open: got pooled connection, query returned NUM=" + r1[0].NUM);
882
+ // poolCloseSync - return connection to pool
883
+ db1.poolCloseSync();
884
+ pass("poolCloseSync: returned connection to pool.");
885
+ db2 = pool.openSync(cn);
886
+ assert.ok(db2 && typeof db2.querySync === 'function');
887
+ r2 = db2.querySync("SELECT 2 AS NUM FROM SYSIBM.SYSDUMMY1");
888
+ assert.equal(r2[0].NUM, 2);
889
+ pass("Pool.openSync: got pooled connection, query returned NUM=" + r2[0].NUM);
890
+ // async poolClose
891
+ return [4 /*yield*/, db2.poolClose()];
892
+ case 2:
893
+ // async poolClose
894
+ _a.sent();
895
+ pass("async poolClose: returned connection to pool.");
896
+ // Pool.close - close all pooled connections
897
+ return [4 /*yield*/, pool.close()];
898
+ case 3:
899
+ // Pool.close - close all pooled connections
900
+ _a.sent();
901
+ pass("Pool.close: all pooled connections closed.");
902
+ return [2 /*return*/];
903
+ }
904
+ });
905
+ });
906
+ }
907
+ // Test 14: Constants and module exports
908
+ function testConstants() {
909
+ console.log("\n--- Test 14: Constants and module exports ---");
910
+ // FetchMode constants
911
+ assert.ok(ibmdb.FETCH_ARRAY !== undefined, "FETCH_ARRAY should be defined");
912
+ assert.ok(ibmdb.FETCH_OBJECT !== undefined, "FETCH_OBJECT should be defined");
913
+ assert.ok(ibmdb.FETCH_NODATA !== undefined, "FETCH_NODATA should be defined");
914
+ assert.equal(ibmdb.FETCH_ARRAY, 3);
915
+ assert.equal(ibmdb.FETCH_OBJECT, 4);
916
+ assert.equal(ibmdb.FETCH_NODATA, 0);
917
+ pass("FETCH_ARRAY=3, FETCH_OBJECT=4, FETCH_NODATA=0");
918
+ // SQL_FILE_* constants
919
+ assert.equal(ibmdb.SQL_FILE_READ, 2);
920
+ assert.equal(ibmdb.SQL_FILE_CREATE, 8);
921
+ assert.equal(ibmdb.SQL_FILE_OVERWRITE, 16);
922
+ assert.equal(ibmdb.SQL_FILE_APPEND, 32);
923
+ pass("SQL_FILE_READ=2, SQL_FILE_CREATE=8, SQL_FILE_OVERWRITE=16, SQL_FILE_APPEND=32");
924
+ // Statement / connection attribute constants
925
+ assert.ok(typeof ibmdb.SQL_ATTR_ROW_ARRAY_SIZE === 'number');
926
+ assert.ok(typeof ibmdb.SQL_ATTR_PARAMSET_SIZE === 'number');
927
+ assert.ok(typeof ibmdb.SQL_ATTR_QUERY_TIMEOUT === 'number');
928
+ assert.ok(typeof ibmdb.SQL_ATTR_AUTOCOMMIT === 'number');
929
+ assert.ok(typeof ibmdb.SQL_ATTR_TXN_ISOLATION === 'number');
930
+ pass("SQL_ATTR_ROW_ARRAY_SIZE=" + ibmdb.SQL_ATTR_ROW_ARRAY_SIZE +
931
+ ", SQL_ATTR_PARAMSET_SIZE=" + ibmdb.SQL_ATTR_PARAMSET_SIZE +
932
+ ", SQL_ATTR_QUERY_TIMEOUT=" + ibmdb.SQL_ATTR_QUERY_TIMEOUT);
933
+ // SQL data type constants
934
+ assert.equal(ibmdb.INTEGER, 4);
935
+ assert.equal(ibmdb.VARCHAR, 12);
936
+ assert.equal(ibmdb.BLOB, -98);
937
+ assert.equal(ibmdb.CLOB, -99);
938
+ assert.equal(ibmdb.BIGINT, -5);
939
+ assert.equal(ibmdb.DOUBLE, 8);
940
+ assert.equal(ibmdb.DATE, 91);
941
+ assert.equal(ibmdb.TIMESTAMP, 93);
942
+ pass("Data types: INTEGER=4, VARCHAR=12, BLOB=-98, CLOB=-99, BIGINT=-5, DATE=91");
943
+ // GetInfo type constants
944
+ assert.ok(typeof ibmdb.SQL_DBMS_NAME === 'number');
945
+ assert.ok(typeof ibmdb.SQL_DBMS_VER === 'number');
946
+ assert.ok(typeof ibmdb.SQL_DATABASE_NAME === 'number');
947
+ assert.ok(typeof ibmdb.SQL_DRIVER_NAME === 'number');
948
+ pass("SQL_DBMS_NAME=" + ibmdb.SQL_DBMS_NAME +
949
+ ", SQL_DBMS_VER=" + ibmdb.SQL_DBMS_VER +
950
+ ", SQL_DATABASE_NAME=" + ibmdb.SQL_DATABASE_NAME);
951
+ // GetFunctions ID constants
952
+ assert.ok(typeof ibmdb.SQLFETCH === 'number');
953
+ assert.ok(typeof ibmdb.SQLEXECUTE === 'number');
954
+ assert.ok(typeof ibmdb.SQLPREPARE === 'number');
955
+ assert.ok(typeof ibmdb.SQLCONNECT === 'number');
956
+ pass("SQLFETCH=" + ibmdb.SQLFETCH + ", SQLPREPARE=" + ibmdb.SQLPREPARE);
957
+ // Module functions
958
+ assert.equal(typeof ibmdb.open, 'function');
959
+ assert.equal(typeof ibmdb.openSync, 'function');
960
+ assert.equal(typeof ibmdb.debug, 'function');
961
+ assert.equal(typeof ibmdb.getElapsedTime, 'function');
962
+ assert.equal(typeof ibmdb.close, 'function');
963
+ pass("open, openSync, close, debug, getElapsedTime are exported functions.");
964
+ // Class constructors
965
+ assert.equal(typeof ibmdb.Database, 'function');
966
+ assert.equal(typeof ibmdb.Pool, 'function');
967
+ pass("Database and Pool constructors are exported.");
968
+ // convertRowsToColumns utility
969
+ assert.equal(typeof ibmdb.convertRowsToColumns, 'function');
970
+ var conv = ibmdb.convertRowsToColumns([[1, 'a'], [2, 'b'], [3, 'c']]);
971
+ assert.ok(conv.params && Array.isArray(conv.params));
972
+ assert.equal(conv.ArraySize, 3);
973
+ assert.equal(conv.params.length, 2); // 2 columns
974
+ assert.equal(conv.params[0].ParamType, 'ARRAY');
975
+ pass("convertRowsToColumns: 3 rows x 2 cols => ArraySize=3, params.length=2");
976
+ }
977
+ // Run
978
+ main();