├── .github └── ISSUE_TEMPLATE │ ├── bug_report.md │ └── feature_request.md ├── .gitignore ├── APIDocumentation.md ├── CHANGES.md ├── INSTALL.md ├── LICENSE ├── README.md ├── _config.yml ├── binding.gyp ├── build.zip ├── contributing └── CONTRIBUTING.md ├── examples ├── describe.js ├── params.js ├── quick-example.ts ├── singleRowFetch.js └── test.ts ├── installer ├── driverInstall.js ├── ifx.sh ├── setenv.sh ├── testODBCConnection.bat └── testODBCConnection.sh ├── lib ├── climacros.js ├── odbc.js └── simple-queue.js ├── package-lock.json ├── package.json ├── polaris.yml ├── src ├── odbc.cpp ├── odbc.h ├── odbc_connection.cpp ├── odbc_connection.h ├── odbc_result.cpp ├── odbc_result.h ├── odbc_statement.cpp ├── odbc_statement.h ├── strptime.c └── strptime.h ├── test ├── README ├── bench-insert.js ├── bench-insertBatch10.js ├── bench-insertBatch100.js ├── bench-insertBatch1000.js ├── bench-insertBatch10000.js ├── bench-prepare-bind-execute-closeSync.js ├── bench-prepare-bind-executeNonQuery.js ├── bench-prepare-bindSync-execute-closeSync.js ├── bench-prepare-bindSync-executeNonQuery.js ├── bench-prepare-execute-closeSync.js ├── bench-prepare-executeNonQuery.js ├── bench-prepare-not.js ├── bench-query-fetch.js ├── bench-query-fetchAll.js ├── bench-query-fetchAllSync.js ├── bench-query.js ├── bench-querySync-fetchArray.js ├── bench-querySync.js ├── common.js ├── config.json ├── config.zos.json ├── data │ ├── .gitignore │ ├── panda.jpg │ ├── phool.jpg │ ├── pushpa.jpg │ ├── sample1.txt │ ├── sample2.txt │ ├── sample3.txt │ ├── sampledoc.docx │ └── trc.fmt ├── disabled │ ├── test-binding-statement-rebinding.js │ ├── test-open-dont-close.js │ ├── test-param-select-with-booleans-only.js │ ├── test-param-select-with-decimals-only.js │ ├── test-param-select-with-null.js │ ├── test-param-select-with-nulls-mixed.js │ ├── test-param-select-with-numbers-mixed.js │ ├── test-param-select-with-numbers-only.js │ ├── test-param-select-with-strings-only.js │ ├── test-param-select-with-unicode.js │ ├── test-prepare-bind-execute-closeSync.js │ ├── test-prepare-bind-execute-error.js │ ├── test-prepare-bind-execute-long-string.js │ ├── test-prepare-bind-executeNonQuery.js │ ├── test-prepare-bindSync-execute-closeSync.js │ ├── test-prepare-bindSync-executeNonQuery.js │ ├── test-prepare.js │ ├── test-prepareSync.js │ ├── test-query-select-fetchAll.js │ ├── test-query-select-fetchAllSync.js │ ├── test-query-select-unicode.js │ └── test-querySync-select-unicode.js ├── nodeEE-leak-huge-query.js ├── nodeEE-leak-multiple-query-multiple-connections.js ├── nodeEE-leak-multiple-query-pool-connections.js ├── nodeEE-leak-multiple-query.js ├── nodeEE-stress-async-waterfall-multiple-connections.js ├── nodeEE-stress-async-waterfall.js ├── nodeEE-stress-mixed-query-multiple-connections.js ├── nodeEE-stress-mixed-query.js ├── odbc-bench.c ├── perfTest.js ├── promise-test-all-data-types.js ├── promise-test-open-close.js ├── quick-example.ts ├── run-bench.js ├── run-nodeEE.js ├── run-tests.js ├── server.cert ├── server.key ├── sql-cli.js ├── test-affected-rows.js ├── test-all-data-types.js ├── test-array-insert.js ├── test-asyc-await.js ├── test-attributes.js ├── test-bad-connection-string.js ├── test-bad-pool-connection-prepare-execute.js ├── test-basic-test.js ├── test-binary-array-insert.js ├── test-binding-connection-timeOut.js ├── test-binding-statement-executeSync.js ├── test-binding-transaction-commit.js ├── test-binding-transaction-commitSync.js ├── test-blob-file.js ├── test-blob-insert.js ├── test-blocking-issue210.js ├── test-call-async.js ├── test-call-stmt.js ├── test-chinese-char.js ├── test-closed.js ├── test-connection-object.js ├── test-date.js ├── test-dbclob.js ├── test-decimals.js ├── test-describe-column.js ├── test-describe-database.js ├── test-describe-table.js ├── test-domains-open.js ├── test-executeFile.js ├── test-executeFileSync.js ├── test-fetch-apis.js ├── test-getinfo.js ├── test-global-open-close.js ├── test-ibm-db-issue14.js ├── test-ibm-db-issue17.js ├── test-ibm-db-issue18.js ├── test-instantiate-one-and-end.js ├── test-issue-54.js ├── test-issue-get-column-value-2.js ├── test-issue211.js ├── test-issue253.js ├── test-max-pool-size.js ├── test-memory-leaks-new-objects.js ├── test-multi-open-close.js ├── test-multi-open-query-close.js ├── test-multi-openSync-closeSync.js ├── test-open-close.js ├── test-open-connectTimeout.js ├── test-openSync.js ├── test-pool-close.js ├── test-pool-connect.js ├── test-pool-idle-connection.js ├── test-pool-rollbackTransaction.js ├── test-pool-stale-connections.js ├── test-pool-uncommited.js ├── test-prepareSync-bad-sql.js ├── test-prepareSync-multiple-execution.js ├── test-promisified-connection-pool.js ├── test-query-create-table-fetchSync.js ├── test-query-create-table.js ├── test-query-drop-table.js ├── test-query-insert.js ├── test-query-select-fetch.js ├── test-query-select-fetchMode-array.js ├── test-query-select.js ├── test-queryResult.js ├── test-queryStream.js ├── test-querySync-select-with-exception.js ├── test-querySync-select.js ├── test-quick-example.js ├── test-require-and-end.js ├── test-sp-array.js ├── test-sp-dbc-6000.js ├── test-sp-memleak.js ├── test-sp-resultset-execute.js ├── test-sp-resultset.js ├── test-statement-close.js ├── test-transaction-commit-sync.js ├── test-transaction-commit.js ├── test-xml-datatype.js ├── testWebApp.js ├── trace ├── webapp.html └── webapp.js └── typescript ├── ConnStr.ts ├── DB2Error.ts ├── Database.ts ├── DescribeObject.ts ├── ODBC.ts ├── ODBCConnection.ts ├── ODBCResult.ts ├── ODBCStatement.ts ├── Options.ts ├── Pool.ts ├── PoolOptions.ts ├── README.md ├── attributes.ts ├── index.ts ├── tests └── test.ts └── tsconfig.json /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Opening an issue for this driver 4 | title: 'Bug Report' 5 | --- 6 | 7 | 8 | 9 | 10 | 11 | # Please provide below information while opening an issue to understand your problem 12 | 13 | - Operating System Name where ibm_db is installed: 14 | - Target Db2 Server Version or output of `db2level` command from Db2 database system: 15 | 16 | ### For non-Windows system, output of below commands from terminal: 17 | uname 18 | uname -m 19 | node -v 20 | npm ls ibm_db 21 | db2level 22 | echo $IBM_DB_HOME 23 | echo $PATH 24 | echo $LD_LIBRARY_PATH $DYLD_LIBRARY_PATH 25 | 26 | ### For Windows system, output of below commands from windows command prompt: 27 | node -v 28 | npm ls ibm_db 29 | db2level 30 | echo %IBM_DB_HOME% 31 | echo %PATH% 32 | echo %LIB% 33 | 34 | - Value of any other ibm_db specific environment variable if in use. 35 | 36 | ## Please provide below problem specific info: 37 | ========================================= 38 | 39 | ### For Installation related issue 40 | - please share complete output of `npm install ibm_db` command. 41 | - For MacOS M1/M2 Chip system, please follow this documentation - https://github.com/ibmdb/node-ibm_db/blob/master/INSTALL.md#m1chip 42 | 43 | ### For Connection related issue 44 | 1. Are you trying SSL connection or non-SSL connection? 45 | 2. For SSL Connection, please read and follow [this documentation](https://github.com/ibmdb/node-ibm_db/blob/master/APIDocumentation.md#SSLConnection) 46 | 3. For SSL connection, do you have ssl certificate from server? 47 | 4. If you have certificate, are you using `SSLServerCertificate` keyword in connection string or using your own keystore db? 48 | 5. Share the connection string used for connection by masking password. 49 | 6. update database connection info in `ibm_db/test/config.json` file and share complete output of below commands: 50 | * cd .../node_modules/ibm_db 51 | * npm install 52 | * node test/test-basic-test.js 53 | 7. For non-SSL connection, update connection info for `db2cli validate` command in file `ibm_db/installer/testODBCConnection.bat` for windows or `ibm_db/installer/testODBCConnection.sh` for non-Windows. Then execute `testODBCConnection.bat` from Administrator command prompt on Windows or `testODBCConnection.sh` script from terminal on non-Windows and share complete output of script along will all generated 1.* files in zip file. 54 | 8. Complete output of `db2cli validate` command. 55 | 56 | 57 | ### For SQL1598N Error 58 | - Please follow [this documentation](https://github.com/ibmdb/node-ibm_db#sql1598n). 59 | 60 | ### For other issues 61 | - Test script to reproduce the problem. 62 | 63 | Steps to Reproduce: 64 | 65 | 1. 66 | 2. 67 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: New Feature/Enhancement Request 5 | --- 6 | 7 | **Is your feature request related to a problem? Please describe.** 8 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 9 | 10 | **Describe the solution you'd like** 11 | A clear and concise description of what you want to happen. 12 | 13 | **Describe alternatives you've considered** 14 | A clear and concise description of any alternative solutions or features you've considered. 15 | 16 | **Additional context** 17 | Add any other context or screenshots about the feature request here. 18 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | a.out 2 | build 3 | node_modules 4 | deps 5 | defect 6 | .DS_Store 7 | installer/clidriver 8 | .polaris-coverity.zip 9 | .blackduck 10 | .synopsys 11 | .vs 12 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2010 IBM Corporation 2 | Copyright (c) 2010 Lee Smith 3 | 4 | Permission is hereby granted, free of charge, to any person 5 | obtaining a copy of this software and associated documentation 6 | files (the "Software"), to deal in the Software without 7 | restriction, including without limitation the rights to use, 8 | copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the 10 | Software is furnished to do so, subject to the following 11 | conditions: 12 | 13 | The above copyright notice and this permission notice shall be 14 | included in all copies or substantial portions of the Software. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 18 | OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 19 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 20 | HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 21 | WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 22 | FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 23 | OTHER DEALINGS IN THE SOFTWARE. 24 | -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | theme: jekyll-theme-cayman -------------------------------------------------------------------------------- /binding.gyp: -------------------------------------------------------------------------------- 1 | { 2 | 'targets' : [ 3 | { 4 | 'target_name' : 'odbc_bindings', 5 | 'sources' : [ 6 | 'src/odbc.cpp', 7 | 'src/odbc_connection.cpp', 8 | 'src/odbc_statement.cpp', 9 | 'src/odbc_result.cpp', 10 | ], 11 | 'include_dirs': [ 12 | " { 35 | try { 36 | // Open connection 37 | const conn = await ibmdb.open(cn); 38 | 39 | // Execute queries 40 | await conn.query("create table mytab(c1 int, c2 varchar(10))"); 41 | await conn.query("insert into mytab values (?, ?)", [3, 'ibm']); 42 | 43 | // Prepare and execute statement 44 | const stmt = await conn.prepare("select * from mytab"); 45 | const result = await stmt.execute(); 46 | const data: { C1: number; C2: string }[] = await result.fetchAll(); 47 | 48 | // Log results 49 | console.log("result = ", data); 50 | assert.deepEqual(data, [{ C1: 3, C2: 'ibm' }]); 51 | 52 | // Close resources 53 | await result.close(); 54 | await stmt.close(); 55 | 56 | // Drop table (ignore errors) 57 | await conn.query("drop table mytab").catch((e: Error) => console.error("Drop table error:", e)); 58 | 59 | await conn.close(); 60 | } catch (e: unknown) { // Explicitly type as `unknown` and check type 61 | if (e instanceof Error) { 62 | console.error("Error:", e.message); 63 | } else { 64 | console.error("An unknown error occurred:", e); 65 | } 66 | } 67 | } 68 | 69 | // Run the function 70 | main(); 71 | 72 | -------------------------------------------------------------------------------- /examples/singleRowFetch.js: -------------------------------------------------------------------------------- 1 | /* 2 | * This example demonstrates how to fetch a single row from a large table 3 | * one by one and get processed by application. It avoids allocation of 4 | * large memory by the ibm_db and data processing becomes easier. 5 | * 6 | * This example has used Sync methods, but async methods also exist. 7 | */ 8 | 9 | var ibmdb = require("../") //require("ibm_db") 10 | , conn = new ibmdb.Database() 11 | , cn = "database=sample;hostname=hotel.torolab.ibm.com;port=21169;uid=newton;pwd=xxxx" 12 | ; 13 | 14 | // open a connection to the database 15 | conn.openSync(cn); 16 | 17 | // create table and insert some rows to it. 18 | conn.querySync("create table mytab (c1 int, c2 varchar(20))"); 19 | conn.querySync("insert into mytab values (1, 'bimal'),(2, 'kamal'),(3,'mohan'),(4,'ram')"); 20 | 21 | // Select data from table 22 | conn.queryResult("select * from mytab", function (err, result) { 23 | if(err) { 24 | console.log(err); 25 | return; 26 | } 27 | 28 | // Fetch single row at once and process it. 29 | // Note that queryResult will bring only 64k data from server and result.fetchSync 30 | // will return each row from this 64k client buffer. Once all data is read from 31 | // buffer, ibm_db driver will bring another 64k chunk of data from server. 32 | var data; 33 | while( data = result.fetchSync() ) 34 | { 35 | console.log(data); 36 | } 37 | 38 | // drop the table and close connection. 39 | conn.querySync("drop table mytab"); 40 | conn.closeSync(); 41 | }); 42 | 43 | -------------------------------------------------------------------------------- /examples/test.ts: -------------------------------------------------------------------------------- 1 | // To run this test.ts file, follow below steps 2 | // npm install -g typescript 3 | // npm install --save-dev @types/node 4 | // update database connection info in ../test/config.json file 5 | // tsc test.ts --lib es2015,dom 6 | // node test.js 7 | // OR, run: tsc test.ts && node test.js && rm test.js 8 | 9 | import * as ibmdb from '../' 10 | import * as common from '../test/common.js' 11 | 12 | let cn = common.connectionString 13 | , pool = new ibmdb.Pool(); 14 | 15 | async function main(){ 16 | const query = `SELECT * FROM employee WHERE phoneno = ?;` 17 | 18 | await pool.initAsync(1, cn) 19 | const conn = await pool.open(cn) 20 | const stmt = await conn.prepare(query) 21 | const result = await stmt.execute([3978]) 22 | 23 | const fetched = await result.fetchAll() 24 | console.log(fetched); 25 | await conn.close() 26 | } 27 | 28 | main(); 29 | 30 | -------------------------------------------------------------------------------- /installer/ifx.sh: -------------------------------------------------------------------------------- 1 | #!/bin/ksh 2 | 3 | # Script to remove UNICODE from binding.gyp and compile ibm_db. 4 | # Also, add Authentication=SERVER in db2cli.ini and db2dsdriver.cfg file 5 | # to avoid SQL1042C error from security layer. 6 | 7 | if [ "$IBM_DB_HOME" == "" ] 8 | then 9 | IBM_DB_HOME=`pwd`/clidriver 10 | fi 11 | OS=`uname` 12 | 13 | export PATH=$IBM_DB_HOME/bin:$IBM_DB_HOME/adm:$IBM_DB_HOME/lib:$PATH 14 | if [ "$OS" == "Darwin" ] 15 | then 16 | export DYLD_LIBRARY_PATH=$IBM_DB_HOME/lib:$DYLD_LIBRARY_PATH 17 | else 18 | export LD_LIBRARY_PATH=$IBM_DB_HOME/lib:$LD_LIBRARY_PATH 19 | fi 20 | 21 | cd .. 22 | npm install nan bindings 23 | npm install -g node-gyp 24 | 25 | grep -v UNICODE binding.gyp > binding1.gyp 26 | mv binding1.gyp binding.gyp 27 | 28 | node-gyp rebuild --IBM_DB_HOME=$IBM_DB_HOME --IS_DOWNLOADED=false 29 | 30 | db2cli writecfg add -parameter Authentication=SERVER 31 | echo "writeini common Authentication SERVER" > .t.cli 32 | echo "" >> .t.cli 33 | db2cli < .t.cli 34 | rm .t.cli 35 | 36 | -------------------------------------------------------------------------------- /installer/setenv.sh: -------------------------------------------------------------------------------- 1 | # Script file to set environment variables to use db2cli executable from 2 | # ibm_db/installer/clidriver/bin folder 3 | # This script is only for non-Windows platform. 4 | 5 | if [ "$IBM_DB_HOME" == "" ] 6 | then 7 | IBM_DB_HOME=`pwd`/clidriver 8 | fi 9 | OS=`uname` 10 | 11 | export PATH=$IBM_DB_HOME/bin:$IBM_DB_HOME/adm:$IBM_DB_HOME/lib:$PATH 12 | if [ "$OS" == "Darwin" ] 13 | then 14 | export DYLD_LIBRARY_PATH=$IBM_DB_HOME/lib:$DYLD_LIBRARY_PATH 15 | else 16 | export LD_LIBRARY_PATH=$IBM_DB_HOME/lib:$LD_LIBRARY_PATH 17 | fi 18 | 19 | export INCLUDE=$IBM_DB_HOME/include:$INCLUDE 20 | 21 | -------------------------------------------------------------------------------- /installer/testODBCConnection.bat: -------------------------------------------------------------------------------- 1 | :: Script file to try connection to target server using ODBC driver 2 | :: and collect db2trace files for this connection to diagnose the 3 | :: connection related issue and make sure setup is proper. 4 | :: This script is only for Windows platform. 5 | 6 | @ECHO OFF 7 | 8 | if "%IBM_DB_HOME%" == "" (SET IBM_DB_HOME=%cd%\clidriver) 9 | 10 | SET PATH=%IBM_DB_HOME%\bin;%IBM_DB_HOME%\adm;%IBM_DB_HOME%\lib;%PATH% 11 | SET LIB=%IBM_DB_HOME%\lib;%LIB% 12 | 13 | DEL /F 1.trc 1.flw 1.fmt 1.fmtc 1.cli 14 | db2trc on -t -f 1.trc 15 | 16 | db2cli validate -database "sample:hotel.torolab.ibm.com:21169" -connect -user newton -passwd serverpass 17 | :: You can use either above db2cli command or below node command to run .js file. 18 | :: Keep only one and comment other. Better to use above validate command first. 19 | :: node ../defect/t.js 20 | 21 | db2trc off 22 | db2trc flw -t 1.trc 1.flw 23 | db2trc fmt 1.trc 1.fmt 24 | db2trc fmt -c 1.trc 1.fmtc 25 | db2trc fmt -cli 1.trc 1.cli 26 | 27 | :END 28 | ECHO ON 29 | @EXIT /B 0 30 | -------------------------------------------------------------------------------- /installer/testODBCConnection.sh: -------------------------------------------------------------------------------- 1 | # Script file to try connection to target server using ODBC driver 2 | # and collect db2trace files for this connection to diagnose the 3 | # connection related issue and make sure setup is proper. 4 | # This script is only for non-Windows platform. 5 | 6 | if [ "$IBM_DB_HOME" == "" ] 7 | then 8 | IBM_DB_HOME=`pwd`/clidriver 9 | fi 10 | OS=`uname` 11 | 12 | export PATH=$IBM_DB_HOME/bin:$IBM_DB_HOME/adm:$IBM_DB_HOME/lib:$PATH 13 | if [ "$OS" == "Darwin" ] 14 | then 15 | export DYLD_LIBRARY_PATH=$IBM_DB_HOME/lib:$DYLD_LIBRARY_PATH 16 | else 17 | export LD_LIBRARY_PATH=$IBM_DB_HOME/lib:$LD_LIBRARY_PATH 18 | fi 19 | 20 | rm -rf 1.trc 1.flw 1.fmt 1.cli 21 | if [ "$OS" == "Darwin" ] 22 | then 23 | db2trc on -t -l 2m 24 | else 25 | db2trc on -t -f 1.trc 26 | fi 27 | sleep 5 28 | 29 | db2cli validate -database "sample:hotel.torolab.ibm.com:21169" -connect -user newton -passwd serverpass 30 | # You can use either above db2cli command or below node command to run .js file. 31 | # Keep only one and comment other. Better to use above validate command first. 32 | #node ../defect/t.js 33 | 34 | if [ "$OS" == "Darwin" ] 35 | then 36 | db2trc dump 1.trc 37 | fi 38 | db2trc off 39 | db2trc flw -t 1.trc 1.flw 40 | db2trc fmt 1.trc 1.fmt 41 | db2trc fmt -c 1.trc 1.fmtc 42 | db2trc fmt -cli 1.trc 1.cli 43 | 44 | -------------------------------------------------------------------------------- /lib/simple-queue.js: -------------------------------------------------------------------------------- 1 | module.exports = SimpleQueue; 2 | 3 | function SimpleQueue() { 4 | var self = this; 5 | 6 | self.fifo = []; 7 | self.executing = false; 8 | } 9 | 10 | SimpleQueue.prototype.push = function (fn) { 11 | var self = this; 12 | 13 | self.fifo.push(fn); 14 | 15 | self.maybeNext(); 16 | }; 17 | 18 | SimpleQueue.prototype.maybeNext = function () { 19 | var self = this; 20 | 21 | if (!self.executing) { 22 | self.next(); 23 | } 24 | }; 25 | 26 | SimpleQueue.prototype.next = function () { 27 | var self = this; 28 | 29 | if (self.fifo.length) { 30 | var fn = self.fifo.shift(); 31 | 32 | self.executing = true; 33 | 34 | fn(function () { 35 | self.executing = false; 36 | 37 | self.maybeNext(); 38 | }); 39 | } 40 | }; -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ibm_db", 3 | "description": "IBM DB2 and IBM Informix bindings for node", 4 | "version": "3.3.1", 5 | "main": "lib/odbc.js", 6 | "types": "typescript/dist/index.d.ts", 7 | "homepage": "https://github.com/ibmdb/node-ibm_db/", 8 | "repository": { 9 | "type": "git", 10 | "url": "git://github.com/ibmdb/node-ibm_db.git" 11 | }, 12 | "bugs": { 13 | "url": "https://github.com/ibmdb/node-ibm_db/issues" 14 | }, 15 | "contributors": [ 16 | "IBM " 17 | ], 18 | "directories": { 19 | "example": "examples", 20 | "test": "test" 21 | }, 22 | "engines": { 23 | "node": ">=6.0" 24 | }, 25 | "scripts": { 26 | "install": "node installer/driverInstall.js", 27 | "test": "cd test && node run-tests.js", 28 | "build:types": "tsc -p typescript/tsconfig.json" 29 | }, 30 | "dependencies": { 31 | "adm-zip": "^0.5.16", 32 | "axios": "^1.7.4", 33 | "big-integer": "^1.6.51", 34 | "bindings": "^1.5.0", 35 | "fs-extra": "^11.1.1", 36 | "lodash": "^4.17.21", 37 | "nan": "^2.22.2", 38 | "q": "^1.5.1", 39 | "targz": "^1.0.1" 40 | }, 41 | "keywords": [ 42 | "node", 43 | "odbc", 44 | "db2", 45 | "driver" 46 | ], 47 | "author": "IBM", 48 | "license": "MIT", 49 | "devDependencies": { 50 | "@types/node": "^22.13.10", 51 | "async": "^3.2.4", 52 | "bluebird": "^3.7.2", 53 | "moment": "^2.29.4", 54 | "typescript": "^5.8.2" 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /polaris.yml: -------------------------------------------------------------------------------- 1 | version: "1" 2 | project: 3 | name: ${scm.git.repo} 4 | branch: ${scm.git.branch} 5 | revision: 6 | name: ${scm.git.commit} 7 | date: ${scm.git.commit.date} 8 | capture: 9 | build: 10 | buildCommands: 11 | - shell: [npm, install] 12 | fileSystem: 13 | ears: 14 | extensions: [ear] 15 | files: 16 | - directory: ${project.projectDir} 17 | java: 18 | files: 19 | - directory: ${project.projectDir} 20 | javascript: 21 | files: 22 | - directory: ${project.projectDir} 23 | - excludeRegex: node_modules|bower_components|vendor 24 | php: 25 | files: 26 | - directory: ${project.projectDir} 27 | python: 28 | files: 29 | - directory: ${project.projectDir} 30 | ruby: 31 | files: 32 | - directory: ${project.projectDir} 33 | typescript: 34 | files: 35 | - directory: ${project.projectDir} 36 | wars: 37 | extensions: [war] 38 | files: 39 | - directory: ${project.projectDir} 40 | dlls: 41 | extensions: [cpp, h] 42 | files: 43 | - directory: ${project.projectDir} 44 | analyze: 45 | mode: central 46 | install: 47 | coverity: 48 | version: default 49 | serverUrl: https://rocketsoftware.polaris.synopsys.com 50 | -------------------------------------------------------------------------------- /src/strptime.h: -------------------------------------------------------------------------------- 1 | #ifndef _STRPTIME_H 2 | #define _STRPTIME_H 3 | 4 | #define ALT_E 0x01 5 | #define ALT_O 0x02 6 | //#define LEGAL_ALT(x) { if (alt_format & ~(x)) return (0); } 7 | #define LEGAL_ALT(x) { ; } 8 | #define TM_YEAR_BASE (1900) 9 | 10 | #include 11 | #include 12 | #include 13 | #include 14 | 15 | #ifdef __cplusplus 16 | extern "C" { 17 | #endif 18 | 19 | char * strptime(const char *buf, const char *fmt, struct tm *tm); 20 | 21 | #ifdef __cplusplus 22 | } 23 | #endif 24 | 25 | static const char *day[7] = { 26 | "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", 27 | "Friday", "Saturday" 28 | }; 29 | 30 | static const char *abday[7] = { 31 | "Sun","Mon","Tue","Wed","Thu","Fri","Sat" 32 | }; 33 | 34 | static const char *mon[12] = { 35 | "January", "February", "March", "April", "May", "June", "July", 36 | "August", "September", "October", "November", "December" 37 | }; 38 | 39 | static const char *abmon[12] = { 40 | "Jan", "Feb", "Mar", "Apr", "May", "Jun", 41 | "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" 42 | }; 43 | static const char *am_pm[2] = { 44 | "AM", "PM" 45 | }; 46 | 47 | #endif -------------------------------------------------------------------------------- /test/README: -------------------------------------------------------------------------------- 1 | # IBM DB Test Suite 2 | 3 | * Connection info must be specified in the environment. 4 | For example, by sourcing the following ENV Vars: 5 | export IBM_DB_DBNAME= 6 | export IBM_DB_UID= 7 | export IBM_DB_PWD= 8 | export IBM_DB_HOSTNAME= 9 | export IBM_DB_PORT= 10 | 11 | * OR, 12 | If not using ENV Vars,Update connection info in 13 | ibm_db/test/config.json file. 14 | 15 | * Connection info set in ENV vars will take priority over connection info 16 | in config.json file, if connection info is set at both places. 17 | 18 | * If installing ibm_db on z/OS natively, 19 | update connection info in config.zos.json file. 20 | 21 | * If target Db2 server for connection is z/OS, set environment variable 22 | IBM_DB_SERVER_TYPE = "ZOS" and update connection info in config.zos.json file. 23 | 24 | -------------------------------------------------------------------------------- /test/bench-insert.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , odbc = require("../") 3 | , db = new odbc.Database(); 4 | 5 | db.open(common.connectionString, function(err){ 6 | if (err) { 7 | console.log(err); 8 | process.exit(1); 9 | } 10 | dropTable(); 11 | createTable(); 12 | }); 13 | 14 | function createTable() { 15 | db.query("create table bench_insert (str varchar(50))", function (err) { 16 | if (err) { 17 | console.log(err); 18 | return finish(); 19 | } 20 | 21 | return insertData(); 22 | }); 23 | } 24 | 25 | function dropTable() { 26 | try { 27 | db.querySync("drop table bench_insert") 28 | }catch(e){ 29 | // console.log(e); 30 | // do nothing if the table doesn't exist 31 | } 32 | } 33 | 34 | function insertData() { 35 | var count = 0 36 | , iterations = 100 37 | , time = new Date().getTime(); 38 | 39 | for (var x = 0; x < iterations; x++) { 40 | db.query("insert into bench_insert (str) values ('testing')", cb); 41 | 42 | } 43 | 44 | function cb (err) { 45 | if (err) { 46 | console.log(err); 47 | return finish(); 48 | } 49 | 50 | if (++count == iterations) { 51 | var elapsed = (new Date().getTime() - time)/1000; 52 | process.stdout.write("(" + iterations + " records inserted in " + elapsed + " seconds, " + (iterations/elapsed).toFixed(4) + " records/sec)"); 53 | return dropTable(); 54 | } 55 | } 56 | } 57 | 58 | function finish() { 59 | db.close(function () { 60 | console.log("connection closed"); 61 | }); 62 | } 63 | -------------------------------------------------------------------------------- /test/bench-insertBatch10.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , odbc = require("../") 3 | , db = new odbc.Database(); 4 | 5 | var insertString = ""; 6 | var batchSize = 10; 7 | 8 | db.open(common.connectionString, function(err){ 9 | if (err) { 10 | console.log(err); 11 | process.exit(1); 12 | } 13 | createInsertString(batchSize); 14 | dropTable(); 15 | createTable(); 16 | }); 17 | 18 | function createInsertString(batchSize) { 19 | 20 | insertString = "insert into bench_insert (str) values ('testing')"; 21 | for (var i = 0; i < batchSize; i++) { 22 | insertString += ", ('testing')"; 23 | } 24 | } 25 | function createTable() { 26 | db.query("create table bench_insert (str varchar(50))", function (err) { 27 | if (err) { 28 | console.log(err); 29 | return finish(); 30 | } 31 | 32 | return insertData(); 33 | }); 34 | } 35 | 36 | function dropTable() { 37 | try { 38 | db.querySync("drop table bench_insert") 39 | }catch(e){ 40 | // console.log(e); 41 | // do nothing if the table doesn't exist 42 | } 43 | } 44 | 45 | function insertData() { 46 | var count = 0 47 | , iterations = 100 48 | , time = new Date().getTime(); 49 | 50 | for (var x = 0; x < iterations; x++) { 51 | db.query(insertString, cb); 52 | 53 | } 54 | 55 | function cb (err) { 56 | if (err) { 57 | console.log(err); 58 | return finish(); 59 | } 60 | 61 | if (++count == iterations) { 62 | var elapsed = (new Date().getTime() - time)/1000; 63 | process.stdout.write("(" + batchSize * iterations + " records inserted in " + elapsed + " seconds, " + 64 | (batchSize * iterations/elapsed).toFixed(4) + " records/sec)"); 65 | return dropTable(); 66 | } 67 | } 68 | } 69 | 70 | function finish() { 71 | db.close(function () { 72 | console.log("connection closed"); 73 | }); 74 | } 75 | -------------------------------------------------------------------------------- /test/bench-insertBatch100.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , odbc = require("../") 3 | , db = new odbc.Database(); 4 | 5 | var insertString = ""; 6 | var batchSize = 100; 7 | 8 | db.open(common.connectionString, function(err){ 9 | if (err) { 10 | console.log(err); 11 | process.exit(1); 12 | } 13 | createInsertString(batchSize); 14 | dropTable(); 15 | createTable(); 16 | }); 17 | 18 | function createInsertString(batchSize) { 19 | 20 | insertString = "insert into bench_insert (str) values ('testing')"; 21 | for (var i = 0; i < batchSize; i++) { 22 | insertString += ", ('testing')"; 23 | } 24 | } 25 | function createTable() { 26 | db.query("create table bench_insert (str varchar(50))", function (err) { 27 | if (err) { 28 | console.log(err); 29 | return finish(); 30 | } 31 | 32 | return insertData(); 33 | }); 34 | } 35 | 36 | function dropTable() { 37 | try { 38 | db.querySync("drop table bench_insert") 39 | }catch(e){ 40 | // console.log(e); 41 | // do nothing if the table doesn't exist 42 | } 43 | } 44 | 45 | function insertData() { 46 | var count = 0 47 | , iterations = 100 48 | //, iterations = 10000 49 | , time = new Date().getTime(); 50 | 51 | for (var x = 0; x < iterations; x++) { 52 | db.query(insertString, cb); 53 | 54 | } 55 | 56 | function cb (err) { 57 | if (err) { 58 | console.log(err); 59 | return finish(); 60 | } 61 | 62 | if (++count == iterations) { 63 | var elapsed = (new Date().getTime() - time)/1000; 64 | process.stdout.write("(" + batchSize * iterations + " records inserted in " + elapsed + " seconds, " + 65 | (batchSize * iterations/elapsed).toFixed(4) + " records/sec)"); 66 | return dropTable(); 67 | } 68 | } 69 | } 70 | 71 | function finish() { 72 | db.close(function () { 73 | console.log("connection closed"); 74 | }); 75 | } 76 | -------------------------------------------------------------------------------- /test/bench-insertBatch1000.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , odbc = require("../") 3 | , db = new odbc.Database(); 4 | 5 | var insertString = ""; 6 | var batchSize = 1000; 7 | 8 | db.open(common.connectionString, function(err){ 9 | if (err) { 10 | console.log(err); 11 | process.exit(1); 12 | } 13 | createInsertString(batchSize); 14 | dropTable(); 15 | createTable(); 16 | }); 17 | 18 | function createInsertString(batchSize) { 19 | 20 | insertString = "insert into bench_insert (str) values ('testing')"; 21 | for (var i = 0; i < batchSize; i++) { 22 | insertString += ", ('testing')"; 23 | } 24 | } 25 | function createTable() { 26 | db.query("create table bench_insert (str varchar(50))", function (err) { 27 | if (err) { 28 | console.log(err); 29 | return finish(); 30 | } 31 | 32 | return insertData(); 33 | }); 34 | } 35 | 36 | function dropTable() { 37 | try { 38 | db.querySync("drop table bench_insert") 39 | }catch(e){ 40 | // console.log(e); 41 | // do nothing if the table doesn't exist 42 | } 43 | } 44 | 45 | function insertData() { 46 | var count = 0 47 | , iterations = 100 48 | //, iterations = 10000 49 | , time = new Date().getTime(); 50 | 51 | for (var x = 0; x < iterations; x++) { 52 | db.query(insertString, cb); 53 | 54 | } 55 | 56 | function cb (err) { 57 | if (err) { 58 | console.log(err); 59 | return finish(); 60 | } 61 | 62 | if (++count == iterations) { 63 | var elapsed = (new Date().getTime() - time)/1000; 64 | process.stdout.write("(" + batchSize * iterations + " records inserted in " + elapsed + " seconds, " + 65 | (batchSize * iterations/elapsed).toFixed(4) + " records/sec)"); 66 | return dropTable(); 67 | } 68 | } 69 | } 70 | 71 | function finish() { 72 | db.close(function () { 73 | console.log("connection closed"); 74 | }); 75 | } 76 | -------------------------------------------------------------------------------- /test/bench-insertBatch10000.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , odbc = require("../") 3 | , db = new odbc.Database(); 4 | 5 | var insertString = ""; 6 | var batchSize = 10000; 7 | 8 | db.open(common.connectionString, function(err){ 9 | if (err) { 10 | console.log(err); 11 | process.exit(1); 12 | } 13 | createInsertString(batchSize); 14 | dropTable(); 15 | createTable(); 16 | }); 17 | 18 | function createInsertString(batchSize) { 19 | 20 | insertString = "insert into bench_insert (str) values ('testing')"; 21 | for (var i = 0; i < batchSize; i++) { 22 | insertString += ", ('testing')"; 23 | } 24 | } 25 | function createTable() { 26 | db.query("create table bench_insert (str varchar(50))", function (err) { 27 | if (err) { 28 | console.log(err); 29 | return finish(); 30 | } 31 | 32 | return insertData(); 33 | }); 34 | } 35 | 36 | function dropTable() { 37 | try { 38 | db.querySync("drop table bench_insert") 39 | }catch(e){ 40 | // console.log(e); 41 | // do nothing if the table doesn't exist 42 | } 43 | } 44 | 45 | function insertData() { 46 | var count = 0 47 | , iterations = 100 48 | //, iterations = 10000 49 | , time = new Date().getTime(); 50 | 51 | for (var x = 0; x < iterations; x++) { 52 | db.query(insertString, cb); 53 | 54 | } 55 | 56 | function cb (err) { 57 | if (err) { 58 | console.log(err); 59 | return finish(); 60 | } 61 | 62 | if (++count == iterations) { 63 | var elapsed = (new Date().getTime() - time)/1000; 64 | process.stdout.write("(" + batchSize * iterations + " records inserted in " + elapsed + " seconds, " + 65 | (batchSize * iterations/elapsed).toFixed(4) + " records/sec)"); 66 | return dropTable(); 67 | } 68 | } 69 | } 70 | 71 | function finish() { 72 | db.close(function () { 73 | console.log("connection closed"); 74 | }); 75 | } 76 | -------------------------------------------------------------------------------- /test/bench-prepare-bind-execute-closeSync.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , odbc = require("../") 3 | , db = new odbc.Database() 4 | //, iterations = 10000 5 | , iterations = 100 6 | ; 7 | 8 | db.open(common.connectionString, function(err){ 9 | if (err) { 10 | console.log(err); 11 | process.exit(1); 12 | } 13 | 14 | issueQuery3(function () { 15 | finish(); 16 | }); 17 | }); 18 | 19 | function issueQuery3(done) { 20 | var count = 0 21 | , time = new Date().getTime(); 22 | 23 | var stmt = db.prepareSync('select cast(? as INTEGER) as test from sysibm.sysdummy1'); 24 | 25 | for (var x = 0; x < iterations; x++) { 26 | (function (x) { 27 | stmt.bind([x], function (err) { 28 | if (err) { 29 | console.log(err); 30 | return finish(); 31 | } 32 | 33 | //console.log(x); 34 | 35 | stmt.execute(cb); 36 | }); 37 | })(x); 38 | } 39 | 40 | function cb (err, result) { 41 | if (err) { 42 | console.log(err); 43 | return finish(); 44 | } 45 | 46 | //console.log(result.fetchAllSync()); 47 | 48 | result.closeSync(); 49 | 50 | if (++count == iterations) { 51 | var elapsed = (new Date().getTime() - time)/1000; 52 | process.stdout.write("(" + count + " queries issued in " + elapsed + " seconds, " + (count/elapsed).toFixed(2) + " query/sec)"); 53 | return done(); 54 | } 55 | } 56 | } 57 | 58 | function finish() { 59 | db.close(function () {}); 60 | } 61 | -------------------------------------------------------------------------------- /test/bench-prepare-bind-executeNonQuery.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , odbc = require("../") 3 | , db = new odbc.Database() 4 | , iterations = 100 5 | ; 6 | 7 | db.open(common.connectionString, function(err){ 8 | if (err) { 9 | console.error(err); 10 | process.exit(1); 11 | } 12 | 13 | issueQuery2(function () { 14 | finish(); 15 | }); 16 | }); 17 | 18 | function issueQuery2(done) { 19 | var count = 0 20 | , time = new Date().getTime(); 21 | 22 | var stmt = db.prepareSync('select cast(? as INTEGER) as test from sysibm.sysdummy1'); 23 | 24 | for (var x = 0; x < iterations; x++) { 25 | (function (x) { 26 | stmt.bind([x], function (err) { 27 | if (err) { 28 | console.log(err); 29 | return finish(); 30 | } 31 | 32 | stmt.executeNonQuery(cb); 33 | }); 34 | })(x); 35 | } 36 | 37 | function cb (err, data) { 38 | if (err) { 39 | console.error(err); 40 | return finish(); 41 | } 42 | 43 | if (++count == iterations) { 44 | var elapsed = (new Date().getTime() - time)/1000; 45 | process.stdout.write("(" + count + " queries issued in " + elapsed + " seconds, " + (count/elapsed).toFixed(2) + " query/sec)"); 46 | return done(); 47 | } 48 | } 49 | } 50 | 51 | function finish() { 52 | db.close(function () {}); 53 | } 54 | -------------------------------------------------------------------------------- /test/bench-prepare-bindSync-execute-closeSync.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , odbc = require("../") 3 | , db = new odbc.Database() 4 | , iterations = 100 5 | //, iterations = 10000 6 | ; 7 | 8 | db.open(common.connectionString, function(err){ 9 | if (err) { 10 | console.error(err); 11 | process.exit(1); 12 | } 13 | 14 | issueQuery3(function () { 15 | finish(); 16 | }); 17 | }); 18 | 19 | function issueQuery3(done) { 20 | var count = 0 21 | , time = new Date().getTime(); 22 | 23 | var stmt = db.prepareSync('select cast(? as INTEGER) as test from sysibm.sysdummy1'); 24 | 25 | for (var x = 0; x < iterations; x++) { 26 | (function (x) { 27 | stmt.bindSync([x]); 28 | stmt.execute(cb); 29 | })(x); 30 | } 31 | 32 | function cb (err, result) { 33 | if (err) { 34 | console.error(err); 35 | return finish(); 36 | } 37 | 38 | result.closeSync(); 39 | 40 | if (++count == iterations) { 41 | var elapsed = (new Date().getTime() - time)/1000; 42 | process.stdout.write("(" + count + " queries issued in " + elapsed + " seconds, " + (count/elapsed).toFixed(2) + " query/sec)"); 43 | return done(); 44 | } 45 | } 46 | } 47 | 48 | function finish() { 49 | db.close(function () {}); 50 | } 51 | -------------------------------------------------------------------------------- /test/bench-prepare-bindSync-executeNonQuery.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , odbc = require("../") 3 | , db = new odbc.Database() 4 | //, iterations = 10000 5 | , iterations = 100 6 | ; 7 | 8 | db.open(common.connectionString, function(err){ 9 | if (err) { 10 | console.error(err); 11 | process.exit(1); 12 | } 13 | 14 | issueQuery2(function () { 15 | finish(); 16 | }); 17 | }); 18 | 19 | function issueQuery2(done) { 20 | var count = 0 21 | , time = new Date().getTime(); 22 | 23 | var stmt = db.prepareSync('select cast(? as INTEGER) as test from sysibm.sysdummy1'); 24 | 25 | for (var x = 0; x < iterations; x++) { 26 | (function (x) { 27 | stmt.bindSync([x]); 28 | stmt.executeNonQuery(cb); 29 | })(x); 30 | } 31 | 32 | function cb (err, data) { 33 | if (err) { 34 | console.error(err); 35 | return finish(); 36 | } 37 | 38 | if (++count == iterations) { 39 | var elapsed = (new Date().getTime() - time)/1000; 40 | process.stdout.write("(" + count + " queries issued in " + elapsed + " seconds, " + (count/elapsed).toFixed(2) + " query/sec)"); 41 | return done(); 42 | } 43 | } 44 | } 45 | 46 | function finish() { 47 | db.close(function () {}); 48 | } 49 | -------------------------------------------------------------------------------- /test/bench-prepare-execute-closeSync.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , odbc = require("../") 3 | , db = new odbc.Database() 4 | , iterations = 100 5 | //, iterations = 10000 6 | ; 7 | 8 | db.open(common.connectionString, function(err){ 9 | if (err) { 10 | console.error(err); 11 | process.exit(1); 12 | } 13 | 14 | issueQuery3(function () { 15 | finish(); 16 | }); 17 | }); 18 | 19 | function issueQuery3(done) { 20 | var count = 0 21 | , time = new Date().getTime(); 22 | 23 | var stmt = db.prepareSync('select cast(? as INTEGER) as test from sysibm.sysdummy1'); 24 | 25 | for (var x = 0; x < iterations; x++) { 26 | (function (x) { 27 | stmt.execute([x], cb); 28 | })(x); 29 | } 30 | 31 | function cb (err, result) { 32 | if (err) { 33 | console.error(err); 34 | return finish(); 35 | } 36 | 37 | //console.log(result.fetchAllSync()); 38 | 39 | result.closeSync(); 40 | 41 | if (++count == iterations) { 42 | var elapsed = (new Date().getTime() - time)/1000; 43 | process.stdout.write("(" + count + " queries issued in " + elapsed + " seconds, " + (count/elapsed).toFixed(2) + " query/sec)"); 44 | return done(); 45 | } 46 | } 47 | } 48 | 49 | function finish() { 50 | db.close(function () {}); 51 | } 52 | -------------------------------------------------------------------------------- /test/bench-prepare-executeNonQuery.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , odbc = require("../") 3 | , db = new odbc.Database() 4 | , iterations = 100 5 | //, iterations = 10000 6 | ; 7 | 8 | db.open(common.connectionString, function(err){ 9 | if (err) { 10 | console.error(err); 11 | process.exit(1); 12 | } 13 | 14 | issueQuery2(function () { 15 | finish(); 16 | }); 17 | }); 18 | 19 | function issueQuery2(done) { 20 | var count = 0 21 | , time = new Date().getTime(); 22 | 23 | var stmt = db.prepareSync('select cast(? as INTEGER) as test from sysibm.sysdummy1'); 24 | 25 | for (var x = 0; x < iterations; x++) { 26 | (function (x) { 27 | stmt.executeNonQuery([x], cb); 28 | })(x); 29 | } 30 | 31 | function cb (err, data) { 32 | if (err) { 33 | console.error(err); 34 | return finish(); 35 | } 36 | 37 | if (++count == iterations) { 38 | var elapsed = (new Date().getTime() - time)/1000; 39 | process.stdout.write("(" + count + " queries issued in " + elapsed + " seconds, " + (count/elapsed).toFixed(2) + " query/sec)"); 40 | return done(); 41 | } 42 | } 43 | } 44 | 45 | function finish() { 46 | db.close(function () {}); 47 | } 48 | -------------------------------------------------------------------------------- /test/bench-prepare-not.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , odbc = require("../") 3 | , db = new odbc.Database() 4 | //, iterations = 10000 5 | , iterations = 100 6 | ; 7 | 8 | db.open(common.connectionString, function(err){ 9 | if (err) { 10 | console.error(err); 11 | process.exit(1); 12 | } 13 | 14 | issueQuery1(function () { 15 | finish(); 16 | }); 17 | }); 18 | 19 | function issueQuery1(done) { 20 | var count = 0 21 | , time = new Date().getTime(); 22 | 23 | for (var x = 0; x < iterations; x++) { 24 | db.query("select 1 + ? as test from sysibm.sysdummy1", [1], cb); 25 | } 26 | 27 | function cb (err, data) { 28 | if (err) { 29 | console.error(err); 30 | return finish(); 31 | } 32 | 33 | if (++count == iterations) { 34 | var elapsed = (new Date().getTime() - time)/1000; 35 | process.stdout.write("(" + count + " queries issued in " + elapsed + " seconds, " + (count/elapsed).toFixed(2) + " query/sec)"); 36 | return done(); 37 | } 38 | } 39 | } 40 | 41 | function finish() { 42 | db.close(function () {}); 43 | } 44 | -------------------------------------------------------------------------------- /test/bench-query-fetch.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , odbc = require("../") 3 | , db = new odbc.Database(); 4 | 5 | db.open(common.connectionString, function(err){ 6 | if (err) { 7 | console.error(err); 8 | process.exit(1); 9 | } 10 | 11 | issueQuery(); 12 | }); 13 | 14 | function issueQuery() { 15 | var count = 0 16 | , iterations = 100 17 | //, iterations = 10000 18 | , time = new Date().getTime(); 19 | 20 | for (var x = 0; x < iterations; x++) { 21 | db.queryResult("select 1 + 1 as test from sysibm.sysdummy1", cb); 22 | } 23 | 24 | function cb (err, result) { 25 | if (err) { 26 | console.error(err); 27 | return finish(); 28 | } 29 | 30 | fetchAll(result); 31 | } 32 | 33 | function fetchAll(rs) { 34 | rs.fetch(function (err, data) { 35 | if (err) { 36 | console.error(err); 37 | return finish(); 38 | } 39 | 40 | //if data is null, then no more data 41 | if (!data) { 42 | rs.closeSync(); 43 | 44 | if (++count == iterations) { 45 | var elapsed = (new Date().getTime() - time)/1000; 46 | process.stdout.write("(" + count + " queries issued in " + elapsed + " seconds, " + (count/elapsed).toFixed(2) + " query/sec)"); 47 | return finish(); 48 | } 49 | } 50 | else { 51 | fetchAll(rs); 52 | } 53 | }); 54 | } 55 | 56 | function finish() { 57 | db.close(function () {}); 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /test/bench-query-fetchAll.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , odbc = require("../") 3 | , db = new odbc.Database(); 4 | 5 | db.open(common.connectionString, function(err){ 6 | if (err) { 7 | console.error(err); 8 | process.exit(1); 9 | } 10 | 11 | issueQuery(); 12 | }); 13 | 14 | function issueQuery() { 15 | var count = 0 16 | , iterations = 100 17 | //, iterations = 10000 18 | , time = new Date().getTime(); 19 | 20 | for (var x = 0; x < iterations; x++) { 21 | db.queryResult("select 1 + 1 as test from sysibm.sysdummy1", cb); 22 | } 23 | 24 | function cb (err, result) { 25 | if (err) { 26 | console.error(err); 27 | return finish(); 28 | } 29 | 30 | result.fetchAll(function (err, data) { 31 | if (err) { 32 | console.error(err); 33 | return finish(); 34 | } 35 | 36 | result.closeSync(); 37 | 38 | if (++count == iterations) { 39 | var elapsed = (new Date().getTime() - time)/1000; 40 | process.stdout.write("(" + count + " queries issued in " + elapsed + " seconds, " + (count/elapsed).toFixed(2) + " query/sec)"); 41 | return finish(); 42 | } 43 | }); 44 | } 45 | 46 | function finish() { 47 | db.close(function () {}); 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /test/bench-query-fetchAllSync.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , odbc = require("../") 3 | , db = new odbc.Database(); 4 | 5 | db.open(common.connectionString, function(err){ 6 | if (err) { 7 | console.error(err); 8 | process.exit(1); 9 | } 10 | 11 | issueQuery(); 12 | }); 13 | 14 | function issueQuery() { 15 | var count = 0 16 | , iterations = 100 17 | //, iterations = 10000 18 | , time = new Date().getTime(); 19 | 20 | for (var x = 0; x < iterations; x++) { 21 | db.queryResult("select 1 + 1 as test from sysibm.sysdummy1", cb); 22 | } 23 | 24 | function cb (err, result) { 25 | if (err) { 26 | console.error(err); 27 | return finish(); 28 | } 29 | 30 | var data = result.fetchAllSync(); 31 | result.closeSync(); 32 | 33 | if (++count == iterations) { 34 | var elapsed = (new Date().getTime() - time)/1000; 35 | process.stdout.write("(" + count + " queries issued in " + elapsed + " seconds, " + (count/elapsed).toFixed(2) + " query/sec)"); 36 | return finish(); 37 | } 38 | } 39 | 40 | function finish() { 41 | db.close(function () {}); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /test/bench-query.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , odbc = require("../") 3 | , db = new odbc.Database(); 4 | 5 | db.open(common.connectionString, function(err){ 6 | if (err) { 7 | console.error(err); 8 | process.exit(1); 9 | } 10 | 11 | issueQuery(); 12 | }); 13 | 14 | function issueQuery() { 15 | var count = 0 16 | , iterations = 100 17 | //, iterations = 10000 18 | , time = new Date().getTime(); 19 | 20 | for (var x = 0; x < iterations; x++) { 21 | db.query("select 1 + 1 as test from sysibm.sysdummy1", cb); 22 | } 23 | 24 | function cb (err, data) { 25 | if (err) { 26 | console.error(err); 27 | return finish(); 28 | } 29 | 30 | if (++count == iterations) { 31 | var elapsed = (new Date().getTime() - time)/1000; 32 | process.stdout.write("(" + count + " queries issued in " + elapsed + " seconds, " + (count/elapsed).toFixed(2) + " query/sec)"); 33 | return finish(); 34 | } 35 | } 36 | } 37 | 38 | function finish() { 39 | db.close(function () {}); 40 | } 41 | -------------------------------------------------------------------------------- /test/bench-querySync-fetchArray.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , odbc = require("../") 3 | , db = new odbc.Database({ fetchMode : odbc.FETCH_ARRAY }); 4 | 5 | db.open(common.connectionString, function(err){ 6 | if (err) { 7 | console.error(err); 8 | process.exit(1); 9 | } 10 | 11 | issueQuery(); 12 | }); 13 | 14 | function issueQuery() { 15 | var count = 0 16 | , iterations = 100 17 | //, iterations = 10000 18 | , time = new Date().getTime(); 19 | 20 | for (var x = 0; x < iterations; x++) { 21 | var data = db.querySync("select 1 + 1 as test from sysibm.sysdummy1"); 22 | count += 1; 23 | } 24 | 25 | var elapsed = (new Date().getTime() - time)/1000; 26 | process.stdout.write("(" + count + " queries issued in " + elapsed + " seconds, " + (count/elapsed).toFixed(2) + " query/sec)"); 27 | db.close(function () {}); 28 | } 29 | -------------------------------------------------------------------------------- /test/bench-querySync.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , odbc = require("../") 3 | , db = new odbc.Database(); 4 | 5 | db.open(common.connectionString, function(err){ 6 | if (err) { 7 | console.error(err); 8 | console.log(err); 9 | console.log(common.connectionString); 10 | process.exit(1); 11 | } 12 | issueQuery(); 13 | }); 14 | 15 | function issueQuery() { 16 | var count = 0 17 | //, iterations = 10000 18 | , iterations = 100 19 | , time = new Date().getTime(); 20 | 21 | for (var x = 0; x < iterations; x++) { 22 | var data = db.querySync("select 1 + 1 as test from sysibm.sysdummy1"); 23 | count += 1; 24 | } 25 | 26 | var elapsed = (new Date().getTime() - time)/1000; 27 | process.stdout.write("(" + count + " queries issued in " + elapsed + " seconds, " + (count/elapsed).toFixed(2) + " query/sec)"); 28 | db.close(function () { }); 29 | } 30 | -------------------------------------------------------------------------------- /test/config.json: -------------------------------------------------------------------------------- 1 | { "DRIVER" : "{DB2 ODBC Driver}", 2 | "DATABASE" : "SAMPLE", 3 | "UID" : "db2user", 4 | "PWD" : "xxxxxx", 5 | "HOSTNAME" : "waldevdbclnxtst06.dev.rocketsoftware.com", 6 | "PORT" : 60000, 7 | "PROTOCOL" : "TCPIP" 8 | } 9 | -------------------------------------------------------------------------------- /test/config.zos.json: -------------------------------------------------------------------------------- 1 | { "DSN" : "SAMPLE", 2 | "UID" : "db2user", 3 | "PWD" : "xxxxxx" 4 | } 5 | -------------------------------------------------------------------------------- /test/data/.gitignore: -------------------------------------------------------------------------------- 1 | sqlite-test.db 2 | -------------------------------------------------------------------------------- /test/data/panda.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ibmdb/node-ibm_db/8f2ada082ad93a135644dd6ab5f089ea201f8b70/test/data/panda.jpg -------------------------------------------------------------------------------- /test/data/phool.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ibmdb/node-ibm_db/8f2ada082ad93a135644dd6ab5f089ea201f8b70/test/data/phool.jpg -------------------------------------------------------------------------------- /test/data/pushpa.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ibmdb/node-ibm_db/8f2ada082ad93a135644dd6ab5f089ea201f8b70/test/data/pushpa.jpg -------------------------------------------------------------------------------- /test/data/sample1.txt: -------------------------------------------------------------------------------- 1 | create table sample(no integer,name varchar(10)); 2 | insert into sample values(1,'pri'); 3 | insert into sample values(2,'anbu'); 4 | select * from sample; 5 | drop table sample; 6 | create table sample1(no integer); 7 | insert into sample1 values(1); 8 | insert into sample1 values(2); 9 | select * from sample1; 10 | drop table sample1 -------------------------------------------------------------------------------- /test/data/sample2.txt: -------------------------------------------------------------------------------- 1 | create table sample(no integer,name varchar(10))%insert into sample values(1,'pri')%insert into sample values(2,'anbu')%select * from sample%drop table sample%create table sample1(no integer)%insert into sample1 values(1)%insert into sample1 values(2)%select * from sample1%drop table sample1 -------------------------------------------------------------------------------- /test/data/sample3.txt: -------------------------------------------------------------------------------- 1 | create table sample(no integer,name varchar(10))@insert into sample values(1,'pri')@insert into sample values(2,'anbu')@select * from sample@drop table sample@create table sample1(no integer)@insert into sample1 values(1)@insert into sample1 values(2)@select * from sample1@drop table sample1 -------------------------------------------------------------------------------- /test/data/sampledoc.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ibmdb/node-ibm_db/8f2ada082ad93a135644dd6ab5f089ea201f8b70/test/data/sampledoc.docx -------------------------------------------------------------------------------- /test/disabled/test-binding-statement-rebinding.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , odbc = require("../") 3 | , db = new odbc.ODBC() 4 | , assert = require("assert") 5 | , exitCode = 0 6 | ; 7 | 8 | /* 9 | * The purpose of this test is to test binding an array and then 10 | * changing the values of the array before an execute[Sync] 11 | * call and have the new array values be used. 12 | */ 13 | 14 | db.createConnection(function (err, conn) { 15 | 16 | console.log(common.connectionString); 17 | conn.openSync(common.connectionString); 18 | 19 | conn.createStatement(function (err, stmt) { 20 | var r, result, caughtError; 21 | 22 | var a = ['hello', 'world']; 23 | 24 | stmt.prepareSync('select ? as col1, ? as col2'); 25 | 26 | stmt.bindSync(a); 27 | 28 | result = stmt.executeSync(); 29 | 30 | console.log(result.fetchAllSync()); 31 | result.closeSync(); 32 | 33 | a[0] = 'goodbye'; 34 | a[1] = 'steven'; 35 | 36 | result = stmt.executeSync(); 37 | 38 | r = result.fetchAllSync(); 39 | 40 | try { 41 | assert.deepEqual(r, [ { col1: 'goodbye', col2: 'steven' } ]); 42 | } 43 | catch (e) { 44 | console.log(e); 45 | exitCode = 1; 46 | } 47 | 48 | conn.closeSync(); 49 | 50 | if (exitCode) { 51 | console.log("failed"); 52 | } 53 | else { 54 | console.log("success"); 55 | } 56 | 57 | process.exit(exitCode); 58 | }); 59 | }); 60 | -------------------------------------------------------------------------------- /test/disabled/test-open-dont-close.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , odbc = require("../") 3 | , db = new odbc.Database(); 4 | 5 | db.open(common.connectionString, function(err) { 6 | console.error('db.open callback'); 7 | console.error('node should just sit and wait'); 8 | //console.log(err); 9 | //reference db here so it isn't garbage collected: 10 | 11 | console.log(db.connected); 12 | }); 13 | -------------------------------------------------------------------------------- /test/disabled/test-param-select-with-booleans-only.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , odbc = require("../") 3 | , db = new odbc.Database() 4 | , assert = require("assert"); 5 | 6 | 7 | db.open(common.testConnectionStrings[0].connectionString, function (err) { 8 | assert.equal(err, null); 9 | 10 | db.query("select ? as \"TRUECOL\", ? as \"FALSECOL\" FROM SYSIBM.SYSDUMMY1" 11 | , [true, false] 12 | , function (err, data, more) { 13 | db.close(function () { 14 | assert.equal(err, null); 15 | assert.deepEqual(data, [{ 16 | TRUECOL: true, 17 | FALSECOL: false 18 | }]); 19 | }); 20 | }); 21 | }); 22 | -------------------------------------------------------------------------------- /test/disabled/test-param-select-with-decimals-only.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , odbc = require("../") 3 | , db = new odbc.Database() 4 | , assert = require("assert"); 5 | 6 | 7 | db.open(common.connectionString, function (err) { 8 | assert.equal(err, null); 9 | 10 | db.query("select ? as \"DECCOL1\" " 11 | , [5.5] 12 | , function (err, data, more) { 13 | db.close(function () { 14 | assert.equal(err, null); 15 | assert.deepEqual(data, [{ 16 | DECCOL1: 5.5 17 | }]); 18 | }); 19 | }); 20 | }); 21 | -------------------------------------------------------------------------------- /test/disabled/test-param-select-with-null.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , odbc = require("../") 3 | , db = new odbc.Database() 4 | , assert = require("assert"); 5 | 6 | 7 | db.open(common.connectionString, function (err) { 8 | assert.equal(err, null); 9 | 10 | db.query("select ? as \"NULLCOL1\" " 11 | , [null] 12 | , function (err, data, more) { 13 | if (err) { console.error(err) } 14 | db.close(function () { 15 | assert.equal(err, null); 16 | assert.deepEqual(data, [{ 17 | NULLCOL1: null 18 | }]); 19 | }); 20 | }); 21 | }); 22 | -------------------------------------------------------------------------------- /test/disabled/test-param-select-with-nulls-mixed.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , odbc = require("../") 3 | , db = new odbc.Database() 4 | , assert = require("assert"); 5 | 6 | 7 | db.open(common.connectionString, function (err) { 8 | assert.equal(err, null); 9 | 10 | db.query("select ? as \"TEXTCOL1\", ? as \"TEXTCOL2\", ? as \"NULLCOL1\" " 11 | , ["something", "something", null] 12 | , function (err, data, more) { 13 | if (err) { console.error(err) } 14 | db.close(function () { 15 | assert.equal(err, null); 16 | assert.deepEqual(data, [{ 17 | TEXTCOL1: "something", 18 | TEXTCOL2: "something", 19 | NULLCOL1: null 20 | }]); 21 | }); 22 | }); 23 | }); 24 | -------------------------------------------------------------------------------- /test/disabled/test-param-select-with-numbers-mixed.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , odbc = require("../") 3 | , db = new odbc.Database() 4 | , assert = require("assert"); 5 | 6 | 7 | db.open(common.connectionString, function (err) { 8 | assert.equal(err, null); 9 | 10 | db.query("select ? as TEXTCOL, ? as TEXTCOL2, ? as INTCOL " 11 | , ["fish", "asdf", 1] 12 | , function (err, data, more) { 13 | db.close(function () { 14 | assert.equal(err, null); 15 | assert.deepEqual(data, [{ 16 | TEXTCOL: 'fish', 17 | TEXTCOL2: 'asdf', 18 | INTCOL: 1 19 | }]); 20 | }); 21 | }); 22 | }); 23 | -------------------------------------------------------------------------------- /test/disabled/test-param-select-with-numbers-only.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , odbc = require("../") 3 | , db = new odbc.Database() 4 | , assert = require("assert"); 5 | 6 | 7 | db.open(common.connectionString, function (err) { 8 | assert.equal(err, null); 9 | 10 | db.query("select ? as INTCOL1, ? as INTCOL2, ? as INTCOL3, ? as FLOATCOL4, ? as FLOATYINT" 11 | , [5, 3, 1, 1.23456789012345, 12345.000] 12 | , function (err, data, more) { 13 | db.close(function () { 14 | assert.equal(err, null); 15 | assert.deepEqual(data, [{ 16 | INTCOL1: 5, 17 | INTCOL2: 3, 18 | INTCOL3: 1, 19 | FLOATCOL4 : 1.23456789012345, 20 | FLOATYINT : 12345 21 | }]); 22 | }); 23 | }); 24 | }); 25 | -------------------------------------------------------------------------------- /test/disabled/test-param-select-with-strings-only.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , odbc = require("../") 3 | , db = new odbc.Database() 4 | , assert = require("assert"); 5 | 6 | 7 | db.open(common.testConnectionStrings[0].connectionString, function (err) { 8 | assert.equal(err, null); 9 | 10 | db.query("select ? as TEXTCOL, ? as TEXTCOL2, ? as TEXTCOL3 FROM SYSIBM.SYSDUMMY1" 11 | , ["fish", "asdf", "1234"] 12 | , function (err, data, more) { 13 | console.log('Error: '+err); 14 | db.close(function () { 15 | assert.equal(err, null); 16 | assert.deepEqual(data, [{ 17 | TEXTCOL: 'fish', 18 | TEXTCOL2: 'asdf', 19 | TEXTCOL3: '1234' 20 | }]); 21 | }); 22 | }); 23 | }); 24 | -------------------------------------------------------------------------------- /test/disabled/test-param-select-with-unicode.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , odbc = require("../") 3 | , db = new odbc.Database() 4 | , assert = require("assert") 5 | ; 6 | 7 | db.open(common.connectionString, function(err) { 8 | db.query("select ? as UNICODETEXT", ['ף צ ץ ק ר ש תכ ך ל מ ם נ ן ס ע פ 電电電買买買開开開東东東車车車'], function (err, data) { 9 | db.close(function () { 10 | console.log(data); 11 | assert.equal(err, null); 12 | assert.deepEqual(data, [{ UNICODETEXT: 'ף צ ץ ק ר ש תכ ך ל מ ם נ ן ס ע פ 電电電買买買開开開東东東車车車' }]); 13 | }); 14 | }); 15 | }); 16 | -------------------------------------------------------------------------------- /test/disabled/test-prepare-bind-execute-closeSync.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , odbc = require("../") 3 | , db = new odbc.Database() 4 | , assert = require("assert") 5 | , iterations = 1000 6 | ; 7 | 8 | db.openSync(common.connectionString); 9 | 10 | issueQuery3(function () { 11 | finish(); 12 | }); 13 | 14 | 15 | function issueQuery3(done) { 16 | var count = 0 17 | , time = new Date().getTime(); 18 | 19 | var stmt = db.prepareSync('select ? as test'); 20 | 21 | for (var x = 0; x < iterations; x++) { 22 | (function (x) { 23 | stmt.bind([x], function (err) { 24 | if (err) { 25 | console.log(err); 26 | return finish(); 27 | } 28 | 29 | //console.log(x); 30 | 31 | stmt.execute(function (err, result) { 32 | cb(err, result, x); 33 | }); 34 | }); 35 | })(x); 36 | } 37 | 38 | function cb (err, result, x) { 39 | if (err) { 40 | console.error(err); 41 | return finish(); 42 | } 43 | 44 | var a = result.fetchAllSync(); 45 | 46 | assert.deepEqual(a, [{ test : x }]); 47 | 48 | result.closeSync(); 49 | 50 | if (++count == iterations) { 51 | var elapsed = new Date().getTime() - time; 52 | 53 | console.log("%d queries issued in %d seconds, %d/sec : Prepare - Bind - Execute - CloseSync", count, elapsed/1000, Math.floor(count/(elapsed/1000))); 54 | return done(); 55 | } 56 | } 57 | } 58 | 59 | function finish() { 60 | db.closeSync(); 61 | console.log("connection closed"); 62 | } 63 | -------------------------------------------------------------------------------- /test/disabled/test-prepare-bind-execute-error.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , odbc = require("../") 3 | , db = new odbc.Database() 4 | , assert = require("assert") 5 | ; 6 | 7 | db.openSync(common.connectionString); 8 | issueQuery(); 9 | 10 | function issueQuery() { 11 | var count = 0 12 | , time = new Date().getTime() 13 | , stmt 14 | , result 15 | , data 16 | ; 17 | 18 | assert.doesNotThrow(function () { 19 | stmt = db.prepareSync('select cast(? as datetime) as test'); 20 | }); 21 | 22 | assert.throws(function () { 23 | result = stmt.executeSync(); 24 | }); 25 | 26 | assert.doesNotThrow(function () { 27 | stmt.bindSync([0]); 28 | }); 29 | 30 | assert.doesNotThrow(function () { 31 | result = stmt.executeSync(); 32 | }); 33 | 34 | assert.doesNotThrow(function () { 35 | data = result.fetchAllSync(); 36 | }); 37 | 38 | assert.ok(data); 39 | 40 | finish(0); 41 | } 42 | 43 | function finish(exitCode) { 44 | db.closeSync(); 45 | 46 | console.log("connection closed"); 47 | 48 | process.exit(exitCode || 0); 49 | } 50 | -------------------------------------------------------------------------------- /test/disabled/test-prepare-bind-execute-long-string.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , odbc = require("../") 3 | , db = new odbc.Database() 4 | , assert = require("assert") 5 | ; 6 | 7 | db.openSync(common.connectionString); 8 | issueQuery(); 9 | 10 | function issueQuery() { 11 | var count = 0 12 | , time = new Date().getTime() 13 | , stmt 14 | , result 15 | , data 16 | , str = '' 17 | ; 18 | 19 | var set = 'abcdefghijklmnopqrstuvwxyz'; 20 | 21 | for (var x = 0; x < 1000001; x++) { 22 | str += set[x % set.length]; 23 | } 24 | 25 | assert.doesNotThrow(function () { 26 | stmt = db.prepareSync('select ? as longString'); 27 | }); 28 | 29 | assert.doesNotThrow(function () { 30 | stmt.bindSync([str]); 31 | }); 32 | 33 | assert.doesNotThrow(function () { 34 | result = stmt.executeSync(); 35 | }); 36 | 37 | assert.doesNotThrow(function () { 38 | data = result.fetchAllSync(); 39 | }); 40 | 41 | // console.log(data); 42 | console.log(str.length); 43 | console.log(data[0].longString.length); 44 | 45 | for (var x = 0; x < str.length; x++) { 46 | if (str[x] != data[0].longString[x]) { 47 | console.log(x, str[x], data[0].longString[x]); 48 | 49 | assert.equal(str[x], data[0].longString[x]); 50 | } 51 | } 52 | 53 | assert.equal(data[0].longString, str); 54 | 55 | finish(0); 56 | } 57 | 58 | function finish(exitCode) { 59 | db.closeSync(); 60 | 61 | console.log("connection closed"); 62 | process.exit(exitCode || 0); 63 | } 64 | -------------------------------------------------------------------------------- /test/disabled/test-prepare-bind-executeNonQuery.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , odbc = require("../") 3 | , assert = require("assert") 4 | , db = new odbc.Database() 5 | , iterations = 100000 6 | ; 7 | 8 | db.open(common.connectionString, function(err){ 9 | if (err) { 10 | console.error(err); 11 | process.exit(1); 12 | } 13 | 14 | issueQuery2(function () { 15 | finish(); 16 | }); 17 | }); 18 | 19 | function issueQuery2(done) { 20 | var count = 0 21 | , time = new Date().getTime(); 22 | 23 | var stmt = db.prepareSync('select ? as test'); 24 | 25 | for (var x = 0; x < iterations; x++) { 26 | (function (x) { 27 | stmt.bind([x], function (err) { 28 | if (err) { 29 | console.log(err); 30 | return finish(); 31 | } 32 | 33 | stmt.executeNonQuery(function (err, result) { 34 | cb(err, result, x); 35 | }); 36 | }); 37 | })(x); 38 | } 39 | 40 | function cb (err, data, x) { 41 | if (err) { 42 | console.error(err); 43 | return finish(); 44 | } 45 | 46 | //TODO: there's nothing to assert in this case. 47 | //we actually need to insert data and then get 48 | //the data back out and then assert. 49 | 50 | if (++count == iterations) { 51 | var elapsed = new Date().getTime() - time; 52 | 53 | console.log("%d queries issued in %d seconds, %d/sec : Prepare - Bind - ExecuteNonQuery ", count, elapsed/1000, Math.floor(count/(elapsed/1000))); 54 | return done(); 55 | } 56 | } 57 | } 58 | 59 | function finish() { 60 | db.close(function () { 61 | console.log("connection closed"); 62 | }); 63 | } 64 | -------------------------------------------------------------------------------- /test/disabled/test-prepare-bindSync-execute-closeSync.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , odbc = require("../") 3 | , assert = require("assert") 4 | , db = new odbc.Database() 5 | , iterations = 100 6 | ; 7 | 8 | db.openSync(common.connectionString); 9 | 10 | issueQuery3(function () { 11 | finish(); 12 | }); 13 | 14 | function issueQuery3(done) { 15 | var count = 0 16 | , time = new Date().getTime(); 17 | 18 | var stmt = db.prepareSync('select ? as test'); 19 | 20 | for (var x = 0; x < iterations; x++) { 21 | (function (x) { 22 | stmt.bindSync([x]); 23 | var result = stmt.executeSync() 24 | cb(result, x); 25 | 26 | })(x); 27 | } 28 | 29 | function cb (result, x) { 30 | assert.deepEqual(result.fetchAllSync(), [ { test : x } ]); 31 | 32 | result.closeSync(); 33 | 34 | if (++count == iterations) { 35 | var elapsed = new Date().getTime() - time; 36 | 37 | console.log("%d queries issued in %d seconds, %d/sec : Prepare - Bind - Execute - CloseSync", count, elapsed/1000, Math.floor(count/(elapsed/1000))); 38 | return done(); 39 | } 40 | } 41 | } 42 | 43 | function finish() { 44 | db.closeSync(); 45 | console.log("connection closed"); 46 | } 47 | -------------------------------------------------------------------------------- /test/disabled/test-prepare-bindSync-executeNonQuery.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , odbc = require("../") 3 | , db = new odbc.Database() 4 | , iterations = 100000 5 | ; 6 | 7 | db.open(common.connectionString, function(err){ 8 | if (err) { 9 | console.error(err); 10 | process.exit(1); 11 | } 12 | 13 | issueQuery2(function () { 14 | finish(); 15 | }); 16 | }); 17 | 18 | function issueQuery2(done) { 19 | var count = 0 20 | , time = new Date().getTime(); 21 | 22 | var stmt = db.prepareSync('select ? as test'); 23 | 24 | for (var x = 0; x < iterations; x++) { 25 | (function (x) { 26 | stmt.bindSync([x]); 27 | stmt.executeNonQuery(cb); 28 | })(x); 29 | } 30 | 31 | function cb (err, data) { 32 | if (err) { 33 | console.error(err); 34 | return finish(); 35 | } 36 | 37 | if (++count == iterations) { 38 | var elapsed = new Date().getTime() - time; 39 | 40 | console.log("%d queries issued in %d seconds, %d/sec : Prepare - Bind - ExecuteNonQuery ", count, elapsed/1000, Math.floor(count/(elapsed/1000))); 41 | return done(); 42 | } 43 | } 44 | } 45 | 46 | function finish() { 47 | db.close(function () { 48 | console.log("connection closed"); 49 | }); 50 | } 51 | -------------------------------------------------------------------------------- /test/disabled/test-prepare.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , odbc = require("../") 3 | , db = new odbc.Database() 4 | , assert = require("assert") 5 | ; 6 | 7 | db.openSync(common.connectionString); 8 | 9 | assert.equal(db.connected, true); 10 | 11 | db.prepare("select 'abc' as col1 from SYSIBM.SYSDUMMY1", function (err, stmt) { 12 | assert.equal(err, null); 13 | assert.equal(stmt.constructor.name, "ODBCStatement"); 14 | 15 | stmt.bind(["hello world"], function (err) { 16 | assert.equal(err, null); 17 | 18 | stmt.execute(function (err, result) { 19 | assert.equal(err, null); 20 | assert.equal(result.constructor.name, "ODBCResult"); 21 | 22 | result.fetchAll(function (err, data) { 23 | assert.equal(err, null); 24 | console.log(data); 25 | 26 | result.closeSync(); 27 | 28 | db.closeSync(); 29 | assert.deepEqual(data, [{ col1: "hello world" }]); 30 | }); 31 | }); 32 | }); 33 | }); 34 | 35 | -------------------------------------------------------------------------------- /test/disabled/test-prepareSync.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , odbc = require("../") 3 | , db = new odbc.Database() 4 | , assert = require("assert") 5 | ; 6 | 7 | db.openSync(common.connectionString); 8 | assert.equal(db.connected, true); 9 | 10 | var stmt = db.prepareSync("select ? as col1, ? as col2, ? as col3"); 11 | assert.equal(stmt.constructor.name, "ODBCStatement"); 12 | 13 | stmt.bindSync(["hello world", 1, null]); 14 | 15 | stmt.execute(function (err, result) { 16 | assert.equal(err, null); 17 | assert.equal(result.constructor.name, "ODBCResult"); 18 | 19 | result.fetchAll(function (err, data) { 20 | assert.equal(err, null); 21 | console.log(data); 22 | 23 | result.closeSync(); 24 | 25 | db.closeSync(); 26 | assert.deepEqual(data, [{ col1: "hello world", col2 : 1, col3 : null }]); 27 | }); 28 | }); 29 | 30 | -------------------------------------------------------------------------------- /test/disabled/test-query-select-fetchAll.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , odbc = require("../") 3 | , db = new odbc.Database() 4 | , assert = require("assert") 5 | ; 6 | 7 | db.openSync(common.connectionString); 8 | 9 | assert.equal(db.connected, true); 10 | 11 | db.queryResult("select 1 as COLINT, 'some test' as COLTEXT union select 2, 'something else' FROM SYSIBM.SYSDUMMY1", function (err, result) { 12 | assert.equal(err, null); 13 | assert.equal(result.constructor.name, "ODBCResult"); 14 | 15 | result.fetchAll(function (err, data) { 16 | db.closeSync(); 17 | assert.deepEqual(data, [ 18 | {"COLINT":1,"COLTEXT":"some test"} 19 | ,{"COLINT":2,"COLTEXT":"something else"} 20 | ]); 21 | }); 22 | }); 23 | 24 | -------------------------------------------------------------------------------- /test/disabled/test-query-select-fetchAllSync.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , odbc = require("../") 3 | , db = new odbc.Database() 4 | , assert = require("assert") 5 | ; 6 | 7 | db.openSync(common.connectionString); 8 | 9 | assert.equal(db.connected, true); 10 | 11 | db.queryResult("select 1 as COLINT, 'some test' as COLTEXT union select 2, 'something else' FROM SYSIBM.SYSDUMMY1", function (err, result) { 12 | assert.equal(err, null); 13 | assert.equal(result.constructor.name, "ODBCResult"); 14 | 15 | var data = result.fetchAllSync(); 16 | 17 | db.closeSync(); 18 | assert.deepEqual(data, [ 19 | {"COLINT":1,"COLTEXT":"some test"} 20 | ,{"COLINT":2,"COLTEXT":"something else"} 21 | ]); 22 | }); 23 | 24 | -------------------------------------------------------------------------------- /test/disabled/test-query-select-unicode.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , odbc = require("../") 3 | , db = new odbc.Database() 4 | , assert = require("assert") 5 | ; 6 | 7 | db.openSync(common.connectionString); 8 | 9 | db.query("select '☯ąčęėįšųūž☎áäàéêèóöòüßÄÖÜ€ шчябы Ⅲ ❤' as UNICODETEXT FROM SYSIBM.SYSDUMMY1", function (err, data) { 10 | db.closeSync(); 11 | console.log(data); 12 | assert.equal(err, null); 13 | assert.deepEqual(data, [{ UNICODETEXT: '☯ąčęėįšųūž☎áäàéêèóöòüßÄÖÜ€ шчябы Ⅲ ❤' }]); 14 | }); 15 | 16 | -------------------------------------------------------------------------------- /test/disabled/test-querySync-select-unicode.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , odbc = require("../") 3 | , db = new odbc.Database() 4 | , assert = require("assert") 5 | ; 6 | 7 | db.openSync(common.connectionString); 8 | var data; 9 | 10 | try { 11 | data = db.querySync("select 'ꜨꜢ' as UNICODETEXT FROM SYSIBM.SYSDUMMY1"); 12 | } 13 | catch (e) { 14 | console.log(e); 15 | } 16 | 17 | db.closeSync(); 18 | console.log(data); 19 | assert.deepEqual(data, [{ UNICODETEXT: 'ꜨꜢ' }]); 20 | 21 | -------------------------------------------------------------------------------- /test/nodeEE-leak-multiple-query.js: -------------------------------------------------------------------------------- 1 | var common = require("./common"), 2 | odbc = require("../"), 3 | db = new odbc.Database(), 4 | assert = require("assert"), 5 | util = require('util'), 6 | initialMemHeap = 0, 7 | maxDiff = 1000000, 8 | insertCount = 0; 9 | try 10 | { 11 | global.gc(); 12 | initialMemHeap = util.inspect(process.memoryUsage().heapUsed); 13 | db.open(common.connectionString, function(err) { 14 | runQueries(); 15 | }); 16 | 17 | } 18 | catch(e) 19 | { 20 | console.log(e); 21 | db.close(function () { 22 | console.log("Connection closed on error"); 23 | }); 24 | 25 | } 26 | 27 | function runQueries() 28 | { 29 | db.query("create table T1Leak (PID INTEGER, C1 VARCHAR(255), C2 VARCHAR(255), C3 VARCHAR(255))", function(err, data){ 30 | if (err == null) 31 | { 32 | console.log("Table T1Leak created"); 33 | } 34 | 35 | else 36 | { 37 | console.log(err); 38 | } 39 | }); 40 | 41 | db.query("INSERT into T1Leak values (1, 'PersonA', 'LastNameA', 'QA')", icback); 42 | db.query("INSERT into T1Leak values (2, 'PersonB', 'LastNameB', 'Dev')", icback); 43 | db.query("INSERT into T1Leak values (3, 'PersonC', 'LastNameC', 'QA')", icback); 44 | db.query("INSERT into T1Leak values (4, 'PersonD', 'LastNameD', 'QA')", icback); 45 | db.query("INSERT into T1Leak values (5, 'PersonE', 'LastNameE', 'QA')", icback); 46 | 47 | db.query("SELECT * from T1Leak", scback); 48 | 49 | db.query("UPDATE T1Leak SET C3 = 'QA Intern' where C2 = 'LastNameD'", ucback); 50 | db.query("SELECT * from T1Leak where C3 = 'QA Intern'", scback); 51 | db.query("SELECT count(*) from T1Leak where PID = 7", scback); 52 | db.query("DELETE from T1Leak where PID = 5", dcback); 53 | db.query("INSERT into T1Leak values (6, 'PersonF', 'LastNameF', 'QA Lead')", icback); 54 | db.query("SELECT * from T1Leak where PID = 5", scback); 55 | db.query("DROP table T1Leak", drcback); 56 | } 57 | 58 | function icback(err, data) 59 | { 60 | if (err == null) 61 | { 62 | insertCount++; 63 | } 64 | 65 | else 66 | { 67 | console.log(err); 68 | } 69 | } 70 | 71 | function scback(err, data) 72 | { 73 | if (err == null) 74 | { 75 | console.log("Select statement successful"); 76 | } 77 | 78 | else 79 | { 80 | console.log(err); 81 | } 82 | } 83 | function ucback(err, data) 84 | { 85 | if (err == null) 86 | { 87 | console.log("Update statement successful"); 88 | } 89 | 90 | else 91 | { 92 | console.log(err); 93 | } 94 | } 95 | function dcback(err, data) 96 | { 97 | if (err == null) 98 | { 99 | console.log("Delete row(s) successful"); 100 | } 101 | 102 | else 103 | { 104 | console.log(err); 105 | } 106 | } 107 | function drcback(err, data) 108 | { 109 | if (err == null) 110 | { 111 | console.log("Drop table T1Leak successful"); 112 | 113 | } 114 | else 115 | { 116 | console.log(err); 117 | } 118 | 119 | closedbConnection(); 120 | } 121 | function closedbConnection() 122 | { 123 | db.close(function () { 124 | console.log("Database Connection Closed"); 125 | checkMemory(); 126 | }); 127 | } 128 | function checkMemory() 129 | { 130 | global.gc(); 131 | diffHeapUse = util.inspect(process.memoryUsage().heapUsed) - initialMemHeap; 132 | console.log("DIFFERENCE ", diffHeapUse); 133 | assert(diffHeapUse < maxDiff); 134 | } -------------------------------------------------------------------------------- /test/perfTest.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | var common = require("./common.js") 4 | , odbc = require("../") 5 | , db = new odbc.Database() 6 | , iterations = 100000 7 | ; 8 | 9 | db.open(common.connectionString, function(err){ 10 | if (err) { 11 | console.error(err); 12 | process.exit(1); 13 | } 14 | 15 | issueQuery2(function () { 16 | finish(); 17 | }); 18 | }); 19 | 20 | function issueQuery2(done) { 21 | var count = 0 22 | , time = new Date().getTime(); 23 | 24 | var stmt = db.prepareSync('select cast(? as integer) as test FROM SYSIBM.SYSDUMMY1'); 25 | 26 | for (var x = 0; x < iterations; x++) { 27 | (function (x) { 28 | stmt.executeNonQuery([x], cb); 29 | })(x); 30 | } 31 | 32 | function cb (err, data) { 33 | 34 | if (err) { 35 | console.error(err); 36 | return finish(); 37 | } 38 | 39 | if (++count == iterations) { 40 | var elapsed = new Date().getTime() - time; 41 | 42 | console.log("%d queries issued in %d seconds, %d/sec : Prepare - ExecuteNonQuery ", count, elapsed/1000, Math.floor(count/(elapsed/1000))); 43 | return done(); 44 | } 45 | } 46 | } 47 | 48 | function finish() { 49 | db.close(function () { 50 | console.log("connection closed"); 51 | }); 52 | } 53 | 54 | -------------------------------------------------------------------------------- /test/promise-test-all-data-types.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , ibmdb = require("../") 3 | , assert = require("assert") 4 | , cn = common.connectionString; 5 | 6 | ibmdb.open(cn).then(function(conn) { 7 | //conn.querySync("drop table mytab1"); 8 | return conn; 9 | }, function(err) { 10 | console.log(err) 11 | }) 12 | .then(function(conn) { 13 | conn.querySync("create table mytab1 (c1 int, c2 SMALLINT, c3 BIGINT, c4 INTEGER, c5 DECIMAL(3), c6 NUM, c7 float, c8 double, c9 decfloat, c10 char(10), c11 varchar(10), c12 char for bit data, c13 clob(10), c14 date, c15 time, c16 timestamp, c17 blob(10))"); 14 | conn.querySync("insert into mytab1 values (1, 2, 456736789, 1234, 67.98, 5689, 56.2390, 34567890, 45.234, 'bimal', 'kumar', '\x50', 'jha123456', '2015-09-10', '10:16:33', '2015-09-10 10:16:33.770139', BLOB(x'616263'))"); 15 | conn.query("select * from mytab1").then(function(data) { 16 | console.log(data); 17 | conn.querySync("drop table mytab1"); 18 | conn.closeSync(); 19 | 20 | assert.deepEqual(data, 21 | [ { C1: 1, 22 | C2: 2, 23 | C3: '456736789', 24 | C4: 1234, 25 | C5: '67', 26 | C6: '5689', 27 | C7: 56.239, 28 | C8: 34567890, 29 | C9: '45.234', 30 | C10: 'bimal ', 31 | C11: 'kumar', 32 | C12: '50', 33 | C13: 'jha123456', 34 | C14: '2015-09-10', 35 | C15: '10:16:33', 36 | C16: '2015-09-10 10:16:33.770139', 37 | C17: 'abc' } ]); 38 | 39 | }, function(err) { 40 | console.log(err); 41 | }); 42 | }); 43 | -------------------------------------------------------------------------------- /test/promise-test-open-close.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , ibmdb = require("../") 3 | , db = new ibmdb.Database() 4 | , assert = require("assert"); 5 | 6 | db.query("select * from " + common.tableName).then(null, function (err) { 7 | assert.deepEqual(err, { message: 'Connection not open.' }); 8 | assert.equal(db.connected, false); 9 | }); 10 | 11 | db.open(common.connectionString).then(function(res) { 12 | console.log("db = ", db); 13 | assert.equal(db.connected, true); 14 | db.query("select * from " + common.tableName).then(null, function (err) { 15 | var errorFound = false; 16 | if(err) console.log(err); 17 | if (err.message) { 18 | var errorFound = err.message.includes("SQL0204N"); 19 | } 20 | assert.equal(errorFound, true); 21 | assert.equal(db.connected, true); 22 | db.close().then(function () { 23 | assert.equal(db.connected, false); 24 | 25 | db.query("select * from " + common.tableName).then(null, function (err) { 26 | if(err) console.log(err); 27 | assert.deepEqual(err, { message: 'Connection not open.' }); 28 | assert.equal(db.connected, false); 29 | }); 30 | }); 31 | }); 32 | }) 33 | .catch(function(err){console.log(err);}) 34 | .done(); 35 | -------------------------------------------------------------------------------- /test/quick-example.ts: -------------------------------------------------------------------------------- 1 | // To run this quick-example.ts file, follow below steps 2 | // npm install -g typescript 3 | // npm install --save-dev @types/node 4 | // update database connection info in ../test/config.json file or 5 | // set environment variables DB2_USER, DB2_PASSWD, etc. 6 | // tsc quick-example.ts --target ES2016 --lib ES2016 7 | // node quick-example.js 8 | // OR, run: 9 | // tsc quick-example.ts && node quick-example.js && rm quick-example.js 10 | // 11 | // To run this test program using ts-node, Allow JavaScript 12 | // Modules in tsconfig.json file. For that - 13 | // Modify your tsconfig.json to allow JS modules: 14 | // Open tsconfig.json 15 | // Add or modify these options: 16 | // { 17 | // "compilerOptions": { 18 | // "allowJs": true, // Allow JS modules 19 | // "skipLibCheck": true, // Skip type checking for JS files 20 | // "noImplicitAny": false, // Allow 'any' type 21 | // "moduleResolution": "node" // Use Node.js module resolution 22 | // } 23 | // } 24 | // Save the file and rerun: 25 | // ts-node quick-example.ts 26 | 27 | import * as common from "./common"; 28 | import * as ibmdb from "../"; 29 | import * as assert from "assert"; 30 | 31 | // Define connection string 32 | const cn: string = common.connectionString; 33 | 34 | async function main(): Promise { 35 | try { 36 | // Open connection 37 | const conn = await ibmdb.open(cn); 38 | 39 | // Execute queries 40 | await conn.query("create table mytab(c1 int, c2 varchar(10))"); 41 | await conn.query("insert into mytab values (?, ?)", [3, 'ibm']); 42 | 43 | // Prepare and execute statement 44 | const stmt = await conn.prepare("select * from mytab"); 45 | const result = await stmt.execute(); 46 | const data: { C1: number; C2: string }[] = await result.fetchAll(); 47 | 48 | // Log results 49 | console.log("result = ", data); 50 | assert.deepEqual(data, [{ C1: 3, C2: 'ibm' }]); 51 | 52 | // Close resources 53 | await result.close(); 54 | await stmt.close(); 55 | 56 | // Drop table (ignore errors) 57 | await conn.query("drop table mytab").catch((e: Error) => console.error("Drop table error:", e)); 58 | 59 | await conn.close(); 60 | } catch (e: unknown) { // Explicitly type as `unknown` and check type 61 | if (e instanceof Error) { 62 | console.error("Error:", e.message); 63 | } else { 64 | console.error("An unknown error occurred:", e); 65 | } 66 | } 67 | } 68 | 69 | // Run the function 70 | main(); 71 | 72 | -------------------------------------------------------------------------------- /test/run-bench.js: -------------------------------------------------------------------------------- 1 | var fs = require("fs") 2 | , common = require('./common.js') 3 | , spawn = require("child_process").spawn 4 | , requestedBench = null 5 | , errorCount = 0 6 | , testCount = 0 7 | , files 8 | ; 9 | 10 | if (process.argv.length === 3) { 11 | requestedBench = process.argv[2]; 12 | } 13 | 14 | var connectionStrings = common.benchConnectionStrings; 15 | 16 | //check to see if the requested test is actually a driver to benchmark 17 | if (requestedBench) { 18 | connectionStrings.forEach(function (connectionString) { 19 | if (requestedBench == connectionString.title) { 20 | connectionStrings = [connectionString]; 21 | requestedBench = null; 22 | } 23 | }); 24 | } 25 | 26 | doNextConnectionString(); 27 | 28 | function doBench(file, connectionString) { 29 | var bench = spawn("node", ['--expose_gc',file, connectionString.connectionString]); 30 | 31 | process.stdout.write("Running test for [\033[01;29m" + connectionString.title + "\033[01;0m] : \033[01;33m" + 32 | file.replace(/\.js$/, "") + "\033[01;0m"); 33 | process.stdout.write(" ... "); 34 | 35 | testCount += 1; 36 | 37 | bench.on("exit", function (code, signal) { 38 | process.stdout.write(" ... "); 39 | if (code != 0) { 40 | errorCount += 1; 41 | process.stdout.write("\033[01;31mfail \033[01;0m "); 42 | } 43 | else { 44 | process.stdout.write("\033[01;32msuccess \033[01;0m "); 45 | } 46 | process.stdout.write("\n"); 47 | 48 | doNextBench(connectionString); 49 | }); 50 | 51 | bench.stdout.on("data", function (data) { 52 | process.stdout.write(data); 53 | }); 54 | } 55 | 56 | function doNextBench(connectionString) { 57 | if (files.length) { 58 | var benchFile = files.shift(); 59 | 60 | doBench(benchFile, connectionString); 61 | } 62 | else { 63 | //we're done with this connection string, display results and exit accordingly 64 | doNextConnectionString(); 65 | } 66 | } 67 | 68 | function doNextConnectionString() { 69 | if (connectionStrings.length) { 70 | var connectionString = connectionStrings.shift(); 71 | 72 | if (requestedBench) { 73 | files = [requestedBench]; 74 | } 75 | else { 76 | //re-read files 77 | files = fs.readdirSync("./"); 78 | 79 | files = files.filter(function (file) { 80 | return (/^bench-/.test(file)) ? true : false; 81 | }); 82 | 83 | files.sort(); 84 | } 85 | 86 | doNextBench(connectionString); 87 | } 88 | else { 89 | if (errorCount) { 90 | console.log("\nResults : %s of %s tests failed.\n", errorCount, testCount); 91 | } 92 | else { 93 | console.log("Results : All tests were successful. Total %s files executed.", testCount); 94 | } 95 | } 96 | } 97 | -------------------------------------------------------------------------------- /test/server.cert: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIIEGzCCAwOgAwIBAgIUET2FFilIQmxLUUTbPFNP01xKBA4wDQYJKoZIhvcNAQEL 3 | BQAwgZwxCzAJBgNVBAYTAklOMRIwEAYDVQQIDAlLYXJuYXRha2ExEjAQBgNVBAcM 4 | CUJlbmdhbHVydTEYMBYGA1UECgwPUm9ja2V0IFNvZnR3YXJlMRMwEQYDVQQLDApE 5 | YjJDb25uZWN0MQ4wDAYDVQQDDAVCaW1hbDEmMCQGCSqGSIb3DQEJARYXYmpoYUBy 6 | b2NrZXRzb2Z0d2FyZS5jb20wHhcNMjUwMTE1MTQyNzQ3WhcNMjUwMjE0MTQyNzQ3 7 | WjCBnDELMAkGA1UEBhMCSU4xEjAQBgNVBAgMCUthcm5hdGFrYTESMBAGA1UEBwwJ 8 | QmVuZ2FsdXJ1MRgwFgYDVQQKDA9Sb2NrZXQgU29mdHdhcmUxEzARBgNVBAsMCkRi 9 | MkNvbm5lY3QxDjAMBgNVBAMMBUJpbWFsMSYwJAYJKoZIhvcNAQkBFhdiamhhQHJv 10 | Y2tldHNvZnR3YXJlLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB 11 | ANmATRzHITxCNrMYkLZbtfn9kRYjUMmt/HzcoDtabOslavy727n7R9SYPDF+hnu6 12 | o06SR9U+UYguTBrms+tFKeV3ywdtVGeZU3OlaqTp8gRV2knG75CFL3VWXvcQ+Gjg 13 | dQzkFgpsiXcnEVTiKimzLY5hOKDZw5B1WSddDvbCGONGqpB8octf3s1ULCICFT1X 14 | 7EngESzl1HoQBkZM1bH95iozzbV7I1ZS1ueTvi/mtgK+x/w/Vn2GhyWbC0vZy76N 15 | FRvOdBNSQSRMc/cNzJnU3nFFbo8KkKX8FWFlIOmLQLdbO5WnyYfs7n+DB1qeL54x 16 | J+Gg6vswP9RjJ2HSBlfu6McCAwEAAaNTMFEwHQYDVR0OBBYEFAVhhdwPbpkcTSBT 17 | Kyp7EPLl96k0MB8GA1UdIwQYMBaAFAVhhdwPbpkcTSBTKyp7EPLl96k0MA8GA1Ud 18 | EwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBALuq0Jv2sPo2/bMApCTXRT8z 19 | i6lAoQiKhtoMuHWiZ2Gxo4voaRGxg3L4R325YCB1Okdaf4FM6ddC+V70lMQnmv4H 20 | xqtmE8r3K3p7Zf0DturBz7gXo8UqYs/A7pYhhWXvFrbIZmztm4QJ0E/zjPt3JO8Q 21 | rHXTPk813ulAwTFn6/0gkAIIulNAR4yZyJSK6VKfkTqgdO6INPZTKmWBeGJLNrS8 22 | Hc+z95Pi5q6I9b8qlz31gC4cf5u7Ie+uO1oWgUJT9DITDsN6Uknm/pM8c3c25r1Z 23 | c3mrt9RPOMKeR8xzsA0gSBxjftSMovxKuNAnrKDXKwQkjRL9xlElEr6mKUJn4Mg= 24 | -----END CERTIFICATE----- 25 | -------------------------------------------------------------------------------- /test/server.key: -------------------------------------------------------------------------------- 1 | -----BEGIN PRIVATE KEY----- 2 | MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDZgE0cxyE8Qjaz 3 | GJC2W7X5/ZEWI1DJrfx83KA7WmzrJWr8u9u5+0fUmDwxfoZ7uqNOkkfVPlGILkwa 4 | 5rPrRSnld8sHbVRnmVNzpWqk6fIEVdpJxu+QhS91Vl73EPho4HUM5BYKbIl3JxFU 5 | 4iopsy2OYTig2cOQdVknXQ72whjjRqqQfKHLX97NVCwiAhU9V+xJ4BEs5dR6EAZG 6 | TNWx/eYqM821eyNWUtbnk74v5rYCvsf8P1Z9hoclmwtL2cu+jRUbznQTUkEkTHP3 7 | DcyZ1N5xRW6PCpCl/BVhZSDpi0C3WzuVp8mH7O5/gwdani+eMSfhoOr7MD/UYydh 8 | 0gZX7ujHAgMBAAECggEAKXidO298ltDJPTzh2uOBvzjqAR6auNnD2sr2glqrieqI 9 | i8gGDWAsQg0E7SsC2XSszr51k+NeCGlLeZWjmKiHZImC3Ner0FUb5GEWBHvW+Zyl 10 | EowsAZJjiiv9z34c32Js7xhOW452Z5G7bEPzZiAT/6Hp+kGLWHAHn8nOoJ5BwJPO 11 | m1x6pMgpDCdYGmGik3zrfcWBuCdmPIwtxN3CxAny+h0hKfjl47yahnojEqJcq/2X 12 | sZdnWoSFbDP/XcZ26BxM2KvoG6UX988/RHsDI/I+wAsB9QF19ecnESeUXD8fl7LT 13 | t5S2c7RGTTbdba6KTGh+efM9w3ol8sAZjGW4TAU2AQKBgQD9Wu9U3q3ezn+R3k9l 14 | Sod6yyNMtr29XYxtGR+4Nc8ixn/i2ZDOcqKuhVRhwWCf9VnTJyazmdySP/uyZ3cH 15 | xcJ/ps0ULtDmijOULETrErR+z1OcdJtrBrI/bwZgQIoBCxxNFrSIZnvfF3vf/rIm 16 | LqElp43LjhYYgsGWdqwxWlNQlwKBgQDbxYzZhLrlB1hI8D26/PxjLmjda873PEJ8 17 | T1uBGEaMPQWh8f+j9FqkOS3K9h2Jd2LqCD/Jh1AlEQZcygsmqg6pWZ6yAwvu0vvi 18 | VonKRsUxsiJKulK7mMq3ntANnHpJXdsNGC5Lxmzr+Z9bDlHQgTSpWNnuHu1humX8 19 | LQwrKZT/UQKBgD/OPAIaxp0bUmNxInu3BmG1cSFr0GM1gR0ku6lP2+e9KA4Ajwh/ 20 | NFtRdsvbwLLoPoQAEy4eLL+kX4YxqneJpY8yeemAVNoKqizB7WVqY4ygOEVp1I5i 21 | tFdnZaqt9lOG8cy0UCkd7kpkBq2F3mXhTnJGPV6rXQM1Qv3ay0jun5bnAoGALvly 22 | uaudJwcC39Q53ZXlfG2XDHzWqBHBREDSFi3SJneElLDdK3Y3SZLPLuqcNZ3HDq7k 23 | s3awsruI2Jx29bSznY8CVJpCGrIOFLraiNnHnG+u1LoupNprugPABKjFmpjtEUdx 24 | 3dBzx5x7a0MMSbzUPL45FqSVqKXm1pfqWe9xYYECgYEApGw4nieE0OdqwRupbI/f 25 | R58XopU9oo3/6L/hKt9/9sVDQ8XnuPGCHw/5hyBYtpvB8f6cJVLUEEotNrxi6gg7 26 | sdZd+bhtSE+e36rr1V43iLChvpLyU/9GZ9iu++c26M8tR/l1cuSQbSodhxarz1zp 27 | qhPNf2wwZth/oQ+tmARyf9E= 28 | -----END PRIVATE KEY----- 29 | -------------------------------------------------------------------------------- /test/sql-cli.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , odbc = require("../") 3 | , db = new odbc.Database(); 4 | 5 | db.open(common.connectionString, function(err) 6 | { 7 | if (err) { 8 | console.log(err); 9 | process.exit(1); 10 | } 11 | 12 | process.stdout.write('> '); 13 | process.stdin.resume(); 14 | 15 | process.stdin.on('data',function (strInput) { 16 | db.query(strInput.toString(), function (err, rs, moreResultSets) { 17 | if (err) { 18 | console.log(err); 19 | console.log(rs); 20 | } 21 | else { 22 | console.log(rs); 23 | } 24 | 25 | process.stdout.write('> '); 26 | }); 27 | }); 28 | }); 29 | -------------------------------------------------------------------------------- /test/test-affected-rows.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , ibmdb = require("../") 3 | , assert = require("assert") 4 | , cn = common.connectionString; 5 | 6 | ibmdb.open(cn, function(err, conn) { 7 | if(err) console.log(err); 8 | 9 | try{ 10 | conn.querySync("drop table mytab1"); 11 | } catch (e) {} 12 | conn.querySync("create table mytab1 (c1 int, c2 varchar(10))"); 13 | conn.querySync("insert into mytab1 values ( 4, 'bimal')"); 14 | conn.prepare("insert into mytab1 VALUES (?, ?)", function (err, stmt) { 15 | if (err) { 16 | //could not prepare for some reason 17 | console.log(err); 18 | return conn.closeSync(); 19 | } 20 | //Bind and Execute the statment asynchronously 21 | var result = stmt.executeSync([5, 'kumar']); 22 | console.log("No of Inserted rows = ", result.getAffectedRowsSync()); 23 | result.closeSync(); 24 | stmt.closeSync(); 25 | conn.prepare("update mytab1 set c2 = 'jha' where c1 > 3", 26 | function(err, stmt) { 27 | if(err) { 28 | console.log(err); 29 | return conn.closeSync(); 30 | } 31 | result = stmt.executeSync(); 32 | console.log("No of updated rows = ", result.getAffectedRowsSync()); 33 | result.closeSync(); 34 | stmt.closeSync(); 35 | conn.prepare("delete from mytab1 where c1 = ?", function(err, stmt) { 36 | if(err) { 37 | console.log(err); 38 | return conn.closeSync(); 39 | } 40 | stmt.execute([4], function(err, result) { 41 | if(err) { console.log(err); } 42 | else { 43 | console.log("No of deleted rows = ", 44 | result.getAffectedRowsSync()); 45 | result.closeSync(); 46 | } 47 | stmt.closeSync(); 48 | conn.querySync("drop table mytab1"); 49 | conn.closeSync(); 50 | }); 51 | }); 52 | }); 53 | }); 54 | }); 55 | 56 | -------------------------------------------------------------------------------- /test/test-asyc-await.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , ibmdb = require("../") 3 | , pool = new ibmdb.Pool() 4 | , assert = require("assert") 5 | , cn = common.connectionString 6 | ; 7 | 8 | main(); 9 | async function main() { 10 | await test1(); 11 | await test2(); 12 | await test3(); 13 | await test4(); 14 | } 15 | 16 | async function test1() { 17 | let invalidConnStr = "database=wrongdb;" + cn ; 18 | let conn = await ibmdb.open(invalidConnStr).catch((e) => { 19 | console.log(e); }); 20 | if(conn) console.log(conn); 21 | console.log("Test1 done."); 22 | } 23 | 24 | async function test2() { 25 | try { 26 | let conn = await ibmdb.open(cn); 27 | let data = await conn.query("select 1 from sysibm.sysdummy1"); 28 | console.log("data = ", data); 29 | 30 | await conn.query("drop table mytab").catch((e) => {console.log(e);}); 31 | await conn.query("create table mytab(c1 int, c2 varchar(10))"); 32 | await conn.query("insert into mytab values (?, ?)", [3, 'rocket']); 33 | let stmt = await conn.prepare("select * from mytab"); 34 | let result = await stmt.execute(); 35 | data = await result.fetchAll(); 36 | console.log("result = ", data); 37 | await result.close(); 38 | await stmt.close(); 39 | await conn.close(); 40 | } catch(e) { 41 | console.log(e); 42 | } 43 | console.log("Test2 done."); 44 | } 45 | 46 | async function test3() 47 | { 48 | const query = 'update mytab set c2=? WHERE c1=?;' 49 | pool.setMaxPoolSize(2); // Max no of active connections. 50 | await pool.initAsync(1, cn).catch((err) => { 51 | console.log(err); 52 | if(typeof err === 'object') assert.equal(err.message, undefined); 53 | }); 54 | 55 | try { 56 | let conn = await pool.open(cn); 57 | let data = await conn.query("select 1 from sysibm.sysdummy1"); 58 | console.log("data = ", data); 59 | 60 | await conn.query("drop table mytab"); 61 | await conn.query("create table mytab(c1 int, c2 varchar(10))"); 62 | await conn.query("insert into mytab values (?, ?)", [1050, 'rocket']); 63 | 64 | // Test for issue #960 65 | let stmt = await conn.prepare(query) 66 | let result = await stmt.executeNonQuery(['canceled', 1050]) 67 | console.log("No of updated row = ", result) 68 | assert.equal(1, result); 69 | 70 | stmt = await conn.prepare("select * from mytab"); 71 | result = await stmt.execute(); 72 | data = await result.fetchAll(); 73 | console.log("result = ", data); 74 | assert.equal(data[0].C2, 'canceled'); 75 | await result.close(); 76 | await stmt.close(); 77 | console.log("Test for issue #960 is done."); 78 | // Test for issue #996 79 | try { 80 | await conn.query("insert into mytab values (?, ?)", [[1050, 'rocket']]); 81 | } catch (err) { console.log("Got error, throwing it."); throw err; } 82 | data = await conn.query("select * from mytab"); 83 | console.log("data = ", data); 84 | console.log("Test for issue #996 is done."); 85 | 86 | // Clean up 87 | await conn.query("drop table mytab"); 88 | await conn.close(); 89 | } catch(e) { 90 | console.log(e); 91 | } 92 | await pool.close(); 93 | console.log("Test3 done."); 94 | } 95 | 96 | async function test4() { 97 | let invalidSQL = ["not an sql"] ; 98 | let conn = await ibmdb.open(cn); 99 | await conn.prepare(invalidSQL).catch((e) => { console.log(e); }); 100 | console.log("Test4 done."); 101 | } 102 | -------------------------------------------------------------------------------- /test/test-attributes.js: -------------------------------------------------------------------------------- 1 | let common = require("./common") 2 | , ibmdb = require("../") 3 | , assert = require("assert") 4 | ; 5 | 6 | let conn = null; 7 | let data = null; 8 | 9 | main(); 10 | 11 | async function main() { 12 | conn = await ibmdb.open(common.connectionString).catch((e) => {console.log(e);}); 13 | await setConnectAttr(); 14 | await conn.close(); 15 | console.log("All tests executed."); 16 | } 17 | 18 | async function setConnectAttr() { 19 | console.log(conn.setAttrSync(21, 'invalidoption')); 20 | console.log(conn.setAttrSync(1281, 'bimal')); 21 | console.log(conn.setAttrSync(ibmdb.SQL_ATTR_INFO_APPLNAME, 'mynodeApp')); 22 | data = conn.querySync("select CURRENT CLIENT_USERID as userid, CURRENT CLIENT_APPLNAME as appname from sysibm.sysdummy1"); 23 | console.log("Selected userid = ", data); 24 | assert.deepEqual(data, [{ APPNAME: 'mynodeApp', USERID: 'bimal' }]); 25 | 26 | await conn.setAttr(22, 22).catch((e) => {console.log(e);}); 27 | console.log(await conn.setAttr("SQL_ATTR_INFO_WRKSTNNAME", 'mythinkpad')); 28 | data = await conn.query("select CURRENT CLIENT_WRKSTNNAME as host from sysibm.sysdummy1"); 29 | console.log("Selected host = ", data); 30 | assert.deepEqual(data, [{ HOST: 'mythinkpad' }]); 31 | 32 | return; 33 | } 34 | 35 | -------------------------------------------------------------------------------- /test/test-bad-connection-string.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , odbc = require("../") 3 | , db = new odbc.Database() 4 | , assert = require("assert") 5 | ; 6 | 7 | const os = require("os"); 8 | 9 | assert.throws(function () { 10 | db.openSync("this is wrong"); 11 | }); 12 | 13 | assert.equal(db.connected, false); 14 | 15 | db.open("this is wrong", function(err) { 16 | console.log(err); 17 | 18 | if( /^win/.test(process.platform) ) { 19 | assert.deepEqual(err.message, '[IBM][CLI Driver] SQL1024N A database connection does not exist. SQLSTATE=08003\r\n'); 20 | } else if (os.type() === "OS/390") { 21 | // Expected error message on z/OS is SQLCODE = -950 SQLSTATE = 42705 22 | // ERROR: THE LOCATION NAME SPECIFIED IN THE CONNECT STATEMENT IS INVALID OR NOT LISTED IN THE COMMUNICATIONS DATABASE 23 | assert(/SQLCODE\s*=\s*-950/.test(err.message)); 24 | assert.equal(err.state, 42705); 25 | } else { 26 | assert.deepEqual(err.message, '[IBM][CLI Driver] SQL1024N A database connection does not exist. SQLSTATE=08003\n'); 27 | } 28 | 29 | assert.equal(db.connected, false); 30 | }); 31 | -------------------------------------------------------------------------------- /test/test-bad-pool-connection-prepare-execute.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , odbc = require("../lib/odbc") 3 | , pool = new odbc.Pool() 4 | , connectionString = common.connectionString 5 | , assert = require("assert") 6 | ; 7 | 8 | var i=0; 9 | console.log("---------------------------------------------------------------"); 10 | console.log("After first iteration and before start of second iteration,"); 11 | console.log("restart the server using 'db2stop force; db2start' command."); 12 | console.log("---------------------------------------------------------------"); 13 | // odbc.debug(true); 14 | pool.setMaxPoolSize(5); 15 | var timer = setInterval(function() { 16 | var j = i; 17 | console.log('start' + j); 18 | if(i == 3){ 19 | pool.close(); 20 | clearInterval(timer); 21 | } 22 | 23 | pool.open(connectionString, function (err, connection) { 24 | if (err) { 25 | console.log("Connection Error: " + err.toString()); 26 | } 27 | 28 | connection.prepare("select * from sysibm.sysdummy1 WHERE IBMREQD <> ?", // IBMREQD is always 'Y' 29 | function (err, stmt) { 30 | if (err) { 31 | assert.fail('should not error.'); 32 | } 33 | 34 | stmt.execute(['0'], function (err, results) { 35 | if (err) { 36 | console.log(err.toString()); 37 | assert.equal(err['message'].search("SQL30081N"),18); 38 | } else { 39 | const result = results.fetchAllSync(); 40 | console.log(JSON.stringify(result)); 41 | assert.equal(JSON.stringify(result), '[{"IBMREQD":"Y"}]'); 42 | } 43 | 44 | connection.close(function () { 45 | console.log('Connection closed'); 46 | console.log('done' + j); 47 | if (j == 0) { 48 | console.log("<=== Now restart the server using " + 49 | "'db2stop force; db2start' command. ====>"); 50 | } 51 | }); 52 | }); 53 | }); 54 | }); 55 | i++; 56 | }, 3000); // Change it to 30000 when running single test file for actual test. 57 | 58 | -------------------------------------------------------------------------------- /test/test-binary-array-insert.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , ibmdb = require("../") 3 | , crypt = require('crypto') 4 | , assert = require('assert') 5 | , cn = common.connectionString; 6 | 7 | async function main() { 8 | const BLOB_LENGTH = 1024 * 16; 9 | const conn = await ibmdb.open(cn) 10 | let results; 11 | 12 | results = await conn.query(`BEGIN DECLARE V_STATEMENT VARCHAR(300) DEFAULT 'drop table BINARY_TAB'; DECLARE CONTINUE HANDLER FOR SQLSTATE '42704' BEGIN END; EXECUTE IMMEDIATE V_STATEMENT; END;`) 13 | console.log(results) 14 | 15 | results = await conn.querySync(`create table BINARY_TAB (id int, B1 BINARY(12), VB1 VARBINARY(12), C4B1 CHAR(12) FOR BIT DATA )`); 16 | console.log(results) 17 | 18 | const data = [ 19 | '628bacf012d4628bacd4', 20 | '628bacf012d5628bacf012d5', 21 | '628bacf012d6628bacf0d6', 22 | '628bacf012d7628bacf0d7', 23 | '628bacf012d8628bacf012d8' 24 | ] 25 | ibmdb.debug(2); 26 | let idx=0 27 | let parameters = [{ 28 | ParamType: 'ARRAY', 29 | DataType: 'INT', 30 | Data: data.map(() => { return idx++ }), 31 | },{ 32 | ParamType: 'ARRAY', 33 | DataType: 'BINARY', 34 | Data: data.map((hex) => { return Buffer.from(hex, 'hex')}), 35 | Length : 12 36 | },{ 37 | ParamType: 'ARRAY', 38 | DataType: 'BINARY', 39 | Data: data.map((hex) => { return Buffer.from(hex, 'hex')}), 40 | Length : 12 41 | },{ 42 | ParamType: 'ARRAY', 43 | DataType: 'BINARY', 44 | Data: data.map((hex) => { return Buffer.from(hex, 'hex')}), 45 | Length : 12 46 | }]; 47 | console.log("Inserted parameters = ", parameters); 48 | try { 49 | const query = { 50 | sql: `insert into BINARY_TAB (ID, B1, VB1, C4B1) values (?, ?, ?, ?)` 51 | , params: parameters 52 | , ArraySize: data.length 53 | } 54 | 55 | results = await conn.query(query); 56 | console.log(results) 57 | } catch (e) { 58 | console.log(1,e) 59 | } 60 | 61 | results = await conn.query(`select ID, B1, VB1, C4B1 from BINARY_TAB`) 62 | console.log("BINARY_TAB contents:\n", results); 63 | 64 | results.forEach( (row) => { console.log(row.ID, data[row.ID], Buffer.from(data[row.ID],'hex'), row.B1, (row.B1.toString('hex') === data[row.ID]), row.VB1, (row.VB1.toString('hex') === data[row.ID]), row.C4B1, (row.C4B1.toString('hex') === data[row.ID]))}) 65 | 66 | 67 | results = await conn.query(`select ID, RAWTOHEX(B1) "B1", RAWTOHEX(VB1) "VB1", RAWTOHEX(C4B1) "C4B1" from BINARY_TAB`) 68 | console.log("BINARY_TAB contents:\n", results); 69 | 70 | 71 | } 72 | 73 | main().then(() => { console.log('success')}).catch((e) => { console.log(e) }) 74 | -------------------------------------------------------------------------------- /test/test-binding-connection-timeOut.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , odbc = require("../") 3 | , db = new odbc.ODBC() 4 | , assert = require("assert") 5 | , exitCode = 0 6 | ; 7 | 8 | db.createConnection(function (err, conn) { 9 | //connectionTimeout should be 30 by default as set in C++ 10 | assert.equal(conn.connectTimeout, 30); 11 | 12 | //test the setter and getter 13 | conn.connectTimeout = 1234; 14 | assert.equal(conn.connectTimeout, 1234); 15 | 16 | //set the time out to something small 17 | conn.connectTimeout = 1; 18 | assert.equal(conn.connectTimeout, 1); 19 | console.log('Connecting...'); 20 | conn.open(common.connectionString, function (err) { 21 | //TODO: it would be nice if we could somehow 22 | //force a timeout to occurr, but most testing is 23 | //done locally and it's hard to get a local server 24 | //to not accept a connection within one second... 25 | console.log(err); 26 | //console.log(err); 27 | conn.close(function () { 28 | console.log("Done"); 29 | }); 30 | }); 31 | }); 32 | -------------------------------------------------------------------------------- /test/test-binding-statement-executeSync.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , odbc = require("../") 3 | , db = new odbc.ODBC() 4 | , assert = require("assert") 5 | , exitCode = 0 6 | ; 7 | 8 | db.createConnection(function (err, conn) { 9 | conn.openSync(common.connectionString); 10 | 11 | conn.createStatement(function (err, stmt) { 12 | var r, result, caughtError={}; 13 | 14 | //try excuting without preparing or binding. 15 | try { 16 | result = stmt.executeSync(); 17 | } 18 | catch (e) { 19 | caughtError = e; 20 | } 21 | 22 | try { 23 | assert.ok(caughtError); 24 | } 25 | catch (e) { 26 | console.log(e.message); 27 | exitCode = 1; 28 | } 29 | 30 | //try incorrectly binding a string and then executeSync 31 | try { 32 | r = stmt.bind("select 1 + 1 as col1"); 33 | } 34 | catch (e) { 35 | caughtError = e; 36 | } 37 | 38 | try { 39 | assert.equal(caughtError.message, "Argument 1 must be an Array"); 40 | 41 | r = stmt.prepareSync("select 1 + ? as col1 from SYSIBM.SYSDUMMY1"); 42 | assert.equal(r, true, "prepareSync did not return true"); 43 | 44 | r = stmt.bindSync([2]); 45 | assert.equal(r, true, "bindSync did not return true"); 46 | 47 | result = stmt.executeSync(); 48 | assert.equal(result.constructor.name, "ODBCResult"); 49 | 50 | r = result.fetchAllSync(); 51 | assert.deepEqual(r, [ { COL1: 3 } ]); 52 | 53 | r = result.closeSync(); 54 | assert.equal(r, true, "closeSync did not return true"); 55 | 56 | r = stmt.bindSync([7]); 57 | assert.equal(r, true, "bindSync did not return true"); 58 | 59 | result = stmt.executeSync(); 60 | assert.equal(result.constructor.name, "ODBCResult"); 61 | 62 | r = result.fetchAllSync(); 63 | console.log(r); 64 | assert.deepEqual(r, [ { COL1: 8 } ]); 65 | } 66 | catch (e) { 67 | console.log(e); 68 | 69 | exitCode = 1; 70 | } 71 | 72 | stmt.closeSync(); 73 | conn.closeSync(); 74 | 75 | if (exitCode) { 76 | console.log("failed"); 77 | } 78 | else { 79 | console.log("success"); 80 | } 81 | 82 | process.exit(exitCode); 83 | }); 84 | }); 85 | -------------------------------------------------------------------------------- /test/test-binding-transaction-commit.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , odbc = require("../") 3 | , db = new odbc.ODBC() 4 | , assert = require("assert") 5 | , exitCode = 0 6 | ; 7 | 8 | db.createConnection(function (err, conn) { 9 | 10 | conn.openSync(common.connectionString); 11 | 12 | common.createTables(conn, function (err, data) { 13 | test1() 14 | 15 | function test1() { 16 | conn.beginTransaction(function (err) { 17 | if (err) { 18 | console.log("Error beginning transaction."); 19 | console.log(err); 20 | exitCode = 1 21 | } 22 | 23 | var result = conn.querySync("insert into " + common.tableName + " (COLINT, COLDATETIME, COLTEXT) VALUES (42, null, null)" ); 24 | 25 | //rollback 26 | conn.endTransaction(true, function (err) { 27 | if (err) { 28 | console.log("Error rolling back transaction"); 29 | console.log(err); 30 | exitCode = 2 31 | } 32 | 33 | result = conn.querySync("select * from " + common.tableName); 34 | data = result.fetchAllSync(); 35 | 36 | assert.deepEqual(data, []); 37 | 38 | test2(); 39 | }); 40 | }); 41 | } 42 | 43 | function test2 () { 44 | //Start a new transaction 45 | conn.beginTransaction(function (err) { 46 | if (err) { 47 | console.log("Error beginning transaction"); 48 | console.log(err); 49 | exitCode = 3 50 | } 51 | 52 | result = conn.querySync("insert into " + common.tableName + " (COLINT, COLDATETIME, COLTEXT) VALUES (42, null, null)" ); 53 | 54 | //commit 55 | conn.endTransaction(false, function (err) { 56 | if (err) { 57 | console.log("Error committing transaction"); 58 | console.log(err); 59 | exitCode = 3 60 | } 61 | 62 | result = conn.querySync("select * from " + common.tableName); 63 | data = result.fetchAllSync(); 64 | 65 | assert.deepEqual(data, [ { COLINT: 42, COLDATETIME: null, COLTEXT: null } ]); 66 | 67 | finish(); 68 | }); 69 | }); 70 | } 71 | 72 | function finish() { 73 | common.dropTables(conn, function (err) { 74 | conn.closeSync(); 75 | process.exit(exitCode); 76 | }); 77 | } 78 | }); 79 | }); 80 | -------------------------------------------------------------------------------- /test/test-binding-transaction-commitSync.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , odbc = require("../") 3 | , db = new odbc.ODBC() 4 | , assert = require("assert") 5 | , exitCode = 0 6 | ; 7 | 8 | db.createConnection(function (err, conn) { 9 | conn.openSync(common.connectionString); 10 | 11 | common.createTables(conn, function (err, data) { 12 | try { 13 | conn.beginTransactionSync(); 14 | 15 | var result = conn.querySync("insert into " + common.tableName + " (COLINT, COLDATETIME, COLTEXT) VALUES (42, null, null)" ); 16 | 17 | conn.endTransactionSync(true); //rollback 18 | 19 | result = conn.querySync("select * from " + common.tableName); 20 | 21 | assert.deepEqual(result.fetchAllSync(), []); 22 | } 23 | catch (e) { 24 | console.log("Failed when rolling back"); 25 | console.log(e); 26 | exitCode = 1 27 | } 28 | 29 | try { 30 | //Start a new transaction 31 | conn.beginTransactionSync(); 32 | 33 | result = conn.querySync("insert into " + common.tableName + " (COLINT, COLDATETIME, COLTEXT) VALUES (42, null, null)" ); 34 | 35 | conn.endTransactionSync(false); //commit 36 | 37 | result = conn.querySync("select * from " + common.tableName); 38 | 39 | assert.deepEqual(result.fetchAllSync(), [ { COLINT: 42, COLDATETIME: null, COLTEXT: null } ]); 40 | } 41 | catch (e) { 42 | console.log("Failed when committing"); 43 | console.log(e); 44 | 45 | exitCode = 2; 46 | } 47 | 48 | common.dropTables(conn, function (err) { 49 | conn.closeSync(); 50 | process.exit(exitCode); 51 | }); 52 | }); 53 | }); 54 | -------------------------------------------------------------------------------- /test/test-blob-file.js: -------------------------------------------------------------------------------- 1 | // Test insertion of BLOB and CLOB data using FILE NAME. 2 | // No need to read the file into memory buffer. 3 | // Author: bimaljha@in.ibm.com 4 | 5 | var common = require("./common") 6 | , ibmdb = require("../") 7 | , assert = require("assert") 8 | , fs = require('fs') 9 | , cn = common.connectionString; 10 | 11 | ibmdb.open(cn, function (err,conn) { 12 | if (err) { 13 | console.log(err); 14 | process.exit(-1); 15 | } 16 | try { 17 | conn.querySync("drop table mytab"); 18 | } catch (e) {}; 19 | try { 20 | conn.querySync("create table mytab (empId int, photo BLOB(1M), trace CLOB(1M), document BLOB(1M))"); 21 | } catch (e) {}; 22 | 23 | var img1 = __dirname + '/data/phool.jpg'; //fs.readFileSync('phool.jpg','binary'); 24 | var text = __dirname + '/data/trc.fmt'; //fs.readFileSync('trc.fmt','ascii'); 25 | var doc = __dirname + '/data/sampledoc.docx'; 26 | 27 | var len1 = fs.statSync(img1)["size"]; 28 | var len2 = fs.statSync(text)["size"]; 29 | var len3 = fs.statSync(doc)["size"]; 30 | 31 | console.log( "img1.length = " + len1); 32 | console.log( "text.length = " + len2); 33 | console.log( "doc.length = " + len3); 34 | 35 | conn.prepare("insert into mytab(empId, photo, trace, document) VALUES (?, ?, ?, ?)", 36 | function (err, stmt) { 37 | if (err) { 38 | console.log(err); 39 | return conn.closeSync(); 40 | } 41 | //var photo = [3, -2, -98, img1]; // We can use such array too. 42 | //var photo = {ParamType:"FILE", CType:"BINARY", "SQLType:"BLOB", Data:img1}; 43 | // Except, numbers and string; all other datatypes like LOBS, GRAPHIC, File, etc 44 | // must be passed as JSON Object or Array. 45 | var photo = {ParamType:"FILE", DataType: "BLOB", "Data":img1}; 46 | var tracefile = {ParamType: 3, "DataType": "CLOB", Data: text}; 47 | var document = {ParamType:"FILE", DataType: "BLOB", "Data":doc}; 48 | 49 | stmt.execute([18, photo, tracefile, document], 50 | function (err, result) { 51 | if( err ) console.log(err); 52 | else result.closeSync(); 53 | 54 | conn.prepare("select * from mytab", function (err, stmt) { 55 | if(err) { 56 | console.log(err); 57 | return conn.closeSync(); 58 | } 59 | 60 | stmt.execute([], function(err, result) { 61 | if(err) console.log(err); 62 | else { 63 | data = result.fetchAllSync(); 64 | fs.writeFileSync('phool2.jpg', data[0].PHOTO, 'binary'); 65 | fs.writeFileSync('trc2.fmt', data[0].TRACE, 'ascii'); 66 | fs.writeFileSync('doc2.docx', data[0].DOCUMENT, 'binary'); 67 | 68 | try { 69 | conn.querySync("drop table mytab"); 70 | } catch (e) {}; 71 | 72 | result.closeSync(); 73 | var size1 = fs.statSync("phool2.jpg")["size"]; 74 | var size2 = fs.statSync("trc2.fmt")["size"]; 75 | var size3 = fs.statSync("doc2.docx")["size"]; 76 | 77 | console.log("Lengths after select = " + size1 + ", " + size2 + ", " + size3); 78 | assert(len1, size1); 79 | assert(len2, size2); 80 | assert(len3, size3); 81 | 82 | fs.unlinkSync("phool2.jpg"); 83 | fs.unlinkSync("doc2.docx"); 84 | fs.unlink("trc2.fmt", function () { console.log('done'); }); 85 | } 86 | }); 87 | }); 88 | }); 89 | }); 90 | }); 91 | -------------------------------------------------------------------------------- /test/test-call-async.js: -------------------------------------------------------------------------------- 1 | // Test case to verify result of OUT and INOUT Parameters in a Strored Procedure. 2 | // When SP is called using conn.query() assynchronously. 3 | 4 | var common = require("./common") 5 | , ibmdb = require("../") 6 | , assert = require("assert") 7 | , cn = common.connectionString 8 | , iszos = common.isZOS 9 | , schema = common.connectionObject.CURRENTSCHEMA; 10 | 11 | ibmdb.open(cn, function (err, conn) 12 | { 13 | if(err) console.log(err); 14 | assert.equal(err, null); 15 | var query = "CaLL " + schema + ".PROC1(?, ?, ?)"; 16 | var proc1 = "create procedure " + schema + ".PROC1 " + 17 | "(IN v1 INTEGER, OUT v2 INTEGER, INOUT v3 VARCHAR(20)) " + 18 | "BEGIN set v2 = v1 + 1; set v3 = 'verygood'; END"; 19 | var proc2 = "create or replace procedure " + schema + ".PROC2 (IN v1 INTEGER) BEGIN END"; 20 | var dropProc1 = "drop procedure " + schema + ".PROC1(INT, INT, VARCHAR(20))"; 21 | var dropProc2 = "drop procedure " + schema + ".PROC2(INT)"; 22 | 23 | if (iszos) { 24 | // The DROP PROCEDURE syntax on z/OS can only specify the name of the procedure to drop. 25 | dropProc1 = "drop procedure " + schema + ".PROC1"; 26 | dropProc2 = "drop procedure " + schema + ".PROC2"; 27 | proc1 = common.sanitizeSP(proc1); 28 | proc2 = common.sanitizeSP(proc2); 29 | } 30 | try { 31 | conn.querySync(dropProc1); 32 | console.log("PROC1 dropped.\n"); 33 | } catch(e) { } 34 | 35 | conn.querySync(proc1); 36 | console.log("created PROC1...\n"); 37 | conn.commitTransactionSync(); 38 | var param1 = {ParamType:"INPUT", DataType:1, Data:3}; 39 | var param2 = {ParamType:"OUTPUT", DataType:1, Data:0}; 40 | var param3 = {ParamType:"INOUT", DataType:1, Data:"abc", Length:30}; 41 | 42 | conn.query(query, [param1, param2, param3], function(err, result){ 43 | if(err) console.log(err); 44 | else { 45 | console.log("return value = ", result[0], result[1]); 46 | } 47 | conn.querySync(dropProc1); 48 | assert.deepEqual(result, [ 4, 'verygood' ]); 49 | }); 50 | 51 | try { 52 | conn.querySync(dropProc2); 53 | console.log("PROC2 dropped.\n"); 54 | } catch(e) { } 55 | conn.querySync(proc2); 56 | query = "call " + schema + ".PROC2(?)"; 57 | conn.query({"sql":query, "params" : [param1]}, function(err, result){ 58 | if(err) console.log(err); 59 | conn.querySync(dropProc2); 60 | conn.closeSync(); 61 | assert.equal(result.length, 0); 62 | console.log('done'); 63 | }); 64 | }); 65 | -------------------------------------------------------------------------------- /test/test-call-stmt.js: -------------------------------------------------------------------------------- 1 | // Test case to verify result of OUT and INOUT Parameters in a Strored Procedure. 2 | 3 | var common = require("./common") 4 | , ibmdb = require("../") 5 | , assert = require("assert") 6 | , cn = common.connectionString 7 | , iszos = common.isZOS 8 | , schema = common.connectionObject.CURRENTSCHEMA; 9 | 10 | var query = "CaLL " + schema + ".PROC1(?, ?, ?)"; 11 | ibmdb.open(cn, function (err, conn) 12 | { 13 | if(err) console.log(err); 14 | assert.equal(err, null); 15 | let proc1 = "create or replace procedure " + schema + ".PROC1 " + 16 | "(IN v1 INTEGER, OUT v2 INTEGER, INOUT v3 VARCHAR(20)) " + 17 | "BEGIN set v2 = v1 + 1; set v3 = 'verygood'; END"; 18 | let proc2 = "create or replace procedure " + schema + ".PROC2 (IN v1 INTEGER) BEGIN END"; 19 | let dropProc1 = "drop procedure " + schema + ".PROC1(INT, INT, VARCHAR(20))"; 20 | let dropProc2 = "drop procedure " + schema + ".PROC2(INT)"; 21 | 22 | if (iszos) { 23 | proc1 = common.sanitizeSP(proc1); 24 | proc2 = common.sanitizeSP(proc2); 25 | dropProc1 = "drop procedure " + schema + ".PROC1"; 26 | dropProc2 = "drop procedure " + schema + ".PROC2"; 27 | } 28 | 29 | try { 30 | conn.querySync(dropProc1); 31 | } catch(e) {} 32 | conn.querySync(proc1); 33 | 34 | var param1 = {ParamType:"INPUT", DataType:1, Data:0}; 35 | var param2 = {ParamType:"OUTPUT", DataType:1, Data:0}; 36 | var param3 = {ParamType:"INOUT", DataType:1, Data:"abc", Length:30}; 37 | 38 | result = conn.querySync(query, [param1, param2, param3]); 39 | assert.deepEqual(result, [ 1, 'verygood' ]); 40 | console.log("Output Parameters V2 = ", result[0], ", V3 = ", result[1]); 41 | conn.querySync(dropProc1); 42 | 43 | try { 44 | conn.querySync(dropProc2); 45 | } catch(e) {} 46 | conn.querySync(proc2); 47 | 48 | result = conn.querySync("call " + schema + ".PROC2(?)", [param1]); 49 | assert.deepEqual(result, []); 50 | conn.querySync(dropProc2); 51 | conn.closeSync(); 52 | console.log('done'); 53 | }); 54 | -------------------------------------------------------------------------------- /test/test-chinese-char.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , ibmdb = require("../") 3 | , db = new ibmdb.ODBC() 4 | , assert = require("assert") 5 | , connStr = common.connectionString; 6 | 7 | var sql = "insert into testtab (col1,col2) values('一二三四', '五六七八')"; 8 | 9 | ibmdb.open(connStr,(err,conn)=>{ 10 | if(err){ console.log(err); return; } 11 | try { 12 | conn.querySync('create table testtab (col1 VARCHAR(100), col2 VARCHAR(100))'); 13 | } catch(err) {console.log(err);} 14 | 15 | // Insert Chinese characters in table using all possible ways. 16 | conn.querySync(sql); // Insert Row1 17 | var stmt = conn.prepareSync(sql); 18 | stmt.executeSync(); // Insert Row2 19 | stmt.closeSync(); 20 | conn.query(sql, function(err, data) { // Insert Row3 21 | if(err){ console.log(err); return; } 22 | conn.prepare(sql, function(err, stmt) { 23 | if(err){ console.log(err); return; } 24 | stmt.execute(function(err, data) { // Insert Row4 25 | if(err){ console.log(err); return; } 26 | stmt.closeSync(); 27 | 28 | // Create another connection using alternate way. 29 | var conn2 = db.createConnectionSync(); 30 | conn2.openSync(connStr); 31 | stmt = conn2.createStatementSync(); 32 | stmt.executeDirectSync(sql); // Insert Row5 33 | stmt.prepareSync(sql); 34 | console.log("Inserted row = ",stmt.executeNonQuerySync()); // Insert Row6 35 | stmt.closeSync(); 36 | conn2.createStatement(function(err, stmt){ 37 | if(err){ console.log(err); return; } 38 | stmt.executeDirect(sql, function(err, result){ // Insert Row7 39 | if(err){ console.log(err); return; } 40 | stmt.prepare(sql, function(err, result) { //dont use err, stmt here 41 | stmt.executeNonQuery(function(err, rowCount){ // Insert Row8 42 | if(err){ console.log(err); return; } 43 | console.log("Inserted rowcount = ", rowCount); 44 | stmt.closeSync(); 45 | var data = conn.querySync("select * from testtab"); 46 | console.log("Inserted rows = ", data); 47 | conn2.querySync("drop table testtab"); 48 | conn2.closeSync(); 49 | conn.closeSync(); 50 | assert(data.length, 8); 51 | }); 52 | }); 53 | }); 54 | }); 55 | }); 56 | }); 57 | }); 58 | }); 59 | 60 | -------------------------------------------------------------------------------- /test/test-closed.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , odbc = require("../") 3 | , db = new odbc.Database() 4 | , assert = require("assert") 5 | ; 6 | 7 | assert.equal(db.connected, false); 8 | 9 | db.query("select * from test", function (err, rs, sqlca) { 10 | assert.deepEqual(err.message, 'Connection not open.'); 11 | assert.deepEqual(rs, []); 12 | assert.equal(sqlca.sqlcode, -30081); 13 | assert.equal(db.connected, false); 14 | }); 15 | -------------------------------------------------------------------------------- /test/test-connection-object.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , odbc = require("../") 3 | , db = new odbc.Database() 4 | , assert = require("assert") 5 | ; 6 | 7 | db.open(common.connectionObject, function(err){ 8 | assert.equal(err, null); 9 | 10 | db.close(function () { 11 | assert.equal(db.connected, false); 12 | }); 13 | }); 14 | -------------------------------------------------------------------------------- /test/test-date.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , odbc = require("../") 3 | , db = new odbc.Database() 4 | , assert = require("assert") 5 | ; 6 | 7 | db.open(common.connectionString, function(err) { 8 | assert.equal(err, null); 9 | assert.equal(db.connected, true); 10 | 11 | var dt = new Date(); 12 | var dtString = dt.toISOString().replace('Z','').replace('T', ' ') + '000'; 13 | var sql = "SELECT cast('" + dtString + "' as timestamp) as DT1 FROM SYSIBM.SYSDUMMY1"; 14 | 15 | console.log(sql); 16 | 17 | db.query(sql, function (err, data) { 18 | assert.equal(err, null); 19 | assert.equal(data.length, 1); 20 | 21 | db.close(function () { 22 | assert.equal(db.connected, false); 23 | console.log(dt); 24 | console.log(data); 25 | 26 | //test selected data after the connection 27 | //is closed, in case the assertion fails 28 | assert.equal(data[0].DT1.constructor.name, "String", "DT1 is not an instance of a String object"); 29 | //assert.equal(data[0].DT1.getTime(), dt.getTime()); 30 | }); 31 | }); 32 | }); 33 | -------------------------------------------------------------------------------- /test/test-dbclob.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , ibmdb = require("../") 3 | , crypt = require('crypto') 4 | , assert = require('assert') 5 | , cn = common.connectionString; 6 | 7 | async function main() { 8 | const BLOB_LENGTH = 1024 * 16; 9 | const conn = await ibmdb.open(cn) 10 | let results; 11 | 12 | results = await conn.querySync(`create table DBCLOB_TAB (id int, B1 DBCLOB(${BLOB_LENGTH}))`); 13 | console.log(results); 14 | 15 | const filler = 'X'.repeat(1000); 16 | 17 | const source = { 18 | "V1" : filler 19 | , "V2" : "Oops" 20 | } 21 | 22 | const data = JSON.stringify(source," ",2); 23 | console.log(data.length,Buffer.byteLength(data)); 24 | 25 | try { 26 | results = await conn.query(`insert into DBCLOB_TAB (ID, B1) values (?, ?)`,[1,data]); 27 | console.log(results); 28 | } catch (e) { 29 | console.log(1,e); 30 | } 31 | 32 | results = await conn.query(`select ID, length(B1) L1, B1 from DBCLOB_TAB`); 33 | console.log("result = ", results); 34 | console.log("data = ", data); 35 | 36 | let target; 37 | try { 38 | target = JSON.parse(results[0].B1); 39 | console.log(source.V1.length,target.V1.length); 40 | } catch (e) { 41 | console.log('Oops',e); 42 | } 43 | 44 | for (var i = 0; i < data.length; i++) { 45 | if (data.charAt(i) !== results[0].B1.charAt(i)) { 46 | console.log(i,data.charAt(i), results[0].B1.charAt(i)); 47 | assert.equal(data.charAt(i), results[0].B1.charAt(i)); 48 | break; 49 | } 50 | } 51 | await conn.query(`drop table DBCLOB_TAB`); 52 | } 53 | 54 | async function blobTest() { 55 | const BLOB_LENGTH = 256; 56 | const conn = await ibmdb.open(cn); 57 | let results; 58 | 59 | results = await conn.querySync(`create table BLOB_TAB (id int, B1 BLOB(${BLOB_LENGTH}))`); 60 | console.log(results); 61 | 62 | const values = Array.from(Array(BLOB_LENGTH).keys()); 63 | console.log("values = ", values); 64 | const buf = Buffer.from(values); 65 | console.log("buffer = ", buf); 66 | console.log("buflen = ", buf.length); 67 | 68 | const blobParam = {DataType: "BLOB", Data:buf}; 69 | 70 | try { 71 | const query = { 72 | sql : `insert into BLOB_TAB (ID, B1) values (?, ?)` 73 | , params: [1, blobParam] 74 | } 75 | 76 | results = await conn.query(query); 77 | console.log(results); 78 | } catch (e) { 79 | console.log(1,e); 80 | } 81 | results = await conn.query(`select ID, length(B1) L1, B1 from BLOB_TAB`); 82 | console.log("result = ", results); 83 | await conn.query(`drop table BLOB_TAB`); 84 | } 85 | 86 | main().then(() => { 87 | console.log('DBCLOB test success'); 88 | console.log("==================\n"); 89 | blobTest().then(() => { 90 | console.log('BLOB test success'); 91 | console.log("==================\n"); 92 | }) 93 | }).catch((e) => { console.log(e); }) 94 | -------------------------------------------------------------------------------- /test/test-describe-column.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , odbc = require("../") 3 | , db = new odbc.Database() 4 | , assert = require("assert") 5 | ; 6 | 7 | db.openSync(common.connectionString); 8 | 9 | console.log("connected"); 10 | 11 | common.dropTables(db, function (err) { 12 | if (err) console.log(err.message); 13 | 14 | console.log("tables dropped"); 15 | 16 | common.createTables(db, function (err) { 17 | if (err) console.log(err.message); 18 | 19 | console.log("tables created"); 20 | 21 | db.describe({ 22 | database : common.databaseName, 23 | table : common.tableName, 24 | column : 'COLDATETIME' 25 | }, function (err, data) { 26 | if (err) console.log(err.message); 27 | 28 | console.log(data); 29 | assert.ok(data.length, "No records returned when attempting to describe the column COLDATETIME"); 30 | test2(); 31 | }); 32 | }); 33 | }); 34 | 35 | async function test2() { 36 | let result = ""; 37 | result = await db.columns(common.databaseName, '%', common.tableName, 'COLDATETIME'); 38 | console.log("db.columns result = ", result); 39 | result = await db.columns(common.databaseName, common.tableName, 'COLDATETIME').catch((e) => { console.log(e); }); 40 | result = await db.describe({ 41 | database : common.databaseName, 42 | table : common.tableName, 43 | column : 'COLDATETIME' 44 | }); 45 | console.log("db.describe result = ", result); 46 | result = await db.describe({ 47 | table : common.tableName, 48 | column : 'COLDATETIME' 49 | }).catch((e) => { console.log(e); }); 50 | console.log("db.describe result = ", result); 51 | db.closeSync(); 52 | } 53 | -------------------------------------------------------------------------------- /test/test-describe-database.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , odbc = require("../") 3 | , db = new odbc.Database() 4 | , assert = require("assert") 5 | ; 6 | 7 | db.openSync(common.connectionString); 8 | 9 | common.dropTables(db, function () { 10 | common.createTables(db, function () { 11 | db.describe({ 12 | database : common.databaseName 13 | }, function (err, data) { 14 | db.closeSync(); 15 | assert.ok(data.length, "No records returned when attempting to describe the database"); 16 | }); 17 | }); 18 | }); 19 | -------------------------------------------------------------------------------- /test/test-describe-table.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , odbc = require("../") 3 | , db = new odbc.Database() 4 | , assert = require("assert") 5 | ; 6 | 7 | db.openSync(common.connectionString); 8 | 9 | common.dropTables(db, function () { 10 | common.createTables(db, function () { 11 | 12 | db.describe({ 13 | database : common.databaseName 14 | , table : common.tableName 15 | }, function (err, data) { 16 | console.log("db.describe data = ", data); 17 | assert.ok(data.length, "No records returned when attempting to describe the tabe " + common.tableName); 18 | test2(); 19 | }); 20 | }); 21 | }); 22 | 23 | async function test2() { 24 | var result = ""; 25 | 26 | result = await db.describe({ database : common.databaseName , table : common.tableName }); 27 | console.log("db.describe result = ", result); 28 | result = await db.describe({ database : common.databaseName }); 29 | console.log("db.describe result = ", result); 30 | db.closeSync(); 31 | } 32 | -------------------------------------------------------------------------------- /test/test-domains-open.js: -------------------------------------------------------------------------------- 1 | var domain = require("domain"); 2 | 3 | var d = domain.create(); 4 | 5 | d.on("error", function (error) { 6 | console.log("Error caught!", error); 7 | }); 8 | 9 | d.run(function() { 10 | var db = require("../")(); 11 | 12 | console.trace(); 13 | 14 | db.open("wrongConnectionString", function (error) { 15 | console.trace(); 16 | 17 | //throw new Error(); 18 | }); 19 | }); 20 | -------------------------------------------------------------------------------- /test/test-executeFileSync.js: -------------------------------------------------------------------------------- 1 | var fs = require('fs'); 2 | var path = require('path') 3 | var common = require("./common") 4 | , ibmdb = require("../") 5 | , assert = require("assert") 6 | , cn = common.connectionString; 7 | 8 | ibmdb.open(cn, function (err, conn) { 9 | if (err) { 10 | return console.log(err); 11 | } 12 | 13 | var inputfile = __dirname + '/data/sample1.txt'; 14 | var res = conn.executeFileSync(inputfile); 15 | assert.deepEqual(res, '[{"NO":1,"NAME":"pri"},{"NO":2,"NAME":"anbu"}];[{"NO":1},{"NO":2}];'); 16 | 17 | 18 | var res1 = conn.executeFileSync(inputfile, ';'); 19 | assert.deepEqual(res1, '[{"NO":1,"NAME":"pri"},{"NO":2,"NAME":"anbu"}];[{"NO":1},{"NO":2}];'); 20 | 21 | 22 | var outputfile1 = __dirname + '/data/out1.txt'; 23 | conn.executeFileSync(inputfile, ';', outputfile1); 24 | var result1 = fs.readFileSync(outputfile1, 'utf8') 25 | assert.deepEqual(result1, '[{"NO":1,"NAME":"pri"},{"NO":2,"NAME":"anbu"}];[{"NO":1},{"NO":2}];'); 26 | if (fs.existsSync(outputfile1)) { 27 | fs.unlinkSync(outputfile1) 28 | } 29 | 30 | var inputfile2 = __dirname + '/data/sample2.txt'; 31 | var res2 = conn.executeFileSync(inputfile2, '%'); 32 | assert.deepEqual(res2, '[{"NO":1,"NAME":"pri"},{"NO":2,"NAME":"anbu"}]%[{"NO":1},{"NO":2}]%'); 33 | 34 | var outputfile2 = __dirname + '/data/out2.txt'; 35 | conn.executeFileSync(inputfile2, '%', outputfile2); 36 | var result2 = fs.readFileSync(outputfile2, 'utf8') 37 | assert.deepEqual(result2, '[{"NO":1,"NAME":"pri"},{"NO":2,"NAME":"anbu"}]%[{"NO":1},{"NO":2}]%'); 38 | if (fs.existsSync(outputfile2)) { 39 | fs.unlinkSync(outputfile2) 40 | } 41 | 42 | var inputfile3 = __dirname + '/data/sample3.txt'; 43 | var res3 = conn.executeFileSync(inputfile3, '@'); 44 | assert.deepEqual(res3, '[{"NO":1,"NAME":"pri"},{"NO":2,"NAME":"anbu"}]@[{"NO":1},{"NO":2}]@'); 45 | 46 | var outputfile3 = __dirname + '/data/out3.txt'; 47 | conn.executeFileSync(inputfile3, '@', outputfile3); 48 | var result3 = fs.readFileSync(outputfile3, 'utf8') 49 | assert.deepEqual(result3, '[{"NO":1,"NAME":"pri"},{"NO":2,"NAME":"anbu"}]@[{"NO":1},{"NO":2}]@'); 50 | if (fs.existsSync(outputfile3)) { 51 | fs.unlinkSync(outputfile3) 52 | } 53 | 54 | var outputfile4 = __dirname + '/data/abc/out3.txt'; 55 | conn.executeFileSync(inputfile3, '@', outputfile4); 56 | var result4 = fs.readFileSync(outputfile4, 'utf8') 57 | assert.deepEqual(result4, '[{"NO":1,"NAME":"pri"},{"NO":2,"NAME":"anbu"}]@[{"NO":1},{"NO":2}]@'); 58 | if (fs.existsSync(outputfile4)) { 59 | fs.unlinkSync(outputfile4) 60 | fs.rmdirSync(__dirname + '/data/abc') 61 | } 62 | 63 | var err = null; 64 | try { 65 | err = conn.executeFileSync(inputfile3); 66 | } 67 | catch (e) { 68 | err = e; 69 | } 70 | assert.equal(err.error, "[node-ibm_db] Error in ODBCConnection::QuerySync while executing query."); 71 | 72 | var inputfile30 = __dirname + '/data/sample100.txt'; 73 | var err1 = null; 74 | try { 75 | err1 = conn.executeFileSync(inputfile30); 76 | } 77 | catch (e) { 78 | err1 = e; 79 | } 80 | assert.equal(err1, "Error: [node-ibm_db] Input file " + inputfile30 + " does not exists"); 81 | }); -------------------------------------------------------------------------------- /test/test-global-open-close.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , odbc = require("../") 3 | , assert = require("assert"); 4 | 5 | odbc.open(common.connectionString, function (err, conn) { 6 | assert.equal(err, null); 7 | assert.equal(conn.constructor.name, 'Database'); 8 | 9 | conn.close(); 10 | }); 11 | 12 | -------------------------------------------------------------------------------- /test/test-ibm-db-issue14.js: -------------------------------------------------------------------------------- 1 | /* Test program to access DB2 sample database */ 2 | /*require the ibm_db module*/ 3 | var common = require("./common") 4 | , assert = require("assert") 5 | , ibmdb = require("../"); 6 | 7 | var testTable = 'BIGINTTEST'; 8 | var testValues = [10205152031467301, 10205152031467303]; 9 | 10 | 11 | /*Connect to the database server 12 | param 1: The DSN string which has the details of database name to connect to, user id, password, hostname, portnumber 13 | param 2: The Callback function to execute when connection attempt to the specified database is completed 14 | */ 15 | ibmdb.open(common.connectionString, function(err, conn) 16 | { 17 | if(err) { 18 | console.error("error: ", err.message); 19 | assert.equal(err.message, null); 20 | } else { 21 | 22 | console.log('Connection to DB2 machine successful'); 23 | 24 | try { 25 | conn.querySync("create table " + testTable + " (COLINT BIGINT)"); 26 | } catch (e) {}; 27 | for(var i=0;i>>:', data); 52 | } 53 | queryExecuted++; 54 | }); 55 | 56 | conn2.query(stmt2, function(err, data) { 57 | console.log('Query 2 executed'); 58 | if (err) { 59 | conn2.rollbackTransactionSync(); 60 | console.log(err); 61 | } else { 62 | conn2.commitTransactionSync(); 63 | console.log('<<< DATA >>>:', data); 64 | assert.deepEqual(data, [ { '1': 1 } ]); 65 | } 66 | conn2.closeSync(); 67 | queryExecuted++; 68 | }); 69 | }); 70 | }); 71 | }); 72 | var interval = setInterval(function(){ 73 | if(queryExecuted === 2) { 74 | conn1.querySync("drop table T1"); 75 | conn1.closeSync(); 76 | clearInterval(interval); 77 | } 78 | }, 1000); 79 | }); 80 | 81 | -------------------------------------------------------------------------------- /test/test-issue253.js: -------------------------------------------------------------------------------- 1 | var ibmdb = require("../") 2 | , common = require("./common") 3 | , assert = require("assert") 4 | , cn = common.connectionString; 5 | 6 | const os = require("os"); 7 | 8 | var createSQL = "create table issue253 (name int)"; 9 | var selectSQL = "select * from issue253 WHERE CURRENT DATE = '2017-04-17 0'"; 10 | var dropSQL = "drop table issue253"; 11 | 12 | ibmdb.open(cn, function (err,conn) { 13 | if (err) console.log(err); 14 | assert.equal(err, null); 15 | 16 | conn.querySync(createSQL); 17 | 18 | conn.query(selectSQL, function (err, data) { 19 | conn.querySync(dropSQL); 20 | conn.closeSync(); 21 | var errorFound = false; 22 | 23 | if (err.message) { 24 | if (common.isZOS) { 25 | // zOS Db2 returns SQLCode -181 and SQLState 22007 for 26 | // THE STRING REPRESENTATION OF A DATETIME VALUE IS NOT 27 | // A VALID DATETIME VALUE 28 | if (os.type() === "OS/390") { 29 | var errorFound = err.message.includes("SQLCODE = -181"); 30 | } else { 31 | var errorFound = err.message.includes("SQL0181N"); 32 | } 33 | } else { 34 | var errorFound = err.message.includes("SQL0180N"); 35 | } 36 | } 37 | assert.equal(errorFound, true); 38 | }); 39 | }); 40 | -------------------------------------------------------------------------------- /test/test-memory-leaks-new-objects.js: -------------------------------------------------------------------------------- 1 | var odbc = require("../") 2 | , openCount = 100 3 | , start = process.memoryUsage().heapUsed 4 | , x = 100 5 | ; 6 | 7 | gc(); 8 | 9 | start = process.memoryUsage().heapUsed; 10 | 11 | for (x = 0; x < openCount; x++ ) { 12 | (function () { 13 | var db = new odbc.Database(); 14 | db = null; 15 | })(); 16 | } 17 | 18 | gc(); 19 | 20 | console.log(process.memoryUsage().heapUsed - start); 21 | 22 | gc(); 23 | 24 | for (x = 0; x < openCount; x++ ) { 25 | (function () { 26 | var db = new odbc.Database(); 27 | db = null; 28 | })(); 29 | } 30 | 31 | gc(); 32 | 33 | console.log(process.memoryUsage().heapUsed - start); -------------------------------------------------------------------------------- /test/test-multi-open-close.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , odbc = require("../") 3 | , assert = require("assert") 4 | , openCallback = 0 5 | , closeCallback = 0 6 | , openCount = 10 7 | , connections = [] 8 | ; 9 | 10 | for (var x = 0; x < openCount; x++ ) { 11 | (function () { 12 | var db = new odbc.Database(); 13 | connections.push(db); 14 | 15 | db.open(common.connectionString, function(err) { 16 | assert.equal(err, null); 17 | openCallback += 1; 18 | maybeClose(); 19 | }); 20 | })(); 21 | } 22 | 23 | function maybeClose() { 24 | 25 | if (openCount == openCallback) { 26 | doClose(); 27 | } 28 | } 29 | 30 | 31 | function doClose() { 32 | connections.forEach(function (db) { 33 | db.close(function () { 34 | closeCallback += 1; 35 | 36 | maybeFinish(); 37 | }); 38 | }); 39 | } 40 | 41 | function maybeFinish() { 42 | if (openCount == closeCallback) { 43 | console.log('Done'); 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /test/test-multi-open-query-close.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , odbc = require("../") 3 | , openCallback = 0 4 | , closeCallback = 0 5 | , queryCallback = 0 6 | , openCount = 3 7 | , connections = [] 8 | ; 9 | 10 | for (var x = 0; x < openCount; x++ ) { 11 | (function (x) { 12 | var db = new odbc.Database(); 13 | connections.push(db); 14 | 15 | db.open(common.connectionString, function(err) { 16 | if (err) { 17 | throw err; 18 | process.exit(); 19 | } 20 | 21 | //console.error("Open: %s %s %s", x, openCount, openCallback); 22 | 23 | openCallback += 1; 24 | 25 | maybeQuery(); 26 | }); 27 | })(x); 28 | } 29 | 30 | function maybeQuery() { 31 | if (openCount == openCallback) { 32 | doQuery(); 33 | } 34 | } 35 | 36 | function doQuery() { 37 | connections.forEach(function (db, ix) { 38 | var seconds = connections.length - ix; 39 | 40 | var query = "WAITFOR DELAY '00:00:0" + seconds + "'; select " + seconds + " as result from SYSIBM.SYSDUMMY1"; 41 | 42 | db.query(query, function (err, rows, moreResultSets) { 43 | 44 | //console.error("Query: %s %s %s %s", ix, openCount, queryCallback, moreResultSets, rows, err); 45 | 46 | queryCallback += 1; 47 | 48 | maybeClose(); 49 | }); 50 | }); 51 | } 52 | 53 | function maybeClose() { 54 | if (openCount == queryCallback) { 55 | doClose(); 56 | } 57 | } 58 | 59 | function doClose() { 60 | connections.forEach(function (db, ix) { 61 | db.close(function () { 62 | //console.log("Close: %s %s %s", ix, openCount, closeCallback); 63 | 64 | closeCallback += 1; 65 | 66 | maybeFinish(); 67 | }); 68 | }); 69 | } 70 | 71 | function maybeFinish() { 72 | if (openCount == closeCallback) { 73 | console.error('done'); 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /test/test-multi-openSync-closeSync.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , odbc = require("../") 3 | , assert = require("assert") 4 | , openCallback = 0 5 | , closeCallback = 0 6 | , openCount = 10 7 | , connections = [] 8 | , errorCount = 0; 9 | ; 10 | 11 | for (var x = 0; x < openCount; x++ ) { 12 | var db = new odbc.Database(); 13 | connections.push(db); 14 | 15 | try { 16 | var connected = db.openSync(common.connectionString); 17 | if(connected === true) { 18 | console.log("Connection ", x + 1, " opened."); 19 | } 20 | else { 21 | console.log("Connection ", x + 1, " error = ", connected); 22 | } 23 | } 24 | catch (e) { 25 | console.log(common.connectionString); 26 | console.log(e); 27 | errorCount += 1; 28 | break; 29 | } 30 | } 31 | 32 | connections.forEach(function (db) { 33 | db.closeSync(); 34 | console.log("Closed connection ", openCount--); 35 | }); 36 | 37 | /* Test case to test the fix of issue #557 */ 38 | odbc.open(common.connectionString, function(err, conn) { 39 | conn.query("select * from mytab; select 1 from sysibm.sysdummy1;", 40 | function(err, result) { 41 | if(err) { 42 | console.log(err); 43 | } 44 | else { 45 | conn.closeSync(); 46 | } 47 | console.log("result = ", result); 48 | assert(err['message'].search("SQL0204N|42704") > 0); 49 | console.log('Done'); 50 | process.exit(errorCount); 51 | }); 52 | }); 53 | -------------------------------------------------------------------------------- /test/test-open-close.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , odbc = require("../") 3 | , db = new odbc.Database() 4 | , assert = require("assert"); 5 | 6 | assert.equal(db.connected, false); 7 | 8 | db.query("select * from " + common.tableName, function (err, rs, sqlca) { 9 | assert.deepEqual(err.message, 'Connection not open.'); 10 | assert.deepEqual(rs, []); 11 | assert.equal(sqlca.sqlcode, -30081); 12 | assert.equal(db.connected, false); 13 | }); 14 | 15 | db.open(common.connectionString, function(err) { 16 | assert.equal(err, null); 17 | assert.equal(db.connected, true); 18 | 19 | db.close(function () { 20 | assert.equal(db.connected, false); 21 | 22 | db.query("select * from " + common.tableName, function (err, rs, sqlca) { 23 | assert.deepEqual(err.message, 'Connection not open.'); 24 | assert.deepEqual(rs, []); 25 | assert.equal(sqlca.sqlcode, -30081); 26 | assert.equal(db.connected, false); 27 | }); 28 | }); 29 | }); 30 | -------------------------------------------------------------------------------- /test/test-open-connectTimeout.js: -------------------------------------------------------------------------------- 1 | // Run this test case individually when build with --debug option and 2 | // look for any error/return code from SetConnectionAttributes function. 3 | 4 | // * test setting connectTimeout via the constructor works 5 | // * test setting systemNaming via the constructor works 6 | // systemNaming is applicable only for i5/OS server. 7 | 8 | var common = require("./common") 9 | , odbc = require("../") 10 | , assert = require("assert"); 11 | 12 | var db = new odbc.Database({ connectTimeout : 10, systemNaming : true }) 13 | 14 | db.open(common.connectionString, function(err) { 15 | assert.equal(db.conn.connectTimeout, 10); 16 | 17 | assert.equal(err, null); 18 | assert.equal(db.connected, true); 19 | 20 | assert.equal(db.conn.systemNaming, true); 21 | 22 | db.close(function () { 23 | assert.equal(db.connected, false); 24 | 25 | db.query("select * from " + common.tableName, function (err, rs, sqlca) { 26 | assert.deepEqual(err.message, 'Connection not open.'); 27 | assert.deepEqual(rs, []); 28 | assert.equal(sqlca.sqlcode, -30081); 29 | assert.equal(db.connected, false); 30 | }); 31 | }); 32 | }); 33 | 34 | -------------------------------------------------------------------------------- /test/test-openSync.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , odbc = require("../") 3 | , db = new odbc.Database() 4 | , assert = require("assert"); 5 | 6 | assert.equal(db.connected, false); 7 | 8 | db.query("select * from " + common.tableName, function (err, rs, sqlca) { 9 | assert.deepEqual(err.message, 'Connection not open.'); 10 | assert.deepEqual(rs, []); 11 | assert.equal(sqlca.sqlcode, -30081); 12 | assert.equal(db.connected, false); 13 | }); 14 | 15 | console.log("Attempting to connect to: %s", common.connectionString); 16 | 17 | try { 18 | db.openSync(common.connectionString); 19 | } 20 | catch(e) { 21 | console.log(e); 22 | assert.deepEqual(e, null); 23 | } 24 | 25 | try { 26 | db.closeSync(); 27 | } 28 | catch(e) { 29 | console.log(e); 30 | assert.deepEqual(e, null); 31 | } 32 | -------------------------------------------------------------------------------- /test/test-pool-connect.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , odbc = require("../") 3 | , pool = new odbc.Pool() 4 | , connectionString = common.connectionString 5 | , connections = [] 6 | , connectCount = 10; 7 | 8 | openConnectionsUsingPool(connections); 9 | 10 | function openConnectionsUsingPool(connections) { 11 | for (var x = 0; x <= connectCount; x++) { 12 | (function (connectionIndex) { 13 | console.error("Opening connection #", connectionIndex); 14 | pool.open(connectionString, function (err, connection) { 15 | if (err) { 16 | console.error("error: ", err.message); 17 | process.exit(-1); 18 | } 19 | 20 | connections.push(connection); 21 | 22 | if (connectionIndex == connectCount) { 23 | closeConnections(connections); 24 | } 25 | }); 26 | })(x); 27 | } 28 | } 29 | 30 | function closeConnections (connections) { 31 | pool.close(function () { 32 | console.error("pool closed"); 33 | }); 34 | } 35 | 36 | 37 | -------------------------------------------------------------------------------- /test/test-pool-idle-connection.js: -------------------------------------------------------------------------------- 1 | // test file to test idle connection is getting dropped or not. 2 | 3 | var ibmdb = require("../") 4 | , pool = new ibmdb.Pool() 5 | , assert = require("assert") 6 | , common = require("./common.js") 7 | , cn = common.connectionString 8 | , starttime 9 | , endtime 10 | ; 11 | 12 | console.log("Trying to open a new connection at => " + getDateTime()); 13 | pool.open(cn, function (err,conn) { 14 | if (err) console.log(err); 15 | assert.equal(err, null); 16 | console.log("Got new connection at => " + getDateTime()); 17 | conn.query('select 1 from sysibm.sysdummy1', function (err, data) { 18 | if (err) console.log(err); 19 | else console.log(data); 20 | 21 | conn.close(function () { 22 | console.log("Connection surrenderred to pool at " + getDateTime()); 23 | console.log('Now wait for 70 seconds and then access connection.'); 24 | }); 25 | 26 | //wait for 2 min then access connection. 27 | setTimeout(function () { 28 | starttime = getDateTime(); 29 | console.log("70 seconds elapesed, try to get connection from pool at ==> "+ starttime); 30 | pool.open(cn, function (err,conn) { 31 | if (err) return console.log(err); 32 | endtime = getDateTime(); 33 | console.log("Got connection from pool at ==> " + endtime); 34 | conn.query('select 1 from sysibm.sysdummy1', function (err, data) { 35 | if (err) console.log(err); 36 | else console.log(data); 37 | 38 | pool.close(function () { 39 | console.log('pool closed.'); 40 | assert(starttime, endtime); 41 | }); 42 | }); 43 | }); 44 | }, 70 * 1000); //setTimeout 2 minute. 45 | }); 46 | }); 47 | 48 | 49 | function getDateTime() { 50 | 51 | var date = new Date(); 52 | 53 | var hour = date.getHours(); 54 | hour = (hour < 10 ? "0" : "") + hour; 55 | 56 | var min = date.getMinutes(); 57 | min = (min < 10 ? "0" : "") + min; 58 | 59 | var sec = date.getSeconds(); 60 | sec = (sec < 10 ? "0" : "") + sec; 61 | 62 | var year = date.getFullYear(); 63 | 64 | var month = date.getMonth() + 1; 65 | month = (month < 10 ? "0" : "") + month; 66 | 67 | var day = date.getDate(); 68 | day = (day < 10 ? "0" : "") + day; 69 | 70 | return year + "." + month + "." + day + " " + hour + ":" + min + ":" + sec; 71 | } 72 | 73 | -------------------------------------------------------------------------------- /test/test-pool-rollbackTransaction.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , odbc = require("../") 3 | , assert = require("assert") 4 | , pool = new odbc.Pool() 5 | , cn = common.connectionString 6 | 7 | 8 | pool.open(cn, function (err, conn) { 9 | if (err) { 10 | console.log(err); 11 | assert.equal(err, null); 12 | } 13 | try { 14 | conn.querySync("drop table mytab4"); 15 | } catch(e) {}; 16 | conn.beginTransaction(function (err) { 17 | if (err) { 18 | //could not begin a transaction for some reason. 19 | console.log(err); 20 | return conn.closeSync(); 21 | } 22 | conn.querySync("create table mytab4 (c1 int, c2 varchar(20))"); 23 | conn.querySync("insert into mytab4 values( 3, 'bimal')"); 24 | console.log(conn.querySync("select * from mytab4")); 25 | conn.rollbackTransaction(function (err) { 26 | if (err) { 27 | //error during commit 28 | console.log(err); 29 | return conn.closeSync(); 30 | } 31 | }); 32 | }); 33 | }); 34 | 35 | 36 | -------------------------------------------------------------------------------- /test/test-pool-uncommited.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , ibmdb = require("../") 3 | , pool = new ibmdb.Pool() 4 | , cn = common.connectionString 5 | 6 | 7 | var request = function (err, conn) { 8 | if (err) { 9 | console.log(err); 10 | process.exit(-1); 11 | } 12 | try { 13 | conn.querySync("drop table mytab4"); 14 | } catch(e) {}; 15 | conn.beginTransaction(function (err) { 16 | if (err) { 17 | //could not begin a transaction for some reason. 18 | console.log(err); 19 | return conn.closeSync(); 20 | } 21 | conn.querySync("create table mytab4 (c1 int, c2 varchar(20))"); 22 | conn.querySync("insert into mytab4 values( 3, 'bimal')"); 23 | console.log(conn.querySync("select * from mytab4")); 24 | conn.close(function(){}); 25 | }); 26 | } 27 | 28 | pool.open(cn, request); 29 | pool.open(cn, request); 30 | setTimeout(function() { 31 | pool.open(cn, request); 32 | pool.open(cn, request); 33 | }, 8000); 34 | -------------------------------------------------------------------------------- /test/test-prepareSync-bad-sql.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , odbc = require("../") 3 | , db = new odbc.Database() 4 | , assert = require("assert") 5 | ; 6 | 7 | const os = require("os"); 8 | 9 | db.openSync(common.connectionString); 10 | assert.equal(db.connected, true); 11 | 12 | try { 13 | var stmt = db.prepareSync("asdf asdf asdf asdf sadf "); 14 | } catch (e) { 15 | // ODBC driver on z/OS does not have deferred prepare enabled 16 | // by default. As a result, we expect the error to be thrown 17 | // on the prepare. 18 | assert.deepEqual(os.type(), "OS/390", "With deferred prepare in Db2Connect on distributed platforms, bad sql should not throw error."); 19 | process.exit(0); 20 | } 21 | assert.equal(stmt.constructor.name, "ODBCStatement"); 22 | 23 | stmt.bindSync(["hello world", 1, null]); 24 | 25 | stmt.execute(function (err, result) { 26 | assert.ok(err); 27 | 28 | stmt.executeNonQuery(function (err, count) { 29 | assert.ok(err); 30 | 31 | db.close(function () {}); 32 | }); 33 | }); 34 | 35 | -------------------------------------------------------------------------------- /test/test-prepareSync-multiple-execution.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , ibmdb = require("../") 3 | , assert = require("assert") 4 | ; 5 | 6 | var count = 0; 7 | var iterations = 10; 8 | 9 | var conn = ibmdb.openSync(common.connectionString); 10 | 11 | common.dropTables(conn, function () { 12 | common.createTables(conn, function (err, data) { 13 | if (err) { 14 | console.log(err); 15 | 16 | return finish(2); 17 | } 18 | 19 | conn.beginTransactionSync(); 20 | var stmt = conn.prepareSync("insert into " + common.tableName + " (colint, coltext) VALUES (?, ?)"); 21 | assert.equal(stmt.constructor.name, "ODBCStatement"); 22 | 23 | recursive(stmt); 24 | }); 25 | }); 26 | 27 | function finish(retValue) { 28 | console.log("finish exit value: %s", retValue); 29 | 30 | conn.closeSync(); 31 | process.exit(retValue || 0); 32 | } 33 | 34 | function recursive (stmt) { 35 | try { 36 | var result = stmt.bindSync([4, 'hello world']); 37 | assert.equal(result, true); 38 | } 39 | catch (e) { 40 | console.log(e.message); 41 | finish(3); 42 | } 43 | 44 | stmt.execute(function (err, result) { 45 | if (err) { 46 | console.log(err.message); 47 | 48 | return finish(4); 49 | } 50 | 51 | result.closeSync(); 52 | count += 1; 53 | 54 | console.log("Executed iteration %s out of %s.", count, iterations); 55 | 56 | if (count < iterations) { 57 | setTimeout(function(){ 58 | recursive(stmt); 59 | },100); 60 | } 61 | else { 62 | console.log("Inserted Rows = "); 63 | console.log(conn.querySync("select * from " + common.tableName)); 64 | try { 65 | var result = stmt.bindSync(['abc', 'hello world']); 66 | assert.equal(result, true); 67 | } 68 | catch (e) { 69 | console.log(e.message); 70 | finish(5); 71 | } 72 | 73 | stmt.execute(function (err, result) { 74 | if (err) { // Expecting Error here. 75 | console.log(err.message); 76 | conn.rollbackTransactionSync(); 77 | var data = conn.querySync("select * from " + common.tableName); 78 | console.log("After roolback, selected rows = ", data); 79 | assert.deepEqual(data, []); 80 | common.dropTables(conn, function () { return finish(0); }); 81 | } 82 | else 83 | { 84 | result.closeSync(); 85 | conn.commitTransactionSync(); 86 | var data = conn.querySync("select * from " + common.tableName); 87 | console.log("After commit, selected rows = ", data); 88 | common.dropTables(conn, function () { return finish(6); }); 89 | } 90 | }); 91 | } 92 | }); 93 | } 94 | -------------------------------------------------------------------------------- /test/test-promisified-connection-pool.js: -------------------------------------------------------------------------------- 1 | // var common = require("./common") 2 | // , Pool = require("../").Pool 3 | // , connectionString = common.connectionString; 4 | // //var Promise = require("bluebird"); 5 | // // Promise.promisifyAll(require("../lib/odbc").prototype); 6 | // // Promise.promisifyAll(require("../lib/odbc").Pool.prototype); 7 | // // Promise.promisifyAll(require("../lib/odbc").Database.prototype); 8 | // var pool = new Pool(); 9 | // function getSqlConnection() 10 | // { 11 | // 12 | // // return pool.openAsync(connectionString).disposer(function (conn) { 13 | // // console.log("connection opened."); 14 | // // conn.query('select 1 from sysibm.sysdummy1', function (err, data) { 15 | // // if (err) console.log(err); 16 | // // else console.log(data); 17 | // // conn.close(function () { 18 | // // console.log('done'); 19 | // // }); 20 | // // }); 21 | // // }); 22 | // 23 | // } 24 | // exports.getSqlConnection = getSqlConnection; 25 | // getSqlConnection(); 26 | -------------------------------------------------------------------------------- /test/test-query-create-table-fetchSync.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , odbc = require("../") 3 | , db = new odbc.Database() 4 | , assert = require("assert") 5 | ; 6 | 7 | db.openSync(common.connectionString); 8 | 9 | db.queryResult("create table " + common.tableName + " (COLINT INTEGER, COLDATETIME DATETIME, COLTEXT TEXT)", function (err, result) { 10 | console.log(arguments); 11 | 12 | try { 13 | //this should throw because there was no result to be had? 14 | var data = result.fetchAllSync(); 15 | console.log(data); 16 | } 17 | catch (e) { 18 | console.log(e); 19 | } 20 | 21 | db.closeSync(); 22 | }); 23 | 24 | -------------------------------------------------------------------------------- /test/test-query-create-table.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , odbc = require("../") 3 | , db = new odbc.Database() 4 | , assert = require("assert") 5 | ; 6 | 7 | db.openSync(common.connectionString); 8 | common.createTables(db, function (err, data, morefollowing) { 9 | console.log(arguments); 10 | db.closeSync(); 11 | }); 12 | 13 | -------------------------------------------------------------------------------- /test/test-query-drop-table.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , odbc = require("../") 3 | , db = new odbc.Database() 4 | , assert = require("assert") 5 | ; 6 | 7 | db.openSync(common.connectionString); 8 | common.dropTables(db, function (err, data) { 9 | db.closeSync(); 10 | assert.equal(err, null); 11 | assert.deepEqual(data, []); 12 | }); 13 | 14 | -------------------------------------------------------------------------------- /test/test-query-insert.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , odbc = require("../") 3 | , db = new odbc.Database() 4 | , assert = require("assert") 5 | , insertCount = 0; 6 | ; 7 | 8 | db.open(common.connectionString, function(err) { 9 | common.dropTables(db, function () { 10 | common.createTables(db, function (err) { 11 | assert.equal(err, null); 12 | 13 | db.query("insert into " + common.tableName + " (COLTEXT) values ('sandwich')", insertCallback); 14 | db.query("insert into " + common.tableName + " (COLTEXT) values ('fish')", insertCallback); 15 | db.query("insert into " + common.tableName + " (COLTEXT) values ('scarf')", insertCallback); 16 | 17 | }); 18 | }); 19 | }); 20 | 21 | function insertCallback(err, data) { 22 | assert.equal(err, null); 23 | assert.deepEqual(data, []); 24 | 25 | insertCount += 1; 26 | 27 | if (insertCount === 3) { 28 | let param1 = {ParamType: "IN", DataType: "SQL_CHAR", Data: 'rocket'}; 29 | let data = db.querySync("select COLTEXT from final table (insert into " + common.tableName + " (COLTEXT) values (?))", [param1]); 30 | console.log("Inserted data = ", data); 31 | assert.deepEqual(data, [ { COLTEXT: 'rocket' } ]); 32 | common.dropTables(db, function () { 33 | db.close(function () { 34 | console.error("Done"); 35 | }); 36 | }); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /test/test-query-select-fetch.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , odbc = require("../") 3 | , db = new odbc.Database() 4 | , assert = require("assert") 5 | ; 6 | 7 | db.openSync(common.connectionString); 8 | assert.equal(db.connected, true); 9 | 10 | var query = {"sql": "select 1 as COLINT, 'some test' as COLTEXT FROM SYSIBM.SYSDUMMY1"}; 11 | db.queryResult(query, function (err, result) { 12 | assert.equal(err, null); 13 | assert.equal(result.constructor.name, "ODBCResult"); 14 | 15 | result.fetch(function (err, data) { 16 | db.closeSync(); 17 | console.log("Returned data = " + JSON.stringify(data)); 18 | assert.deepEqual(data, { COLINT: '1', COLTEXT: 'some test' }); 19 | }); 20 | }); 21 | 22 | -------------------------------------------------------------------------------- /test/test-query-select-fetchMode-array.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , odbc = require("../") 3 | , db = odbc({ fetchMode : odbc.FETCH_ARRAY }) 4 | , assert = require("assert") 5 | ; 6 | 7 | db.openSync(common.connectionString); 8 | 9 | assert.equal(db.connected, true); 10 | 11 | db.query("select 1 as COLINT, 'some test' as COLTEXT FROM SYSIBM.SYSDUMMY1", function (err, data) { 12 | assert.equal(err, null); 13 | 14 | db.closeSync(); 15 | assert.deepEqual(data, [[1,"some test"]]); 16 | }); 17 | 18 | -------------------------------------------------------------------------------- /test/test-query-select.js: -------------------------------------------------------------------------------- 1 | let common = require("./common") 2 | , ibmdb = require("../") 3 | , assert = require("assert") 4 | ; 5 | 6 | let conn = null; 7 | let data = null; 8 | 9 | main(); 10 | 11 | async function main() { 12 | conn = await ibmdb.open(common.connectionString); 13 | await testColAlias(); 14 | await testDupColNames(); 15 | await testColumnAlias(); 16 | await testCharInsert(); 17 | await conn.close(); 18 | console.log("All tests executed."); 19 | } 20 | 21 | async function testColAlias() { 22 | try { 23 | data = await conn.query("select 1 as \"COLINT\", 'some test' as \"COLTEXT\" FROM SYSIBM.SYSDUMMY1"); 24 | } catch (error) { 25 | assert.equal(error, null); 26 | } 27 | console.log("Result from testColAlias = ",data); 28 | assert.deepEqual(data, [{ COLINT: '1', COLTEXT: 'some test' }]); 29 | return; 30 | } 31 | 32 | async function testDupColNames() { 33 | let sql = "select 'text 1' as name, 'text 2' as name from SYSIBM.SYSDUMMY1"; 34 | try { 35 | data = await conn.query(sql); 36 | } catch(error) { 37 | assert.equal(error, null); 38 | } 39 | console.log("Result from testDupColNames= ", data); 40 | } 41 | 42 | async function testColumnAlias() { 43 | let sql = "select 'abc' as first, 'dcd' as second, 'efg', 'pqr', 'xyz' as last from SYSIBM.SYSDUMMY1"; 44 | ibmdb.debug(2); 45 | try { 46 | data = await conn.querySync(sql); 47 | } catch(error) { 48 | assert.equal(error, null); 49 | } 50 | console.log("Result from testColumnAlias= ", data); 51 | ibmdb.debug(false); 52 | } 53 | 54 | async function testCharInsert() { 55 | await conn.query("drop table test1").catch((e) => {}); 56 | await conn.query("create table test1(c1 int, c2 char(5))"); 57 | await conn.query("insert into test1 values (1, 'abcde')"); 58 | await conn.query("insert into test1 values (2, 'abcd')"); 59 | await conn.query("insert into test1 values (?, ?)", [3, 'ABCDE']); 60 | await conn.query("insert into test1 values (?, ?)", [4, 'ABCD']); 61 | await conn.query("insert into test1 values (?, ?)", [5, { ParamType: 'INPUT', SQLType: 'CHAR', Data: 'DSWC' }]); 62 | console.log("Result from testCharInsert =", conn.querySync("select * from test1")); 63 | await conn.query("drop table test1"); 64 | } 65 | -------------------------------------------------------------------------------- /test/test-queryResult.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , ibmdb = require("../") 3 | , assert = require("assert") 4 | , cn = common.connectionString; 5 | 6 | ibmdb.open(cn, function (err,conn) { 7 | if (err) return console.log(err); 8 | var query = 'select creator, name from sysibm.systables where 1 = ?'; 9 | var params = [1]; 10 | conn.queryResult(query, params, function (err, data) { 11 | if(err) { 12 | console.log(err); 13 | } 14 | else { 15 | console.log("data = ", data.fetchAllSync()); 16 | console.log("sqlerror = ", data.getSQLErrorSync()); 17 | console.log("metadata = ", data.getColumnMetadataSync()); 18 | data.closeSync(); 19 | conn.close(function(){}); 20 | } 21 | }); 22 | }); 23 | 24 | ibmdb.open(cn, function (err,conn) { 25 | if (err) return console.log(err); 26 | var query = 'select creator, name from sysibm.systables'; 27 | var result = conn.queryResultSync(query); 28 | console.log("result = ", result); 29 | console.log("data = ", result.fetchAllSync()); 30 | console.log("sqlerror = ", result.getSQLErrorSync()); 31 | console.log("metadata = ", result.getColumnMetadataSync()); 32 | result.closeSync(); 33 | conn.closeSync(); 34 | }); 35 | 36 | -------------------------------------------------------------------------------- /test/test-queryStream.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , odbc = require("../") 3 | , db = new odbc.Database() 4 | , assert = require("assert") 5 | ; 6 | 7 | const os = require("os"); 8 | 9 | db.openSync(common.connectionString); 10 | assert.equal(db.connected, true); 11 | 12 | var stream = db.queryStream("wrong query"); 13 | // adding the 'data' eventhandler starts the stream 14 | stream.once('data', function (data) { 15 | throw new Error("data should not return from an erroring queryStream."); 16 | }).once('error', function (err) { 17 | assert.equal(err.sqlstate, (os.type() === "OS/390")?'37000':'42601'); 18 | db.close(function(){ 19 | console.log("Error test for queryStream completed successfully."); 20 | }); 21 | }); 22 | 23 | odbc.open(common.connectionString, function(err, conn) { 24 | if(err) return console.log(err); 25 | assert.equal(conn.connected, true); 26 | 27 | var sql = "select 1 as COLINT, 'some test' as COLTEXT FROM SYSIBM.SYSDUMMY1"; 28 | var stream = conn.queryStream(sql); 29 | 30 | stream.once('data', function (data) { 31 | assert.deepEqual(data, { COLINT: '1', COLTEXT: 'some test' }); 32 | console.log("Select test for queryStream completed successfully."); 33 | }).once('error', function (err) { 34 | conn.closeSync(); 35 | throw err; 36 | }).once('end', function () { 37 | conn.close(function(){ console.log("done.") }); 38 | }); 39 | }); 40 | 41 | -------------------------------------------------------------------------------- /test/test-querySync-select-with-exception.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , odbc = require("../") 3 | , db = new odbc.Database() 4 | , assert = require("assert") 5 | ; 6 | 7 | db.openSync(common.connectionString); 8 | assert.equal(db.connected, true); 9 | var err = null; 10 | 11 | try { 12 | err = db.querySync("select invalid query"); 13 | } 14 | catch (e) { 15 | err = e; 16 | } 17 | console.log(err); 18 | 19 | db.closeSync(); 20 | assert.equal(err.error, "[node-ibm_db] Error in ODBCConnection::QuerySync while executing query."); 21 | -------------------------------------------------------------------------------- /test/test-querySync-select.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , odbc = require("../") 3 | , db = new odbc.Database() 4 | , assert = require("assert") 5 | ; 6 | 7 | db.openSync(common.connectionString); 8 | assert.equal(db.connected, true); 9 | 10 | var data = db.querySync("select 1 as \"COLINT\", 'some test' as \"COLTEXT\" FROM SYSIBM.SYSDUMMY1"); 11 | assert.deepEqual(data, [{ COLINT: 1, COLTEXT: 'some test' }]); 12 | 13 | // Test multiple result set returned by querySync. 14 | db.fetchMode = 3; // Fetch in array mode. 15 | data[0] = db.querySync("select 1, 2, 3 from sysibm.sysdummy1"); 16 | data[1] = db.querySync("select 4, 5, 6 from sysibm.sysdummy1"); 17 | console.log(data); 18 | assert.deepEqual(data, [ [ [ 1, 2, 3 ] ], [ [ 4, 5, 6 ] ] ]); 19 | 20 | db.fetchMode = 4; // Fetch in object mode. It is default mode too. 21 | data[0] = db.querySync("select 1 from sysibm.sysdummy1"); 22 | data[1] = db.querySync("select 2 from sysibm.sysdummy1"); 23 | data[2] = db.querySync("select 3 from sysibm.sysdummy1"); 24 | console.log(data); 25 | assert.deepEqual(data[2], [ { '1': 3 } ]); 26 | db.closeSync(); 27 | 28 | 29 | -------------------------------------------------------------------------------- /test/test-quick-example.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , ibmdb = require("../") 3 | , assert = require("assert") 4 | , cn = common.connectionString; 5 | 6 | main(); 7 | async function main() { 8 | try { 9 | let conn = await ibmdb.open(cn); 10 | await conn.query("create table mytab(c1 int, c2 varchar(10))"); 11 | await conn.query("insert into mytab values (?, ?)", [3, 'ibm']); 12 | let stmt = await conn.prepare("select * from mytab"); 13 | let result = await stmt.execute(); 14 | data = await result.fetchAll(); 15 | console.log("result = ", data); 16 | assert.deepEqual(data, [ { C1: 3, C2: 'ibm' } ]); 17 | await result.close(); 18 | await stmt.close(); 19 | await conn.query("drop table mytab").catch((e) => {console.log(e);}); 20 | await conn.close(); 21 | } catch(e) { 22 | console.log(e); 23 | } 24 | } 25 | 26 | -------------------------------------------------------------------------------- /test/test-require-and-end.js: -------------------------------------------------------------------------------- 1 | var odbc = require("../") 2 | ; 3 | 4 | //This test should just exit. This tests an issue where 5 | //the C++ ODBC::Init function was causing the event loop to 6 | //stay alive 7 | 8 | console.log("done"); -------------------------------------------------------------------------------- /test/test-sp-array.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , ibmdb = require("../") 3 | , assert = require("assert") 4 | , schema = common.connectionObject.CURRENTSCHEMA; 5 | 6 | 7 | if (common.isZOS) { 8 | // Does not support ARRAY Data Type in CALL stmt. 9 | return 0; 10 | } 11 | 12 | ibmdb.open(common.connectionString, function (err, conn) { 13 | if(err) { 14 | console.log(err); 15 | process.exit(-1); 16 | } 17 | var arr1 = [10, 20, 30, 40, 50]; 18 | var arr2 = ["Row 10", "Row 20", "Row 30", "Row 40", "Row 50"]; 19 | var param1= { ParamType: "ARRAY", DataType: "INTEGER", Data: arr1 } ; 20 | var param2= { ParamType: "ARRAY", DataType: "VARCHAR", Data: arr2, Length:6 } ; 21 | var queryOptions = {sql: "CALL ARRAYPROCEDURE(?, ?)", 22 | params: [param1, param2], 23 | ArraySize: 5}; 24 | 25 | try { conn.querySync("drop table arrtab2;"); } 26 | catch (e) { } 27 | 28 | conn.beginTransactionSync(); 29 | var ret = conn.querySync("create table arrtab2(c1 int, c2 varchar(10));"); 30 | console.log("crete table ret = ", ret); 31 | ret = conn.querySync("CREATE PROCEDURE ARRAYPROCEDURE (" + 32 | "IN arr1 INT, IN arr2 VARCHAR(10)) LANGUAGE SQL BEGIN " + 33 | "INSERT INTO ARRTAB2 VALUES (arr1, arr2);" + 34 | "END"); 35 | console.log("create procedure ret = ", ret); 36 | 37 | // Call SP Synchronously. 38 | ret = conn.querySync(queryOptions); 39 | var result = conn.querySync("select * from arrtab2"); 40 | console.log("Result for Select = ", result); 41 | var data = [ 42 | { C1: 10, C2: 'Row 10' }, 43 | { C1: 20, C2: 'Row 20' }, 44 | { C1: 30, C2: 'Row 30' }, 45 | { C1: 40, C2: 'Row 40' }, 46 | { C1: 50, C2: 'Row 50' } 47 | ]; 48 | 49 | assert.deepEqual(data, result); 50 | conn.rollbackTransaction(); 51 | conn.closeSync(); 52 | 53 | }); 54 | 55 | -------------------------------------------------------------------------------- /test/test-sp-dbc-6000.js: -------------------------------------------------------------------------------- 1 | // Test case to test the OUT parameters and Result set returned by 2 | // Stored Procedure when Async and Sync forms of Prepare and Execute 3 | // APIs are used. 4 | 5 | var ibmdb = require("../") 6 | , assert = require("assert") 7 | , common = require("./common") 8 | , connStr = common.connectionString; 9 | 10 | //connStr = "database=RS22DC1A;hostname=rs22.rocketsoftware.com;port=3750;uid=" + common.connectionObject.UID + ";pwd=" + common.connectionObject.PWD; 11 | 12 | if (process.env.IBM_DB_SERVER_TYPE !== "ZOS") { 13 | return; 14 | } 15 | 16 | var proc = "CREATE PROCEDURE SYSPROC.TBV8930 (in vlog_header varchar(200), out return_code char(05), out sql_code integer, out result varchar(200)) language sql commit on return no query acceleration NONE asutime LIMIT 5002 reads sql data dynamic result sets 1 package owner DVLPP with explain MAIN: BEGIN declare sqlcode integer; declare sqlstate char(5); declare c1 cursor with return for select lower(vlog_header) as vlog_header from sysibm.sysdummy1; set result = upper(vlog_header) ; set return_code = '00000' , sql_code = 0 ; open c1; END MAIN"; 17 | 18 | var query = "call SYSPROC.TBV8930(?, ?, ?, ?)"; 19 | var result; 20 | var dropProc = "drop procedure SYSPROC.TBV8930"; 21 | 22 | ibmdb.debug(true); 23 | ibmdb.open(connStr, function (err, conn) { 24 | if(err) { 25 | console.log(err); 26 | process.exit(-1); 27 | } 28 | param1 = {ParamType:"INPUT", DataType:1, Data:"aBcDeFgH"}; 29 | param2 = {ParamType:"OUTPUT", DataType:1, Data:"", Length:5}; 30 | param3 = {ParamType:"OUTPUT", Data:50}; 31 | param4 = {ParamType:"OUTPUT", DataType:1, Data:"", Length:200}; 32 | 33 | try { 34 | conn.querySync(dropProc); 35 | } catch(e) { }; 36 | 37 | // Create SP 38 | conn.querySync(proc); 39 | 40 | // Call SP Synchronously. 41 | stmt = conn.prepareSync(query); 42 | //console.log(stmt.bindSync(['1', param2])); 43 | result = stmt.executeSync([param1, param2, param3, param4]); 44 | console.log("Result for Synchronous call of PROC ==>"); 45 | if(Array.isArray(result)) 46 | { 47 | // Print INOUT and OUT param values for SP. 48 | console.log("\tOut Params = ", result[1]); 49 | assert.deepEqual(result[1], [ '00000', 0, 'ABCDEFGH' ]); 50 | result = result[0]; 51 | } 52 | data = result.fetchAllSync(); 53 | console.log("\tResult Set = ", data); 54 | assert.equal(data.length, 1); 55 | while(result.moreResultsSync()) { 56 | data = result.fetchAllSync(); 57 | console.log(data); 58 | } 59 | result.closeSync(); 60 | stmt.closeSync(); 61 | // Call SP Asynchronously. 62 | conn.prepare(query, function (err, stmt) { 63 | if (err) console.log(err); 64 | stmt.execute([param1, param2, param3, param4], function(err, result, outparams) { 65 | if( err ) console.log(err); 66 | else { 67 | data = result.fetchAllSync(); 68 | console.log("\nResult for Async call of PROC (3 OUT param and 1 Result Sets) ==>"); 69 | console.log("\tOut Params = ", outparams); 70 | assert.deepEqual(outparams, [ '00000', 0, 'ABCDEFGH' ]); 71 | console.log("\tResult Set = ", data); 72 | assert.equal(data.length, 1); 73 | while(result.moreResultsSync()) { 74 | data = result.fetchAllSync(); 75 | console.log(data); 76 | } 77 | result.closeSync(); 78 | } 79 | stmt.closeSync(); 80 | 81 | console.log("Dropping the procedure..."); 82 | conn.querySync(dropProc); 83 | // Close connection in last only. 84 | conn.close(function (err) { console.log("done.");}); 85 | }); 86 | }); 87 | }); 88 | 89 | -------------------------------------------------------------------------------- /test/test-transaction-commit-sync.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , odbc = require("../") 3 | , db = new odbc.Database() 4 | , assert = require("assert") 5 | , exitCode = 0 6 | ; 7 | 8 | 9 | db.openSync(common.connectionString); 10 | 11 | common.createTables(db, function (err, data) { 12 | try { 13 | db.beginTransactionSync(); 14 | 15 | var results = db.querySync("insert into " + common.tableName + " (COLINT, COLDATETIME, COLTEXT) VALUES (42, null, null)" ); 16 | 17 | db.rollbackTransactionSync(); 18 | 19 | results = db.querySync("select * from " + common.tableName); 20 | 21 | assert.deepEqual(results, []); 22 | } 23 | catch (e) { 24 | console.log("Failed when rolling back"); 25 | console.log(e); 26 | exitCode = 1 27 | } 28 | 29 | try { 30 | //Start a new transaction 31 | db.beginTransactionSync(); 32 | 33 | result = db.querySync("insert into " + common.tableName + " (COLINT, COLDATETIME, COLTEXT) VALUES (42, null, null)" ); 34 | 35 | db.commitTransactionSync(); //commit 36 | 37 | result = db.querySync("select * from " + common.tableName); 38 | 39 | assert.deepEqual(result, [ { COLINT: 42, COLDATETIME: null, COLTEXT: null } ]); 40 | } 41 | catch (e) { 42 | console.log("Failed when committing"); 43 | console.log(e); 44 | 45 | exitCode = 2; 46 | } 47 | 48 | common.dropTables(db, function (err) { 49 | db.closeSync(); 50 | process.exit(exitCode); 51 | }); 52 | }); 53 | 54 | 55 | -------------------------------------------------------------------------------- /test/test-transaction-commit.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , odbc = require("../") 3 | , db = new odbc.Database() 4 | , assert = require("assert") 5 | , exitCode = 0 6 | ; 7 | 8 | 9 | db.openSync(common.connectionString); 10 | 11 | common.dropTables(db, function (err) { 12 | common.createTables(db, function (err, data) { 13 | test1() 14 | 15 | function test1() { 16 | db.beginTransaction(function (err) { 17 | if (err) { 18 | console.log("Error beginning transaction."); 19 | console.log(err); 20 | exitCode = 1 21 | } 22 | 23 | var result = db.querySync("insert into " + common.tableName + " (COLINT, COLDATETIME, COLTEXT) VALUES (42, null, null)" ); 24 | 25 | //rollback 26 | db.endTransaction(true, function (err) { 27 | if (err) { 28 | console.log("Error rolling back transaction"); 29 | console.log(err); 30 | exitCode = 2 31 | } 32 | 33 | data = db.querySync("select * from " + common.tableName); 34 | 35 | assert.deepEqual(data, []); 36 | 37 | test2(); 38 | }); 39 | }); 40 | } 41 | 42 | function test2 () { 43 | //Start a new transaction 44 | db.beginTransaction(function (err) { 45 | if (err) { 46 | console.log("Error beginning transaction"); 47 | console.log(err); 48 | exitCode = 3 49 | } 50 | 51 | result = db.querySync("insert into " + common.tableName + " (COLINT, COLDATETIME, COLTEXT) VALUES (42, null, null)" ); 52 | 53 | //commit 54 | db.endTransaction(false, function (err) { 55 | if (err) { 56 | console.log("Error committing transaction"); 57 | console.log(err); 58 | exitCode = 3 59 | } 60 | 61 | data = db.querySync("select * from " + common.tableName); 62 | 63 | assert.deepEqual(data, [ { COLINT: 42, COLDATETIME: null, COLTEXT: null } ]); 64 | 65 | finish(); 66 | }); 67 | }); 68 | } 69 | 70 | function finish() { 71 | common.dropTables(db, function (err) { 72 | db.closeSync(); 73 | process.exit(exitCode); 74 | }); 75 | } 76 | }); 77 | }); 78 | 79 | 80 | -------------------------------------------------------------------------------- /test/test-xml-datatype.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , ibmdb = require("../") 3 | , assert = require("assert") 4 | , cn = common.connectionString 5 | , isZOS = common.isZOS 6 | , schema = common.connectionObject.CURRENTSCHEMA; 7 | 8 | var query = "CaLL " + schema + ".PROC1(?, ?, ?)"; 9 | ibmdb.open(cn, function (err, conn) { 10 | if (err) console.log(err); 11 | assert.equal(err, null); 12 | try { 13 | if (isZOS) { 14 | // The DROP PROCEDURE syntax on z/OS can only specify the name of the procedure to drop. 15 | conn.querySync("drop procedure " + schema + ".PROC1"); 16 | } else { 17 | conn.querySync("drop procedure " + schema + ".PROC1(INT, INT, XML)"); 18 | } 19 | } catch (e) { } 20 | 21 | if (isZOS) { 22 | // CREATE OR REPLACE syntax is not supported on z/OS. 23 | // When creating an SQL native procedure on z/OS, you will need to have a WLM environment 24 | // defined for your system if you want to run the procedure in debugging mode. 25 | // Adding "disable debug mode" to bypass this requirement. 26 | conn.querySync("create procedure " + schema + ".PROC1 " + 27 | "(IN v1 INTEGER, OUT v2 INTEGER, INOUT v3 XML) " + 28 | "disable debug mode " + 29 | "BEGIN set v2 = v1 + 1; set v3 = XMLPARSE(DOCUMENT' xml '); END"); 30 | } else { 31 | conn.querySync("create or replace procedure " + schema + ".PROC1 " + 32 | "(IN v1 INTEGER, OUT v2 INTEGER, INOUT v3 XML) " + 33 | "BEGIN set v2 = v1 + 1; set v3 = XMLPARSE(DOCUMENT' xml '); END"); 34 | } 35 | var param1 = { ParamType: "INPUT", DataType: 1, Data: 0 }; 36 | var param2 = { ParamType: "OUTPUT", DataType: 1, Data: 0 }; 37 | var param3 = { ParamType: "INOUT", DataType: "XML", Data: " xml ", Length: 200 }; 38 | 39 | result = conn.querySync(query, [param1, param2, param3]); 40 | console.log("Output Parameters V2 = ", result[0], ", V3 = ", result[1]); 41 | 42 | if (isZOS) { 43 | // The DROP PROCEDURE syntax on z/OS can only specify the name of the procedure to drop. 44 | conn.querySync("drop procedure " + schema + ".PROC1"); 45 | } else { 46 | conn.querySync("drop procedure " + schema + ".PROC1(INT, INT, XML)"); 47 | } 48 | if (isZOS) { 49 | // CREATE OR REPLACE syntax is not supported on z/OS. Drop PROCEDURE first. 50 | // When creating an SQL native procedure on z/OS, you will need to have a WLM environment 51 | // defined for your system if you want to run the procedure in debugging mode. 52 | // Adding "disable debug mode" to bypass this requirement. 53 | try { 54 | conn.querySync("drop procedure " + schema + ".PROC2"); 55 | } catch (e) { } 56 | conn.querySync("create procedure " + schema + ".PROC2 (IN v1 INTEGER) disable debug mode BEGIN END"); 57 | } else { 58 | conn.querySync("create or replace procedure " + schema + ".PROC2 (IN v1 INTEGER) BEGIN END"); 59 | } 60 | result = conn.querySync("call " + schema + ".PROC2(?)", [param1]); 61 | assert.deepEqual(result, []); 62 | if (isZOS) { 63 | // The DROP PROCEDURE syntax on z/OS can only specify the name of the procedure to drop. 64 | conn.querySync("drop procedure " + schema + ".PROC2"); 65 | } else { 66 | conn.querySync("drop procedure " + schema + ".PROC2(INT)"); 67 | } 68 | conn.closeSync(); 69 | console.log('done'); 70 | }); 71 | -------------------------------------------------------------------------------- /test/testWebApp.js: -------------------------------------------------------------------------------- 1 | var common = require("./common") 2 | , odbc = require("../") 3 | , db = new odbc.Database() 4 | , fs = require("fs"); 5 | 6 | db.open(common.connectionString, function(err) 7 | { 8 | if (err) { 9 | console.error(err.message); 10 | return; 11 | } 12 | let app = function (req, res) { 13 | if (req.url == "/close") { 14 | db.closeSync(); 15 | db = null; 16 | res.writeHead(200, {'Content-Type': 'text/plain'}); 17 | res.write("Web Application Ended."); 18 | res.end(); 19 | process.exit(1); 20 | } 21 | 22 | var query = "select 1234 from sysibm.sysdummy1"; 23 | 24 | db && db.query(query, function(err, rows) 25 | { 26 | if (err) { 27 | console.error(err.message); 28 | } 29 | console.log("Selected Data = ", rows); 30 | res.writeHead(200, {'Content-Type': 'text/plain'}); 31 | res.write(JSON.stringify(rows)); 32 | res.end(); 33 | }); 34 | } 35 | 36 | // Create options object of key and certificate for SSL connection. 37 | // These key and cert files are generated by below command 38 | // executed from "git bash" terminal on Windows: 39 | // openssl req -nodes -new -x509 -keyout server.key -out server.cert 40 | const options = { 41 | key: fs.readFileSync("server.key"), 42 | cert: fs.readFileSync("server.cert") 43 | }; 44 | require('https').createServer(options, app).listen(8082, "127.0.0.1"); 45 | console.log("App is listening on 127.0.0.1:8082"); 46 | }); 47 | 48 | process.on('uncaughtException', function (err) { 49 | console.error('uncaughtException:' + err); 50 | console.error(err.stack); 51 | }); 52 | -------------------------------------------------------------------------------- /test/trace: -------------------------------------------------------------------------------- 1 | # Script file to enable db2trc and run node.js script to collect 2 | # db2trace files to diagnose the issue and make sure setup is proper. 3 | # This script is only for non-Windows platform. 4 | 5 | testfile="$1" 6 | if [ $# -eq 0 ]; then 7 | echo "test file to execute is missing. Usage: trace test.js" 8 | exit 1; 9 | fi 10 | 11 | if [ "$IBM_DB_HOME" == "" ] 12 | then 13 | IBM_DB_HOME=`pwd`/../installer/clidriver 14 | fi 15 | OS=`uname` 16 | 17 | export PATH=$IBM_DB_HOME/bin:$IBM_DB_HOME/adm:$IBM_DB_HOME/lib:$PATH 18 | if [ "$OS" == "Darwin" ] 19 | then 20 | export DYLD_LIBRARY_PATH=$IBM_DB_HOME/lib:$DYLD_LIBRARY_PATH 21 | else 22 | export LD_LIBRARY_PATH=$IBM_DB_HOME/lib:$LD_LIBRARY_PATH 23 | fi 24 | 25 | rm -rf 1.trc 1.flw 1.fmt 1.fmtc 1.cli 26 | if [ "$OS" == "Darwin" ] 27 | then 28 | db2trc on -l 2m 29 | else 30 | db2trc on -f 1.trc 31 | fi 32 | sleep 5 33 | 34 | node $testfile 35 | # You can use either above db2cli command or below node command to run .js file. 36 | # Keep only one and comment other. Better to use above validate command first. 37 | #node ../defect/t.js 38 | 39 | if [ "$OS" == "Darwin" ] 40 | then 41 | db2trc dump 1.trc 42 | fi 43 | db2trc off 44 | db2trc flw -t 1.trc 1.flw 45 | db2trc fmt 1.trc 1.fmt 46 | db2trc fmt -c 1.trc 1.fmtc 47 | db2trc fmt -cli 1.trc 1.cli 48 | 49 | echo "Generated trace files:" 50 | echo "`ls 1.*`" 51 | 52 | -------------------------------------------------------------------------------- /test/webapp.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Node.js App 5 | 6 | 7 | 8 |

