@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
|
@@ -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();
|