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

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 (282) 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/adm-zip/adm-zip.js +32 -6
  6. package/node_modules/adm-zip/headers/entryHeader.js +13 -1
  7. package/node_modules/adm-zip/methods/inflater.js +33 -3
  8. package/node_modules/adm-zip/package.json +2 -2
  9. package/node_modules/adm-zip/util/errors.js +3 -0
  10. package/node_modules/adm-zip/util/utils.js +102 -14
  11. package/node_modules/adm-zip/zipEntry.js +43 -18
  12. package/node_modules/adm-zip/zipFile.js +10 -0
  13. package/node_modules/axios/CHANGELOG.md +62 -0
  14. package/node_modules/axios/README.md +236 -73
  15. package/node_modules/axios/dist/axios.js +1308 -357
  16. package/node_modules/axios/dist/axios.min.js +3 -3
  17. package/node_modules/axios/dist/axios.min.js.map +1 -1
  18. package/node_modules/axios/dist/browser/axios.cjs +1443 -403
  19. package/node_modules/axios/dist/esm/axios.js +1443 -403
  20. package/node_modules/axios/dist/esm/axios.min.js +2 -2
  21. package/node_modules/axios/dist/esm/axios.min.js.map +1 -1
  22. package/node_modules/axios/dist/node/axios.cjs +1483 -348
  23. package/node_modules/axios/index.d.cts +24 -1
  24. package/node_modules/axios/index.d.ts +22 -1
  25. package/node_modules/axios/lib/adapters/fetch.js +136 -30
  26. package/node_modules/axios/lib/adapters/http.js +277 -74
  27. package/node_modules/axios/lib/adapters/xhr.js +172 -16
  28. package/node_modules/axios/lib/core/Axios.js +87 -27
  29. package/node_modules/axios/lib/core/AxiosError.js +59 -0
  30. package/node_modules/axios/lib/core/AxiosHeaders.js +17 -4
  31. package/node_modules/axios/lib/core/InterceptorManager.js +118 -8
  32. package/node_modules/axios/lib/core/assertParamsAcyclic.js +49 -0
  33. package/node_modules/axios/lib/core/buildFullPath.js +1 -13
  34. package/node_modules/axios/lib/core/createMultipartBody.js +37 -0
  35. package/node_modules/axios/lib/core/dispatchRequest.js +28 -2
  36. package/node_modules/axios/lib/core/mergeConfig.js +183 -120
  37. package/node_modules/axios/lib/core/methodList.js +17 -0
  38. package/node_modules/axios/lib/defaults/index.js +2 -1
  39. package/node_modules/axios/lib/defaults/transitional.js +1 -0
  40. package/node_modules/axios/lib/env/data.js +1 -1
  41. package/node_modules/axios/lib/helpers/AxiosTransformStream.js +11 -2
  42. package/node_modules/axios/lib/helpers/Http2Sessions.js +4 -1
  43. package/node_modules/axios/lib/helpers/HttpStatusCode.js +11 -1
  44. package/node_modules/axios/lib/helpers/composeSignals.js +6 -3
  45. package/node_modules/axios/lib/helpers/cookies.js +30 -6
  46. package/node_modules/axios/lib/helpers/estimateDataURLDecodedBytes.js +34 -7
  47. package/node_modules/axios/lib/helpers/formDataToBlob.js +113 -0
  48. package/node_modules/axios/lib/helpers/formDataToJSON.js +25 -1
  49. package/node_modules/axios/lib/helpers/fromDataURI.js +11 -4
  50. package/node_modules/axios/lib/helpers/isURLSameOrigin.js +4 -9
  51. package/node_modules/axios/lib/helpers/normalizeURLForProtocolCheck.js +24 -0
  52. package/node_modules/axios/lib/helpers/parseHeaders.js +2 -1
  53. package/node_modules/axios/lib/helpers/parseProtocol.js +1 -1
  54. package/node_modules/axios/lib/helpers/progressEventReducer.js +1 -1
  55. package/node_modules/axios/lib/helpers/resolveConfig.js +20 -5
  56. package/node_modules/axios/lib/helpers/shouldBypassProxy.js +197 -6
  57. package/node_modules/axios/lib/helpers/throttle.js +3 -2
  58. package/node_modules/axios/lib/helpers/toFormData.js +14 -21
  59. package/node_modules/axios/lib/utils.js +192 -20
  60. package/node_modules/axios/package.json +1 -2
  61. package/node_modules/follow-redirects/README.md +27 -1
  62. package/node_modules/follow-redirects/index.js +11 -6
  63. package/node_modules/follow-redirects/package.json +1 -1
  64. package/node_modules/fs-extra/README.md +0 -1
  65. package/node_modules/fs-extra/lib/empty/index.js +4 -2
  66. package/node_modules/fs-extra/lib/util/stat.js +12 -2
  67. package/node_modules/fs-extra/package.json +1 -1
  68. package/node_modules/ibm_db/APIDocumentation.md +2883 -2024
  69. package/node_modules/ibm_db/LICENSE +23 -23
  70. package/node_modules/ibm_db/README.md +735 -735
  71. package/node_modules/ibm_db/binding.gyp +99 -98
  72. package/node_modules/ibm_db/installer/driverInstall.js +984 -958
  73. package/node_modules/ibm_db/installer/ifx.sh +38 -38
  74. package/node_modules/ibm_db/installer/setenv.sh +23 -23
  75. package/node_modules/ibm_db/installer/testODBCConnection.bat +51 -51
  76. package/node_modules/ibm_db/installer/testODBCConnection.sh +61 -61
  77. package/node_modules/ibm_db/lib/climacros.js +431 -431
  78. package/node_modules/ibm_db/lib/odbc.js +4293 -3487
  79. package/node_modules/ibm_db/lib/simple-queue.js +41 -41
  80. package/node_modules/ibm_db/package.json +70 -70
  81. package/node_modules/ibm_db/src/odbc.cpp +1495 -1396
  82. package/node_modules/ibm_db/src/odbc.h +477 -473
  83. package/node_modules/ibm_db/src/odbc_connection.cpp +1762 -1612
  84. package/node_modules/ibm_db/src/odbc_connection.h +228 -215
  85. package/node_modules/ibm_db/src/odbc_result.cpp +1547 -1547
  86. package/node_modules/ibm_db/src/odbc_result.h +152 -152
  87. package/node_modules/ibm_db/src/odbc_statement.cpp +2047 -861
  88. package/node_modules/ibm_db/src/odbc_statement.h +257 -135
  89. package/node_modules/ibm_db/src/strptime.c +389 -389
  90. package/node_modules/ibm_db/src/strptime.h +46 -46
  91. package/node_modules/ibm_db/test/README +23 -23
  92. package/node_modules/ibm_db/test/bench-insert.js +62 -62
  93. package/node_modules/ibm_db/test/bench-insertBatch10.js +74 -74
  94. package/node_modules/ibm_db/test/bench-insertBatch100.js +75 -75
  95. package/node_modules/ibm_db/test/bench-insertBatch1000.js +75 -75
  96. package/node_modules/ibm_db/test/bench-insertBatch10000.js +75 -75
  97. package/node_modules/ibm_db/test/bench-prepare-bind-execute-closeSync.js +60 -60
  98. package/node_modules/ibm_db/test/bench-prepare-bind-executeNonQuery.js +53 -53
  99. package/node_modules/ibm_db/test/bench-prepare-bindSync-execute-closeSync.js +50 -50
  100. package/node_modules/ibm_db/test/bench-prepare-bindSync-executeNonQuery.js +48 -48
  101. package/node_modules/ibm_db/test/bench-prepare-execute-closeSync.js +51 -51
  102. package/node_modules/ibm_db/test/bench-prepare-executeNonQuery.js +47 -47
  103. package/node_modules/ibm_db/test/bench-prepare-not.js +43 -43
  104. package/node_modules/ibm_db/test/bench-query-fetch.js +59 -59
  105. package/node_modules/ibm_db/test/bench-query-fetchAll.js +49 -49
  106. package/node_modules/ibm_db/test/bench-query-fetchAllSync.js +43 -43
  107. package/node_modules/ibm_db/test/bench-query.js +40 -40
  108. package/node_modules/ibm_db/test/bench-querySync-fetchArray.js +28 -28
  109. package/node_modules/ibm_db/test/bench-querySync.js +29 -29
  110. package/node_modules/ibm_db/test/common.d.ts +10 -10
  111. package/node_modules/ibm_db/test/common.js +127 -127
  112. package/node_modules/ibm_db/test/config.json +7 -7
  113. package/node_modules/ibm_db/test/config.zos.json +4 -4
  114. package/node_modules/ibm_db/test/data/sample1.txt +9 -9
  115. package/node_modules/ibm_db/test/data/trc.fmt +30114 -30114
  116. package/node_modules/ibm_db/test/nodeEE-leak-huge-query.js +152 -152
  117. package/node_modules/ibm_db/test/nodeEE-leak-multiple-query-multiple-connections.js +148 -148
  118. package/node_modules/ibm_db/test/nodeEE-leak-multiple-query-pool-connections.js +154 -154
  119. package/node_modules/ibm_db/test/nodeEE-leak-multiple-query.js +133 -133
  120. package/node_modules/ibm_db/test/nodeEE-stress-async-waterfall-multiple-connections.js +174 -174
  121. package/node_modules/ibm_db/test/nodeEE-stress-async-waterfall.js +169 -169
  122. package/node_modules/ibm_db/test/nodeEE-stress-mixed-query-multiple-connections.js +159 -159
  123. package/node_modules/ibm_db/test/nodeEE-stress-mixed-query.js +148 -148
  124. package/node_modules/ibm_db/test/odbc-bench.c +123 -123
  125. package/node_modules/ibm_db/test/perfTest.js +53 -53
  126. package/node_modules/ibm_db/test/quick-example.sh +30 -30
  127. package/node_modules/ibm_db/test/quick-example.ts +80 -80
  128. package/node_modules/ibm_db/test/run-bench.js +96 -96
  129. package/node_modules/ibm_db/test/run-nodeEE.js +132 -132
  130. package/node_modules/ibm_db/test/run-tests.js +132 -138
  131. package/node_modules/ibm_db/test/sql-cli.js +28 -28
  132. package/node_modules/ibm_db/test/test-all-data-types.js +109 -109
  133. package/node_modules/ibm_db/test/test-array-insert.js +178 -178
  134. package/node_modules/ibm_db/test/test-async-await.js +105 -105
  135. package/node_modules/ibm_db/test/test-attributes.js +34 -34
  136. package/node_modules/ibm_db/test/test-bad-pool-connection-prepare-execute.js +57 -57
  137. package/node_modules/ibm_db/test/test-basic-test.js +138 -138
  138. package/node_modules/ibm_db/test/test-binary-array-insert.js +73 -73
  139. package/node_modules/ibm_db/test/test-blob-from-file.js +90 -90
  140. package/node_modules/ibm_db/test/test-blob-insert.js +144 -144
  141. package/node_modules/ibm_db/test/test-blob-stream-insert.js +321 -299
  142. package/node_modules/ibm_db/test/test-blob-to-file.js +370 -370
  143. package/node_modules/ibm_db/test/test-block-fetch.js +364 -364
  144. package/node_modules/ibm_db/test/test-blocking-issue210.js +123 -123
  145. package/node_modules/ibm_db/test/test-call-async.js +64 -64
  146. package/node_modules/ibm_db/test/test-call-stmt.js +53 -53
  147. package/node_modules/ibm_db/test/test-cancel.js +703 -0
  148. package/node_modules/ibm_db/test/test-chinese-char.js +59 -59
  149. package/node_modules/ibm_db/test/test-connection.js +306 -0
  150. package/node_modules/ibm_db/test/test-date.js +32 -32
  151. package/node_modules/ibm_db/test/test-dbclob.js +93 -93
  152. package/node_modules/ibm_db/test/test-decimals.js +135 -135
  153. package/node_modules/ibm_db/test/test-describe-metadata.js +148 -0
  154. package/node_modules/ibm_db/test/test-executeFile.js +167 -167
  155. package/node_modules/ibm_db/test/test-executeFileSync.js +85 -85
  156. package/node_modules/ibm_db/test/test-fetch-apis.js +146 -146
  157. package/node_modules/ibm_db/test/test-fetchN.js +130 -130
  158. package/node_modules/ibm_db/test/test-getinfo.js +197 -197
  159. package/node_modules/ibm_db/test/test-ibm-db-issue14.js +58 -58
  160. package/node_modules/ibm_db/test/test-ibm-db-issue17.js +54 -54
  161. package/node_modules/ibm_db/test/test-ibm-db-issue18.js +54 -54
  162. package/node_modules/ibm_db/test/test-issue-1059-fetchAll-undefined.js +67 -67
  163. package/node_modules/ibm_db/test/test-issue-1080-array-blob-insert.js +40 -0
  164. package/node_modules/ibm_db/test/test-issue-54.js +39 -39
  165. package/node_modules/ibm_db/test/test-issue-get-column-value-2.js +44 -44
  166. package/node_modules/ibm_db/test/test-issue211.js +80 -80
  167. package/node_modules/ibm_db/test/test-issue253.js +39 -39
  168. package/node_modules/ibm_db/test/test-max-pool-size.js +96 -96
  169. package/node_modules/ibm_db/test/test-memory-leaks-new-objects.js +32 -32
  170. package/node_modules/ibm_db/test/test-multi-open-query-close.js +75 -75
  171. package/node_modules/ibm_db/test/test-param-put-data.js +713 -0
  172. package/node_modules/ibm_db/test/test-pool-idle-connection.js +72 -72
  173. package/node_modules/ibm_db/test/test-pool-operations.js +325 -0
  174. package/node_modules/ibm_db/test/test-pool-stale-connections.js +111 -111
  175. package/node_modules/ibm_db/test/test-pool-uncommited.js +33 -33
  176. package/node_modules/ibm_db/test/test-prepare-execute.js +339 -0
  177. package/node_modules/ibm_db/test/test-prepareSync-multiple-execution.js +93 -93
  178. package/node_modules/ibm_db/test/test-primary-foreign-keys.js +246 -0
  179. package/node_modules/ibm_db/test/test-procedures.js +243 -0
  180. package/node_modules/ibm_db/test/test-promise-all-data-types.js +42 -42
  181. package/node_modules/ibm_db/test/test-query-operations.js +405 -0
  182. package/node_modules/ibm_db/test/test-quick-example.js +25 -25
  183. package/node_modules/ibm_db/test/test-row-array-insert.js +167 -167
  184. package/node_modules/ibm_db/test/test-sp-array.js +54 -54
  185. package/node_modules/ibm_db/test/test-sp-dbc-6000.js +88 -88
  186. package/node_modules/ibm_db/test/test-sp-memleak.js +136 -136
  187. package/node_modules/ibm_db/test/test-sp-resultset-execute.js +269 -269
  188. package/node_modules/ibm_db/test/test-sp-resultset.js +228 -228
  189. package/node_modules/ibm_db/test/test-transactions.js +261 -0
  190. package/node_modules/ibm_db/test/test-typescript.js +48 -48
  191. package/node_modules/ibm_db/test/test-xml-datatype.js +70 -70
  192. package/node_modules/ibm_db/test/testWebApp.js +56 -56
  193. package/node_modules/ibm_db/test/trace +51 -51
  194. package/node_modules/ibm_db/test/typescript-apis-test.js +978 -978
  195. package/node_modules/ibm_db/test/webapp.html +17 -17
  196. package/node_modules/ibm_db/test/webapp.js +79 -79
  197. package/node_modules/ibm_db/typescript/README.md +28 -28
  198. package/node_modules/ibm_db/typescript/dist/Database.d.ts +26 -0
  199. package/node_modules/ibm_db/typescript/dist/ODBCStatement.d.ts +93 -0
  200. package/node_modules/string_decoder/node_modules/safe-buffer/LICENSE +21 -0
  201. package/node_modules/string_decoder/node_modules/safe-buffer/README.md +584 -0
  202. package/node_modules/string_decoder/node_modules/safe-buffer/index.d.ts +187 -0
  203. package/node_modules/string_decoder/node_modules/safe-buffer/index.js +62 -0
  204. package/node_modules/string_decoder/node_modules/safe-buffer/package.json +37 -0
  205. package/node_modules/which-typed-array/CHANGELOG.md +14 -0
  206. package/node_modules/which-typed-array/README.md +0 -2
  207. package/node_modules/which-typed-array/index.d.ts +288 -11
  208. package/node_modules/which-typed-array/index.js +6 -7
  209. package/node_modules/which-typed-array/package.json +12 -11
  210. package/package.json +10 -11
  211. package/node_modules/ibm_db/test/disabled/test-binding-statement-rebinding.js +0 -59
  212. package/node_modules/ibm_db/test/disabled/test-open-dont-close.js +0 -12
  213. package/node_modules/ibm_db/test/disabled/test-param-select-with-booleans-only.js +0 -21
  214. package/node_modules/ibm_db/test/disabled/test-param-select-with-decimals-only.js +0 -20
  215. package/node_modules/ibm_db/test/disabled/test-param-select-with-null.js +0 -21
  216. package/node_modules/ibm_db/test/disabled/test-param-select-with-nulls-mixed.js +0 -23
  217. package/node_modules/ibm_db/test/disabled/test-param-select-with-numbers-mixed.js +0 -22
  218. package/node_modules/ibm_db/test/disabled/test-param-select-with-numbers-only.js +0 -24
  219. package/node_modules/ibm_db/test/disabled/test-param-select-with-strings-only.js +0 -23
  220. package/node_modules/ibm_db/test/disabled/test-param-select-with-unicode.js +0 -15
  221. package/node_modules/ibm_db/test/disabled/test-prepare-bind-execute-closeSync.js +0 -62
  222. package/node_modules/ibm_db/test/disabled/test-prepare-bind-execute-error.js +0 -49
  223. package/node_modules/ibm_db/test/disabled/test-prepare-bind-execute-long-string.js +0 -63
  224. package/node_modules/ibm_db/test/disabled/test-prepare-bind-executeNonQuery.js +0 -63
  225. package/node_modules/ibm_db/test/disabled/test-prepare-bindSync-execute-closeSync.js +0 -46
  226. package/node_modules/ibm_db/test/disabled/test-prepare-bindSync-executeNonQuery.js +0 -50
  227. package/node_modules/ibm_db/test/disabled/test-prepare.js +0 -34
  228. package/node_modules/ibm_db/test/disabled/test-prepareSync.js +0 -29
  229. package/node_modules/ibm_db/test/disabled/test-query-select-fetchAll.js +0 -23
  230. package/node_modules/ibm_db/test/disabled/test-query-select-fetchAllSync.js +0 -23
  231. package/node_modules/ibm_db/test/disabled/test-query-select-unicode.js +0 -15
  232. package/node_modules/ibm_db/test/disabled/test-querySync-select-unicode.js +0 -20
  233. package/node_modules/ibm_db/test/test-affected-rows.js +0 -55
  234. package/node_modules/ibm_db/test/test-bad-connection-string.js +0 -30
  235. package/node_modules/ibm_db/test/test-binding-connection-timeOut.js +0 -31
  236. package/node_modules/ibm_db/test/test-binding-statement-executeSync.js +0 -84
  237. package/node_modules/ibm_db/test/test-binding-transaction-commit.js +0 -79
  238. package/node_modules/ibm_db/test/test-binding-transaction-commitSync.js +0 -53
  239. package/node_modules/ibm_db/test/test-closed.js +0 -14
  240. package/node_modules/ibm_db/test/test-connection-object.js +0 -16
  241. package/node_modules/ibm_db/test/test-describe-column.js +0 -92
  242. package/node_modules/ibm_db/test/test-describe-database.js +0 -18
  243. package/node_modules/ibm_db/test/test-describe-table.js +0 -31
  244. package/node_modules/ibm_db/test/test-domains-open.js +0 -19
  245. package/node_modules/ibm_db/test/test-global-open-close.js +0 -11
  246. package/node_modules/ibm_db/test/test-instantiate-one-and-end.js +0 -9
  247. package/node_modules/ibm_db/test/test-multi-open-close.js +0 -45
  248. package/node_modules/ibm_db/test/test-multi-openSync-closeSync.js +0 -52
  249. package/node_modules/ibm_db/test/test-open-close.js +0 -29
  250. package/node_modules/ibm_db/test/test-open-connectTimeout.js +0 -33
  251. package/node_modules/ibm_db/test/test-openSync.js +0 -31
  252. package/node_modules/ibm_db/test/test-pool-close.js +0 -120
  253. package/node_modules/ibm_db/test/test-pool-connect.js +0 -36
  254. package/node_modules/ibm_db/test/test-pool-rollbackTransaction.js +0 -35
  255. package/node_modules/ibm_db/test/test-prepareSync-bad-sql.js +0 -34
  256. package/node_modules/ibm_db/test/test-promise-open-close.js +0 -33
  257. package/node_modules/ibm_db/test/test-query-create-table-fetchSync.js +0 -23
  258. package/node_modules/ibm_db/test/test-query-create-table.js +0 -12
  259. package/node_modules/ibm_db/test/test-query-drop-table.js +0 -13
  260. package/node_modules/ibm_db/test/test-query-insert.js +0 -38
  261. package/node_modules/ibm_db/test/test-query-select-fetch.js +0 -21
  262. package/node_modules/ibm_db/test/test-query-select-fetchMode-array.js +0 -17
  263. package/node_modules/ibm_db/test/test-query-select.js +0 -64
  264. package/node_modules/ibm_db/test/test-queryResult.js +0 -35
  265. package/node_modules/ibm_db/test/test-queryStream.js +0 -43
  266. package/node_modules/ibm_db/test/test-querySync-select-with-exception.js +0 -25
  267. package/node_modules/ibm_db/test/test-querySync-select.js +0 -28
  268. package/node_modules/ibm_db/test/test-require-and-end.js +0 -8
  269. package/node_modules/ibm_db/test/test-statement-close.js +0 -118
  270. package/node_modules/ibm_db/test/test-transaction-commit-sync.js +0 -54
  271. package/node_modules/ibm_db/test/test-transaction-commit.js +0 -79
  272. package/node_modules/which-typed-array/eslint.config.mjs +0 -12
  273. package/node_modules/which-typed-array/test/index.js +0 -105
  274. /package/node_modules/{tar-fs/node_modules/chownr → chownr}/LICENSE +0 -0
  275. /package/node_modules/{tar-fs/node_modules/chownr → chownr}/README.md +0 -0
  276. /package/node_modules/{tar-fs/node_modules/chownr → chownr}/chownr.js +0 -0
  277. /package/node_modules/{tar-fs/node_modules/chownr → chownr}/package.json +0 -0
  278. /package/node_modules/{tar-stream/node_modules/string_decoder → string_decoder}/.travis.yml +0 -0
  279. /package/node_modules/{tar-stream/node_modules/string_decoder → string_decoder}/LICENSE +0 -0
  280. /package/node_modules/{tar-stream/node_modules/string_decoder → string_decoder}/README.md +0 -0
  281. /package/node_modules/{tar-stream/node_modules/string_decoder → string_decoder}/lib/string_decoder.js +0 -0
  282. /package/node_modules/{tar-stream/node_modules/string_decoder → string_decoder}/package.json +0 -0
