@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.
- package/README.md +12 -10
- package/lib/Db2PluginLifeCycle.d.ts +11 -9
- package/lib/Db2PluginLifeCycle.js +18 -13
- package/lib/Db2PluginLifeCycle.js.map +1 -1
- package/node_modules/adm-zip/adm-zip.js +32 -6
- package/node_modules/adm-zip/headers/entryHeader.js +13 -1
- package/node_modules/adm-zip/methods/inflater.js +33 -3
- package/node_modules/adm-zip/package.json +2 -2
- package/node_modules/adm-zip/util/errors.js +3 -0
- package/node_modules/adm-zip/util/utils.js +102 -14
- package/node_modules/adm-zip/zipEntry.js +43 -18
- package/node_modules/adm-zip/zipFile.js +10 -0
- package/node_modules/axios/CHANGELOG.md +62 -0
- package/node_modules/axios/README.md +236 -73
- package/node_modules/axios/dist/axios.js +1308 -357
- package/node_modules/axios/dist/axios.min.js +3 -3
- package/node_modules/axios/dist/axios.min.js.map +1 -1
- package/node_modules/axios/dist/browser/axios.cjs +1443 -403
- package/node_modules/axios/dist/esm/axios.js +1443 -403
- package/node_modules/axios/dist/esm/axios.min.js +2 -2
- package/node_modules/axios/dist/esm/axios.min.js.map +1 -1
- package/node_modules/axios/dist/node/axios.cjs +1483 -348
- package/node_modules/axios/index.d.cts +24 -1
- package/node_modules/axios/index.d.ts +22 -1
- package/node_modules/axios/lib/adapters/fetch.js +136 -30
- package/node_modules/axios/lib/adapters/http.js +277 -74
- package/node_modules/axios/lib/adapters/xhr.js +172 -16
- package/node_modules/axios/lib/core/Axios.js +87 -27
- package/node_modules/axios/lib/core/AxiosError.js +59 -0
- package/node_modules/axios/lib/core/AxiosHeaders.js +17 -4
- package/node_modules/axios/lib/core/InterceptorManager.js +118 -8
- package/node_modules/axios/lib/core/assertParamsAcyclic.js +49 -0
- package/node_modules/axios/lib/core/buildFullPath.js +1 -13
- package/node_modules/axios/lib/core/createMultipartBody.js +37 -0
- package/node_modules/axios/lib/core/dispatchRequest.js +28 -2
- package/node_modules/axios/lib/core/mergeConfig.js +183 -120
- package/node_modules/axios/lib/core/methodList.js +17 -0
- package/node_modules/axios/lib/defaults/index.js +2 -1
- package/node_modules/axios/lib/defaults/transitional.js +1 -0
- package/node_modules/axios/lib/env/data.js +1 -1
- package/node_modules/axios/lib/helpers/AxiosTransformStream.js +11 -2
- package/node_modules/axios/lib/helpers/Http2Sessions.js +4 -1
- package/node_modules/axios/lib/helpers/HttpStatusCode.js +11 -1
- package/node_modules/axios/lib/helpers/composeSignals.js +6 -3
- package/node_modules/axios/lib/helpers/cookies.js +30 -6
- package/node_modules/axios/lib/helpers/estimateDataURLDecodedBytes.js +34 -7
- package/node_modules/axios/lib/helpers/formDataToBlob.js +113 -0
- package/node_modules/axios/lib/helpers/formDataToJSON.js +25 -1
- package/node_modules/axios/lib/helpers/fromDataURI.js +11 -4
- package/node_modules/axios/lib/helpers/isURLSameOrigin.js +4 -9
- package/node_modules/axios/lib/helpers/normalizeURLForProtocolCheck.js +24 -0
- package/node_modules/axios/lib/helpers/parseHeaders.js +2 -1
- package/node_modules/axios/lib/helpers/parseProtocol.js +1 -1
- package/node_modules/axios/lib/helpers/progressEventReducer.js +1 -1
- package/node_modules/axios/lib/helpers/resolveConfig.js +20 -5
- package/node_modules/axios/lib/helpers/shouldBypassProxy.js +197 -6
- package/node_modules/axios/lib/helpers/throttle.js +3 -2
- package/node_modules/axios/lib/helpers/toFormData.js +14 -21
- package/node_modules/axios/lib/utils.js +192 -20
- package/node_modules/axios/package.json +1 -2
- package/node_modules/follow-redirects/README.md +27 -1
- package/node_modules/follow-redirects/index.js +11 -6
- package/node_modules/follow-redirects/package.json +1 -1
- package/node_modules/fs-extra/README.md +0 -1
- package/node_modules/fs-extra/lib/empty/index.js +4 -2
- package/node_modules/fs-extra/lib/util/stat.js +12 -2
- package/node_modules/fs-extra/package.json +1 -1
- package/node_modules/ibm_db/APIDocumentation.md +2883 -2024
- package/node_modules/ibm_db/LICENSE +23 -23
- package/node_modules/ibm_db/README.md +735 -735
- package/node_modules/ibm_db/binding.gyp +99 -98
- package/node_modules/ibm_db/installer/driverInstall.js +984 -958
- package/node_modules/ibm_db/installer/ifx.sh +38 -38
- package/node_modules/ibm_db/installer/setenv.sh +23 -23
- package/node_modules/ibm_db/installer/testODBCConnection.bat +51 -51
- package/node_modules/ibm_db/installer/testODBCConnection.sh +61 -61
- package/node_modules/ibm_db/lib/climacros.js +431 -431
- package/node_modules/ibm_db/lib/odbc.js +4293 -3487
- package/node_modules/ibm_db/lib/simple-queue.js +41 -41
- package/node_modules/ibm_db/package.json +70 -70
- package/node_modules/ibm_db/src/odbc.cpp +1495 -1396
- package/node_modules/ibm_db/src/odbc.h +477 -473
- package/node_modules/ibm_db/src/odbc_connection.cpp +1762 -1612
- package/node_modules/ibm_db/src/odbc_connection.h +228 -215
- package/node_modules/ibm_db/src/odbc_result.cpp +1547 -1547
- package/node_modules/ibm_db/src/odbc_result.h +152 -152
- package/node_modules/ibm_db/src/odbc_statement.cpp +2047 -861
- package/node_modules/ibm_db/src/odbc_statement.h +257 -135
- package/node_modules/ibm_db/src/strptime.c +389 -389
- package/node_modules/ibm_db/src/strptime.h +46 -46
- package/node_modules/ibm_db/test/README +23 -23
- package/node_modules/ibm_db/test/bench-insert.js +62 -62
- package/node_modules/ibm_db/test/bench-insertBatch10.js +74 -74
- package/node_modules/ibm_db/test/bench-insertBatch100.js +75 -75
- package/node_modules/ibm_db/test/bench-insertBatch1000.js +75 -75
- package/node_modules/ibm_db/test/bench-insertBatch10000.js +75 -75
- package/node_modules/ibm_db/test/bench-prepare-bind-execute-closeSync.js +60 -60
- package/node_modules/ibm_db/test/bench-prepare-bind-executeNonQuery.js +53 -53
- package/node_modules/ibm_db/test/bench-prepare-bindSync-execute-closeSync.js +50 -50
- package/node_modules/ibm_db/test/bench-prepare-bindSync-executeNonQuery.js +48 -48
- package/node_modules/ibm_db/test/bench-prepare-execute-closeSync.js +51 -51
- package/node_modules/ibm_db/test/bench-prepare-executeNonQuery.js +47 -47
- package/node_modules/ibm_db/test/bench-prepare-not.js +43 -43
- package/node_modules/ibm_db/test/bench-query-fetch.js +59 -59
- package/node_modules/ibm_db/test/bench-query-fetchAll.js +49 -49
- package/node_modules/ibm_db/test/bench-query-fetchAllSync.js +43 -43
- package/node_modules/ibm_db/test/bench-query.js +40 -40
- package/node_modules/ibm_db/test/bench-querySync-fetchArray.js +28 -28
- package/node_modules/ibm_db/test/bench-querySync.js +29 -29
- package/node_modules/ibm_db/test/common.d.ts +10 -10
- package/node_modules/ibm_db/test/common.js +127 -127
- package/node_modules/ibm_db/test/config.json +7 -7
- package/node_modules/ibm_db/test/config.zos.json +4 -4
- package/node_modules/ibm_db/test/data/sample1.txt +9 -9
- package/node_modules/ibm_db/test/data/trc.fmt +30114 -30114
- package/node_modules/ibm_db/test/nodeEE-leak-huge-query.js +152 -152
- package/node_modules/ibm_db/test/nodeEE-leak-multiple-query-multiple-connections.js +148 -148
- package/node_modules/ibm_db/test/nodeEE-leak-multiple-query-pool-connections.js +154 -154
- package/node_modules/ibm_db/test/nodeEE-leak-multiple-query.js +133 -133
- package/node_modules/ibm_db/test/nodeEE-stress-async-waterfall-multiple-connections.js +174 -174
- package/node_modules/ibm_db/test/nodeEE-stress-async-waterfall.js +169 -169
- package/node_modules/ibm_db/test/nodeEE-stress-mixed-query-multiple-connections.js +159 -159
- package/node_modules/ibm_db/test/nodeEE-stress-mixed-query.js +148 -148
- package/node_modules/ibm_db/test/odbc-bench.c +123 -123
- package/node_modules/ibm_db/test/perfTest.js +53 -53
- package/node_modules/ibm_db/test/quick-example.sh +30 -30
- package/node_modules/ibm_db/test/quick-example.ts +80 -80
- package/node_modules/ibm_db/test/run-bench.js +96 -96
- package/node_modules/ibm_db/test/run-nodeEE.js +132 -132
- package/node_modules/ibm_db/test/run-tests.js +132 -138
- package/node_modules/ibm_db/test/sql-cli.js +28 -28
- package/node_modules/ibm_db/test/test-all-data-types.js +109 -109
- package/node_modules/ibm_db/test/test-array-insert.js +178 -178
- package/node_modules/ibm_db/test/test-async-await.js +105 -105
- package/node_modules/ibm_db/test/test-attributes.js +34 -34
- package/node_modules/ibm_db/test/test-bad-pool-connection-prepare-execute.js +57 -57
- package/node_modules/ibm_db/test/test-basic-test.js +138 -138
- package/node_modules/ibm_db/test/test-binary-array-insert.js +73 -73
- package/node_modules/ibm_db/test/test-blob-from-file.js +90 -90
- package/node_modules/ibm_db/test/test-blob-insert.js +144 -144
- package/node_modules/ibm_db/test/test-blob-stream-insert.js +321 -299
- package/node_modules/ibm_db/test/test-blob-to-file.js +370 -370
- package/node_modules/ibm_db/test/test-block-fetch.js +364 -364
- package/node_modules/ibm_db/test/test-blocking-issue210.js +123 -123
- package/node_modules/ibm_db/test/test-call-async.js +64 -64
- package/node_modules/ibm_db/test/test-call-stmt.js +53 -53
- package/node_modules/ibm_db/test/test-cancel.js +703 -0
- package/node_modules/ibm_db/test/test-chinese-char.js +59 -59
- package/node_modules/ibm_db/test/test-connection.js +306 -0
- package/node_modules/ibm_db/test/test-date.js +32 -32
- package/node_modules/ibm_db/test/test-dbclob.js +93 -93
- package/node_modules/ibm_db/test/test-decimals.js +135 -135
- package/node_modules/ibm_db/test/test-describe-metadata.js +148 -0
- package/node_modules/ibm_db/test/test-executeFile.js +167 -167
- package/node_modules/ibm_db/test/test-executeFileSync.js +85 -85
- package/node_modules/ibm_db/test/test-fetch-apis.js +146 -146
- package/node_modules/ibm_db/test/test-fetchN.js +130 -130
- package/node_modules/ibm_db/test/test-getinfo.js +197 -197
- package/node_modules/ibm_db/test/test-ibm-db-issue14.js +58 -58
- package/node_modules/ibm_db/test/test-ibm-db-issue17.js +54 -54
- package/node_modules/ibm_db/test/test-ibm-db-issue18.js +54 -54
- package/node_modules/ibm_db/test/test-issue-1059-fetchAll-undefined.js +67 -67
- package/node_modules/ibm_db/test/test-issue-1080-array-blob-insert.js +40 -0
- package/node_modules/ibm_db/test/test-issue-54.js +39 -39
- package/node_modules/ibm_db/test/test-issue-get-column-value-2.js +44 -44
- package/node_modules/ibm_db/test/test-issue211.js +80 -80
- package/node_modules/ibm_db/test/test-issue253.js +39 -39
- package/node_modules/ibm_db/test/test-max-pool-size.js +96 -96
- package/node_modules/ibm_db/test/test-memory-leaks-new-objects.js +32 -32
- package/node_modules/ibm_db/test/test-multi-open-query-close.js +75 -75
- package/node_modules/ibm_db/test/test-param-put-data.js +713 -0
- package/node_modules/ibm_db/test/test-pool-idle-connection.js +72 -72
- package/node_modules/ibm_db/test/test-pool-operations.js +325 -0
- package/node_modules/ibm_db/test/test-pool-stale-connections.js +111 -111
- package/node_modules/ibm_db/test/test-pool-uncommited.js +33 -33
- package/node_modules/ibm_db/test/test-prepare-execute.js +339 -0
- package/node_modules/ibm_db/test/test-prepareSync-multiple-execution.js +93 -93
- package/node_modules/ibm_db/test/test-primary-foreign-keys.js +246 -0
- package/node_modules/ibm_db/test/test-procedures.js +243 -0
- package/node_modules/ibm_db/test/test-promise-all-data-types.js +42 -42
- package/node_modules/ibm_db/test/test-query-operations.js +405 -0
- package/node_modules/ibm_db/test/test-quick-example.js +25 -25
- package/node_modules/ibm_db/test/test-row-array-insert.js +167 -167
- package/node_modules/ibm_db/test/test-sp-array.js +54 -54
- package/node_modules/ibm_db/test/test-sp-dbc-6000.js +88 -88
- package/node_modules/ibm_db/test/test-sp-memleak.js +136 -136
- package/node_modules/ibm_db/test/test-sp-resultset-execute.js +269 -269
- package/node_modules/ibm_db/test/test-sp-resultset.js +228 -228
- package/node_modules/ibm_db/test/test-transactions.js +261 -0
- package/node_modules/ibm_db/test/test-typescript.js +48 -48
- package/node_modules/ibm_db/test/test-xml-datatype.js +70 -70
- package/node_modules/ibm_db/test/testWebApp.js +56 -56
- package/node_modules/ibm_db/test/trace +51 -51
- package/node_modules/ibm_db/test/typescript-apis-test.js +978 -978
- package/node_modules/ibm_db/test/webapp.html +17 -17
- package/node_modules/ibm_db/test/webapp.js +79 -79
- package/node_modules/ibm_db/typescript/README.md +28 -28
- package/node_modules/ibm_db/typescript/dist/Database.d.ts +26 -0
- package/node_modules/ibm_db/typescript/dist/ODBCStatement.d.ts +93 -0
- package/node_modules/string_decoder/node_modules/safe-buffer/LICENSE +21 -0
- package/node_modules/string_decoder/node_modules/safe-buffer/README.md +584 -0
- package/node_modules/string_decoder/node_modules/safe-buffer/index.d.ts +187 -0
- package/node_modules/string_decoder/node_modules/safe-buffer/index.js +62 -0
- package/node_modules/string_decoder/node_modules/safe-buffer/package.json +37 -0
- package/node_modules/which-typed-array/CHANGELOG.md +14 -0
- package/node_modules/which-typed-array/README.md +0 -2
- package/node_modules/which-typed-array/index.d.ts +288 -11
- package/node_modules/which-typed-array/index.js +6 -7
- package/node_modules/which-typed-array/package.json +12 -11
- package/package.json +10 -11
- package/node_modules/ibm_db/test/disabled/test-binding-statement-rebinding.js +0 -59
- package/node_modules/ibm_db/test/disabled/test-open-dont-close.js +0 -12
- package/node_modules/ibm_db/test/disabled/test-param-select-with-booleans-only.js +0 -21
- package/node_modules/ibm_db/test/disabled/test-param-select-with-decimals-only.js +0 -20
- package/node_modules/ibm_db/test/disabled/test-param-select-with-null.js +0 -21
- package/node_modules/ibm_db/test/disabled/test-param-select-with-nulls-mixed.js +0 -23
- package/node_modules/ibm_db/test/disabled/test-param-select-with-numbers-mixed.js +0 -22
- package/node_modules/ibm_db/test/disabled/test-param-select-with-numbers-only.js +0 -24
- package/node_modules/ibm_db/test/disabled/test-param-select-with-strings-only.js +0 -23
- package/node_modules/ibm_db/test/disabled/test-param-select-with-unicode.js +0 -15
- package/node_modules/ibm_db/test/disabled/test-prepare-bind-execute-closeSync.js +0 -62
- package/node_modules/ibm_db/test/disabled/test-prepare-bind-execute-error.js +0 -49
- package/node_modules/ibm_db/test/disabled/test-prepare-bind-execute-long-string.js +0 -63
- package/node_modules/ibm_db/test/disabled/test-prepare-bind-executeNonQuery.js +0 -63
- package/node_modules/ibm_db/test/disabled/test-prepare-bindSync-execute-closeSync.js +0 -46
- package/node_modules/ibm_db/test/disabled/test-prepare-bindSync-executeNonQuery.js +0 -50
- package/node_modules/ibm_db/test/disabled/test-prepare.js +0 -34
- package/node_modules/ibm_db/test/disabled/test-prepareSync.js +0 -29
- package/node_modules/ibm_db/test/disabled/test-query-select-fetchAll.js +0 -23
- package/node_modules/ibm_db/test/disabled/test-query-select-fetchAllSync.js +0 -23
- package/node_modules/ibm_db/test/disabled/test-query-select-unicode.js +0 -15
- package/node_modules/ibm_db/test/disabled/test-querySync-select-unicode.js +0 -20
- package/node_modules/ibm_db/test/test-affected-rows.js +0 -55
- package/node_modules/ibm_db/test/test-bad-connection-string.js +0 -30
- package/node_modules/ibm_db/test/test-binding-connection-timeOut.js +0 -31
- package/node_modules/ibm_db/test/test-binding-statement-executeSync.js +0 -84
- package/node_modules/ibm_db/test/test-binding-transaction-commit.js +0 -79
- package/node_modules/ibm_db/test/test-binding-transaction-commitSync.js +0 -53
- package/node_modules/ibm_db/test/test-closed.js +0 -14
- package/node_modules/ibm_db/test/test-connection-object.js +0 -16
- package/node_modules/ibm_db/test/test-describe-column.js +0 -92
- package/node_modules/ibm_db/test/test-describe-database.js +0 -18
- package/node_modules/ibm_db/test/test-describe-table.js +0 -31
- package/node_modules/ibm_db/test/test-domains-open.js +0 -19
- package/node_modules/ibm_db/test/test-global-open-close.js +0 -11
- package/node_modules/ibm_db/test/test-instantiate-one-and-end.js +0 -9
- package/node_modules/ibm_db/test/test-multi-open-close.js +0 -45
- package/node_modules/ibm_db/test/test-multi-openSync-closeSync.js +0 -52
- package/node_modules/ibm_db/test/test-open-close.js +0 -29
- package/node_modules/ibm_db/test/test-open-connectTimeout.js +0 -33
- package/node_modules/ibm_db/test/test-openSync.js +0 -31
- package/node_modules/ibm_db/test/test-pool-close.js +0 -120
- package/node_modules/ibm_db/test/test-pool-connect.js +0 -36
- package/node_modules/ibm_db/test/test-pool-rollbackTransaction.js +0 -35
- package/node_modules/ibm_db/test/test-prepareSync-bad-sql.js +0 -34
- package/node_modules/ibm_db/test/test-promise-open-close.js +0 -33
- package/node_modules/ibm_db/test/test-query-create-table-fetchSync.js +0 -23
- package/node_modules/ibm_db/test/test-query-create-table.js +0 -12
- package/node_modules/ibm_db/test/test-query-drop-table.js +0 -13
- package/node_modules/ibm_db/test/test-query-insert.js +0 -38
- package/node_modules/ibm_db/test/test-query-select-fetch.js +0 -21
- package/node_modules/ibm_db/test/test-query-select-fetchMode-array.js +0 -17
- package/node_modules/ibm_db/test/test-query-select.js +0 -64
- package/node_modules/ibm_db/test/test-queryResult.js +0 -35
- package/node_modules/ibm_db/test/test-queryStream.js +0 -43
- package/node_modules/ibm_db/test/test-querySync-select-with-exception.js +0 -25
- package/node_modules/ibm_db/test/test-querySync-select.js +0 -28
- package/node_modules/ibm_db/test/test-require-and-end.js +0 -8
- package/node_modules/ibm_db/test/test-statement-close.js +0 -118
- package/node_modules/ibm_db/test/test-transaction-commit-sync.js +0 -54
- package/node_modules/ibm_db/test/test-transaction-commit.js +0 -79
- package/node_modules/which-typed-array/eslint.config.mjs +0 -12
- package/node_modules/which-typed-array/test/index.js +0 -105
- /package/node_modules/{tar-fs/node_modules/chownr → chownr}/LICENSE +0 -0
- /package/node_modules/{tar-fs/node_modules/chownr → chownr}/README.md +0 -0
- /package/node_modules/{tar-fs/node_modules/chownr → chownr}/chownr.js +0 -0
- /package/node_modules/{tar-fs/node_modules/chownr → chownr}/package.json +0 -0
- /package/node_modules/{tar-stream/node_modules/string_decoder → string_decoder}/.travis.yml +0 -0
- /package/node_modules/{tar-stream/node_modules/string_decoder → string_decoder}/LICENSE +0 -0
- /package/node_modules/{tar-stream/node_modules/string_decoder → string_decoder}/README.md +0 -0
- /package/node_modules/{tar-stream/node_modules/string_decoder → string_decoder}/lib/string_decoder.js +0 -0
- /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
|
+
});
|