Click on link to display image.

9 | HOME 10 |
11 |

Show Image1 12 | Show Image2

13 | 14 |
15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /test/webapp.js: -------------------------------------------------------------------------------- 1 | var ibmdb = require("../") 2 | , common = require("./common") 3 | , pool = new ibmdb.Pool() 4 | , app = require('express')() 5 | , cn = common.connectionString 6 | , requestNo = 0 7 | , img1 = "data/pushpa.jpg" 8 | , img2 = "data/panda.jpg" 9 | ; 10 | 11 | app.disable('x-powered-by'); 12 | //ibmdb.debug(true); 13 | pool.init(5, cn); 14 | function getConnection() { 15 | var conn; 16 | pool.open(cn, function(err, connection) { 17 | if(err) return console.log(err); 18 | conn = connection; 19 | }); 20 | return conn; 21 | } 22 | pool.open(cn, function(err, conn) { 23 | if(err) { 24 | console.log(err); 25 | exit(1); 26 | } 27 | 28 | try{ 29 | conn.querySync("drop table imgtab"); 30 | } catch (e) {}; 31 | try{ 32 | conn.querySync("create table imgtab (id int, filename varchar(50), image BLOB(200K))"); 33 | } catch (e) {}; 34 | 35 | conn.prepare("insert into imgtab (id, filename, image) values(?, ? , ?)", function(err, stmt){ 36 | if(err) return console.log(err); 37 | stmt.execute([1, 'img1.jpg', {ParamType:"FILE", DataType:"BLOB", Data:img1}], 38 | function(err, result){ 39 | if(err) return console.log(err); 40 | console.log("image 1 inserted."); 41 | stmt.execute([2, 'img2.jpg', {ParamType:"FILE", DataType:"BLOB", Data:img2}], 42 | function(err, result){ 43 | if(err) return console.log(err); 44 | else {result.closeSync(); 45 | console.log("image 2 inserted.");} 46 | conn.close(function(){console.log("done.");}); 47 | console.log("App is running on localhost:3000 "); 48 | }); 49 | }); 50 | }); 51 | }); 52 | 53 | app.listen(3000); 54 | 55 | app.get('/', function(req, res) { 56 | res.sendFile('webapp.html', {root: __dirname }); 57 | }); 58 | 59 | app.get('/:id', function(req, res) { 60 | var imgid = req.params.id; 61 | var no = ++requestNo; 62 | console.log("Received id = " + imgid + " for request no "+no); 63 | if(imgid != parseInt(imgid)) return console.log("id is not int."); 64 | var conn = getConnection(); 65 | if(typeof(conn) !== 'object') { console.log("Invalid connection..");res.send(conn); res.end(); } 66 | else 67 | conn.query("SELECT id, filename, image FROM imgtab WHERE id=?", [imgid], function(err, rows) { 68 | if(err){ 69 | return console.log(err); 70 | } else { 71 | res.set('Content-Type', 'image/jpeg'); 72 | res.send(Buffer.from(rows[0].IMAGE, 'binary')); 73 | res.end(); 74 | console.log("File "+ rows[0].FILENAME + " sent for request no = "+no+", id = "+ imgid); 75 | conn.close(function(){console.log("Done for request ", no);}); 76 | } 77 | }); 78 | }) 79 | 80 | -------------------------------------------------------------------------------- /typescript/ConnStr.ts: -------------------------------------------------------------------------------- 1 | export interface ConnStr { 2 | DATABASE: string; 3 | HOSTNAME: string; 4 | PORT: number | string; 5 | PROTOCOL: string; 6 | UID: string; 7 | PWD: string; 8 | } 9 | -------------------------------------------------------------------------------- /typescript/DB2Error.ts: -------------------------------------------------------------------------------- 1 | export interface DB2Error extends Error { 2 | sqlcode: number; 3 | sqlstate: string; 4 | resultset?: Array; 5 | } 6 | -------------------------------------------------------------------------------- /typescript/DescribeObject.ts: -------------------------------------------------------------------------------- 1 | export interface DescribeObject { 2 | database: string; 3 | schema?: string; 4 | type?: string; 5 | table?: string; 6 | column?: string; 7 | } 8 | -------------------------------------------------------------------------------- /typescript/ODBC.ts: -------------------------------------------------------------------------------- 1 | import { DB2Error } from './DB2Error'; 2 | import { ODBCConnection } from './ODBCConnection'; 3 | 4 | export type ColumnValue = number | null | Date | boolean | Buffer | string; 5 | 6 | export type RecordArray = Array; 7 | export type RecordTuple = Record; 8 | 9 | export type ArrayParam = 10 | | [ 11 | number /*paramtype*/, 12 | number /*c_type*/, 13 | number /*type*/, 14 | ( 15 | | null 16 | | number 17 | | boolean 18 | | Array 19 | | Buffer 20 | | string 21 | ) 22 | ] 23 | | [ 24 | number /*paramtype*/, 25 | number /*c_type*/, 26 | number /*type*/, 27 | ( 28 | | null 29 | | number 30 | | boolean 31 | | Array 32 | | Buffer 33 | | string 34 | ), 35 | number /*buffer length*/ 36 | ]; 37 | 38 | export class ODBC { 39 | static SQL_CLOSE: number; 40 | static SQL_DROP: number; 41 | static SQL_UNBIND: number; 42 | static SQL_RESET_PARAMS: number; 43 | static SQL_DESTROY: number; 44 | static FETCH_ARRAY: number; 45 | static FETCH_OBJECT: number; 46 | 47 | constructor() {} 48 | 49 | createConnection( 50 | cb: (err: DB2Error | null, conn?: ODBCConnection) => void 51 | ): void; 52 | createConnection() {} 53 | 54 | createConnectionSync(): ODBCConnection; 55 | createConnectionSync(): any {} 56 | } 57 | -------------------------------------------------------------------------------- /typescript/ODBCResult.ts: -------------------------------------------------------------------------------- 1 | import { FetchMode } from './attributes'; 2 | import { CloseOption } from './Database'; 3 | import { DB2Error } from './DB2Error'; 4 | import { ColumnValue, RecordArray, RecordTuple } from './ODBC'; 5 | 6 | export type RecordTupleOrArray = RecordArray | RecordTuple; 7 | 8 | export type SQLResults = Array; 9 | 10 | export interface FetchOptions { 11 | fetchMode: FetchMode; 12 | } 13 | 14 | export interface Column { 15 | index: number; 16 | SQL_DESC_NAME: string; 17 | SQL_DESC_TYPE_NAME: string; 18 | SQL_DESC_CONSIZE_TYPE: number; 19 | SQL_DESC_DISPLAY_SIZE: number; 20 | SQL_DESC_PRECISION: number; 21 | SQL_DESC_SCALE: number; 22 | SQL_DESC_LENGTH: number; 23 | } 24 | 25 | export class ODBCResult { 26 | private constructor() { 27 | // Internal only 28 | } 29 | 30 | fetchMode: number; // Defaults to FETCH_OBJECT 31 | 32 | fetch( 33 | options: FetchOptions, 34 | cb: (err: null | DB2Error, data: RecordTupleOrArray | null) => void 35 | ): void; 36 | fetch( 37 | cb: (err: null | DB2Error, data: RecordTupleOrArray | null) => void 38 | ): void; 39 | fetch(options?: FetchOptions): Promise; 40 | fetch(): any {} 41 | 42 | fetchSync(options?: FetchOptions): null | RecordTupleOrArray; 43 | fetchSync(): any {} 44 | 45 | fetchAll( 46 | options: FetchOptions, 47 | cb: ( 48 | err: DB2Error | null, 49 | data: SQLResults | null, 50 | colCount: number 51 | ) => void 52 | ): void; 53 | fetchAll( 54 | cb: ( 55 | err: DB2Error | null, 56 | data: SQLResults | null, 57 | colCount: number 58 | ) => void 59 | ): void; 60 | fetchAll(options?: FetchOptions): Promise; 61 | fetchAll(): any {} 62 | 63 | fetchAllSync(options?: FetchOptions): SQLResults; 64 | fetchAllSync(): any {} 65 | 66 | getData( 67 | colNum: number, 68 | dataSize: number, 69 | cb: (err: null | DB2Error, row: ColumnValue | null) => void 70 | ): void; 71 | getData( 72 | colNum: number, 73 | cb: (err: null | DB2Error, row: ColumnValue | null) => void 74 | ): void; 75 | getData(colNum?: number, dataSize?: number): Promise; 76 | getData(): any {} 77 | 78 | getDataSync(colNum: number, dataSize: number): ColumnValue | null; 79 | getDataSync(): any {} 80 | 81 | close(closeOption: CloseOption, cb: (err: DB2Error | null) => void): void; 82 | close(cb: (err: DB2Error | null) => void): void; 83 | close(closeOption?: CloseOption): Promise; 84 | close(): any {} 85 | 86 | closeSync(closeOption?: CloseOption): true; 87 | closeSync(): any {} 88 | 89 | moreResultsSync(): boolean; 90 | moreResultsSync(): any {} 91 | 92 | getColumnNamesSync(): string[]; 93 | getColumnNamesSync(): any {} 94 | 95 | getColumnMetadataSync(): Array; 96 | getColumnMetadataSync(): any {} 97 | 98 | getSQLErrorSync(): DB2Error; 99 | getSQLErrorSync(): any {} 100 | 101 | getAffectedRowsSync(): number; 102 | getAffectedRowsSync(): any {} 103 | } 104 | -------------------------------------------------------------------------------- /typescript/ODBCStatement.ts: -------------------------------------------------------------------------------- 1 | import { SQLParam } from './Database'; 2 | import { DB2Error } from './DB2Error'; 3 | import { ODBCResult } from './ODBCResult'; 4 | 5 | export class ODBCStatement { 6 | private constructor() { 7 | // Internal only 8 | } 9 | 10 | prepareSync(sql: string): boolean; 11 | prepareSync(): any {} 12 | 13 | closeSync(closeOption: number): true; 14 | closeSync(): any {} 15 | 16 | execute( 17 | params: SQLParam[], 18 | cb: ( 19 | err: DB2Error, 20 | result?: ODBCResult, 21 | outparams?: Array | null 22 | ) => void 23 | ): void; 24 | execute( 25 | cb: ( 26 | err: DB2Error, 27 | result?: ODBCResult, 28 | outparams?: Array | null 29 | ) => void 30 | ): void; 31 | execute( 32 | params?: SQLParam[] 33 | ): Promise< 34 | [ODBCResult, Array] | ODBCResult 35 | >; 36 | execute(): any {} 37 | 38 | executeSync( 39 | params?: SQLParam[] 40 | ): [ODBCResult, Array] | ODBCResult | null; 41 | executeSync(): any {} 42 | 43 | executeDirect( 44 | sql: string, 45 | cb: (err: DB2Error | null, result?: ODBCResult) => void 46 | ): null; 47 | executeDirect(sql: string): Promise; 48 | executeDirect(): any {} 49 | 50 | executeNonQuery( 51 | params: SQLParam[], 52 | cb: (err: DB2Error | null, res?: number) => void 53 | ): null; 54 | executeNonQuery(cb: (err: DB2Error | null, res?: number) => void): null; 55 | executeNonQuery(params?: SQLParam[]): Promise; 56 | executeNonQuery(): any {} 57 | 58 | executeNonQuerySync(params: SQLParam[]): null | number; 59 | executeNonQuerySync(): any {} 60 | 61 | prepare(sql: string, cb: (err: DB2Error | null) => void): null; 62 | prepare(sql: string): Promise; 63 | prepare(): any {} 64 | 65 | bind(params: SQLParam[], cb: (err: DB2Error | null) => void): void; 66 | bind(cb: (err: DB2Error | null) => void): void; 67 | bind(params?: SQLParam[]): Promise; 68 | bind(): any {} 69 | 70 | bindSync(params: SQLParam[]): boolean; 71 | bindSync(): any {} 72 | 73 | setAttr( 74 | attr: number, 75 | value: number | null | string, 76 | cb: (err: DB2Error | null) => void 77 | ): null; 78 | setAttr(attr: number, value: number | null | string): Promise; 79 | setAttr(): any {} 80 | 81 | setAttrSync(attr: number, value: number | null | string): boolean; 82 | setAttrSync(): any {} 83 | 84 | close(closeOption: number, cb: (err: DB2Error | null) => void): void; 85 | close(cb: (err: DB2Error | null) => void): void; 86 | close(closeOption?: number): Promise; 87 | close(): any {} 88 | } 89 | -------------------------------------------------------------------------------- /typescript/Options.ts: -------------------------------------------------------------------------------- 1 | import { ODBC } from './ODBC'; 2 | import { FetchMode } from './attributes'; 3 | import { Pool } from './Pool'; 4 | 5 | export interface Options { 6 | odbc?: ODBC; 7 | fetchMode?: 0 | 3 | 4 | FetchMode | null; 8 | connected?: boolean; 9 | connectTimeout?: number | null; 10 | systemNaming?: boolean; 11 | codeSet?: string | null; 12 | mode?: string | null; 13 | pool?: Pool | null; 14 | connStr?: string | null; 15 | } 16 | -------------------------------------------------------------------------------- /typescript/Pool.ts: -------------------------------------------------------------------------------- 1 | import { ConnStr } from './ConnStr'; 2 | import { Database } from './Database'; 3 | import { DB2Error } from './DB2Error'; 4 | import { ODBC } from './ODBC'; 5 | import { PoolOptions } from './PoolOptions'; 6 | 7 | export class Pool { 8 | options: PoolOptions; 9 | maxPoolSize: number; 10 | index: number; 11 | availablePool: object; 12 | usedPool: object; 13 | poolSize: number; 14 | odbc: ODBC; 15 | 16 | constructor(options?: PoolOptions); 17 | constructor() {} 18 | 19 | open(connStr: string, cb: (err: DB2Error | null, db: Database) => void): null; 20 | open(connStr: string): Promise; 21 | open(): any {} 22 | 23 | openSync(connStr: string): Database; 24 | openSync(): any {} 25 | 26 | poolCloseSync(): void; 27 | poolCloseSync(): any {} 28 | 29 | poolClose(cb: (err: null) => void): void; 30 | poolClose(): Promise; 31 | poolClose(): any {} 32 | 33 | init(count: number, connStr: string): DB2Error | true; 34 | init(): any {} 35 | 36 | initAsync( 37 | count: number, 38 | connStr: string | ConnStr, 39 | cb: (err: Error | null) => void 40 | ): DB2Error | true; 41 | initAsync(count: number, connStr: string | ConnStr): Promise; 42 | initAsync(): any {} 43 | 44 | setMaxPoolSize(size: number): true; 45 | setMaxPoolSize(): any {} 46 | 47 | // DEPRECATED 48 | setConnectTimeout(timeout: number): true; 49 | setConnectTimeout(): any {} 50 | 51 | cleanup(connStr: string): boolean | undefined; 52 | cleanup(): any {} 53 | 54 | close(cb: () => void): void; 55 | close(): Promise; 56 | close(): any {} 57 | 58 | closeSync(): null | true; 59 | closeSync(): any {} 60 | } 61 | -------------------------------------------------------------------------------- /typescript/PoolOptions.ts: -------------------------------------------------------------------------------- 1 | export interface PoolOptions { 2 | idleTimeout?: number; 3 | autoCleanIdle?: boolean; 4 | maxPoolSize?: number; 5 | connectTimeout?: number; 6 | systemNaming?: boolean; 7 | } 8 | -------------------------------------------------------------------------------- /typescript/README.md: -------------------------------------------------------------------------------- 1 | # Typescript types 2 | 3 | ## Building the types 4 | 5 | The types are written as standard Typescript code (.ts files). After making any changes, be sure to 6 | run `npm run build:types` to build the types and populate the dist/ folder before publishing 7 | the npm module. -------------------------------------------------------------------------------- /typescript/index.ts: -------------------------------------------------------------------------------- 1 | import { ConnStr } from './ConnStr'; 2 | import { Database } from './Database'; 3 | import { Options } from './Options'; 4 | 5 | export * from './attributes'; 6 | export * from './ConnStr'; 7 | export * from './Database'; 8 | export * from './DescribeObject'; 9 | export * from './ODBC'; 10 | export * from './ODBCConnection'; 11 | export * from './ODBCResult'; 12 | export * from './ODBCStatement'; 13 | export * from './Options'; 14 | export * from './Pool'; 15 | export * from './PoolOptions'; 16 | export * from './DB2Error'; 17 | 18 | export default function (options?: Options): Database; 19 | export default function (): any {} 20 | 21 | export function getElapsedTime(): string; 22 | export function getElapsedTime(): any {} 23 | 24 | export function debug(x: boolean | 2): void; 25 | export function debug(): any {} 26 | 27 | export function open( 28 | connStr: string | ConnStr, 29 | options: Options | null, 30 | cb?: (err: Error, db: Database) => void 31 | ): void; 32 | export function open( 33 | connStr: string | ConnStr, 34 | cb?: (err: Error, db: Database) => void 35 | ): void; 36 | export function open( 37 | connStr: string | ConnStr, 38 | options?: Options | null 39 | ): Promise; 40 | export function open(): any {} 41 | 42 | export function openSync( 43 | connStr: string | ConnStr, 44 | options?: Options 45 | ): Database; 46 | export function openSync(): any {} 47 | 48 | export function createDbSync( 49 | dbName: string, 50 | connStr: string | ConnStr, 51 | options: Options 52 | ): boolean; 53 | export function createDbSync(): any {} 54 | 55 | export function dropDbSync( 56 | dbName: string, 57 | connStr: string | ConnStr, 58 | options: Options 59 | ): boolean; 60 | export function dropDbSync(): any {} 61 | -------------------------------------------------------------------------------- /typescript/tests/test.ts: -------------------------------------------------------------------------------- 1 | import * as ibmdb from '../index'; 2 | 3 | function testFetchMode() { 4 | // Valid 5 | ibmdb.open('db', { fetchMode: 0 }); 6 | ibmdb.open('db', { fetchMode: 3 }); 7 | ibmdb.open('db', { fetchMode: 4 }); 8 | ibmdb.open('db', { fetchMode: ibmdb.FETCH_ARRAY }); 9 | ibmdb.open('db', { fetchMode: ibmdb.FETCH_OBJECT }); 10 | ibmdb.open('db', { fetchMode: ibmdb.FETCH_NODATA }); 11 | 12 | // Invalid 13 | ibmdb.open('db', { fetchMode: 18 }); 14 | } 15 | -------------------------------------------------------------------------------- /typescript/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "node16", 4 | "lib": ["es6"], 5 | "outDir": "./dist", 6 | "noImplicitAny": true, 7 | "noImplicitThis": true, 8 | "strictNullChecks": true, 9 | "strictFunctionTypes": true, 10 | // "strict": true /* Enable all strict type-checking options. */, 11 | "types": ["node"], 12 | "declaration": true, 13 | "emitDeclarationOnly": true, 14 | "forceConsistentCasingInFileNames": true 15 | }, 16 | "include": ["*.ts"], 17 | "exclude": ["Database.ts", "Options.ts", "Pool.ts"] 18 | } 19 | --------------------------------------------------------------------------------