@@ -0,0 +1,703 @@
1
+ /*
2
+ Test case for cancel() and cancelSync() APIs.
3
+
4
+ The cancel() and cancelSync() APIs call SQLCancel ODBC function to cancel
5
+ an executing SQL statement. This test verifies:
6
+ 1. Statement-level cancel via stmt.cancel() and stmt.cancelSync()
7
+ 2. Connection-level cancel via conn.cancel(stmt) and conn.cancelSync(stmt)
8
+
9
+ Note: Due to timing complexities, this test primarily verifies that:
10
+ - The cancel APIs are callable
11
+ - They return proper results
12
+ - They handle errors appropriately
13
+ */
14
+
15
+ var common = require("./common")
16
+ , ibmdb = require("../")
17
+ , assert = require("assert")
18
+ , cn = common.connectionString;
19
+
20
+ console.log("Testing cancel() and cancelSync() APIs...");
21
+ console.log("Connection String =", cn);
22
+
23
+ // Test 1: Statement-level cancelSync() - calling on a prepared statement
24
+ ibmdb.open(cn, function(err, conn) {
25
+ if (err) {
26
+ console.log("Connection error:", err);
27
+ return;
28
+ }
29
+ console.log("Connection opened successfully.");
30
+
31
+ // Create a test table
32
+ try {
33
+ conn.querySync("DROP TABLE CANCEL_TEST");
34
+ } catch (e) {
35
+ // Table doesn't exist, ignore
36
+ }
37
+ conn.querySync("CREATE TABLE CANCEL_TEST (ID INT, NAME VARCHAR(50))");
38
+
39
+ // Insert test data
40
+ for (var i = 0; i < 10; i++) {
41
+ conn.querySync("INSERT INTO CANCEL_TEST VALUES (?, ?)", [i, "Name" + i]);
42
+ }
43
+ console.log("Test table created with sample data.");
44
+
45
+ // Test 1: Statement-level cancelSync during execute
46
+ console.log("\n=== Test 1: Statement cancelSync() during execute ===");
47
+ var stmt = conn.prepareSync("SELECT * FROM CANCEL_TEST");
48
+ var test1ExecuteCompleted = false;
49
+ var test1CancelCompleted = false;
50
+
51
+ // Start async execute and immediately call cancelSync
52
+ stmt.execute(function(execErr, result) {
53
+ test1ExecuteCompleted = true;
54
+ if (execErr) {
55
+ console.log("Test 1: execute() error after cancel:", execErr.message);
56
+ } else {
57
+ console.log("Test 1: execute() completed");
58
+ if (result) {
59
+ try { result.closeSync(); } catch(e) {}
60
+ }
61
+ }
62
+ if (test1CancelCompleted) {
63
+ try { stmt.closeSync(); } catch(e) {}
64
+ runTest2();
65
+ }
66
+ });
67
+
68
+ // Immediately cancel while execute is running
69
+ try {
70
+ var cancelResult = stmt.cancelSync();
71
+ console.log("stmt.cancelSync() returned:", cancelResult);
72
+ assert.strictEqual(cancelResult, true, "cancelSync should return true");
73
+ console.log("Test 1 PASSED: Statement cancelSync works.");
74
+ } catch (e) {
75
+ console.log("stmt.cancelSync() threw:", e.message);
76
+ console.log("Test 1: Statement cancelSync threw (may happen depending on timing)");
77
+ }
78
+ test1CancelCompleted = true;
79
+ if (test1ExecuteCompleted) {
80
+ try { stmt.closeSync(); } catch(e) {}
81
+ runTest2();
82
+ }
83
+
84
+ function runTest2() {
85
+ // Test 2: Statement-level cancel() with callback during execute
86
+ console.log("\n=== Test 2: Statement cancel() with callback during execute ===");
87
+ var stmt2 = conn.prepareSync("SELECT * FROM CANCEL_TEST");
88
+ var test2ExecuteCompleted = false;
89
+ var test2CancelCompleted = false;
90
+
91
+ function finishTest2() {
92
+ setTimeout(function() {
93
+ try { stmt2.closeSync(); } catch(e) {}
94
+ runTest3();
95
+ }, 50);
96
+ }
97
+
98
+ // Start async execute
99
+ stmt2.execute(function(execErr, result) {
100
+ test2ExecuteCompleted = true;
101
+ if (execErr) {
102
+ console.log("Test 2: execute() error after cancel:", execErr.message);
103
+ } else {
104
+ console.log("Test 2: execute() completed");
105
+ if (result) {
106
+ try { result.closeSync(); } catch(e) {}
107
+ }
108
+ }
109
+ if (test2CancelCompleted) finishTest2();
110
+ });
111
+
112
+ // Immediately cancel while execute is running
113
+ stmt2.cancel(function(err, result) {
114
+ test2CancelCompleted = true;
115
+ if (err) {
116
+ console.log("stmt.cancel() error:", err.message);
117
+ } else {
118
+ console.log("stmt.cancel() returned:", result);
119
+ assert.strictEqual(result, true, "cancel callback should receive true");
120
+ console.log("Test 2 PASSED: Statement cancel with callback works.");
121
+ }
122
+ if (test2ExecuteCompleted) finishTest2();
123
+ });
124
+ }
125
+
126
+ function runTest3() {
127
+ // Test 3: Statement-level cancel() with Promise during execute
128
+ console.log("\n=== Test 3: Statement cancel() with Promise during execute ===");
129
+ var stmt3 = conn.prepareSync("SELECT * FROM CANCEL_TEST");
130
+ var test3ExecuteCompleted = false;
131
+ var test3CancelCompleted = false;
132
+
133
+ function finishTest3() {
134
+ setTimeout(function() {
135
+ try { stmt3.closeSync(); } catch(e) {}
136
+ runConnectionCancelTests();
137
+ }, 10);
138
+ }
139
+
140
+ // Start async execute
141
+ stmt3.execute(function(execErr, result) {
142
+ test3ExecuteCompleted = true;
143
+ if (execErr) {
144
+ console.log("Test 3: execute() error after cancel:", execErr.message);
145
+ } else {
146
+ console.log("Test 3: execute() completed");
147
+ if (result) {
148
+ try { result.closeSync(); } catch(e) {}
149
+ }
150
+ }
151
+ if (test3CancelCompleted) finishTest3();
152
+ });
153
+
154
+ // Immediately cancel while execute is running
155
+ stmt3.cancel().then(function(result) {
156
+ test3CancelCompleted = true;
157
+ console.log("stmt.cancel() promise resolved:", result);
158
+ console.log("Test 3 PASSED: Statement cancel with Promise works.");
159
+ if (test3ExecuteCompleted) finishTest3();
160
+ }).catch(function(err) {
161
+ test3CancelCompleted = true;
162
+ console.log("stmt.cancel() promise rejected:", err.message);
163
+ if (test3ExecuteCompleted) finishTest3();
164
+ });
165
+ }
166
+
167
+ function runConnectionCancelTests() {
168
+ // Test 4: Connection-level cancelSync with statement
169
+ console.log("\n=== Test 4: Connection cancelSync(stmt) ===");
170
+ var stmt4 = conn.prepareSync("SELECT * FROM CANCEL_TEST");
171
+
172
+ try {
173
+ var cancelResult = conn.cancelSync(stmt4);
174
+ console.log("conn.cancelSync(stmt) returned:", cancelResult);
175
+ assert.strictEqual(cancelResult, true, "cancelSync should return true");
176
+ console.log("Test 4 PASSED: Connection cancelSync(stmt) works.");
177
+ } catch (e) {
178
+ console.log("conn.cancelSync(stmt) threw:", e.message);
179
+ }
180
+ stmt4.closeSync();
181
+
182
+ // Test 5: Connection-level cancel(stmt) with callback
183
+ console.log("\n=== Test 5: Connection cancel(stmt, callback) ===");
184
+ var stmt5 = conn.prepareSync("SELECT * FROM CANCEL_TEST");
185
+
186
+ conn.cancel(stmt5, function(err, result) {
187
+ if (err) {
188
+ console.log("conn.cancel(stmt) error:", err.message);
189
+ } else {
190
+ console.log("conn.cancel(stmt) returned:", result);
191
+ assert.strictEqual(result, true, "cancel callback should receive true");
192
+ console.log("Test 5 PASSED: Connection cancel(stmt, callback) works.");
193
+ }
194
+ stmt5.closeSync();
195
+
196
+ // Test 6: Connection-level cancel(stmt) with Promise
197
+ console.log("\n=== Test 6: Connection cancel(stmt) with Promise ===");
198
+ var stmt6 = conn.prepareSync("SELECT * FROM CANCEL_TEST");
199
+
200
+ conn.cancel(stmt6).then(function(result) {
201
+ console.log("conn.cancel(stmt) promise resolved:", result);
202
+ assert.strictEqual(result, true, "cancel promise should resolve to true");
203
+ console.log("Test 6 PASSED: Connection cancel(stmt) with Promise works.");
204
+ stmt6.closeSync();
205
+ runCancelWithExecutionTests();
206
+ }).catch(function(err) {
207
+ console.log("conn.cancel(stmt) promise rejected:", err.message);
208
+ stmt6.closeSync();
209
+ runCancelWithExecutionTests();
210
+ });
211
+ });
212
+ }
213
+
214
+ function runCancelWithExecutionTests() {
215
+ // Test 7: Connection cancel during SQL execution
216
+ console.log("\n=== Test 7: Connection cancel(stmt) during SQL execution ===");
217
+
218
+ var stmt7 = conn.prepareSync("SELECT * FROM CANCEL_TEST");
219
+ var executeCompleted = false;
220
+ var cancelCompleted = false;
221
+
222
+ try {
223
+ // Start executing asynchronously
224
+ stmt7.execute(function(execErr, result) {
225
+ executeCompleted = true;
226
+ if (execErr) {
227
+ console.log("stmt7.execute() error after cancel:", execErr.message);
228
+ } else {
229
+ console.log("stmt7.execute() completed");
230
+ if (result) {
231
+ try { result.closeSync(); } catch(e) {}
232
+ }
233
+ }
234
+
235
+ if (cancelCompleted) {
236
+ finishTest7();
237
+ }
238
+ });
239
+
240
+ // Immediately try to cancel via connection while query is executing
241
+ conn.cancel(stmt7, function(cancelErr, cancelResult) {
242
+ cancelCompleted = true;
243
+ if (cancelErr) {
244
+ console.log("conn.cancel(stmt7) error:", cancelErr.message);
245
+ } else {
246
+ console.log("conn.cancel(stmt7) returned:", cancelResult);
247
+ console.log("Test 7 PASSED: Connection cancel(stmt) with SQL execution works.");
248
+ }
249
+
250
+ if (executeCompleted) {
251
+ finishTest7();
252
+ }
253
+ });
254
+ } catch (e) {
255
+ console.log("Test 7 setup error:", e.message);
256
+ try { stmt7.closeSync(); } catch (e2) {}
257
+ runValidationTests();
258
+ return;
259
+ }
260
+
261
+ function finishTest7() {
262
+ // Small delay to ensure everything is cleaned up
263
+ setTimeout(function() {
264
+ try {
265
+ stmt7.closeSync();
266
+ } catch (e) {
267
+ // Statement may already be closed or in error state
268
+ }
269
+
270
+ runValidationTests();
271
+ }, 100);
272
+ }
273
+ }
274
+
275
+ function runValidationTests() {
276
+ // Test 8: cancel/cancelSync API validation
277
+ console.log("\n=== Test 8: cancel/cancelSync API validation ===");
278
+
279
+ // Test cancelSync without argument - should throw (JS check)
280
+ try {
281
+ conn.cancelSync();
282
+ console.log("Test 8a FAILED: cancelSync() without stmt should have thrown");
283
+ } catch (e) {
284
+ console.log("cancelSync() without stmt correctly threw:", e.message);
285
+ }
286
+
287
+ // Test cancelSync with null - should throw (JS check)
288
+ try {
289
+ conn.cancelSync(null);
290
+ console.log("Test 8b FAILED: cancelSync(null) should have thrown");
291
+ } catch (e) {
292
+ console.log("cancelSync(null) correctly threw:", e.message);
293
+ }
294
+
295
+ // Test cancelSync with invalid object - returns TypeError (type-tag check)
296
+ var result8c = conn.cancelSync({});
297
+ if (result8c instanceof TypeError) {
298
+ console.log("cancelSync({}) correctly returned TypeError:", result8c.message);
299
+ } else if (result8c instanceof Error) {
300
+ console.log("cancelSync({}) correctly returned error:", result8c.message);
301
+ } else {
302
+ console.log("Test 8c FAILED: cancelSync({}) should have returned an error");
303
+ }
304
+
305
+ // Test cancelSync with a non-statement wrapped object (type-confusion fix)
306
+ var result8e = conn.cancelSync(conn.conn);
307
+ if (result8e instanceof TypeError) {
308
+ console.log("cancelSync(conn) correctly returned TypeError:", result8e.message);
309
+ assert.ok(result8e.message.indexOf("ODBCStatement") !== -1,
310
+ "Error should mention ODBCStatement");
311
+ } else {
312
+ console.log("Test 8e FAILED: cancelSync(conn) should have returned TypeError, got:", result8e);
313
+ }
314
+
315
+ // Test cancel without statement - when passed a function, calls it with error
316
+ var callbackCalled = false;
317
+ conn.cancel(function(err) {
318
+ callbackCalled = true;
319
+ if (err && err.message.indexOf("requires a statement") !== -1) {
320
+ console.log("cancel(callback) correctly called callback with error:", err.message);
321
+ } else {
322
+ console.log("Test 8d FAILED: Expected error about requiring statement");
323
+ }
324
+ });
325
+ if (callbackCalled) {
326
+ // Synchronous callback - expected for this error case
327
+ } else {
328
+ console.log("Test 8d: callback not called synchronously (queued)");
329
+ }
330
+
331
+ console.log("Test 8 PASSED: API validation works correctly.");
332
+
333
+ runEdgeCaseTests();
334
+ }
335
+
336
+ function runEdgeCaseTests() {
337
+ // Test 9: Cancel on closed statement
338
+ console.log("\n=== Test 9: Cancel on closed statement ===");
339
+ var stmt9 = conn.prepareSync("SELECT * FROM CANCEL_TEST");
340
+ stmt9.closeSync();
341
+
342
+ // Try to cancel a closed statement - should error
343
+ stmt9.cancel(function(err, result) {
344
+ if (err) {
345
+ console.log("cancel() on closed statement correctly errored:", err.message);
346
+ console.log("Test 9 PASSED: Cancel on closed statement handled correctly.");
347
+ } else {
348
+ console.log("Test 9: cancel() on closed statement returned:", result);
349
+ }
350
+
351
+ runTest10();
352
+ });
353
+ }
354
+
355
+ function runTest10() {
356
+ // Test 10: Double cancel (cancel same statement twice)
357
+ console.log("\n=== Test 10: Double cancel ===");
358
+ var stmt10 = conn.prepareSync("SELECT * FROM CANCEL_TEST");
359
+ var firstCancelDone = false;
360
+ var secondCancelDone = false;
361
+
362
+ function finishTest10() {
363
+ if (firstCancelDone && secondCancelDone) {
364
+ try { stmt10.closeSync(); } catch(e) {}
365
+ console.log("Test 10 PASSED: Double cancel handled correctly.");
366
+ runTest11();
367
+ }
368
+ }
369
+
370
+ // First cancel
371
+ stmt10.cancel(function(err1, result1) {
372
+ firstCancelDone = true;
373
+ if (err1) {
374
+ console.log("First cancel error:", err1.message);
375
+ } else {
376
+ console.log("First cancel returned:", result1);
377
+ }
378
+ finishTest10();
379
+ });
380
+
381
+ // Second cancel immediately
382
+ stmt10.cancel(function(err2, result2) {
383
+ secondCancelDone = true;
384
+ if (err2) {
385
+ console.log("Second cancel error:", err2.message);
386
+ } else {
387
+ console.log("Second cancel returned:", result2);
388
+ }
389
+ finishTest10();
390
+ });
391
+ }
392
+
393
+ function runTest11() {
394
+ // Test 11: Cancel after execute completes (race condition - cancel too late)
395
+ console.log("\n=== Test 11: Cancel after execute completes ===");
396
+ var stmt11 = conn.prepareSync("SELECT * FROM CANCEL_TEST");
397
+
398
+ stmt11.execute(function(execErr, result) {
399
+ if (execErr) {
400
+ console.log("Test 11: execute() error:", execErr.message);
401
+ } else {
402
+ console.log("Test 11: execute() completed successfully");
403
+ if (result) {
404
+ try { result.closeSync(); } catch(e) {}
405
+ }
406
+ }
407
+
408
+ // Now cancel AFTER execute completed
409
+ stmt11.cancel(function(cancelErr, cancelResult) {
410
+ if (cancelErr) {
411
+ console.log("Cancel after completion error:", cancelErr.message);
412
+ } else {
413
+ console.log("Cancel after completion returned:", cancelResult);
414
+ }
415
+ console.log("Test 11 PASSED: Cancel after execute handled correctly.");
416
+ try { stmt11.closeSync(); } catch(e) {}
417
+ runTest12();
418
+ });
419
+ });
420
+ }
421
+
422
+ function runTest12() {
423
+ // Test 12: Cancel during fetchAll
424
+ console.log("\n=== Test 12: Cancel during fetchAll ===");
425
+ var stmt12 = conn.prepareSync("SELECT * FROM CANCEL_TEST");
426
+ var fetchCompleted = false;
427
+ var cancelCompleted = false;
428
+
429
+ function finishTest12() {
430
+ if (fetchCompleted && cancelCompleted) {
431
+ setTimeout(function() {
432
+ try { stmt12.closeSync(); } catch(e) {}
433
+ console.log("Test 12 PASSED: Cancel during fetchAll handled correctly.");
434
+ runTest13();
435
+ }, 50);
436
+ }
437
+ }
438
+
439
+ stmt12.execute(function(execErr, result) {
440
+ if (execErr) {
441
+ console.log("Test 12: execute() error:", execErr.message);
442
+ fetchCompleted = true;
443
+ finishTest12();
444
+ return;
445
+ }
446
+
447
+ // Start fetching
448
+ result.fetchAll(function(fetchErr, data) {
449
+ fetchCompleted = true;
450
+ if (fetchErr) {
451
+ console.log("Test 12: fetchAll() error (may be cancelled):", fetchErr.message);
452
+ } else {
453
+ console.log("Test 12: fetchAll() returned", data ? data.length : 0, "rows");
454
+ }
455
+ try { result.closeSync(); } catch(e) {}
456
+ finishTest12();
457
+ });
458
+
459
+ // Cancel while fetching
460
+ stmt12.cancel(function(cancelErr, cancelResult) {
461
+ cancelCompleted = true;
462
+ if (cancelErr) {
463
+ console.log("Cancel during fetch error:", cancelErr.message);
464
+ } else {
465
+ console.log("Cancel during fetch returned:", cancelResult);
466
+ }
467
+ finishTest12();
468
+ });
469
+ });
470
+ }
471
+
472
+ function runTest13() {
473
+ // Test 13: Cancel INSERT/UPDATE/DELETE (not just SELECT)
474
+ console.log("\n=== Test 13: Cancel INSERT/UPDATE/DELETE ===");
475
+ var stmt13 = conn.prepareSync("UPDATE CANCEL_TEST SET NAME = 'Updated' WHERE ID = ?");
476
+ stmt13.bindSync([1]);
477
+ var executeCompleted = false;
478
+ var cancelCompleted = false;
479
+
480
+ function finishTest13() {
481
+ if (executeCompleted && cancelCompleted) {
482
+ setTimeout(function() {
483
+ try { stmt13.closeSync(); } catch(e) {}
484
+ console.log("Test 13 PASSED: Cancel UPDATE handled correctly.");
485
+ runTest14();
486
+ }, 50);
487
+ }
488
+ }
489
+
490
+ stmt13.execute(function(execErr, result) {
491
+ executeCompleted = true;
492
+ if (execErr) {
493
+ console.log("Test 13: UPDATE error (may be cancelled):", execErr.message);
494
+ } else {
495
+ console.log("Test 13: UPDATE completed");
496
+ if (result) {
497
+ try { result.closeSync(); } catch(e) {}
498
+ }
499
+ }
500
+ finishTest13();
501
+ });
502
+
503
+ stmt13.cancel(function(cancelErr, cancelResult) {
504
+ cancelCompleted = true;
505
+ if (cancelErr) {
506
+ console.log("Cancel UPDATE error:", cancelErr.message);
507
+ } else {
508
+ console.log("Cancel UPDATE returned:", cancelResult);
509
+ }
510
+ finishTest13();
511
+ });
512
+ }
513
+
514
+ function runTest14() {
515
+ // Test 14: Cancel from wrong connection (should fail or error)
516
+ console.log("\n=== Test 14: Cancel from wrong connection ===");
517
+
518
+ // Open a second connection
519
+ ibmdb.open(cn, function(err, conn2) {
520
+ if (err) {
521
+ console.log("Test 14: Could not open second connection:", err.message);
522
+ runTest15();
523
+ return;
524
+ }
525
+
526
+ // Create statement on conn (first connection)
527
+ var stmt14 = conn.prepareSync("SELECT * FROM CANCEL_TEST");
528
+
529
+ // Try to cancel stmt14 using conn2 (wrong connection)
530
+ conn2.cancel(stmt14, function(cancelErr, cancelResult) {
531
+ if (cancelErr) {
532
+ console.log("Cancel from wrong connection error:", cancelErr.message);
533
+ } else {
534
+ console.log("Cancel from wrong connection returned:", cancelResult);
535
+ // Note: This may succeed since SQLCancel works on the statement handle
536
+ // The statement handle is valid regardless of which connection object calls it
537
+ }
538
+ console.log("Test 14 PASSED: Cross-connection cancel handled.");
539
+
540
+ stmt14.closeSync();
541
+ conn2.closeSync();
542
+ runTest15();
543
+ });
544
+ });
545
+ }
546
+
547
+ function runTest15() {
548
+ // Test 15: Pool connection cancel
549
+ console.log("\n=== Test 15: Pool connection cancel ===");
550
+
551
+ var pool = new ibmdb.Pool();
552
+ pool.open(cn, function(poolErr, poolConn) {
553
+ if (poolErr) {
554
+ console.log("Test 15: Pool open error:", poolErr.message);
555
+ runTest16();
556
+ return;
557
+ }
558
+
559
+ var stmt15 = poolConn.prepareSync("SELECT * FROM CANCEL_TEST");
560
+ var executeCompleted = false;
561
+ var cancelCompleted = false;
562
+ var finished = false;
563
+
564
+ function finishTest15() {
565
+ if (finished) return;
566
+ if (executeCompleted && cancelCompleted) {
567
+ finished = true;
568
+ setTimeout(function() {
569
+ try { stmt15.closeSync(); } catch(e) {}
570
+ console.log("Test 15 PASSED: Pool connection cancel works.");
571
+ // Close pool connection and pool
572
+ try {
573
+ poolConn.closeSync();
574
+ pool.closeSync();
575
+ } catch(e) {
576
+ // Ignore close errors
577
+ }
578
+ runTest16();
579
+ }, 50);
580
+ }
581
+ }
582
+
583
+ stmt15.execute(function(execErr, result) {
584
+ executeCompleted = true;
585
+ if (execErr) {
586
+ console.log("Test 15: Pool execute error:", execErr.message);
587
+ } else {
588
+ console.log("Test 15: Pool execute completed");
589
+ if (result) {
590
+ try { result.closeSync(); } catch(e) {}
591
+ }
592
+ }
593
+ finishTest15();
594
+ });
595
+
596
+ poolConn.cancel(stmt15, function(cancelErr, cancelResult) {
597
+ cancelCompleted = true;
598
+ if (cancelErr) {
599
+ console.log("Pool connection cancel error:", cancelErr.message);
600
+ } else {
601
+ console.log("Pool connection cancel returned:", cancelResult);
602
+ }
603
+ finishTest15();
604
+ });
605
+ });
606
+ }
607
+
608
+ function runTest16() {
609
+ // Test 16: Cancel query waiting for lock (realistic slow query scenario)
610
+ // This test verifies that cancel can be called on a statement that's waiting for a lock.
611
+ // Note: SQLCancel behavior with lock-waits varies by driver - some interrupt immediately,
612
+ // others may need the lock to be released first. This test verifies cancel() is callable.
613
+ console.log("\n=== Test 16: Cancel query waiting for lock ===");
614
+
615
+ // Open a second connection
616
+ ibmdb.open(cn, function(err, conn2) {
617
+ if (err) {
618
+ console.log("Test 16: Could not open second connection:", err.message);
619
+ cleanup();
620
+ return;
621
+ }
622
+
623
+ var finished = false;
624
+
625
+ function finishTest16(message) {
626
+ if (finished) return;
627
+ finished = true;
628
+ console.log(message);
629
+
630
+ // Rollback connection 1's transaction to release the lock
631
+ try {
632
+ conn.rollbackTransactionSync();
633
+ console.log("Test 16: Connection 1 transaction rolled back");
634
+ } catch(e) {
635
+ console.log("Test 16: Rollback error:", e.message);
636
+ }
637
+
638
+ try { conn2.closeSync(); } catch(e) {}
639
+ cleanup();
640
+ }
641
+
642
+ try {
643
+ // Connection 1: Start transaction and lock a row
644
+ conn.beginTransactionSync();
645
+ conn.querySync("UPDATE CANCEL_TEST SET NAME = 'Locked' WHERE ID = 0");
646
+ console.log("Test 16: Connection 1 locked row ID=0");
647
+
648
+ // Connection 2: Prepare a statement that would wait for lock
649
+ var stmt16 = conn2.prepareSync("UPDATE CANCEL_TEST SET NAME = 'Waiting' WHERE ID = 0");
650
+
651
+ // Start execute - this will block on lock wait
652
+ console.log("Test 16: Connection 2 starting UPDATE (will wait for lock)...");
653
+ stmt16.execute(function(execErr, result) {
654
+ // This callback may or may not fire depending on cancel timing
655
+ if (execErr) {
656
+ console.log("Test 16: UPDATE error (cancelled or lock timeout):", execErr.message);
657
+ } else {
658
+ console.log("Test 16: UPDATE completed");
659
+ if (result) try { result.closeSync(); } catch(e) {}
660
+ }
661
+ try { stmt16.closeSync(); } catch(e) {}
662
+ });
663
+
664
+ // After a short delay, try to cancel using cancelSync
665
+ setTimeout(function() {
666
+ console.log("Test 16: Attempting to cancel waiting UPDATE via stmt.cancelSync()...");
667
+ try {
668
+ var result = stmt16.cancelSync();
669
+ console.log("Test 16: stmt.cancelSync() returned:", result);
670
+ finishTest16("Test 16 PASSED: Cancel on lock-waiting statement works.");
671
+ } catch (cancelErr) {
672
+ console.log("Test 16: stmt.cancelSync() error:", cancelErr.message);
673
+ finishTest16("Test 16 PASSED: Cancel attempted (error expected for some drivers).");
674
+ }
675
+ }, 200);
676
+
677
+ } catch (e) {
678
+ console.log("Test 16 setup error:", e.message);
679
+ finishTest16("Test 16: Setup failed - " + e.message);
680
+ }
681
+ });
682
+ }
683
+
684
+ function cleanup() {
685
+ // Cleanup
686
+ console.log("\n=== Cleanup ===");
687
+ try {
688
+ conn.querySync("DROP TABLE CANCEL_TEST");
689
+ console.log("Test table dropped.");
690
+ } catch (e) {
691
+ console.log("Failed to drop test table:", e.message);
692
+ }
693
+
694
+ conn.close(function(err) {
695
+ if (err) {
696
+ console.log("Error closing connection:", err);
697
+ } else {
698
+ console.log("Connection closed.");
699
+ }
700
+ console.log("\n=== All cancel() API tests completed (16 tests) ===");
701
+ });
702
+ }
703
+ });