diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..ed9f9cc --- /dev/null +++ b/.eslintignore @@ -0,0 +1 @@ +coverage \ No newline at end of file diff --git a/.eslintrc.yml b/.eslintrc.yml new file mode 100644 index 0000000..549f156 --- /dev/null +++ b/.eslintrc.yml @@ -0,0 +1,5 @@ +extends: eslint:recommended +installedESLint: true +env: + es6: true + node: true diff --git a/.gitignore b/.gitignore index 3c3629e..ba2a97b 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ node_modules +coverage diff --git a/.travis.yml b/.travis.yml index 3d7a492..ad27084 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,64 +1,33 @@ +sudo: required + language: node_js node_js: - # Quote the version number as Travis will interpret 0.10 as 0.1 unless quoted. - - "0.10" + - 4.4 + - 4.5 + - 4.6 + - 5 + - 6 + +services: + - docker env: - - CUBRID_VERSION=9.1.0 - - CUBRID_VERSION=8.4.4 - - CUBRID_VERSION=8.4.3 - - CUBRID_VERSION=8.4.1 + - CUBRID_VERSION=9.3.6.0002 + - CUBRID_VERSION=9.2.26.0004 + - CUBRID_VERSION=9.2.3.0005 + - CUBRID_VERSION=9.1.0.0218 + - CUBRID_VERSION=9.0.0.0478 + - CUBRID_VERSION=8.4.3.10001 + - CUBRID_VERSION=8.4.1.32003 before_install: - # According to http://docs.travis-ci.com/user/build-configuration/ - # prepare the system to install prerequisites or dependencies. - # Update the OS before installing prerequisites. - - sudo apt-get update - # Install Chef Solo prerequisites. - # Ruby >=2.0.0 is required by one of the Chef dependencies. - # Build Ruby from source. Will auto install gem. - - RUBY_MAJOR_VERSION=2.2 - - RUBY_VERSION=$RUBY_MAJOR_VERSION.0 - # Install Ruby prerequisites. - - sudo apt-get install -y build-essential zlib1g-dev libssl-dev libreadline6-dev libyaml-dev wget ssl-cert - # Download Ruby source into the current directory. - - wget http://cache.ruby-lang.org/pub/ruby/$RUBY_MAJOR_VERSION/ruby-$RUBY_VERSION.tar.gz - # Extract Ruby source - - tar -xvzf ruby-$RUBY_VERSION.tar.gz - # Enter the Ruby directory. - - cd ruby-$RUBY_VERSION - # Configure Ruby. - - ./configure --prefix=/usr/local - - make - # Install Ruby. - - sudo make install - # Return back to the previous directory. - - cd .. - # Install Chef Solo. - # Chef Solo 11.4.4 is broken, so install one of the later versions. - # The bug was supposed to be fixed in 11.4.5 which is already released. - - sudo gem install chef --no-rdoc --no-ri - -install: - # Install dev dependencies for this Node.js project. - - npm install - # CUBRID operates on IPv4 address, while Travis defaults to IPv6. - # Therefore, we need to explicitly override the default `hostname` - # to point to an IPv4 address. - - sudo hostname localhost - # Make sure the target directory for cookbooks exists. - - mkdir -p /tmp/chef-solo - # Prepare a file with runlist for Chef Solo. - - echo '{"cubrid":{"version":"'$CUBRID_VERSION'"},"run_list":["cubrid::demodb"]}' > cubrid_chef.json - # Install CUBRID via Chef Solo. Download all cookbooks from a remote URL. - - sudo chef-solo -c test/testSetup/solo.rb -j cubrid_chef.json -r http://sourceforge.net/projects/cubrid/files/CUBRID-Demo-Virtual-Machines/Vagrant/chef-cookbooks.tar.gz/download + - docker pull lighthopper/cubrid:$CUBRID_VERSION + - docker run -d -p 33000:33000 --name cubrid lighthopper/cubrid:$CUBRID_VERSION ./create-start-demodb.sh + - docker ps -a + - docker logs cubrid after_success: - # Install JSCoverage prerequisites. - - sudo apt-get install zip - # Install JSCoverage to instrument code covered version of the node-cubrid module. - - export JSCOVERAGE_VERSION=0.5.1 - - wget http://siliconforks.com/jscoverage/download/jscoverage-$JSCOVERAGE_VERSION.tar.bz2 - - tar jxf jscoverage-$JSCOVERAGE_VERSION.tar.bz2 && cd jscoverage-$JSCOVERAGE_VERSION && ./configure && make && sudo make install && cd .. - - npm run cover + - npm run coverage + +script: npm run test diff --git a/CUBRID version supported.txt b/CUBRID version supported.txt deleted file mode 100644 index 74df60b..0000000 --- a/CUBRID version supported.txt +++ /dev/null @@ -1,2 +0,0 @@ ->=8.4.1.2030 -<=9.1 diff --git a/Dockerfile b/Dockerfile index f3f1a55..3d0c539 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,7 @@ # This is a Dockerfile to build an image for running # node-cubrid tests. -FROM node:0.10 +FROM node:4.5.0 MAINTAINER Esen Sagynov @@ -12,7 +12,7 @@ WORKDIR /node-cubrid # Update the OS before installing prerequisites. RUN apt-get update -# Install Ruby prerequisites. +# Install Ruby prerequisites. Necessary to run Chef. RUN apt-get install -y build-essential zlib1g-dev libssl-dev libreadline6-dev libyaml-dev wget ssl-cert libffi6 libffi-dev # Install Chef Solo prerequisites. diff --git a/README.md b/README.md index 38ef902..15af345 100644 --- a/README.md +++ b/README.md @@ -1,40 +1,40 @@ # node-cubrid [![Build Status](https://travis-ci.org/CUBRID/node-cubrid.png)](https://travis-ci.org/CUBRID/node-cubrid) -[![Coverage Status](https://coveralls.io/repos/CUBRID/node-cubrid/badge.png)](https://coveralls.io/r/CUBRID/node-cubrid) + +This is a Node.js driver for [CUBRID](http://www.cubrid.org) open-source relational database. +**node-cubrid** is implemented in 100% JavaScript with no external dependency (except the +development dependencies). Besides the database specific APIs, the module supplies several +*helper* APIs which are useful to sanitize and validate user input values, format and +parametrize SQL statements, etc. **Table of Contents** -* [Introduction](#introduction) * [Key features](#key-features) * [CHANGELOG](#changelog) * [Installation](#installation) * [Request flow in node-cubrid](#request-flow-in-node-cubrid) * [API Documentation](#api-documentation) - * [Creating a CUBRID client](#creating-a-cubrid-client) - * [Establishing a connection](#establishing-a-connection) - * [Connection configuration](#connection-configuration) - * [Setting connection timeout](#setting-connection-timeout) - * [Setting CUBRID Server Parameters](#setting-cubrid-server-parameters) - * [Executing SQL queries](#executing-sql-queries) - * [READ queries](#read-queries) - * [Close Query](#close-query) - * [WRITE queries](#write-queries) - * [Queueing](#queueing) - * [Transactions](#transactions) - * [Closing a connection](#closing-a-connection) - * [Events by EventEmitter](#events-by-eventemitter) + * [Creating a CUBRID client](#creating-a-cubrid-client) + * [Establishing a connection](#establishing-a-connection) + * [Connection configuration](#connection-configuration) + * [Setting connection timeout](#setting-connection-timeout) + * [Setting CUBRID Server Parameters](#setting-cubrid-server-parameters) + * [Executing SQL queries](#executing-sql-queries) + * [READ queries](#read-queries) + * [Close Query](#close-query) + * [WRITE queries](#write-queries) + * [Queueing](#queueing) + * [Transactions](#transactions) + * [Closing a connection](#closing-a-connection) + * [Events by EventEmitter](#events-by-eventemitter) * [More examples](#more-examples) * [Running tests](#running-tests) - * [Running tests in a Docker container](#running-tests-in-a-docker-container) + * [Running tests in a Docker container](#running-tests-in-a-docker-container) * [What's next](#whats-next) * [Authors and Contributors](#authors-and-contributors) * [Special thanks](#special-thanks) -## Introduction - -This is a Node.js driver for [CUBRID](http://www.cubrid.org) open-source relational database. **node-cubrid** is implemented in 100% JavaScript with no external dependency. Besides the database specific APIs, the module supplies several *helper* APIs which are useful to sanitize and validate user input values, format and parameterize SQL statements, etc. - ## Key features - Full compatibility with CUBRID 8.4.1+ releases. @@ -42,43 +42,36 @@ This is a Node.js driver for [CUBRID](http://www.cubrid.org) open-source relatio - Support for queries queueing. - Support for database schema. - Support for database parameters and transactions. -- Support for [LOB](http://www.cubrid.org/manual/92/en/sql/datatype.html#blob-clob-data-types) objects. -- Support for [ENUM](http://www.cubrid.org/manual/92/en/sql/datatype.html#enum-data-type) data types since CUBRID 9+. +- Support for [LOB](http://www.cubrid.org/manual/93/en/sql/datatype.html#blob-clob-data-types) (Binary and Character) objects. +- Support for [ENUM](http://www.cubrid.org/manual/93/en/sql/datatype.html#enum-data-type) data types since CUBRID 9+. - Fully implements the event emitter. -- Extensive tests suite (260K+ assertions). -- User demos: E2E scenarios, web sites. -- ...and many more! +- Extensive tests suite (87% code coverage). +- Full `Promise` support since `v3.0.0`. ## CHANGELOG -You can find the change logs in [CHANGELOG.md](https://github.com/CUBRID/node-cubrid/blob/master/CHANGELOG.md) file. +Refer to https://github.com/CUBRID/node-cubrid/releases tab. ## Installation -Installing and using **node-cubrid** is easy. To install, one has to initiate `npm install` command with `node-cubrid` module name as an argument in the directory where a Node.js application is located. +Since `v3.0.0` the driver requires Node `>=v4`. If you are on an older version of Node, +you can use the previous `node-cubrid` `v2.2.5`. - npm install node-cubrid + npm install node-cubrid -This will install the latest version available at [https://npmjs.org/](https://npmjs.org/). Once installed, the module can be accessed by requiring the `node-cubrid` module: +This will install the latest version available at https:* www.npmjs.com/package/node-cubrid. +Once installed, the module can be accessed by requiring the `node-cubrid` module: - var CUBRID = require('node-cubrid'); + const CUBRID = require('node-cubrid'); The node-cubrid module exports the following properties and functions: -* `ActionQueue`: an object which provides the [`waterfall()`](https://github.com/caolan/async#waterfall) functionality of [async](https://github.com/caolan/async) module. -* `Helpers`: an object which provides a set of helper functions. -* `Result2Array`: an object which provides functions to convert DB result sets into JS arrays. -* `createCUBRIDConnection()` or `createConnection()`: a function which returns a connection object to work with a user defined CUBRID host and database. -* `createDefaultCUBRIDDemodbConnection()`: a function which returns a connection object to work with a local [demodb](http://blog.cubrid.org/wiki_tutorials/entry/getting-started-with-demodb-cubrid-demo-database) database. +- `Helpers`: an object which provides a set of helper functions. +- `createConnection()` (*alias* `createCUBRIDConnection()`): a function which returns a new client connection object to work with a user defined CUBRID host and database. +- `createDefaultCUBRIDDemodbConnection()`: a function which returns a connection object to work with a local [demodb](http://blog.cubrid.org/wiki_tutorials/entry/getting-started-with-demodb-cubrid-demo-database) database. ## Request flow in node-cubrid -The request flow in node-cubrid module looks as illustrated below. - -![Figure 1: Request flow in node-cubrid](http://blog.cubrid.org/files/attach/images/194379/839/471/cubrid_nodejs_events_chain.png) - -Because **node-cubrid** is developed to take the full advantage of JavaScript and Node.js programming, when executing a SQL statement in **node-cubrid**, developers need to listen for an `EVENT_QUERY_DATA_AVAILABLE` and `EVENT_ERROR` events, or provide a callback function which will be called once there is a response from the server. - When the request is sent to the server, CUBRID executes it, and returns the response, which can be either a query result set, or the error code. It is by design that CUBRID does not return any identification about the request sender. In other words, in order to associate the response with a request, the driver has to have only one active request which can be the only owner of this response. For this reason, if a developer wants to execute several queries, they must execute them one after another, i.e. sequentially, NOT in parallel. This is how the communication between the driver and the server is implemented in CUBRID and most other database systems including MySQL. @@ -89,841 +82,1138 @@ If there is a vital need to run queries in parallel, developers can use connecti ### Creating a CUBRID client - // `createCUBRIDConnection()` function accepts either an object or a list of - // connection parameters. The following list of parameters are supported at - // this moment: - // 1. `host`: an IP or a domain name of the CUBRID host (without http:// part). - // Defaults to `localhost`. - // 2. `port`: a port CUBRID is listening at. Defaults to `33000`. - // 3. `user`: the database username. Defaults to `public`. - // 4. `password`: the database user password. Defaults to an empty string. - // 5. `database`: the name of a database to connect to. Default to `demodb`. - // 6. `cacheTimeout`: the timeout value in milliseconds for the query results - // cache. All query results will be cached if `cacheTimeout > 0`. The - // cached results will be returned if the same SQL query is executed within - // the timeout period. Defaults to `0`. - // 7. `connectionTimeout`: the timeout value in milliseconds for the connection. - // If `connectionTimeout = 0`, it will wait until the network socket times out - // itself. Defaults to `0`. - - // All arguments are optional in which case default values will be set. - var client = CUBRID.createCUBRIDConnection(host, port, user, password, database, cacheTimeout, connectionTimeout); - - // Alias function since version 2.1.0. - var client = CUBRID.createConnection(host, port, user, password, database, cacheTimeout, connectionTimeout); - - // Alternatively, an object of parameters can be passed. Since version 2.1.0. - var client = CUBRID.createConnection(paramsObject); + /* + * `createCUBRIDConnection()` function accepts either an object or a list of + * connection parameters. The following list of parameters are supported: + * 1. `hosts`: Can be either: + * - a string representing an IP or a domain name of the CUBRID host + * (without the `http://` part) + * - (since 3.0.0) an array of strings like + * `['host1[:port1]', 'host2[:port2]', ...]`. + * + * When a custom `port` is not specified, the driver will use the + * default `port` specified by the user when creating a connection. + * When a user has not specified the default `port`, it defaults to + * `33000`. + * + * Defaults to `localhost`. + * 2. `port`: a port CUBRID is listening to. Defaults to `33000`. + * 3. `user`: the database username. Defaults to `public`. + * 4. `password`: the database user password. Defaults to an empty string. + * 5. `database`: the name of a database to connect to. Default to `demodb`. + * 7. `connectionTimeout`: the timeout value in milliseconds for the connection. + * If `connectionTimeout = 0`, it will wait until the network socket times out + * itself. Defaults to `0`. + * 8. `maxConnectionRetryCount`: the number of times the connection needs to + * be retried in case of failure. Defaults to `1`. Since `3.0.0`. + * 9. `logger`: a custom logger that implements at least `debug` and `info` + * functions. Defaults to noop (nothing will be logged). For more details + * refer to **Logging** section below. Since `3.0.0`. + */ + + // All arguments are optional in which case default values will be set. + var client = CUBRID.createCUBRIDConnection(host, port, user, password, database, connectionTimeout); + + * Alias function since version 2.1.0. + var client = CUBRID.createConnection(host, port, user, password, database, connectionTimeout); + + // Alternatively, an object of parameters can be passed. Since version 2.1.0. + var client = CUBRID.createConnection(paramsObject); The following example shows how to create a client by providing an object of connection parameters. - var client = CUBRID.createConnection({ - host: host, - port: port, - user: user, - password: password: - database: database, - cacheTimeout: cacheTimeout, - connectionTimeout: connectionTimeout - }); + const client = CUBRID.createConnection({ + host: host, + port: port, + user: user, + password: password: + database: database, + connectionTimeout: connectionTimeout, + maxConnectionRetryCount: maxConnectionRetryCount, + logger: logger + }); ### Establishing a connection - // callback(err) function receives one arguments: the error message if any. - client.connect(callback); + // callback(err) function receives one arguments: the error message if any. + const promise = client.connect(callback); #### Callback style -The code below illustrates a *callback* style when a function is passed as an argument to a `connect()` API which is called after the module receives a response from CUBRID. - - var CUBRID = require('node-cubrid'), - dbConf = { - host: 'localhost', - port: 33000, - user: 'public' - password: '', - database: 'demodb' - }, - client = CUBRID.createCUBRIDConnection(dbConf.host, dbConf.port, dbConf.user, dbConf.password, dbConf.database); - - client.connect(function (err) { - if (err) { - throw err; - } else { - console.log('connection is established'); - - client.close(function (err) { - if (err) { - throw err; - } else { - console.log('connection is closed'); - } - }); - } - }); - -#### Event-based style - -Alternatively, developers can write applications based on an event-based coding style. For example, the above code can be rewritten as: - - client.connect(); - - client.on(client.EVENT_ERROR, function (err) { - throw err; - }); - - client.on(client.EVENT_CONNECTED, function () { - console.log('connection is established'); - - client.close(); - }); - - client.on(client.EVENT_CONNECTION_CLOSED, function () { - console.log('connection is closed'); - }); - -If you prefer the event-based coding style, refer to the [Driver Event model](http://blog.cubrid.org/wiki_apis/entry/cubrid-node-js-api-overview) wiki page to learn more about other events **node-cubrid** emits for certain API calls. +The code below illustrates a *callback* style when a function is passed as an argument +to a `connect()` API which is called after the module receives a response from CUBRID. + + const CUBRID = require('node-cubrid'); + const dbConf = { + host: 'localhost', + port: 33000, + user: 'public' + password: '', + database: 'demodb' + }; + const client = CUBRID.createConnection(dbConf); + + client.connect(function (err) { + if (err) { + throw err; + } else { + console.log('connection is established'); + + client.close(function (err) { + if (err) { + throw err; + } else { + console.log('connection is closed'); + } + }); + } + }); + +#### Promise style + +Alternatively, a `Promise` style is supported. For example, the above code can be rewritten as: + client + .connect() + .then(() => { + console.log('connection is established'); + + return client.close(); + }) + .catch(err => { + throw err; + }); + #### Implicit connection -**node-cubrid** also provides implicit connection feature. When you execute a query on a client without explicitly establishing a connection with `client.connect()`, the driver will automatically establish a connection, then execute your query. +**node-cubrid** performs an implicit connection whenever necessary. When you execute a query +on a client without explicitly establishing a connection by calling `client.connect()`, the +driver will automatically establish a connection before executing your query. #### Connection errors There can be several reasons for a connection to fail: -1. **Connection timeout**: - 1. when the host does not respond within the specified time larger than `0`, you will receive the following error message emitted by **node-cubrid**: +- **Connection timeout**: - { [Error: connect ETIMEDOUT] } + - when the host does not respond within the specified time larger than `0`, + you will receive the following error message: - 2. when no timeout value is set or its value is `0`, the following timeout error is emitted by the underlying network socket. + { [Error: connect ETIMEDOUT] } - { [Error: connect ETIMEDOUT] code: 'ETIMEDOUT', errno: 'ETIMEDOUT', syscall: 'connect' } + - when no timeout value is set or its value is `0`, the following timeout + error is emitted by the underlying network socket. -2. **Incorrect hostname**: + { [Error: connect ETIMEDOUT] code: 'ETIMEDOUT', errno: 'ETIMEDOUT', syscall: 'connect' } - { [Error: getaddrinfo ENOTFOUND] code: 'ENOTFOUND', errno: 'ENOTFOUND', syscall: 'getaddrinfo' } +- **Incorrect hostname**: -3. **Incorrect port**: - * When you try to connect to a port listened by an active service other than CUBRID or if a firewall refuses the connection, you will see the following error message: - - { [Error: connect ECONNREFUSED] code: 'ECONNREFUSED', errno: 'ECONNREFUSED', syscall: 'connect' } - - * If the port is not listened by any service, then you will see the **Connection timeout** error as in the first case. - * The last type of error message you would receive if an incorrect port is provided is: + { [Error: getaddrinfo ENOTFOUND] code: 'ENOTFOUND', errno: 'ENOTFOUND', syscall: 'getaddrinfo' } - { [Error: read ECONNRESET] code: 'ECONNRESET', errno: 'ECONNRESET', syscall: 'read' } +- **Incorrect port**: + + * When you try to connect to a port listened by an active service other than + CUBRID or if a firewall refuses the connection, you will see the following error message: + + { [Error: connect ECONNREFUSED] code: 'ECONNREFUSED', errno: 'ECONNREFUSED', syscall: 'connect' } + + * If the port is not listened by any service, then you will see the **Connection timeout** + error as in the first case. + + * The last type of error message you would receive if an incorrect port is provided is: + + { [Error: read ECONNRESET] code: 'ECONNRESET', errno: 'ECONNRESET', syscall: 'read' } ### Connection configuration #### Setting connection timeout - // Both functions are available since version 2.0.0. - var timeoutInMsec = client.getConnectionTimeout(); - // Set connection timeout in milliseconds. - client.setConnectionTimeout(2000); - - // Alternatively, set the connection timeout value at client creation time. - // Available since version 2.1.0. - var client = CUBRID.createConnection(host, port, user, password, database, cacheTimeout, connectionTimeout); + // Both functions are available since version 2.0.0. + const timeoutInMilliseconds = client.getConnectionTimeout(); + + // Set connection timeout in milliseconds. + client.setConnectionTimeout(2000); + + // Alternatively, set the connection timeout value at client creation time. + // Available since version 2.1.0. + var client = CUBRID.createConnection(host, port, user, password, database, connectionTimeout); -One of the requests we have got for the 2.0 driver release was to implement a connection timeout feature. Simply said - wait for the connection to the database to complete within the specified number of seconds and eventually throw an error if the timeout occurs. +One of the requests we have got for the 2.0 driver release was to implement a connection +timeout feature. Simply said - wait for the connection to the database to complete within +the specified number of seconds and eventually throw an error if the timeout occurs. -Obviously, the key thing here was to set the connection timeout at the Node.js socket connection layer level (and not on the consumer level): +Obviously, the key thing here was to set the connection timeout at the Node.js socket +connection layer level (and not on the consumer level): - self._socket = Net.createConnection(self.initialBrokerPort, self.brokerServer); - self._socket.setNoDelay(true); - self._socket.setTimeout(this._CONNECTION_TIMEOUT); + this._socket = Net.createConnection(hostInfo.port, hostInfo.host); + this._socket.setNoDelay(true); + this._socket.setTimeout(this.getConnectionTimeout()); -In **node-cubrid** by default the connection timeout value is set to `0`, i.e. **node-cubrid** will wait long enough until the underlying network socket times out itself. In this case, according to our observations, the `timeout` event is emitted in about 75 seconds (**purely observational point**). +In **node-cubrid** by default the connection timeout value is set to `0`, i.e. +the driver will wait long enough until the underlying network socket times out itself. +In this case, according to our observations, the `timeout` event is emitted in about +`75` seconds (**purely observational point**). -So, if you want or expect the connection to timeout within the specified time, then manually set the timeout value as shown below. +So, if you want or expect the connection to timeout within the specified time, then +manually set the timeout value as shown below. - var client = new CUBRIDConnection(dbConf.host, dbConf.port, dbConf.user, dbConf.password, dbConf.database); + const client = new CUBRIDConnection(dbConf.host, dbConf.port, dbConf.user, dbConf.password, dbConf.database, /* connectionTimeout */ 2000); - // 2 seconds timeout. - client.setConnectionTimeout(2000); - - client.connect(function (err) { - if (err) { - console.log(err); - } - - client.close(); - }); + // Or at runtime. + client.setConnectionTimeout(2000); + + client.connect(function (err) { + if (err) { + console.log(err); + } + + client.close(); + }); -As you see, the timeout is specified in milliseconds `2,000`, which is 2 seconds. After the 2 seconds, the script will timeout: +As you see, the timeout is specified in milliseconds `2000`, which is 2 seconds. +After 2 seconds, the script will timeout with an error like: - { [Error: connect ETIMEDOUT] } + { [Error: connect ETIMEDOUT] } #### Setting CUBRID Server Parameters - // Both functions are available since version 2.0.0. - client.getDatabaseParameter(paramType); - client.setDatabaseParameter(paramType, paramValue); + // Both functions are available since version 2.0.0. + client.getDatabaseParameter(paramType); + client.setDatabaseParameter(paramType, paramValue); -After connecting to a database, a user can override some *global* session parameters that will control the behavior queries being executed. For example, isolation level of transactions, the auto-commit behavior, etc. +After connecting to a database, a user can override some *global* session parameters +that will control the behavior queries being executed. For example, isolation level +of transactions, the auto-commit behavior, etc. -The complete list of these CUBRID database parameters is defined in the [`Constants.js` ](https://github.com/CUBRID/node-cubrid/blob/master/src/constants/CASConstants.js#L367) file: +The complete list of these CUBRID database parameters is defined in the +[`Constants.js` ](https://github.com/CUBRID/node-cubrid/blob/master/src/constants/CASConstants.js#L371) file: - /** - * Define CUBRID Database parameters constants - */ - exports.CCIDbParam = { - CCI_PARAM_ISOLATION_LEVEL : 1, - CCI_PARAM_LOCK_TIMEOUT : 2, - CCI_PARAM_MAX_STRING_LENGTH : 3, - CCI_PARAM_AUTO_COMMIT : 4 - }; + /** + * Define CUBRID Database parameters constants + */ + exports.CCIDbParam = { + CCI_PARAM_ISOLATION_LEVEL : 1, + CCI_PARAM_LOCK_TIMEOUT : 2, + CCI_PARAM_MAX_STRING_LENGTH : 3, + CCI_PARAM_AUTO_COMMIT : 4 + }; -For each parameter, the CUBRID communication protocol implements a dedicated support for GET and SET operations. Therefore, in order to manipulate them, also a dedicate functionality was needed in the Node.js driver and this is what we did in the 2.0 release. +For each parameter, the CUBRID communication protocol implements a dedicated support for GET +and SET operations. Therefore, in order to manipulate them, also a dedicate functionality was +needed in the driver and this is what we did in the 2.0 release. -Please note one exception - the `CCI_PARAM_MAX_STRING_LENGTH` parameter **cannot** be set programmatically from code as it is a CUBRID Broker parameter and the client can only query its current value. +Please note one exception - the `CCI_PARAM_MAX_STRING_LENGTH` parameter **cannot** be set +programmatically from code as it is a CUBRID Broker parameter and the client can only query +its current value. Let’s see some examples. First, let set the value of the `ISOLATION_LEVEL` parameter: - var CAS = require('./node_modules/node-cubrid/src/constants/CASConstants'); - - client.connect(function (err) { - // handle error, then... - client.setDatabaseParameter(CAS.CCIDbParam.CCI_PARAM_ISOLATION_LEVEL, CAS.CUBRIDIsolationLevel.TRAN_REP_CLASS_COMMIT_INSTANCE, function (err) { - // handle error - CUBRIDClient.close(function (err) { - // … - }); - }); - }); + const CAS = require('./node_modules/node-cubrid/src/constants/CASConstants'); + + client.connect(function (err) { + // handle error, then... + client.setDatabaseParameter(CAS.CCIDbParam.CCI_PARAM_ISOLATION_LEVEL, CAS.CUBRIDIsolationLevel.TRAN_REP_CLASS_COMMIT_INSTANCE, function (err) { + // handle error + CUBRIDClient.close(function (err) { + // … + }); + }); + }); + And let’s see how we can retrieve the value of the `LOCK_TIMEOUT` parameter for the current session: - client.connect(function (err) { - client.getDatabaseParameter(CAS.CCIDbParam.CCI_PARAM_LOCK_TIMEOUT, function (err, value) { - // handle error, then... - console.log('LOCK_TIMEOUT is: %s', value); - - CUBRIDClient.close(function (err) { - // ... - }); - }); - }); + client.connect(function (err) { + client.getDatabaseParameter(CAS.CCIDbParam.CCI_PARAM_LOCK_TIMEOUT, function (err, value) { + // handle error, then... + console.log('LOCK_TIMEOUT is: %s', value); + + CUBRIDClient.close(function (err) { + // ... + }); + }); + }); The output result is: - LOCK_TIMEOUT is: -1 + LOCK_TIMEOUT is: -1 **Note**: The same value can be obtained also from CUBRID Manager Client: ![Figure 2: CUBRID Manager](http://blog.cubrid.org:8080/files/attach/images/194379/729/617/manager.png) -If you need to change the default values for these parameters, it is highly recommended to do it immediately after `connect ()`. One consequence is that you **must** use an explicit `connect ()` statement in your application, and not the **implicit connect** driver feature (the **implicit connect** feature means that the driver can auto-connect when a query is first executed without the need to issues an explicit `connect()` command). +If you need to change the default values for these parameters, it is highly recommended +to do it immediately after `connect ()`. ### Executing SQL queries #### READ queries - // Callback style. - client.query(sql, callback); - client.query(sql, params, callback); - - // `sql` is a string representation of a READ query. Required. - - // `params` is an array of parameter values or the value itself - // which a user wants to bind instead of `?` placeholders - // in the `sql` query. If no placeholder is found, the `sql` - // will not be modified. This argument is optional. When - // omitted, `sql` will be sent to the server unmodified. This - // `params` argument is available since version 2.1.0. - - // `callback` is a function which will be invoked when the query - // finishes executing. Optional. The `callback` function - // can be omitted in which case only the - // `EVENT_QUERY_DATA_AVAILABLE` event will be - // emitted when the query finishes execution. - - // The `callback(err, result, queryHandle)` function accepts three arguments. - // 1. `err`: an error object if any. - // 2. `result`: a string value of the query result. No type casting as of version 2.1.0. Users need to parse the value into JSON manually. - // 3. `queryHandle`: an integer ID for the query handle. Used to fetch more data. - - // Event style. - client.query(sql); - client.query(sql, params); - - // `callback(result, queryHandle, sql)` function accepts three arguments: - // 1. `result`: a string value of the query result. No type casting as of version 2.1.0. - // 2. `queryHandle`: an integer ID for the query handle. Used to fetch more data. - // 3. `sql`: the SQL query which was executed that matches the `result`. - // `sql` argument is available since version 2.0.0. - client.on(client.EVENT_QUERY_DATA_AVAILABLE, callback); - - // Queries queueing. - client.query(sql); - client.query(sql, params); - - // When multiple queries are executed one after another without - // waiting for a callback or listening for an emmitted event, the queries - // will be queued and executed sequentially. Thus, callbacks and - // appropriate events will be executed/emitted in order. + // Callback style. + client.query(sql, callback); + client.query(sql, params, callback); + + /* + * 1. `sql`: a string representation of a single READ query. Required. + * 2. `params` is an array of parameter values or the value itself + * which a user wants to bind instead of `?` placeholders + * in the `sql` query. If no placeholder is found, the `sql` + * will not be modified. This argument is optional. When + * omitted, `sql` will be sent to the server unmodified. This + * `params` argument is available since version 2.1.0. + * 3. `callback` is a function which will be invoked when the query + * finishes executing. Optional. The `callback` function + * can be omitted in which case users need to handle the + * return value of the `Promise`. + */ + + /* + * The `callback(err, result, queryHandle)` function accepts three arguments. + * 1. `err`: an error object if any. + * 2. `result`: a query result object which has the following properties: + * - `ColumnDataTypes`: an array of strings that represent the column data type. + * - `ColumnNames`: an array of strings that represent the column names. + * - `ColumnValues`: an array of arrays that represent rows of records + * each row having one or more columns. Here each column represents a value + * of that column. + * - `RowsCount`: total number of records that match the provided SQL query. + * **Note** that not all records may have been fetched. + * 3. `queryHandle`: an integer ID for the query handle. Used to fetch more data + * or close the query statement in order to release the memory being kept + * on the CUBRID server side. + */ + + // Promise style. + const promise = client.query(sql); + const promise = client.query(sql, params); + + /* + * A `promise` is resolved with a single `response` object that has the following + * properties described above: + * - result + * - queryHandle + * + * A `promise` is rejected with a single instance of `Error` object. + */ + + /* + * Queries queueing: calling `query()` multiple times will result in queuing + * the queries which will be executed sequentially one after another. + */ + client.query(sql); + client.query(sql, params); + + // Under the hood, `query()` and other functions that accept `params` all + // call `Helpers._sqlFormat()` function to perform the actual formatting. + + // When multiple queries are executed one after another without + // waiting for a callback, the queries + // will be queued and executed sequentially. ##### Callback example -Here is an example which executes a simple `SELECT ` query. +Here is an example which executes a simple `SELECT` query. - var CUBRID = require('node-cubrid'), - // `Result2Array` is a sub-module which provides a set of helper - // functions to convert the query result to array, object, etc. - Result2Array = CUBRID.Result2Array; - - // Connection is established implicitly. - client.query('SELECT * FROM nation', function (err, result, queryHandle) { + const CUBRID = require('node-cubrid'); + + // Connection is established implicitly. + client.query('SELECT * FROM nation', function (err, result, queryHandle) { if (err) { throw err; } else { - var arr = Result2Array.RowsArray(result); + const rows = result.ColumnValues; + const rowsCount = result.RowsCount; - for (var j = 0, len = arr.length; j < len; ++j) { - console.log(arr[j]); + for (let i = 0; i < rowsCount; ++i) { + let columns = rows[i]; + + for (let j = 0, columnsCount = columns.length; j < columnsCount; ++j) { + console.log(columns[j]); + } } // Fetch more data using queryHandle if necessary. + // Refer to examples below. } }); The following example shows how to set placeholders and bind values in `SELECT` queries. - client.query('SELECT * FROM nation WHERE continent = ?', ['Asia'], function (err, result, queryHandle) { - if (err) { - throw err; - } else { - var arr = Result2Array.RowsArray(result); - - for (var j = 0, len = arr.length; j < len; ++j) { - console.log(arr[j]); - } - - // Fetch more data using queryHandle if necessary. - } - }); + client.query('SELECT * FROM nation WHERE continent = ?', ['Asia'], callback); -Alternatively, the `params` value can be literal value. +Alternatively, the `params` value can be a literal value. - client.query('SELECT * FROM nation WHERE continent = ?', 'Asia', callback); + client.query('SELECT * FROM nation WHERE continent = ?', 'Asia', callback); If the `params` value is `undefined` or `null`, it will be converted to SQL `NULL`. - client.query('SELECT * FROM nation WHERE continent IS ?', null, callback); + client.query('SELECT * FROM nation WHERE continent IS ?', null, callback); The `Date` type values will be converted into CUBRID compatible `DATETIME` strings. - client.query('SELECT * FROM game WHERE game_date = ?', [new Date('8/28/2004')], callback); - // The query will be - // `SELECT * FROM game WHERE game_date = '8/28/2004 0:0:0.0'` + client.query('SELECT * FROM game WHERE game_date = ?', [new Date('8/28/2004')], callback); + // The query will be + // `SELECT * FROM game WHERE game_date = '8/28/2004 0:0:0.0'` + // Note that as of CUBRID v9.3.0 it does not support time zones. And finally, everything else will be safely escaped and wrapped in single quotes. -##### Event style example +##### Promise example - // Multiple queries will be queued and executed sequentially. - client.query('SELECT * FROM nation'); - client.query('SELECT * FROM nation WHERE continent = ?', ['Asia']); - - client.on(client.EVENT_QUERY_DATA_AVAILABLE, function (result, queryHandle, sql) { - var arr = Result2Array.RowsArray(result); - - for (var j = 0, len = arr.length; j < len; ++j) { - console.log(arr[j]); - } - - // Do something with `sql` like: - switch (sql) { - case SQL_A: - break; - case SQL_B: - break; - default: - } - - // Fetch more data using queryHandle if necessary. - } + const promise = client + .query('SELECT * FROM nation') + .then(response => { + const result = response.result; + const queryHandle = response.queryHandle; + + const rowsCount = result.RowsCount; + const rows = result.ColumnValues; + + for (let i = 0; i < rowsCount; ++i) { + let columns = rows[i]; + + for (let j = 0, columnsCount = columns.length; j < columnsCount; ++j) { + console.log(columns[j]); + } + } + + // Do something more. + }) + .catch(err => { + // Handle the error. + }); #### Fetch more data - // Callback style. - // `queryHandle`: an integer ID for the query handle obtained from query() function. - // `callback(err, result, queryHandle)` function accepts three arguments. - // 1. `err`: an error object if any. - // 2. `result`: a string value of the query result. No type casting as of version 2.1.0. - // 3. `queryHandle`: an integer ID for the query handle. Used to fetch more data. - client.fetch(queryHandle, callback); - - // Event style. - client.fetch(sql); - // `callback(result, queryHandle)` function accepts two arguments. - client.on(client.EVENT_FETCH_DATA_AVAILABLE, callback); - // `callback(queryHandle)` function accepts one argument. - client.on(client.EVENT_FETCH_NO_MORE_DATA_AVAILABLE, callback); - + /* + * `fetch()` accepts three arguments: + * 1. `queryHandle`: an integer ID for the query handle obtained from `query()` function. + * 2. `all`: a boolean that tells whether to fetch all available records or just the + * next batch. Defaults to `false`. Since `3.0.0`. + * 2. `callback(err, result, queryHandle)` function accepts the same three arguments + * accepted by the `query()` function. + */ + client.fetch(queryHandle, all, callback); + + // Promise style is resolved and rejected similarly like the promise from `query()`. + const promise = client.fetch(queryHandle, all); + ##### Callback example - client.query('SELECT * FROM nation', function (err, result, queryHandle) { + client.query('SELECT * FROM nation', function (err, result, queryHandle) { if (err) { throw err; } else { - var arr = Result2Array.RowsArray(result); + const rows = result.ColumnValues; + const rowsCount = result.RowsCount; - for (var j = 0, len = arr.length; j < len; ++j) { - console.log(arr[j]); + for (let i = 0; i < rowsCount; ++i) { + let columns = rows[i]; + + for (let j = 0, columnsCount = columns.length; j < columnsCount; ++j) { + console.log(columns[j]); + } } - // Fetch more data using queryHandle if necessary. + // Fetch more data using the `queryHandle`. client.fetch(queryHandle, function (err, result, queryHandle) { - // Do the above logic here again. + // Handle the error and response. + // Note that the fetch does not return all the records + // but only some. So, users need to fetch records in batches. }); } }); -##### Event style example +##### Promise example + + const promise = client + .query('SELECT * FROM nation') + .then(response => { + const result = response.result; + const queryHandle = response.queryHandle; + + const rowsCount = result.RowsCount; + const rows = result.ColumnValues; + + for (let i = 0; i < rowsCount; ++i) { + let columns = rows[i]; + + for (let j = 0, columnsCount = columns.length; j < columnsCount; ++j) { + console.log(columns[j]); + } + } + + return client.fetch(queryHandle); + }) + .then(response => { + // The same `response` as after `query()`. + }) + .catch(err => { + // Handle the error. + }); + +#### Close Query + +It is vital to always close all the READ queries when they are no longer necessary. +When you query, CUBRID allocates a part of memory to hold the query statement +information necessary to return values on consecutive `fetch()` requests. Unless +the connection with the client is disconnected, CUBRID will keep this information +in memory. When not released during the lifetime of the connection, eventual +OOM (Out Of Memory) problems can occur on the server side. This is why when you +are done with the query results, close the queries. If the connection is disconnected, +CUBRID will automatically close all the query statements to free the memory. + + /* + * `closeQuery()` accepts two arguments: + * 1. `queryHandle`: an integer ID for the query handle obtained from `query()` + * or the last `fetch()`. + * 2. `callback(err)` function that accepts one argument: + * 1. `err`: an error object if any. + */ + client.closeQuery(queryHandle, callback); + +All READ queries **must be** closed explicitly except when you call `queryAll` +in which case the driver will close queries for you because there is no more +data that you may possibly request. - client.query('SELECT * FROM nation'); +##### Callback example - client.on(client.EVENT_QUERY_DATA_AVAILABLE, function (result, queryHandle) { - var arr = Result2Array.RowsArray(result); + client.query(sql, function (err, result, queryHandle) { + const arr = result.ColumnValues; - for (var j = 0, len = arr.length; j < len; ++j) { - console.log(arr[j]); - } + if (arr.length) { + // Try to fetch more. + } else { + client.closeQuery(queryHandle, function (err) { + // Do something else. + }); + } + }); + +##### Promise example + + // Promise style. + const promise = client + .query(sql) + .then(response => { + // Do something with response. + + return client.closeQuery(response.queryHandle); + }) + .then(() => { - // Fetch more data using queryHandle if necessary. - client.fetch(queryHandle); - } + }) + .catch(err => { + // Handle the error. + }); - client.on(client.EVENT_FETCH_DATA_AVAILABLE, function (result, queryHandle) { - var arr = Result2Array.RowsArray(result); +#### Query As Objects + +There is a convenient function provided in case you want to retrieve result set +as an array of traditional JSON objects with column names and values as object +properties and their corresponding values. + + /* + * `queryAsObjects()` calls `query()`, therefore it accepts the same + * arguments as `query()`. Available since `3.0.0`. + * 1. `sql` + * 2. `params` + * 3. `callback(err, result, queryHandle)` is different from the callback passed + * to `query()`. It accepts the same number of arguments, but `result` is no + * longer an object but an array that represents rows of record objects. + * 1. `err`: an error object if any. + * 2. `result`: an array of records each representing a single row object + * where keys are columns names and their values are column values. + * 3. `queryHandle`: an integer ID for the query handle. Used to fetch more data + * or close the query statement in order to release the memory being kept + * on the CUBRID server side. + */ + client.queryAsObjects(sql, params, callback); + + // Promise style. + const promise = client.queryAsObjects(sql); + const promise = client.queryAsObjects(sql, params); + +**Note** that the `result` returned by `queryAsObjects` is no longer a result object +but an array that represents rows of record objects. Thus, you cannot access the +column meta information via `result.ColumnDataTypes`, `result.ColumnNames` or +`result.RowsCount`. If such information is necessary, call `getMetaData(queryHandle)` +explained below. + +##### Callback example + +Here is an example which executes a simple `SELECT` query. + + // Connection is established implicitly. + client.queryAsObjects('SELECT * FROM nation', function (err, result, queryHandle) { + if (err) { + throw err; + } else { + // `result` is now an array of row objects. + const rowsCount = result.length; - for (var j = 0, len = arr.length; j < len; ++j) { - console.log(arr[j]); + for (let i = 0; i < rowsCount; ++i) { + const row = rows[i]; + + console.log(row.code); + console.log(row.name); + console.log(row.continent); + console.log(row.capital); + } + + // Do something more. } - - // Continue fetching. - client.fetch(queryHandle); - } - - client.on(client.EVENT_FETCH_NO_MORE_DATA_AVAILABLE, function (queryHandle) { - // Close query; - } + }); -#### Close Query +##### Promise example - // `queryHandle`: an integer ID for the query handle obtained from `query()` - // or the last `fetch()` function. - // `callback(err, queryHandle)` function accepts two arguments: - // 1. `err`: an error object if any. - // 2. `queryHandle`: the query handle which has been closed. - client.closeQuery(queryHandle, callback); - - // Event style. - client.closeQuery(queryHandle); - // `callback(queryHandle)` function accepts one argument: - // `queryHandle`: the query handle ID which was just closed. - client.on(client.EVENT_QUERY_CLOSED, callback); - -All READ queries **must be** closed explicitly. + const promise = client + .queryAsObjects('SELECT * FROM nation') + .then(response => { + const result = response.result; + const queryHandle = response.queryHandle; + + // `result` is now an array of row objects. + const rowsCount = result.length; + + for (let i = 0; i < rowsCount; ++i) { + const row = rows[i]; + + console.log(row.code); + console.log(row.name); + console.log(row.continent); + console.log(row.capital); + } + + // Do something more. + }) + .catch(err => { + // Handle the error. + }); +##### Get Query Result Metadata + + /* + * `getMetaData()` accepts two arguments: + * 1. `queryHandle`: that is associated with the required query result, + * obtained from the last `query()`. + * 2. `callback(err, result)` accepts two arguments: + * 1. `err`: an error object if any. + * 2. `result`: the same `result` object that is returned when calling + * `query()` function. It provides the same `ColumnDataTypes`, + * `ColumnNames`, `ColumnValues`, and `RowsCount` properties. + */ + + // Callback style. + client.getMetaData(queryHandle, callback); + + // Promise style. + const promise = client.getMetaData(queryHandle); + +#### Query All + +There is a convenient function provided in case you want to query all records +that match the SQL. + +**Note** that this may potentially result in OOM in your application especially +considering that in Node environment a typical process has a limited memory +around 1.6GB. + +Use this function when you are sure that the result set will fit into your app's +memory. + + /* + * `queryAll()` calls `query()` and then calls `fetch()` multiple times until + * all records are retrieved, and finally calls `closeQuery()` explicitly to + * close the query for you. Thus, it accepts the same arguments as `query()`. + * Available since `3.0.0`. + * 1. `sql` + * 2. `params` + * 3. `callback(err, result)` function is different from the callback you + * pass to `query()` in the way that in `queryAll` it accepts only + * the error and the result object. No `queryHandle` is returned. + */ + client.queryAll(sql, params, callback); + + // Promise style. + const promise = client.queryAll(sql); + const promise = client.queryAll(sql, params); + ##### Callback example - client.query(sql, function (err, result, queryHandle) { - var arr = Result2Array.RowsArray(result); - - if (arr.length) { - // Try to fetch more. - } else { - client.closeQuery(queryHandle, function (err, queryHandle) { - // Do something else. - }); - } - }); - -##### Event style example - - client.on(client.EVENT_FETCH_NO_MORE_DATA_AVAILABLE, function (queryHandle) { - client.closeQuery(queryHandle); - } - - client.on(client.EVENT_QUERY_CLOSED, function (queryHandle) { - // Do something here. - } +Here is an example which executes a simple `SELECT` query. -#### WRITE queries + // Connection is established implicitly. + client.queryAll('SELECT * FROM nation', function (err, result) { + if (err) { + throw err; + } else { + // `rows` now include all records that matched the SQL query. + const rows = result.ColumnValues; + const rowsCount = result.RowsCount; + + for (let i = 0; i < rowsCount; ++i) { + let columns = rows[i]; + + for (let j = 0, columnsCount = columns.length; j < columnsCount; ++j) { + console.log(columns[j]); + } + } + + // No need to fetch anything more. + // No need to close the query as it is already closed by `queryAll()`. + } + }); - // `execute(sql, callback)` function accepts two arguments. - // 1. `sql`: a string which represents a WRITE query or an array - // of strings for batch processing. - // 2. `callback(err)`: a function that accepts one argument: - 1. `err`: an error object if any. - - client.execute("INSERT INTO a VALUES(1, 2, 'val')", function callback(err) {}); - - // `executeWithParams(sql, params, paramDelimiters, callback)` - // function accepts four arguments. - // 1. `sql`: a string which represents a WRITE query. **Note** - // not an array of strings. - // 2. `params`: an array of parameter values or the value itself - // which a user wants to bind instead of `?` placeholders - // in the `sql` query. If no placeholder is found, the `sql` - // will not be modified. - // 3. `paramDelimiters`: an optional array of delimiters which - // must be used to wrap parameter values. If omitted, - // it will try to guess the type and apply a default - // delimiter of that type. - // - `null` is passed as an unwrapped SQL equivalent `NULL`. - // - `number` is not wrapped. - // - `Date` instance is wrapped by a single quote and - // converted into CUBRID's `DATETIME` format such as - // `'mm/dd/yyyy hh:mi:ss.ff am|pm'` omitting the - // timezone information as CUBRID as of version 9 - // does not support timezones. - // - Everything else, including `string`, is wrapped - // by a single quote. - // 4. `callback(err)`: a function that accepts one argument: - 1. `err`: an error object if any. - - // Under the hood, `executeWithParams()` as well as `query()` and - // `queryWithParams()` all call `Helpers._sqlFormat()` function - // to perform the actual formatting. - - var sql = 'INSERT INTO a VALUES(?, ?, ?, ?)', - params = [1, 2, 'val', new Date()], - paramDelimiters = ["", "", "'", "'"]; - - client.executeWithParams(sql, params, paramDelimiters, function callback(err) {}); - // Will send to the server the following formatted SQL: - // `INSERT INTO a VALUES(1, 2, 'val', '02/24/2015 03:09:20.12 pm')` +**Note** once again that there is no need to call `closeQuery()` after `queryAll()` +because `queryAll()` automatically closes the query after all `fetch()` has been +done. + +##### Promise example + + const promise = client + .queryAll('SELECT * FROM nation') + .then(result => { + const rowsCount = result.RowsCount; + // `rows` now include all records that matched the SQL query. + const rows = result.ColumnValues; + + for (let i = 0; i < rowsCount; ++i) { + let columns = rows[i]; + + for (let j = 0, columnsCount = columns.length; j < columnsCount; ++j) { + console.log(columns[j]); + } + } + + // No need to fetch anything more. + // No need to close the query as it is already closed by `queryAll()`. + }) + .catch(err => { + // Handle the error. + }); -After executing WRITE queries there is no need to close the query. +#### Query All As Objects + +In case you want to retrieve all records as object, there is a function just for +that. + + /* + * `queryAllAsObjects()` calls `queryAll()`, therefore it accepts the same + * arguments as `queryAll()`. Available since `3.0.0`. + * 1. `sql` + * 2. `params` + * 3. `callback(err, result)` accepts the same number of arguments as `queryAll()`: + * 1. `err`: an error object if any. + * 2. `result`: an array of records each representing a single row object + * where keys are columns names and their values are column values. + */ + client.queryAllAsObjects(sql, params, callback); + + // Promise style. + const promise = client.queryAllAsObjects(sql); + const promise = client.queryAllAsObjects(sql, params); + +**Note** that just like with `queryAsObjects()`, the `result` returned by +`queryAllAsObjects` is an array that represents rows of record objects. Likewise, +there is no need to call `closeQuery()` after `queryAllAsObjects()` as `queryAll()` +automatically closes the query after all `fetch()` has been done. -#### Queueing +##### Callback example -Since **node-cubrid** version 2.1.0 almost all requests, which initiate a network communication, pass through an internal queue. This includes READ and WRITE queries, close query requests, fetch requests, rollback/commit requests. +Here is an example which executes a simple `SELECT` query. -Thus, in order to put queries into a queue, all you need to do is call query/execute and their equivalent functions one after another. They will be added into the queue as they come in (FIFO). + // Connection is established implicitly. + client.queryAllAsObjects('SELECT * FROM nation', function (err, result) { + if (err) { + throw err; + } else { + // `result` is now an array of all row objects. + const rowsCount = result.length; + + for (let i = 0; i < rowsCount; ++i) { + const row = rows[i]; + + console.log(row.code); + console.log(row.name); + console.log(row.continent); + console.log(row.capital); + } + + // Do something more. + } + }); -Here is an example. +##### Promise example - client.execute('CREATE TABLE tbl_test(id INT)', callback); - client.execute('INSERT INTO tbl_test (id) VALUES (1), (2), (3)', callback); - client.query('SELECT * FROM tbl_test', callback); - client.execute('DROP TABLE tbl_test', callback); + const promise = client + .queryAllAsObjects('SELECT * FROM nation') + .then(result => { + // `result` is now an array of row objects. + const rowsCount = result.length; + + for (let i = 0; i < rowsCount; ++i) { + const row = rows[i]; + + console.log(row.code); + console.log(row.name); + console.log(row.continent); + console.log(row.capital); + } + }) + .catch(err => { + // Handle the error. + }); -Remember that the `callback` is optional in which case you should listen for events. +#### WRITE queries -Alternatively, for backward compatibility we still support `addQuery()` and `addNonQuery()` functions which we introduced in version 2.0.0. + /* + * `execute(sql, params, callback)` function accepts three arguments. + * 1. `sql`: a string which represents a WRITE query or an array + * of strings for batch processing. `sql` must be a string if + * `params` are provided. + * 2. `params` is an array of parameter values or the value itself + * which a user wants to bind instead of `?` placeholders + * in the `sql` query. If no placeholder is found, the `sql` + * will not be modified. This argument is optional. When + * omitted, `sql` will be sent to the server unmodified. + * Available since `3.0.0`. + * 3. `callback(err)`: a function that accepts one argument: + 1. `err`: an error object if any. + + // Callback style. + client.execute(sql, callback); + client.execute(sql, params, callback); + + // Promise style. + const promise = client.execute(sql); + const promise = client.execute(sql, params); + + /* + * A `promise` is resolved with no arguments. + * A `promise` is rejected with a single instance of `Error` object. + */ + + /* + * Queries queueing: calling `execute()` multiple times will result in queuing + * the queries which will be executed sequentially one after another. + */ + client.execute(sql); + client.execute(sql, params); - var SQL_1 = "SELECT COUNT(*) FROM [code]"; - var SQL_2 = "SELECT * FROM [code] WHERE s_name = 'X'"; - var SQL_3 = "SELECT COUNT(*) FROM [code] WHERE f_name LIKE 'M%'"; - var SQL_4 = "DELETE FROM code WHERE s_name = 'ZZZZ'"; +After executing WRITE queries there is no need to close the query. - Helpers.logInfo('Executing [1]: ' + SQL_1); - client.addQuery(SQL_1, function (err, result) { - Helpers.logInfo('Result [1]: ' + Result2Array.RowsArray(result)); - }); +##### Callback example - Helpers.logInfo('Executing [2]: ' + SQL_2); - client.addQuery(SQL_2, function (err, result) { - Helpers.logInfo('Result [2]: ' + Result2Array.RowsArray(result)); - }); +Here is an example which executes a simple `INSERT` query. - Helpers.logInfo('Executing [3]: ' + SQL_3); - client.addQuery(SQL_3, function (err, result) { - Helpers.logInfo('Result [3]: ' + Result2Array.RowsArray(result)); + client.execute('INSERT INTO tbl VALUES(1, 2, 3)', function (err) { + // Handle the error; }); - Helpers.logInfo('Executing [4]: ' + SQL_4); - client.addNonQuery(SQL_4, function (err) { - Helpers.logInfo('Result [4]: ' + err); - client.close(); +The following example shows how to set placeholders and bind values in `INSERT` queries. + + client.execute('INSERT INTO tbl VALUES(?, ?, ?)', [1, 2, 3], function (err) { + // Handle the error; }); -`addQuery()` will simply pass its arguments to the main `query()` function, while `addNonQuery()` will pass its arguments to `execute()` function. Thus, if you want to avoid one more function call, get used to directly calling the `query()` or `execute()` functions. +Alternatively, the `params` value can be a literal value. -##### Check if queue is empty + client.execute('INSERT INTO tbl (name) VALUES(?)', 'cubrid', function (err) { + // Handle the error; + }); - client.isQueueEmpty(); - client.queriesQueueIsEmpty(); +If the `params` value is `undefined` or `null`, it will be converted to SQL `NULL`. -In case you are interested in checking if the queue is empty, call one of the above functions. Returns `true` or `false`. + client.execute('INSERT INTO tbl (name) VALUES(?)', null, function (err) { + // Handle the error; + }); -##### Get queue depth +The `Date` type values will be converted into CUBRID compatible `DATETIME` strings. - client.getQueueDepth(); + client.execute('INSERT INTO tbl (d) VALUES(?)', [new Date('8/28/2004')], callback); + // The query will be + // `INSERT INTO tbl (d) VALUES('8/28/2004 0:0:0.0')` + // Note that as of CUBRID v9.3.0 it does not support time zones. -The above function will return the number of requests currently in the queue. Remember that this number represents all requests, including READ and WRITE, and fetch, and rollback/commit, etc. Briefly all requests which initiate a network communication. +And finally, everything else will be safely escaped and wrapped in single quotes. -### Transactions + batchExecuteNoQuery() + +#### Execute with Typed Parameters + +For cases when implicit type casting is insufficient or the result +is not as expected, data types can be specified by calling `executeWithTypedParams()`. + + /* + * `executeWithTypedParams()` accepts four arguments. + * 1. `sql`: a string which represents a single WRITE query. + * **Note** not an array of strings. + * 2. `params`: an optional array of parameter values which a user + * wants to bind instead of `?` placeholders in the `sql` + * query. If no placeholder is found, the `sql` will not + * be modified. + * 3. `dataTypes`: an optional array of string values where each + * element represents a data type for the corresponding + * value in `params`. The following data types are supported: + * `char`, `varchar`, `nchar`, `string`, `varnchar`, `short`, `int`, + * `bigint`, `float`, `double`, `monetary`, `numeric`, `date`, `time`, + * `datetime`, `timestamp`, `object`, `bit`, `varbit`, `set`, `multiset`, + * `sequence`, `blob`, `clob`, `resultset`. + * `dataTypes` are required if `params` are specified. + * 4. `callback(err)`: a function that accepts one argument: + 1. `err`: an error object if any. + */ + + const sql = 'INSERT INTO a VALUES(?, ?, ?, ?)'; + const params = [1, 23, 'val', new Date()]; + const dataTypes = ['int', 'short', 'varchar', 'datetime']; + + client.executeWithTypedParams(sql, params, paramDelimiters, function callback(err) {}); + + // Promise way. + const promise = client.executeWithTypedParams(sql, params, paramDelimiters); + +**Note** that `executeWithTypedParams()` does not replace `?` placeholders. +The `param` and `dataTypes` are sent to CUBRID directly, and the server handles +explicit type casing. - client.beginTransaction(callback); - client.commit(callback); - client.rollback(callback); - - // All `callback(err)` functions accept one argument: the error message if any. - - client.setAutoCommitMode(boolean, callback); - - // `boolean` is a boolean value which represents the auto_commit - // mode you wish to set the current transaction to. - - // The `callback(err)` function accepts one argument: the error message if any. - -**node-cubrid** fully supports SQL transactions. By default `auto_commit` mode is set to `true` meaning after every WRITE query CUBRID Server will commit the changes to the disk. - -When you start a new transactaction by calling `beginTransaction()`, **node-cubrid** will first commit the previous active transaction if any. This is according to CUBRID spec. Then it will start a new transaction by setting the `auto_commit` mode to `false`. - -**Note:** Unlike in other DBMS vendor drivers, in **node-cubrid** when a transaction is rolled back or committed, the `auto_commit` mode remains unchanged, i.e. `false`. This is according to CUBRID spec. This means that after you commit/rollback the transaction and you no longer need to execute queries in `auto_commit = false` mode, explicitly turn the `auto_commit` mode to `true` by calling `setAutoCommitMode()` function. - - ActionQueue.enqueue([ - function (cb) { - client.connect(cb); - }, - function (cb) { - Helpers.logInfo('Connected...'); - client.batchExecuteNoQuery('create table test_tran(id int)', cb); - }, - function (cb) { - client.beginTransaction(cb); - }, - function (cb) { - client.batchExecuteNoQuery('insert into test_tran values(1)', cb); - }, - function (cb) { - client.query('select * from test_tran', cb); - }, - function (result, queryHandle, cb) { - Helpers.logInfo('Should be true: ' + Result2Array.TotalRowsCount(result) === 1); - client.closeQuery(queryHandle, cb); - }, - function (queryHandle, cb) { - client.rollback(cb); - }, - function (cb) { - client.query('select * from test_tran', cb); - }, - function (result, queryHandle, cb) { - Helpers.logInfo('Should be true: ' + Result2Array.TotalRowsCount(result) === 0); - client.closeQuery(queryHandle, cb); - }, - function (queryHandle, cb) { - client.batchExecuteNoQuery('drop table test_tran', cb); - }, - function (cb) { - client.commit(cb); - }, - function (cb) { - // Explicitly set the auto commit mode to true, once done. - client.setAutoCommitMode(true, cb); - }, - function (cb) { - client.query('select count(*) from db_class where class_name = \'test_tran\'', cb); - }, - function (result, queryHandle, cb) { - Helpers.logInfo('Should be true: ' + Result2Array.RowsArray(result)[0][0] === 0); - client.close(cb); - } - ], function (err) { - if (err) { - throw err; - } else { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - } - }); +#### Queueing -### Closing a connection +Since **node-cubrid** version 2.1.0 almost all requests, which initiate a network +communication, pass through an internal queue. This includes READ and WRITE queries, +close query requests, fetch requests, rollback/commit requests. - // callback(err) function accepts one argument: the error message if any. - client.close(callback); - // Alias function since version 2.1.0. - client.end(callback); +Thus, in order to put queries into a queue, all you need to do is call `query()` / `execute()` +and their equivalent functions one after another. They will be added into the queue as +they come in (FIFO). -#### Callback style +Here is an example. - client.close(function (err) { - if (err) { - throw err; - } else { - console.log('connection is closed'); - } - }); + client.execute('CREATE TABLE tbl_test(id INT)', callback); + client.execute('INSERT INTO tbl_test (id) VALUES (1), (2), (3)', callback); + client.query('SELECT * FROM tbl_test', callback); + client.execute('DROP TABLE tbl_test', callback); -#### Event style +Remember that the `callback` is optional in which case you should handle the promises. - client.connect(); - - client.on(client.EVENT_CONNECTED, function () { - console.log('connection is established'); - - client.close(); - }); +##### Check if queue is empty - client.on(client.EVENT_CONNECTION_CLOSED, function () { - console.log('connection is closed'); - }); +In case you are interested in checking if the queue is empty, call the following function. +Returns `true` or `false`. -When a connection is closed by calling `close()` or `end()`, all pending/queued requests will be removed from the internal queue. + client.isQueueEmpty(); -#### Errors on closing the connection +##### Get queue depth -The following errors may be emitted when the application tries to close the connection: +The below function will return the number of requests currently in the queue. +Remember that this number represents all requests, including READ and WRITE, +and fetch, and rollback/commit, etc. Briefly all requests which initiate a +network communication, including those which are currently in-flight. -1. If a connection is already closed, the following error is emitted by **node-cubrid**. - - { [Error: The connection is already closed!] } - -2. If closing a connection was unsuccessful, an error message returned by a database is emitted. - -### Events by EventEmitter - -**node-cubrid** implements, in addition to the standard callbacks model functionality, a rich event model: - -| Event name | Notes | -| ---------------- | --------| -| `EVENT_ERROR` | Emitted when an error is occurs. | -| `EVENT_CONNECTED` | Emitted when a connection is established. | -| `EVENT_ENGINE_VERSION_AVAILABLE` | Emitted when the database version information is returned from the server to a client. | -| `EVENT_BATCH_COMMANDS_COMPLETED` | Emitted when the batch commands execution is completed. | -| `EVENT_QUERY_DATA_AVAILABLE` | Emitted when the data from the query is available to a client. | -| `EVENT_SCHEMA_DATA_AVAILABLE` | Emitted when the database schema information is available to a client. | -| `EVENT_FETCH_DATA_AVAILABLE` | Emitted when more query data is available to a client through successive `fetch()` command(s). | -| `EVENT_FETCH_NO_MORE_DATA_AVAILABLE` | Emitted when no more data is available from the query. | -| `EVENT_BEGIN_TRANSACTION` | Emitted when a transaction is started in `auto_commit = OFF` mode. | -| `EVENT_SET_AUTOCOMMIT_MODE_COMPLETED` | Emitted when the auto-commit mode is changed. | -| `EVENT_COMMIT_COMPLETED` | Emitted when a commit request is completed. | -| `EVENT_ROLLBACK_COMPLETED` | Emitted when a rollback request is completed. | -| `EVENT_QUERY_CLOSED` | Emitted when a query is closed. | -| `EVENT_CONNECTION_CLOSED` | Emitted when a connection is closed. | -[**Table 1: Events emitted by node-cubrid**] + client.getQueueDepth(); -## More examples +### Transactions + +This driver fully supports SQL transactions. By default `auto_commit` mode is set +to `true` meaning after every WRITE query CUBRID Server will commit the changes to the disk. -The driver code release contains many demo examples and test cases which you can find in the following directories: - -- [/demo](https://github.com/CUBRID/node-cubrid/tree/master/demo) -- [/test](https://github.com/CUBRID/node-cubrid/tree/master/test) - -Here is another **node-cubrid** usage example which uses the `ActionQueue` helper. The `ActionQueue.enqueue` function is the same as the [async.waterfall()](https://github.com/caolan/async#waterfall) from the well-known **async** library: - - var CUBRID = require('node-cubrid'), - ActionQueue = CUBRID.ActionQueue, - Helpers = CUBRID.Helpers, - client = CUBRID.createDefaultCUBRIDDemodbConnection(); - - ActionQueue.enqueue([ - function (cb) { - client.connect(cb); - }, - function (cb) { - client.getEngineVersion(cb); - }, - function (engineVersion, cb) { - Helpers.logInfo('Engine version is: ' + engineVersion); - client.query('select * from code', cb); - }, - function (result, queryHandle, cb) { - Helpers.logInfo('Query result rows count: ' + Result2Array.TotalRowsCount(result)); - Helpers.logInfo('Query results:'); - var arr = Result2Array.RowsArray(result); - - for (var k = 0; k < arr.length; k++) { - Helpers.logInfo(arr[k].toString()); - } - - client.closeQuery(queryHandle, cb); - }, - function (cb) { - Helpers.logInfo('Query closed.'); - client.close(cb); - } - ], function (err) { - if (err) { - throw err; - } else { - Helpers.logInfo('Connection closed.'); - } - } - ); - -You can also find more tutorials at [http://www.cubrid.org/wiki_apis/entry/cubrid-node-js-tutorials](http://www.cubrid.org/wiki_apis/entry/cubrid-node-js-tutorials). +You can begin, end, commit, and rollback transactions by calling these functions. -## Running tests + client.beginTransaction(callback); + client.endTransaction(callback); + client.commit(callback); + client.rollback(callback); + + // All `callback(err)` functions accept one argument: the error message if any. -To run tests on **node-cubrid** module: +`beginTransaction()` and `endTransaction()` functions simply call the following +`setAutoCommitMode()` by specifying a `false` or `true` arguments respectively. -1. `npm install` all testing framework development dependencies. -2. Make sure: - 1. CUBRID Server 8.4.1+ is installed on `localhost`. - 2. CUBRID Broker is listening on port `33000`. - 3. `demodb` database is running. -3. Alternatively, edit test suite connection configurations at `test/testSetup/test_Setup.js` and change the connection information. -4. `npm test` to start testing. + client.setAutoCommitMode(boolean, callback); + + // `boolean` is a boolean value which represents the auto_commit + // mode you wish to set the current transaction to. + + // The `callback(err)` function accepts one argument: the error message if any. -There are over 268K assertion tests which should all pass on CUBRID 8.4.1+. +`beginTransaction()`, `endTransaction()` and `setAutoCommitMode()` functions are +idempotent, that is you can call them multiple times and the result will be the same. -### Running tests in a Docker container +**Note:** Unlike in other DBMS vendor drivers, in **node-cubrid** when a transaction is +rolled back or committed, the `auto_commit` mode remains unchanged, i.e. `false`. This is +according to CUBRID spec. This means that after you commit/rollback the transaction and +you no longer need to execute queries in `auto_commit = false` mode, explicitly turn the +`auto_commit` mode to `true` by calling `setAutoCommitMode()` function. -For development purpose, we have created a Docker image which can be used in order to -run the tests suit. The image does not include a copy of the node-cubrid source code -as it should be available at run time to be able to run tests against the uncommitted +Moreover, enabling the auto commit mode by calling `setAutoCommitMode()` will not +commit the changes automatically. You need to explicitly `commit()` or `rollback()` the changes. -By following these steps you will install CUBRID 9.1.x inside the container and run -node-cubrid tests. +Here is a promise based example that shows how to start and end a transaction. + + client + .execute('CREATE TABLE test_tran(id INT)') + .then(() => { + return client.beginTransaction(); + }) + .then(() => { + return client.execute('INSERT INTO test_tran VALUES(1)'); + }) + .then(() => { + return client.query('SELECT * FROM test_tran'); + }) + .then(response => { + assert(response.result.RowsCount === 1); + + return client.closeQuery(response.queryHandle); + }) + .then(() => { + return client.rollback(); + }) + .then(() => { + // **Note** that the auto commit mode is still OFF + // even after the `rollback()`. + return client.query('SELECT * FROM test_tran'); + }) + .then(response => { + assert(response.result.RowsCount === 0); + + return client.closeQuery(response.queryHandle); + }) + .then(() => { + // We are still inside the same transaction with + // auto commit mode OFF. + return client.execute('DROP TABLE test_tran'); + }) + .then(() => { + return client.commit(); + }) + .then(() => { + return client.endTransaction(); + }) + .then(() => { + return client.query("SELECT COUNT(*) FROM db_class WHERE class_name = 'test_tran'"); + }) + .then(response => { + assert(response.result.RowsCount === 0); + + // Closing a connection will automatically close + // all query statements. + return client.close(); + }); -1. Define the environment variable which point to the location of the node-cubrid -repository +### Requesting CUBRID Server information + +There are a few functions that report meta information about the server. + + /* + * `getEngineVersion()` accepts one argument: + * 1. `callback(err, version)` accepts two arguments: + * 1. `err`: an error object if any. + * 2. `version`: CUBRID Database version like `9.2.3.0005`. + */ + + // Callback style. + client.getEngineVersion(callback); + + // Promise style. + const promise = client.getEngineVersion(); + + /* + * `getActiveHost()` accepts one argument: + * 1. `callback(err, host)` accepts two arguments: + * 1. `err`: an error object if any. + * 2. `host`: an object with `host` and `port` properties that + * represents the server which the client is connected to. + */ + + // Callback style. + client.getActiveHost(callback); + + // Promise style. + const promise = client.getActiveHost(); - NODE_CUBRID_SRC=/Users/user/repos/node-cubrid +### Closing a connection -2. Then pull the Docker image: + /* + * `close()` or its alias `end()` functions accept one argument: + * The alias `end()` function is available since 2.1.0. + * 1. `callback(err)` accepts one argument: + * 1. `err`: an error object if any. + */ + + // Callback style. + client.close(callback); + client.end(callback); + + // Promise style. + const promise = client.close(); + const promise = client.end(); - docker pull lighthopper/node-cubrid:0.10-test +#### Callback style -3. Start the container by mounting the node-cubrid directory to `/node-cubrid` -inside the container: + client.close(function (err) { + if (err) { + throw err; + } else { + console.log('connection is closed'); + } + }); - docker run -it --name node-cubrid -v $NODE_CUBRID_SRC:/node-cubrid lighthopper/node-cubrid:0.10-test +#### Promise style -4. This will enter into the bash inside the container. At this point all commands you type -will be executed inside this container. Now install all NPM dependencies. + const promise = client + .connect() + .then(() => { + return client.close(); + }); - npm install +When a connection is closed by calling `close()` or `end()`, all pending/queued +requests will be removed from the internal queue. All in-flight queries will be +requested to be closed. -5. The default CUBRID Database version is 9.1.0. You can override it as follows. Supported version are: `9.1.0`, `9.0.0`, `8.4.4`, `8.4.3`, and `8.4.1`. - - CUBRID_VERSION=8.4.1 +#### Errors on closing the connection -6. Run the following command to prepare the Chef instructions. +The following errors may be emitted when the application tries to close the connection: + +1. If closing a connection was unsuccessful, an error message returned by a database is emitted. - echo '{"cubrid":{"version":"'$CUBRID_VERSION'"},"run_list":["cubrid::demodb"]}' > cubrid_chef.json +## More examples -6. Run Chef to actually install and start up CUBRID Server: +You can also find more tutorials at [http://www.cubrid.org/wiki_apis/entry/cubrid-node-js-tutorials](http://www.cubrid.org/wiki_apis/entry/cubrid-node-js-tutorials). - chef-solo -c test/testSetup/solo.rb -j cubrid_chef.json -r http://sourceforge.net/projects/cubrid/files/CUBRID-Demo-Virtual-Machines/Vagrant/chef-cookbooks.tar.gz/download +## Running tests -7. Now CUBRID is running. Run the node-cubrid tests as follows. +To run tests on **node-cubrid** module: - npm test +1. Make sure you are using Node `v4` or higher. +2. `npm install` all development dependencies. +3. Make sure: + 1. CUBRID Server 8.4.1+ is installed on `localhost`. + 2. CUBRID Broker is listening on port `33000`. + 3. `demodb` database is running. + 4. Alternatively, edit the test suite connection configurations at + `test/testSetup/index.js` and change the connection information. +4. `npm test` to start testing. +4. `npm run coverage` to prepare the code coverage report. -### Build a Docker container +### Running CUBRID in a Docker container -Run the following in order to build an image for node-cubrid testing. +If you do not have CUBRID already running, you can use the publicly available Docker image. +In fact this method is recommended as you can spin up multiple versions of CUBRID on +the same machine and run tests against all of them at once. - docker build -t="lighthopper/node-cubrid:0.10-test" . +Run the following command to start CUBRID 9.2.3.0005 and its `demodb` database +inside a Docker container. -## What's next + docker run -p 33000:33000 --name cubrid lighthopper/cubrid:9.2.3.0005 ./create-start-demodb.sh -We intend to continuosly improve this driver, by adding more features and improving the existing code base. +Refer to https://github.com/kadishmal/cubrid-docker for other versions. -And you are more than welcome to suggest what we should improve or add - please let us know! :) +## What's next +We intend to continuously improve this driver, by adding more features and improving the existing code base. +You are more than welcome to suggest what we should improve or add - please let us know! :) ## Authors and Contributors @@ -936,8 +1226,8 @@ We welcome new contributors and hope you will enjoy using and coding with CUBRID We would like to say thanks to the following people & projects for inspiration, for the code we have (re)used and for doing such a great job for the open-source community! -- [https://github.com/caolan/async](https://github.com/caolan/async) -- [https://github.com/felixge/node-mysql](https://github.com/felixge/node-mysql) -- [https://github.com/jeromeetienne/microcache.js](https://github.com/jeromeetienne/microcache.js) +- [https://github.com/caolan/async](https://github.com/caolan/async) +- [https://github.com/felixge/node-mysql](https://github.com/felixge/node-mysql) +- [https://github.com/jeromeetienne/microcache.js](https://github.com/jeromeetienne/microcache.js) -... Stay tuned for the next great driver releases! :) +... Stay tuned for the next great driver release! :) diff --git a/demo/E2E/E2E_01.js b/demo/E2E/E2E_01.js deleted file mode 100644 index 1e0bb52..0000000 --- a/demo/E2E/E2E_01.js +++ /dev/null @@ -1,67 +0,0 @@ -var client = require('../../index.js').createDefaultCUBRIDDemodbConnection(), - Result2Array = require('../../src/resultset/Result2Array'); - -var sql = 'select * from game'; - -client.connect(function (err) { - if (err) { - throw err.message; - } else { - console.log('Connected successfully to ' + client.brokerServer + ':' + client.connectionBrokerPort + '.'); - client.getEngineVersion(function (err, result) { - if (err) { - throw err.message; - } else { - console.log('CUBRID engine version is: ' + result); - console.log('Querying: [' + sql + ']...'); - client.query(sql, function (err, queryResults, queryHandle) { - if (err) { - throw err.message; - } else { - console.log('Query results - Rows count: ' + Result2Array.TotalRowsCount(queryResults)); - console.log('Query results - Column names: ' + Result2Array.ColumnNamesArray(queryResults)); - console.log('Query results - Column data types: ' + Result2Array.ColumnTypesArray(queryResults)); - console.log('Query results - Data [displaying only the first 5 rows]:'); - var arr = Result2Array.RowsArray(queryResults); - for (var j = 0; j < 5; j++) { - console.log(arr[j].toString()); - } - console.log('Fetching more results...'); - client.fetch(queryHandle, function (err, result) { - if (err) { - throw err.message; - } else { - if (result) { - console.log('Fetch results - Data [displaying only the first 5 rows]:'); - var arr = Result2Array.RowsArray(result); - for (var k = 0; k < 5; k++) { - console.log(arr[k].toString()); - } - } else { - console.log('There is no more data to fetch.'); - } - client.closeQuery(queryHandle, function (err) { - if (err) { - throw err.message; - } else { - console.log('Query closed.'); - client.close(function (err) { - if (err) { - throw err.message; - } else { - console.log('Connection closed.'); - console.log('Test passed.'); - } - }) - } - }) - } - }) - } - }) - } - }) - } -}); - - diff --git a/demo/E2E/E2E_02.js b/demo/E2E/E2E_02.js deleted file mode 100644 index 2cf44f5..0000000 --- a/demo/E2E/E2E_02.js +++ /dev/null @@ -1,60 +0,0 @@ -var client = require('../../index.js').createDefaultCUBRIDDemodbConnection(), - Result2Array = require('../../src/resultset/Result2Array'); - -var sqlsSetup = ['drop table if exists node_test', - 'create table node_test(id int)', - 'insert into node_test values(1), (22)']; -var sqlQuery = 'select * from node_test'; -var sqlsCleanup = 'drop table node_test'; - -client.connect(function (err) { - if (err) { - throw err.message; - } else { - console.log('Connected to ' + client.brokerServer + ':' + client.connectionBrokerPort + '.'); - console.log('Creating test data...'); - client.batchExecuteNoQuery(sqlsSetup, function (err) { - if (err) { - throw err.message; - } else { - console.log('Querying: [' + sqlQuery + ']'); - client.query(sqlQuery, function (err, queryResults, queryHandle) { - if (err) { - throw err.message; - } else { - console.log('Query results - Rows count: ' + Result2Array.TotalRowsCount(queryResults)); - console.log('Query results - Column names: ' + Result2Array.ColumnNamesArray(queryResults)); - console.log('Query results - Column data types: ' + Result2Array.ColumnTypesArray(queryResults)); - console.log('Query results:'); - var arr = Result2Array.RowsArray(queryResults); - for (var j = 0; j < arr.length; j++) { - console.log('Row ' + j + ': ' + arr[j].toString()); - } - client.closeQuery(queryHandle, function (err) { - if (err) { - throw err.message; - } else { - client.batchExecuteNoQuery(sqlsCleanup, function (err) { - if (err) { - throw err.message; - } else { - console.log('Cleanup done.'); - client.close(function (err) { - if (err) { - throw err.message; - } else { - console.log('Connection closed.'); - console.log('Test passed.'); - } - }) - } - }) - } - }) - } - }) - } - }) - } -}); - diff --git a/demo/E2E/E2E_03.js b/demo/E2E/E2E_03.js deleted file mode 100644 index e77f381..0000000 --- a/demo/E2E/E2E_03.js +++ /dev/null @@ -1,81 +0,0 @@ -var client = require('../../index.js').createDefaultCUBRIDDemodbConnection(), - ActionQueue = require('../../src/utils/ActionQueue'), - Result2Array = require('../../src/resultset/Result2Array'), - assert = require('assert'); - -var sql = 'select * from game where rownum < 500'; -var returnedQueryHandle; -var fetchResult; - -ActionQueue.enqueue( - [ - function (cb) { - client.connect(cb); - console.log('Connected successfully to ' + client.brokerServer + ':' + client.connectionBrokerPort + '.'); - }, - - function (cb) { - console.log('Executing query: [' + sql + ']...'); - client.query(sql, cb); - }, - - function (queryResults, queryHandle, cb) { - console.log('Query results - Rows count: ' + Result2Array.TotalRowsCount(queryResults)); - console.log('Query results - Column names: ' + Result2Array.ColumnNamesArray(queryResults)); - console.log('Query results - Column data types: ' + Result2Array.ColumnTypesArray(queryResults)); - console.log('Query results - Data [displaying only the first 5 rows]:'); - var arr = Result2Array.RowsArray(queryResults); - for (var j = 0; j < 5; j++) { - console.log(arr[j].toString()); - } - returnedQueryHandle = queryHandle; - console.log('Fetching more results...'); - - ActionQueue.while( - function () { - return fetchResult !== null; - }, - - function (callback) { - client.fetch(returnedQueryHandle, function (err, result) { - if (result !== null) { - console.log('Fetch more results - Data [displaying only the first 5 rows]:'); - var arr = Result2Array.RowsArray(result); - for (var k = 0; k < 5; k++) { - console.log(arr[k].toString()); - } - } - fetchResult = result; - callback.call(err); - }) - }, - - function (err) { - if (err) { - throw err.message; - } else { - cb.call(err); - } - } - ) - }, - - function (cb) { - client.closeQuery(returnedQueryHandle, cb); - }, - - function (cb) { - client.close(cb); - } - ], - - function (err) { - if (err == null) { - setTimeout(function () { - console.log('Test passed.'); - }, 1000); - } else { - throw err.message; - } - } -); diff --git a/demo/Server/DemoServer.js b/demo/Server/DemoServer.js deleted file mode 100644 index f663bca..0000000 --- a/demo/Server/DemoServer.js +++ /dev/null @@ -1,79 +0,0 @@ -var http = require('http'), - Result2Array = require('../../src/resultset/Result2Array'), - client = require('../../index.js').createDefaultCUBRIDDemodbConnection(); - -// Note: Open http://localhost:8888 to test this - -function resultToHtmlTable(result) { - var ret = ''; - - ret += '

Table `code` content

'; - ret += ' '; - - var arr = Result2Array.RowsArray(result); - for (var i = 0; i < arr.length; i++) { - ret += ' '; - for (var j = 0; j < arr[i].length; j++) { - ret += ' '; - } - ret += ' '; - } - ret += '
'; - ret += ' ' + arr[i][j]; - ret += '
'; - - return ret; -} - -http.createServer(function (request, response) { - if (request.url == '/') { - client.connect(function (err) { - if (err) { - response.end(err.message); - } else { - client.query('select * from code', function (err, result, queryHandle) { - if (err) { - response.end(err.message); - } else { - var output = ''; - output += ''; - output += ' '; - output += ' CUBRID Node.js Driver test'; - output += ' '; - output += ' '; - output += ' '; - output += resultToHtmlTable(result); - output += ' '; - output += ''; - client.closeQuery(queryHandle, function (err) { - if (err) { - response.end(err.message); - } else { - client.close(function (err) { - if (err) { - response.end(err.message); - } - }); - response.writeHead(200, {'Content-Type' : 'text/html'}); - response.end(output); - } - }) - } - }) - } - }) - } else { - response.writeHead(404, {'Content-Type' : 'text/plain'}); - response.end('Error: Unexpected request!'); - } -}).listen(8888, 'localhost'); - -// Prevent server from closing on uncaught error -process.on('uncaughtException', function (err) { - console.log('Exception: ' + err.message); -}); - diff --git a/demo/Web site (1) - Basic/app.js b/demo/Web site (1) - Basic/app.js deleted file mode 100644 index 1905bc9..0000000 --- a/demo/Web site (1) - Basic/app.js +++ /dev/null @@ -1,61 +0,0 @@ -var fs = require('fs'); -var db_helper = require("./db_helper.js"); - -var http = require('http').createServer(function handler(req, res) { - fs.readFile(__dirname + '/index.html', function (err, data) { - if (err) { - res.writeHead(500); - return res.end('Error loading index.html!'); - } else { - res.writeHead(200); - res.end(data); - } - }); -}).listen(8888); - -var io = require('c:/Program Files (x86)/nodejs/node_modules/socket.io').listen(http); - -io.sockets.on('connection', function (client) { - console.log('Client connected.'); - - // Populate data on first page load - db_helper.get_employees(function (employees, columns, rowsCount) { - client.emit('populate', employees, columns, rowsCount); - }); - - client.on('refresh', function () { - console.log('Repopulate employees on client...'); - db_helper.get_employees(function (employees, columns, rowsCount) { - console.log('Sent [populate] event...'); - client.emit('populate', employees, columns, rowsCount); - }); - }); - - client.on('add employee', function (data) { - console.log('Adding employee...'); - db_helper.add_employee(data, function () { - console.log('Repopulate employees on client...'); - setTimeout(function () { - db_helper.get_employees(function (employees, columns, rowsCount) { - console.log('Sent [populate] event...'); - client.emit('populate', employees, columns, rowsCount); - }); - }, 1000); - }) - }); - - client.on('delete employee', function (data) { - console.log('Deleting employee(s)...'); - db_helper.delete_employee(data, function () { - console.log('Repopulate employees on client...'); - setTimeout(function () { - db_helper.get_employees(function (employees, columns, rowsCount) { - console.log('Sent [populate] event...'); - client.emit('populate', employees, columns, rowsCount); - }); - }, 1000); - }) - }); - -}); - diff --git a/demo/Web site (1) - Basic/db_helper.js b/demo/Web site (1) - Basic/db_helper.js deleted file mode 100644 index 2bc5229..0000000 --- a/demo/Web site (1) - Basic/db_helper.js +++ /dev/null @@ -1,100 +0,0 @@ -var client = require('../../index.js').createDefaultCUBRIDDemodbConnection(); -var Result2Array = require('../../src/resultset/Result2Array'); - -exports.add_employee = function (data, callback) { - var sql = "insert into employees (f_name, salary) values ('" + data.name + "'," + data.salary + ")"; - - client.connect(function (err) { - if (err) { - throw err; - } else { - console.log('Connected.'); - console.log('Adding employee: ' + data.name + ' with salary: ' + data.salary); - client.batchExecuteNoQuery(sql, function (err) { - if (err) { - throw err; - } else { - client.close(function (err) { - if (err) { - throw err; - } else { - console.log('Connection closed.'); - } - }); - - callback(); - } - }); - } - }); -}; - -exports.delete_employee = function (data, callback) { - var sql = "delete from employees where id in (" + data.toString() + ")"; - - console.log(sql); - - client.connect(function (err) { - if (err) { - throw err; - } else { - console.log('Connected.'); - console.log('Deleting employees: ' + data.toString()); - client.batchExecuteNoQuery(sql, function (err) { - if (err) { - throw err; - } else { - client.close(function (err) { - if (err) { - throw err; - } else { - console.log('Connection closed.'); - } - }); - - callback(); - } - }); - } - }); -}; - -exports.get_employees = function (callback) { - var sql = "select * from employees order by id asc"; - - client.connect(function (err) { - if (err) { - throw err; - } else { - console.log('Connected.'); - console.log('Querying: ' + sql); - client.query(sql, function (err, result, queryHandle) { - if (err) { - throw err; - } else { - client.closeQuery(queryHandle, function (err) { - if (err) { - console.log(err.message); - } else { - console.log('Query closed.'); - client.close(function (err) { - if (err) { - throw err; - } else { - console.log('Connection closed.'); - } - }); - } - }); - - var emp = Result2Array.RowsArray(result); - var cols = Result2Array.ColumnNamesArray(result); - var cnt = Result2Array.TotalRowsCount(result); - // Callback function returns employees array - callback(emp, cols, cnt); - } - }); - } - }); -}; - diff --git a/demo/Web site (1) - Basic/favicon.ico b/demo/Web site (1) - Basic/favicon.ico deleted file mode 100644 index e585a78..0000000 Binary files a/demo/Web site (1) - Basic/favicon.ico and /dev/null differ diff --git a/demo/Web site (1) - Basic/index.html b/demo/Web site (1) - Basic/index.html deleted file mode 100644 index 4a0b174..0000000 --- a/demo/Web site (1) - Basic/index.html +++ /dev/null @@ -1,187 +0,0 @@ - - - - - CUBRID Node.js Demo - - - - - - - -

CUBRID node.js demo (1)

- -

Employees data management

-
-
Create new employee
-
- -
- Name: - -     - Salary: - -
-
- -
-
-
List of employees - -

- -
- - -
-
-Status: - -

-
-Options: Simulate 10 sec. wait response time for queries - -
-
- https://github.com/CUBRID/node-cubrid -
-
- www.cubrid.org -
- - diff --git a/demo/Web site (1) - Basic/readme.txt b/demo/Web site (1) - Basic/readme.txt deleted file mode 100644 index b0daafe..0000000 --- a/demo/Web site (1) - Basic/readme.txt +++ /dev/null @@ -1,14 +0,0 @@ -Adapted from: -https://github.com/aluksidadi/Nodejs-Socketio-Mysql-Demo - -Setup: -======================================================================= -- Run setup.sql in CUBRID, to prepare the demo table and the initial data - - -How to run: -======================================================================= -- Run app.js with node -- Open http://localhost:8888 in your browser - - diff --git a/demo/Web site (1) - Basic/setup.sql b/demo/Web site (1) - Basic/setup.sql deleted file mode 100644 index dae87d1..0000000 --- a/demo/Web site (1) - Basic/setup.sql +++ /dev/null @@ -1,13 +0,0 @@ --- Make sure you run this script in the demodb database, with the user 'public'! - -DROP TABLE IF EXISTS employees; - -CREATE TABLE employees( - id INT NOT NULL AUTO_INCREMENT, - f_name VARCHAR(40) NOT NULL DEFAULT 'unknown', - salary INT NOT NULL DEFAULT 100000, - PRIMARY KEY (id) -); - -INSERT INTO employees(f_name, salary) VALUES ('John Tank', 50000), ('Raja Singh', 15000), ('Joe Smith', 10000); - diff --git a/demo/Web site (2) - Paging/app.js b/demo/Web site (2) - Paging/app.js deleted file mode 100644 index 1271c63..0000000 --- a/demo/Web site (2) - Paging/app.js +++ /dev/null @@ -1,95 +0,0 @@ -var fs = require('fs'); -var db_helper = require("./db_helper.js"); - -var delay = (Math.random() * 100) + 200; // "Artificial" operations delay, to simulate a higher network response time -var page_size = 10; - -var http = require('http').createServer(function (req, res) { - switch (req.url) { - case '/': - fs.readFile(__dirname + '/index.html', function (err, data) { - if (err) { - res.writeHead(500); - return res.end('Error loading index.html!'); - } else { - res.writeHead(200, {'Content-Type' : 'text/html'}); - res.end(data); - } - }); - break; - case '/cubrid.png': - fs.readFile(__dirname + '/cubrid.png', function (err, data) { - if (err) { - res.writeHead(500); - return res.end('Error loading cubrid.png!'); - } else { - res.writeHead(200, {'Content-Type' : 'image/png'}); - res.end(data); - } - }); - break; - default: - res.writeHead(404); - return res.end('Error loading: ' + res.url + '!'); - break; - } -}).listen(8888); - -//TODO Update this with your own socket.io installation path -var io = require('c:/Program Files (x86)/nodejs/node_modules/socket.io').listen(http); -//var io = require('socket.io'); - -function populateClient(client, startFrom, selectCount) { - db_helper.get_employees(startFrom, selectCount, function (employees, columns, rowsCount) { - console.log('Sent [populate] event to client, with ' + selectCount + ' rows from start position ' + startFrom + '.'); - client.emit('populate', employees, columns, rowsCount); - }); -} - -io.sockets.on('connection', function (client) { - console.log('Client connected.'); - - // Populate data on first page load - db_helper.setup(function () { - populateClient(client, 1, page_size); // First 10 rows - }); - - client.on('page', function (startFrom, selectCount) { - console.log('Got [page] request from client.'); - setTimeout(function () { - populateClient(client, startFrom, selectCount); - }, delay); - }); - - client.on('add employee', function (data) { - console.log('Got [add employee] request from client.'); - db_helper.add_employee(data, function () { - setTimeout(function () { - populateClient(client, 1, page_size); - }, delay); - }) - }); - - client.on('delete employee', function (data) { - console.log('Got [delete employee] request from client.'); - db_helper.delete_employee(data, function () { - setTimeout(function () { - populateClient(client, 1, page_size); - }, delay); - }) - }); - - client.on('update employee', function (data) { - console.log('Got [update employee] request from client.'); - db_helper.update_employee(data, function () { - setTimeout(function () { - populateClient(client, 1, page_size); - }, delay); - }) - }); - -}); - -io.sockets.on('disconnect', function () { - console.log('Client disconnected.'); -}); diff --git a/demo/Web site (2) - Paging/cubrid.png b/demo/Web site (2) - Paging/cubrid.png deleted file mode 100644 index ae3bab1..0000000 Binary files a/demo/Web site (2) - Paging/cubrid.png and /dev/null differ diff --git a/demo/Web site (2) - Paging/db_helper.js b/demo/Web site (2) - Paging/db_helper.js deleted file mode 100644 index 5594f4e..0000000 --- a/demo/Web site (2) - Paging/db_helper.js +++ /dev/null @@ -1,207 +0,0 @@ -var client = require('../../index.js').createDefaultCUBRIDDemodbConnection(); -var Result2Array = require('../../src/resultset/Result2Array'); - -exports.setup = function (callback) { - var empNames = [ - 'John Doe', - 'Don Mae', - 'Missy Glenn', - 'John Tank', - 'Alec Willson', - 'Donna Doe', - 'Dana Jo', - 'Darling Mo', - 'Master Danny', - 'Senior Dan', - 'Maia Moore', - 'Secret Agent', - 'Dancing Queen', - 'Funny Guy', - 'Daniel Thor', - 'Doctor King', - 'Super Man', - 'Major John Ark', - 'Smiley Man', - 'Bud Thommas', - 'Ala Viking', - 'Beauty Beast', - 'Eleanor Karat' - ]; - - var sqls = []; - sqls.push('drop table if exists employees'); - sqls.push('create table employees( \ - id int not null auto_increment, \ - f_name varchar(40) not null, \ - salary int not null, \ - primary key (id))'); - for (var i = 0; i < empNames.length; i++) { - sqls.push("insert into employees(f_name,salary) values('" + empNames[i] + "'," + Math.random() * 10000 + ")"); - } - console.log(sqls); - - client.connect(function (err) { - if (err) { - throw err; - } else { - console.log('Connected.'); - console.log('Setup employees...'); - client.batchExecuteNoQuery(sqls, function (err) { - if (err) { - throw err; - } else { - client.close(function (err) { - if (err) { - throw err; - } else { - console.log('Connection closed.'); - callback(); - } - }); - } - }); - } - }); -}; - -exports.add_employee = function (data, callback) { - var sql = "insert into employees (f_name, salary) values ('" + data.name + "'," + data.salary + ")"; - console.log(sql); - - client.connect(function (err) { - if (err) { - throw err; - } else { - console.log('Connected.'); - console.log('Adding employee: ' + data.name + ' with salary: ' + data.salary); - client.batchExecuteNoQuery(sql, function (err) { - if (err) { - throw err; - } else { - client.close(function (err) { - if (err) { - throw err; - } else { - console.log('Connection closed.'); - callback(); - } - }); - } - }); - } - }); -}; - -exports.delete_employee = function (data, callback) { - var sql = "delete from employees where id in (" + data.toString() + ")"; - console.log(sql); - - client.connect(function (err) { - if (err) { - throw err; - } else { - console.log('Connected.'); - console.log('Deleting employees: ' + data.toString()); - client.batchExecuteNoQuery(sql, function (err) { - if (err) { - throw err; - } else { - client.close(function (err) { - if (err) { - throw err; - } else { - console.log('Connection closed.'); - callback(); - } - }); - } - }); - } - }); -}; - -exports.update_employee = function (data, callback) { - var sql = "update employees set f_name='" + data.name + "', salary=" + data.salary + " where id=" + data.id; - console.log(sql); - - client.connect(function (err) { - if (err) { - throw err; - } else { - console.log('Connected.'); - console.log('Updating employee: ' + data.toString()); - client.batchExecuteNoQuery(sql, function (err) { - if (err) { - throw err; - } else { - client.close(function (err) { - if (err) { - throw err; - } else { - console.log('Connection closed.'); - callback(); - } - }); - } - }); - } - }); -}; - -exports.get_employees = function (startFrom, selectCount, callback) { - var sql = "select * from employees where rownum between " + startFrom + " and " + (startFrom + selectCount - 1); - console.log(sql); - - var data = null; - var cols = null; - var totalRows = 0; - - client.connect(function (err) { - if (err) { - throw err; - } else { - console.log('Connected.'); - console.log('Querying: ' + sql); - client.query(sql, function (err, result, queryHandle) { - if (err) { - throw err; - } else { - data = Result2Array.RowsArray(result); - cols = Result2Array.ColumnNamesArray(result); - client.closeQuery(queryHandle, function (err) { - if (err) { - console.log(err.message); - } else { - console.log('Query closed.'); - var sqlCount = "select count(*) from employees"; - console.log(sqlCount); - client.query(sqlCount, function (err, result, queryHandle) { - if (err) { - throw err; - } else { - totalRows = Result2Array.RowsArray(result)[0][0]; - client.closeQuery(queryHandle, function (err) { - if (err) { - console.log(err.message); - } else { - console.log('Query closed.'); - client.close(function (err) { - if (err) { - throw err; - } else { - console.log('Connection closed.'); - callback(data, cols, totalRows); - } - }); - } - }); - } - }); - } - }); - } - }); - } - }); -}; - diff --git a/demo/Web site (2) - Paging/favicon.ico b/demo/Web site (2) - Paging/favicon.ico deleted file mode 100644 index e585a78..0000000 Binary files a/demo/Web site (2) - Paging/favicon.ico and /dev/null differ diff --git a/demo/Web site (2) - Paging/index.html b/demo/Web site (2) - Paging/index.html deleted file mode 100644 index 19d4209..0000000 --- a/demo/Web site (2) - Paging/index.html +++ /dev/null @@ -1,332 +0,0 @@ - - - - -CUBRID Node.js Demo - - - - - - - - -

- - CUBRID node.js demo (2) -

- -

Employees data management

-
-
Create new employee
-
- -
- Id: - -     - Name: - -     - Salary: - -
-
- -
- - -
-
-
- List of employees   - Displaying rows from -

- to -

- (out of a total of -

- rows.) -

-
-

- -
-
- -
-
- - - - -
-
-
-
-
- Status: - -

-
-
-
-
- https://github.com/CUBRID/node-cubrid -
-
- www.cubrid.org -
- - diff --git a/demo/Web site (2) - Paging/readme.txt b/demo/Web site (2) - Paging/readme.txt deleted file mode 100644 index a65f6ef..0000000 --- a/demo/Web site (2) - Paging/readme.txt +++ /dev/null @@ -1,9 +0,0 @@ -Adapted from: -https://github.com/aluksidadi/Nodejs-Socketio-Mysql-Demo - -How to run: -======================================================================= -- Run app.js with node -- Open http://localhost:8888 in your browser - - diff --git a/demo/Web site (3) - Filter/app.js b/demo/Web site (3) - Filter/app.js deleted file mode 100644 index 284e6cc..0000000 --- a/demo/Web site (3) - Filter/app.js +++ /dev/null @@ -1,112 +0,0 @@ -var fs = require('fs'); -var db_helper = require("./db_helper.js"); - -var delay = (Math.random() * 100) + 200; // Introduce a delay, to simulate a higher network response time -var page_size = 10; // Rows displayed per page - -var http = require('http').createServer(function handler(req, res) { - switch (req.url) { - case '/': - fs.readFile(__dirname + '/index.html', function (err, data) { - if (err) { - res.writeHead(500); - return res.end('Error loading index.html!'); - } else { - res.writeHead(200, {'Content-Type' : 'text/html'}); - res.end(data); - } - }); - break; - case '/cubrid.png': - fs.readFile(__dirname + '/cubrid.png', function (err, data) { - if (err) { - res.writeHead(500); - return res.end('Error loading cubrid.png!'); - } else { - res.writeHead(200, {'Content-Type' : 'image/png'}); - res.end(data); - } - }); - break; - case '/site.css': - fs.readFile(__dirname + '/site.css', function (err, data) { - if (err) { - res.writeHead(500); - return res.end('Error loading site.css!'); - } else { - res.writeHead(200, {'Content-Type' : 'text/css'}); - res.end(data); - } - }); - break; - default: - res.writeHead(404); - return res.end('Error loading: ' + res.url + '!'); - break; - } -}).listen(8888); - -//TODO Update this with your own socket.io installation path -var io = require('c:/Program Files (x86)/nodejs/node_modules/socket.io').listen(http); -//var io = require('socket.io'); - -function populateClient(client, startFrom, selectCount, filter) { - db_helper.get_employees(startFrom, selectCount, filter, function (employees, columns, rowsCount) { - console.log('Sent [populate] event to client, with ' + selectCount + ' rows from start position ' + startFrom + '.'); - client.emit('populate', employees, columns, rowsCount); - }); -} - -io.sockets.on('connection', function (client) { - console.log('Client connected.'); - - client.on('setup', function () { - console.log('Initial setup needed...'); - db_helper.setup(function () { - populateClient(client, 1, page_size, ''); - }); - }); - - client.on('refresh', function (filter) { - populateClient(client, 1, page_size, filter); // First [page_size] rows - }); - - client.on('page', function (startFrom, selectCount, filter) { - console.log('Got [page] request from client.'); - setTimeout(function () { - populateClient(client, startFrom, selectCount, filter); - }, delay); - }); - - client.on('add employee', function (data, filter) { - console.log('Got [add employee] request from client.'); - db_helper.add_employee(data, function () { - setTimeout(function () { - populateClient(client, 1, page_size, filter); - }, delay); - }) - }); - - client.on('delete employee', function (data, filter) { - console.log('Got [delete employee] request from client.'); - db_helper.delete_employee(data, function () { - setTimeout(function () { - populateClient(client, 1, page_size, filter); - }, delay); - }) - }); - - client.on('update employee', function (data, filter) { - console.log('Got [update employee] request from client.'); - db_helper.update_employee(data, function () { - setTimeout(function () { - populateClient(client, 1, page_size, filter); - }, delay); - }) - }); - -}); - -io.sockets.on('disconnect', function () { - console.log('Client disconnected.'); -}); diff --git a/demo/Web site (3) - Filter/cubrid.png b/demo/Web site (3) - Filter/cubrid.png deleted file mode 100644 index ae3bab1..0000000 Binary files a/demo/Web site (3) - Filter/cubrid.png and /dev/null differ diff --git a/demo/Web site (3) - Filter/db_helper.js b/demo/Web site (3) - Filter/db_helper.js deleted file mode 100644 index 9e8a38f..0000000 --- a/demo/Web site (3) - Filter/db_helper.js +++ /dev/null @@ -1,216 +0,0 @@ -var client = require('../../index.js').createDefaultCUBRIDDemodbConnection(); -var Result2Array = require('../../src/resultset/Result2Array'); - -exports.setup = function (callback) { - var empNames = [ - 'John Doe', - 'Don Mae', - 'Missy Glenn', - 'John Tank', - 'Alec Willson', - 'Donna Doe', - 'Dana Joe', - 'Darling Mo', - 'Master Commander', - 'Senior Dan', - 'Maia Moore', - 'Secret Agent', - 'Dancing Queen', - 'Funny Guy', - 'Daniel Thor', - 'Doctor King', - 'Super Man', - 'Major John Ark', - 'Smiley Man', - 'Bud Thommas', - 'Alan Viking', - 'Beauty Beast', - 'Eleanor Karat' - ]; - - var sqls = []; - sqls.push('drop table if exists employees'); - sqls.push('create table employees( \ - id int not null auto_increment, \ - f_name varchar(40) not null, \ - salary int not null, \ - primary key (id))'); - for (var i = 0; i < empNames.length; i++) { - sqls.push("insert into employees(f_name,salary) values('" + empNames[i] + "'," + Math.random() * 10000 + ")"); - } - console.log(sqls); - - client.connect(function (err) { - if (err) { - throw err; - } else { - console.log('Connected.'); - console.log('Setup employees...'); - client.batchExecuteNoQuery(sqls, function (err) { - if (err) { - throw err; - } else { - client.close(function (err) { - if (err) { - throw err; - } else { - console.log('Connection closed.'); - callback(); - } - }); - } - }); - } - }); -}; - -exports.add_employee = function (data, callback) { - var sql = "insert into employees (f_name, salary) values ('" + data.name + "'," + data.salary + ")"; - console.log(sql); - - client.connect(function (err) { - if (err) { - throw err; - } else { - console.log('Connected.'); - console.log('Adding employee: ' + data.name + ' with salary: ' + data.salary); - client.batchExecuteNoQuery(sql, function (err) { - if (err) { - throw err; - } else { - client.close(function (err) { - if (err) { - throw err; - } else { - console.log('Connection closed.'); - callback(); - } - }); - } - }); - } - }); -}; - -exports.delete_employee = function (data, callback) { - var sql = "delete from employees where id in (" + data.toString() + ")"; - console.log(sql); - - client.connect(function (err) { - if (err) { - throw err; - } else { - console.log('Connected.'); - console.log('Deleting employees: ' + data.toString()); - client.batchExecuteNoQuery(sql, function (err) { - if (err) { - throw err; - } else { - client.close(function (err) { - if (err) { - throw err; - } else { - console.log('Connection closed.'); - callback(); - } - }); - } - }); - } - }); -}; - -exports.update_employee = function (data, callback) { - var sql = "update employees set f_name='" + data.name + "', salary=" + data.salary + " where id=" + data.id; - console.log(sql); - - client.connect(function (err) { - if (err) { - throw err; - } else { - console.log('Connected.'); - console.log('Updating employee: ' + data.toString()); - client.batchExecuteNoQuery(sql, function (err) { - if (err) { - throw err; - } else { - client.close(function (err) { - if (err) { - throw err; - } else { - console.log('Connection closed.'); - callback(); - } - }); - } - }); - } - }); -}; - -exports.get_employees = function (startFrom, selectCount, filter, callback) { - var sql = "select * from employees"; - if (filter != '') { - sql += " where f_name like '" + filter + "'"; - } - sql += " order by f_name asc"; - sql += " for orderby_num() between " + startFrom + " and " + (startFrom + selectCount - 1); - console.log(sql); - - var data = null; - var cols = null; - var totalRows = 0; - - client.connect(function (err) { - if (err) { - throw err; - } else { - console.log('Connected.'); - console.log('Querying: ' + sql); - client.query(sql, function (err, result, queryHandle) { - if (err) { - throw err; - } else { - data = Result2Array.RowsArray(result); - cols = Result2Array.ColumnNamesArray(result); - client.closeQuery(queryHandle, function (err) { - if (err) { - console.log(err.message); - } else { - console.log('Query closed.'); - var sqlCount = "select count(*) from employees"; - if (filter != '') { - sqlCount += " where (f_name like '" + filter + "')"; - } - console.log(sqlCount); - client.query(sqlCount, function (err, result, queryHandle) { - if (err) { - throw err; - } else { - totalRows = Result2Array.RowsArray(result)[0][0]; - console.log('Found ' + totalRows + ' rows.'); - client.closeQuery(queryHandle, function (err) { - if (err) { - console.log(err.message); - } else { - console.log('Query closed.'); - client.close(function (err) { - if (err) { - throw err; - } else { - console.log('Connection closed.'); - callback(data, cols, totalRows); - } - }); - } - }); - } - }); - } - }); - } - }); - } - }); -}; - diff --git a/demo/Web site (3) - Filter/favicon.ico b/demo/Web site (3) - Filter/favicon.ico deleted file mode 100644 index e585a78..0000000 Binary files a/demo/Web site (3) - Filter/favicon.ico and /dev/null differ diff --git a/demo/Web site (3) - Filter/index.html b/demo/Web site (3) - Filter/index.html deleted file mode 100644 index b901c50..0000000 --- a/demo/Web site (3) - Filter/index.html +++ /dev/null @@ -1,347 +0,0 @@ - - - - -CUBRID Node.js Demo - - - - - - - -

- - CUBRID node.js demo (3) -

- -

Employees data management

-
-
Create new/Update employee
-
- -
- Id: - -     - Name: - -     - Salary: - -
-
- -
- - -
-
-
- List of employees   - Displaying rows from -

- to -

- (out of a total of -

- rows.) -

-
-
- Search employees by name: - - - -
-

- -
-
- -
-
- - - - - -
-
-
-
-
- Status: - -

-
-
-
- -
- https://github.com/CUBRID/node-cubrid -
-
- www.cubrid.org -
- - diff --git a/demo/Web site (3) - Filter/readme.txt b/demo/Web site (3) - Filter/readme.txt deleted file mode 100644 index a65f6ef..0000000 --- a/demo/Web site (3) - Filter/readme.txt +++ /dev/null @@ -1,9 +0,0 @@ -Adapted from: -https://github.com/aluksidadi/Nodejs-Socketio-Mysql-Demo - -How to run: -======================================================================= -- Run app.js with node -- Open http://localhost:8888 in your browser - - diff --git a/demo/Web site (3) - Filter/site.css b/demo/Web site (3) - Filter/site.css deleted file mode 100644 index 4448ec4..0000000 --- a/demo/Web site (3) - Filter/site.css +++ /dev/null @@ -1,23 +0,0 @@ -html, body { - font: normal 0.9em arial, helvetica; -} - -label { - width: 80px; - float: left; -} - -#table_employees tr:hover { - font-weight: bold; - color: navy; -} - -.highlight { - background: #FFFFCC; -} - -.button { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} diff --git a/demo/Web site (4) - Events/app.js b/demo/Web site (4) - Events/app.js deleted file mode 100644 index 550898c..0000000 --- a/demo/Web site (4) - Events/app.js +++ /dev/null @@ -1,122 +0,0 @@ -var fs = require('fs'); -var db_helper = require("./db_helper.js"); - -var delay = (Math.random() * 200) + 100; // Introduce a delay, to simulate a higher network response time -var page_size = 10; // Rows displayed per page - -var httpServer = require('http').createServer(function handler(req, res) { - switch (req.url) { - case '/': - fs.readFile(__dirname + '/index.html', function (err, data) { - if (err) { - res.writeHead(500); - return res.end('Error loading index.html!'); - } else { - res.writeHead(200, {'Content-Type' : 'text/html'}); - res.end(data); - } - }); - break; - case '/cubrid.png': - fs.readFile(__dirname + '/cubrid.png', function (err, data) { - if (err) { - res.writeHead(500); - return res.end('Error loading cubrid.png!'); - } else { - res.writeHead(200, {'Content-Type' : 'image/png'}); - res.end(data); - } - }); - break; - case '/site.css': - fs.readFile(__dirname + '/site.css', function (err, data) { - if (err) { - res.writeHead(500); - return res.end('Error loading site.css!'); - } else { - res.writeHead(200, {'Content-Type' : 'text/css'}); - res.end(data); - } - }); - break; - default: - res.writeHead(404); - return res.end('Error loading: ' + res.url + '!'); - break; - } -}).listen(8888); - -httpServer.on('close', function () { - console.log("Server closed."); -}); - -//TODO Update this with your own socket.io installation path -var io = require('c:/Program Files (x86)/nodejs/node_modules/socket.io').listen(httpServer); -//var io = require('socket.io'); - -function populateClient(client, startFrom, selectCount, filter) { - db_helper.get_employees(startFrom, selectCount, filter, function (employees, columns, rowsCount) { - console.log('Sent [populate] event to client, with ' + selectCount + ' rows from start position ' + startFrom + '.'); - client.emit('populate', employees, columns, rowsCount); - }); -} - -io.sockets.on('connection', function (client) { - console.log('Client connected.'); - - client.on('setup', function () { - console.log('Initial setup needed...'); - db_helper.setup(function () { - populateClient(client, 1, page_size, ''); - }); - }); - - client.on('cleanup', function () { - console.log('Cleanup...'); - db_helper.cleanup(function () { - }); - }); - - client.on('refresh', function (filter) { - populateClient(client, 1, page_size, filter); // First [page_size] rows - }); - - client.on('page', function (startFrom, selectCount, filter) { - console.log('Got [page] request from client.'); - setTimeout(function () { - populateClient(client, startFrom, selectCount, filter); - }, delay); - }); - - client.on('add employee', function (data, filter) { - console.log('Got [add employee] request from client.'); - db_helper.add_employee(data, function () { - setTimeout(function () { - populateClient(client, 1, page_size, filter); - }, delay); - }) - }); - - client.on('delete employee', function (data, filter) { - console.log('Got [delete employee] request from client.'); - db_helper.delete_employee(data, function () { - setTimeout(function () { - populateClient(client, 1, page_size, filter); - }, delay); - }) - }); - - client.on('update employee', function (data, filter) { - console.log('Got [update employee] request from client.'); - db_helper.update_employee(data, function () { - setTimeout(function () { - populateClient(client, 1, page_size, filter); - }, delay); - }) - }); - -}); - -io.sockets.on('disconnect', function () { - console.log('Client disconnected.'); -}); diff --git a/demo/Web site (4) - Events/cubrid.png b/demo/Web site (4) - Events/cubrid.png deleted file mode 100644 index ae3bab1..0000000 Binary files a/demo/Web site (4) - Events/cubrid.png and /dev/null differ diff --git a/demo/Web site (4) - Events/db_helper.js b/demo/Web site (4) - Events/db_helper.js deleted file mode 100644 index 3cc18d9..0000000 --- a/demo/Web site (4) - Events/db_helper.js +++ /dev/null @@ -1,247 +0,0 @@ -var Result2Array = require('../../src/resultset/Result2Array'); - -exports.setup = function (callback) { - var empNames = [ - 'John Doe', - 'Don Mae', - 'Missy Glenn', - 'John Tank', - 'Alec Willson', - 'Donna Doe', - 'Dana Joe', - 'Darling Mo', - 'Master Commander', - 'Senior Dan', - 'Maia Moore', - 'Secret Agent', - 'Dancing Queen', - 'Funny Guy', - 'Daniel Thor', - 'Doctor King', - 'Super Man', - 'Major John Ark', - 'Smiley Man', - 'Bud Thommas', - 'Alan Viking', - 'Beauty Beast', - 'Eleanor Karat' - ]; - - var sqls = []; - sqls.push('drop table if exists employees'); - sqls.push('create table employees( \ - id int not null auto_increment, \ - f_name varchar(40) not null, \ - salary int not null, \ - primary key (id))'); - for (var i = 0; i < empNames.length; i++) { - sqls.push("insert into employees(f_name,salary) values('" + empNames[i] + "'," + Math.random() * 10000 + ")"); - } - - var client = require('../../index').createDefaultCUBRIDDemodbConnection(); - - client.connect(null); - - client.on(client.EVENT_ERROR, function (err) { - throw err.message; - }); - - client.on(client.EVENT_CONNECTED, function () { - console.log('Connected.'); - console.log('Setup employees...'); - console.log(sqls); - client.batchExecuteNoQuery(sqls, null); - }); - - client.on(client.EVENT_BATCH_COMMANDS_COMPLETED, function () { - client.close(null); - }); - - client.on(client.EVENT_CONNECTION_CLOSED, function () { - console.log('Connection closed.'); - callback(); - }); -}; - -exports.cleanup = function (callback) { - var sql = "drop table if exists employees"; - var client = require('../../index').createDefaultCUBRIDDemodbConnection(); - - client.connect(null); - - client.on(client.EVENT_ERROR, function (err) { - throw err.message; - }); - - client.on(client.EVENT_CONNECTED, function () { - console.log('Connected.'); - console.log('Cleanup...'); - console.log(sql); - client.batchExecuteNoQuery(sql, null); - }); - - client.on(client.EVENT_BATCH_COMMANDS_COMPLETED, function () { - client.close(null); - }); - - client.on(client.EVENT_CONNECTION_CLOSED, function () { - console.log('Connection closed.'); - callback(); - }); -}; - -exports.add_employee = function (data, callback) { - var sql = "insert into employees (f_name, salary) values ('" + data.name + "'," + data.salary + ")"; - var client = require('../../index').createDefaultCUBRIDDemodbConnection(); - - client.connect(null); - - client.on(client.EVENT_ERROR, function (err) { - throw err.message; - }); - - client.on(client.EVENT_CONNECTED, function () { - console.log('Connected.'); - console.log('Adding employee: ' + data.name + ' with salary: ' + data.salary); - console.log(sql); - client.batchExecuteNoQuery(sql, null); - }); - - client.on(client.EVENT_BATCH_COMMANDS_COMPLETED, function () { - client.close(null); - }); - - client.on(client.EVENT_CONNECTION_CLOSED, function () { - console.log('Connection closed.'); - callback(); - }); -}; - -exports.delete_employee = function (data, callback) { - var sql = "delete from employees where id in (" + data.toString() + ")"; - var client = require('../../index').createDefaultCUBRIDDemodbConnection(); - - client.connect(null); - - client.on(client.EVENT_ERROR, function (err) { - throw err.message; - }); - - client.on(client.EVENT_CONNECTED, function () { - console.log('Connected.'); - console.log('Deleting employee(s): ' + data.toString()); - console.log(sql); - client.batchExecuteNoQuery(sql, null); - }); - - client.on(client.EVENT_BATCH_COMMANDS_COMPLETED, function () { - client.close(null); - }); - - client.on(client.EVENT_CONNECTION_CLOSED, function () { - console.log('Connection closed.'); - callback(); - }); -}; - -exports.update_employee = function (data, callback) { - var sql = "update employees set f_name='" + data.name + "', salary=" + data.salary + " where id=" + data.id; - var client = require('../../index').createDefaultCUBRIDDemodbConnection(); - - client.connect(null); - - client.on(client.EVENT_ERROR, function (err) { - throw err.message; - }); - - client.on(client.EVENT_CONNECTED, function () { - console.log('Connected.'); - console.log('Updating employee: ' + data.toString()); - console.log(sql); - client.batchExecuteNoQuery(sql, null); - }); - - client.on(client.EVENT_BATCH_COMMANDS_COMPLETED, function () { - client.close(null); - }); - - client.on(client.EVENT_CONNECTION_CLOSED, function () { - console.log('Connection closed.'); - callback(); - }); -}; - -exports.get_employees = function (startFrom, selectCount, filter, callback) { - var sql = "select * from employees"; - if (filter != '') { - sql += " where f_name like '" + filter + "'"; - } - sql += " order by f_name asc"; - sql += " for orderby_num() between " + startFrom + " and " + (startFrom + selectCount - 1); - - var sqlCount = "select count(*) from employees"; - if (filter != '') { - sqlCount += " where (f_name like '" + filter + "')"; - } - - var data = null; - var cols = null; - var totalRows = 0; - - var firstQueryCompleted = false; - var firstQueryClosed = false; - - var client = require('../../index').createDefaultCUBRIDDemodbConnection(); - - client.connect(null); - - client.on(client.EVENT_CONNECTED, function () { - console.log('Connected.'); - console.log('Querying data...'); - console.log(sql); - client.query(sql, function () { - }); - }); - - client.on(client.EVENT_QUERY_DATA_AVAILABLE, function (result, queryHandle) { - if (!firstQueryCompleted) { //first query - console.log('First query data available...'); - firstQueryCompleted = true; - data = Result2Array.RowsArray(result); - cols = Result2Array.ColumnNamesArray(result); - console.log('Closing first query...'); - client.closeQuery(queryHandle, function () { - }); - } else { //second query - console.log('Second query data available...'); - totalRows = Result2Array.RowsArray(result)[0][0]; - console.log('Found ' + totalRows + ' rows.'); - console.log('Closing second query...'); - client.closeQuery(queryHandle, function () { - }); - } - }); - - client.on(client.EVENT_QUERY_CLOSED, function () { - if (!firstQueryClosed) { - firstQueryClosed = true; - console.log('First query closed.'); - console.log('Executing COUNT query...'); - console.log(sqlCount); - client.query(sqlCount, function () { - }); - } else { - console.log('Second query closed.'); - console.log('Closing connection...'); - client.close(function () { - }); - } - }); - - client.on(client.EVENT_CONNECTION_CLOSED, function () { - console.log('Connection closed.'); - callback(data, cols, totalRows); - }); -}; - - diff --git a/demo/Web site (4) - Events/favicon.ico b/demo/Web site (4) - Events/favicon.ico deleted file mode 100644 index e585a78..0000000 Binary files a/demo/Web site (4) - Events/favicon.ico and /dev/null differ diff --git a/demo/Web site (4) - Events/index.html b/demo/Web site (4) - Events/index.html deleted file mode 100644 index 9bda11b..0000000 --- a/demo/Web site (4) - Events/index.html +++ /dev/null @@ -1,367 +0,0 @@ - - - - -CUBRID node.js - Web site demo (4) - - - - - - - -

- - CUBRID node.js - Web site demo (4) -

- -

Employees data management

-
-
Create new/Update employee
-
- -
- Id: - -     - Name: - -     - Salary: - -
-
- -
- - -
-
-
- List of employees   - Displaying rows from -

- to -

- (out of a total of -

- rows.) -

-
-
- Search employees by name: - - - -
-

- -
-
- -
-
- - - - - -
-
-
-
-
- Status: - -

-
-
-
- -
- https://github.com/CUBRID/node-cubrid -
-
- www.cubrid.org -
- - diff --git a/demo/Web site (4) - Events/readme.txt b/demo/Web site (4) - Events/readme.txt deleted file mode 100644 index a65f6ef..0000000 --- a/demo/Web site (4) - Events/readme.txt +++ /dev/null @@ -1,9 +0,0 @@ -Adapted from: -https://github.com/aluksidadi/Nodejs-Socketio-Mysql-Demo - -How to run: -======================================================================= -- Run app.js with node -- Open http://localhost:8888 in your browser - - diff --git a/demo/Web site (4) - Events/site.css b/demo/Web site (4) - Events/site.css deleted file mode 100644 index 1ff2c00..0000000 --- a/demo/Web site (4) - Events/site.css +++ /dev/null @@ -1,24 +0,0 @@ -html, body { - font: normal 0.9em arial, helvetica; -} - -label { - width: 80px; - float: left; -} - -#table_employees tr:hover { - font-weight: bold; - color: navy; - font-style: italic; -} - -.highlight { - background: #FFFFCC; -} - -.button { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} diff --git a/demo/Web site (5) - Database/app.js b/demo/Web site (5) - Database/app.js deleted file mode 100644 index 36d5320..0000000 --- a/demo/Web site (5) - Database/app.js +++ /dev/null @@ -1,75 +0,0 @@ -var fs = require('fs'); -var db_helper = require("./db_helper.js"); - -var httpServer = require('http').createServer(function handler(req, res) { - switch (req.url) { - case '/': - fs.readFile(__dirname + '/index.html', function (err, data) { - if (err) { - res.writeHead(500); - return res.end('Error loading index.html!'); - } else { - res.writeHead(200, {'Content-Type' : 'text/html'}); - res.end(data); - } - }); - break; - case '/cubrid.png': - fs.readFile(__dirname + '/cubrid.png', function (err, data) { - if (err) { - res.writeHead(500); - return res.end('Error loading cubrid.png!'); - } else { - res.writeHead(200, {'Content-Type' : 'image/png'}); - res.end(data); - } - }); - break; - case '/site.css': - fs.readFile(__dirname + '/site.css', function (err, data) { - if (err) { - res.writeHead(500); - return res.end('Error loading site.css!'); - } else { - res.writeHead(200, {'Content-Type' : 'text/css'}); - res.end(data); - } - }); - break; - default: - res.writeHead(404); - return res.end('Error loading: ' + res.url + '!'); - break; - } -}).listen(8888); - -httpServer.on('close', function () { - console.log("Server closed."); -}); - -//TODO Update this with your own socket.io installation path -var io = require('c:/Program Files (x86)/nodejs/node_modules/socket.io').listen(httpServer); -//var io = require('socket.io'); - -io.sockets.on('connection', function (client) { - console.log('Client connected.'); - - client.on('execute', function (sql) { - console.log('Got [populate] request from client.'); - db_helper.getQueryData(sql, function (data, columnNames) { - console.log('Send [populate] event to client...'); - if (columnNames == -1) { - var errMsg = data.message; - client.emit('sqlerror', errMsg); - } else { - client.emit('populate', data, columnNames); - } - }); - }); -}); - -io.sockets.on('disconnect', function () { - console.log('Client disconnected.'); -}); - - diff --git a/demo/Web site (5) - Database/cubrid.png b/demo/Web site (5) - Database/cubrid.png deleted file mode 100644 index ae3bab1..0000000 Binary files a/demo/Web site (5) - Database/cubrid.png and /dev/null differ diff --git a/demo/Web site (5) - Database/db_helper.js b/demo/Web site (5) - Database/db_helper.js deleted file mode 100644 index 898101c..0000000 --- a/demo/Web site (5) - Database/db_helper.js +++ /dev/null @@ -1,45 +0,0 @@ -var Result2Array = require('../../src/resultset/Result2Array'); - -exports.getQueryData = function (sql, callback) { - var client = require('../../index').createDefaultCUBRIDDemodbConnection(); - var data = null; - var cols = null; - var error = null; - - client.connect(); - - client.on(client.EVENT_ERROR, function (err) { - console.log('Error: ' + err.message); - error = err; - client.close(); - }); - - client.on(client.EVENT_CONNECTED, function () { - console.log('Connected.'); - console.log('Executing SQL: ' + sql); - client.query(sql); - }); - - client.on(client.EVENT_QUERY_DATA_AVAILABLE, function (result, queryHandle) { - data = Result2Array.RowsArray(result); - cols = Result2Array.ColumnNamesArray(result); - console.log('Closing first query...'); - client.closeQuery(queryHandle, null); - }); - - client.on(client.EVENT_QUERY_CLOSED, function () { - console.log('Query closed.'); - client.close(); - }); - - client.on(client.EVENT_CONNECTION_CLOSED, function () { - console.log('Connection closed.'); - if (error) { - callback(error, -1); - } else { - callback(data, cols); - } - }); -}; - - diff --git a/demo/Web site (5) - Database/favicon.ico b/demo/Web site (5) - Database/favicon.ico deleted file mode 100644 index e585a78..0000000 Binary files a/demo/Web site (5) - Database/favicon.ico and /dev/null differ diff --git a/demo/Web site (5) - Database/index.html b/demo/Web site (5) - Database/index.html deleted file mode 100644 index d32b91f..0000000 --- a/demo/Web site (5) - Database/index.html +++ /dev/null @@ -1,133 +0,0 @@ - - - - - CUBRID node.js - Web site demo (5) - - - - - - - -

- - CUBRID node.js - Web site demo (5) -

- -

Simple query browser

-
-
- -
- SQL: - - -
-
- -
-
- Returned data:   -
-

-
-
-
- Status: - -

-
-
-
- -
- https://github.com/CUBRID/node-cubrid -
-
- www.cubrid.org -
- - diff --git a/demo/Web site (5) - Database/readme.txt b/demo/Web site (5) - Database/readme.txt deleted file mode 100644 index a65f6ef..0000000 --- a/demo/Web site (5) - Database/readme.txt +++ /dev/null @@ -1,9 +0,0 @@ -Adapted from: -https://github.com/aluksidadi/Nodejs-Socketio-Mysql-Demo - -How to run: -======================================================================= -- Run app.js with node -- Open http://localhost:8888 in your browser - - diff --git a/demo/Web site (5) - Database/site.css b/demo/Web site (5) - Database/site.css deleted file mode 100644 index 1ff2c00..0000000 --- a/demo/Web site (5) - Database/site.css +++ /dev/null @@ -1,24 +0,0 @@ -html, body { - font: normal 0.9em arial, helvetica; -} - -label { - width: 80px; - float: left; -} - -#table_employees tr:hover { - font-weight: bold; - color: navy; - font-style: italic; -} - -.highlight { - background: #FFFFCC; -} - -.button { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} diff --git a/index.js b/index.js index de0cfad..3dfba78 100644 --- a/index.js +++ b/index.js @@ -1,3 +1,28 @@ -module.exports = process.env.CODE_COV - ? require('./src-cov/cubrid') - : require('./src/cubrid'); +const CUBRIDConnection = require('./src/CUBRIDConnection'); +const Helpers = require('./src/utils/Helpers'); + +/** + * Helper functions + * @type {*} + */ +exports.Helpers = Helpers; + +/** + * Creates a new CUBRID connection. This function creates a new instance of + * CUBRIDConnection, however doesn't establish actual connection with the + * broker. + * + * @alias createClient, createConnection + * @param hosts + * @param port + * @param user + * @param password + * @param database + * @param connectionTimeout + * @param maxConnectionRetryCount + * @param logger + * @return {CUBRIDConnection} + */ +exports.createConnection = exports.createCUBRIDConnection = function (hosts, port, user, password, database, connectionTimeout, maxConnectionRetryCount, logger) { + return new CUBRIDConnection(hosts, port, user, password, database, connectionTimeout, maxConnectionRetryCount, logger); +}; diff --git a/package.json b/package.json index 58f89f0..7b106fa 100644 --- a/package.json +++ b/package.json @@ -1,18 +1,13 @@ { "name": "node-cubrid", - "version": "2.2.5", + "version": "3.0.0", "description": "This is a Node.js driver for CUBRID RDBMS. It is developed in 100% JavaScript and does not require specific platform compilation.", "author": "CUBRID (http://www.cubrid.org/)", "repository": { "type": "git", "url": "git://github.com/cubrid/node-cubrid.git" }, - "licenses": [ - { - "type": "MIT", - "url": "http://github.com/cubrid/node-cubrid/raw/master/LICENSE" - } - ], + "license": "MIT", "main": "index.js", "keywords": [ "native", @@ -25,18 +20,19 @@ "module" ], "engines": { - "node": "*" + "node": ">=4" }, "scripts": { - "clean": "rm -rf src-cov", - "instrument": "npm run clean && jscoverage src src-cov", - "cover": "npm run instrument && CODE_COV=1 NODE_ENV=test ./node_modules/.bin/nodeunit --reporter=lcov test | node test/testSetup/fix_lcov.js | ./node_modules/.bin/coveralls", - "test": "./node_modules/.bin/nodeunit test" + "clean": "rm -rf coverage", + "coverage": "./node_modules/istanbul/lib/cli.js cover ./node_modules/mocha/bin/_mocha --report lcovonly -- -R spec test && cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js && rm -rf ./coverage", + "lint": "./node_modules/eslint/bin/eslint.js .", + "test": "npm run lint && ./node_modules/mocha/bin/mocha test" }, "devDependencies": { - "async": "~0.8.0", - "coveralls": "~2.10.0", - "generic-pool": "~2.0.4", - "nodeunit": "~0.9.0" + "chai": "3.5.0", + "coveralls": "2.11.14", + "eslint": "3.6.1", + "istanbul": "0.4.5", + "mocha": "3.0.2" } } diff --git a/src/CUBRIDConnection.js b/src/CUBRIDConnection.js index 74f9c96..43d7374 100644 --- a/src/CUBRIDConnection.js +++ b/src/CUBRIDConnection.js @@ -1,417 +1,470 @@ -var Net = require('net'), - EventEmitter = require('events').EventEmitter, - Util = require('util'), - - ErrorMessages = require('./constants/ErrorMessages'), - DATA_TYPES = require('./constants/DataTypes'), - CASConstants = require('./constants/CASConstants'), - - ActionQueue = require('./utils/ActionQueue'), - Helpers = require('./utils/Helpers'), - Cache = require('./utils/Cache'), - - Query = require('./query/Query'), - Queue = require('./query/Queue'), - - PacketReader = require('./packets/PacketReader'), - PacketWriter = require('./packets/PacketWriter'), - ClientInfoExchangePacket = require('./packets/ClientInfoExchangePacket'), - OpenDatabasePacket = require('./packets/OpenDatabasePacket'), - GetEngineVersionPacket = require('./packets/GetEngineVersionPacket'), - ExecuteQueryPacket = require('./packets/ExecuteQueryPacket'), - GetSchemaPacket = require('./packets/GetSchemaPacket.js'), - CloseQueryPacket = require('./packets/CloseQueryPacket'), - BatchExecuteNoQueryPacket = require('./packets/BatchExecuteNoQueryPacket'), - CloseDatabasePacket = require('./packets/CloseDatabasePacket'), - FetchPacket = require('./packets/FetchPacket'), - SetAutoCommitModePacket = require('./packets/SetAutoCommitModePacket'), - RollbackPacket = require('./packets/RollbackPacket'), - CommitPacket = require('./packets/CommitPacket'), - LOBReadPacket = require('./packets/LOBReadPacket'), - LOBNewPacket = require('./packets/LOBNewPacket'), - LOBWritePacket = require('./packets/LOBWritePacket'), - SetDbParameterPacket = require('./packets/SetDbParameterPacket'), - GetDbParameterPacket = require('./packets/GetDbParameterPacket'), - PrepareExecuteOldProtocolPacket = require('./packets/PrepareExecuteOldProtocolPacket'); - -if (typeof Buffer.concat !== 'function') { - // `Buffer.concat` is available since node 0.8.x. - // If it's not available, define it. This source code is taken - // from node's core source. - Buffer.concat = function(list, length) { - if (!Array.isArray(list)) { - throw new TypeError('Usage: Buffer.concat(list, [length])'); - } - - if (list.length === 0) { - return new Buffer(0); - } else if (list.length === 1) { - return list[0]; - } - - if (typeof length !== 'number') { - length = 0; - for (var i = 0; i < list.length; i++) { - var buf = list[i]; - length += buf.length; - } - } - - var buffer = new Buffer(length); - var pos = 0; - for (var i = 0; i < list.length; i++) { - var buf = list[i]; - buf.copy(buffer, pos); - pos += buf.length; - } - return buffer; - }; -} - -module.exports = CUBRIDConnection; - -// Support custom events -Util.inherits(CUBRIDConnection, EventEmitter); +'use strict'; + +const Net = require('net'); +const EventEmitter = require('events').EventEmitter; +const Util = require('util'); + +const ErrorMessages = require('./constants/ErrorMessages'); +const DATA_TYPES = require('./constants/DataTypes'); +const CASConstants = require('./constants/CASConstants'); + +const Helpers = require('./utils/Helpers'); +const NoopLogger = require('./NoopLogger'); +const Query = require('./query/Query'); +const Queue = require('./query/Queue'); +const PacketReader = require('./packets/PacketReader'); +const PacketWriter = require('./packets/PacketWriter'); +const ClientInfoExchangePacket = require('./packets/ClientInfoExchangePacket'); +const OpenDatabasePacket = require('./packets/OpenDatabasePacket'); +const GetEngineVersionPacket = require('./packets/GetEngineVersionPacket'); +const ExecuteQueryPacket = require('./packets/ExecuteQueryPacket'); +const GetSchemaPacket = require('./packets/GetSchemaPacket.js'); +const CloseQueryPacket = require('./packets/CloseQueryPacket'); +const BatchExecuteNoQueryPacket = require('./packets/BatchExecuteNoQueryPacket'); +const CloseDatabasePacket = require('./packets/CloseDatabasePacket'); +const FetchPacket = require('./packets/FetchPacket'); +const RollbackPacket = require('./packets/RollbackPacket'); +const CommitPacket = require('./packets/CommitPacket'); +const LOBReadPacket = require('./packets/LOBReadPacket'); +const LOBNewPacket = require('./packets/LOBNewPacket'); +const LOBWritePacket = require('./packets/LOBWritePacket'); +const SetDbParameterPacket = require('./packets/SetDbParameterPacket'); +const GetDbParameterPacket = require('./packets/GetDbParameterPacket'); +const PrepareExecutePacket = require('./packets/PrepareExecutePacket'); /** * Create a new CUBRID connection instance - * @param brokerServer - * @param brokerPort + * @param hosts + * @param port * @param user * @param password * @param database - * @param cacheTimeout * @param connectionTimeout + * @param maxConnectionRetryCount + * @param logger * @constructor */ -function CUBRIDConnection(brokerServer, brokerPort, user, password, database, cacheTimeout, connectionTimeout) { +function CUBRIDConnection(hosts, port, user, password, database, connectionTimeout, maxConnectionRetryCount, logger) { // Using EventEmitter.call on an object will do the setup of instance methods / properties // (not inherited) of an EventEmitter. // It is similar in purpose to super(...) in Java or base(...) in C#, but it is not implicit in Javascript. // Because of this, we must manually call it ourselves: EventEmitter.call(this); - // Allow to pass connection parameters as an object. - if (typeof brokerServer === 'object') { - brokerPort = brokerServer.port; - user = brokerServer.user; - password = brokerServer.password; - database = brokerServer.database; - cacheTimeout = brokerServer.cacheTimeout; - connectionTimeout = brokerServer.connectionTimeout; - brokerServer = brokerServer.host; - } + // Allow to pass the connection parameters as an object. + if (typeof hosts === 'object' && !Array.isArray(hosts)) { + port = hosts.port; + user = hosts.user; + password = hosts.password; + database = hosts.database; + connectionTimeout = hosts.connectionTimeout; + maxConnectionRetryCount = hosts.maxConnectionRetryCount; + logger = hosts.logger; + // Allow users to specify a single host via `host` + // or multiple hosts as `hosts` array. + hosts = hosts.host || hosts.hosts; + } - // `cacheTimeout` is provided in milliseconds, but the `Cache` class requires seconds. - this._queryCache = cacheTimeout && cacheTimeout > 0 ? new Cache(cacheTimeout / 1000) : null; + if (!Array.isArray(hosts)) { + hosts = [hosts]; + } // Connection parameters - this.brokerServer = brokerServer || 'localhost'; - this.initialBrokerPort = brokerPort || 33000; this.connectionBrokerPort = -1; + this.connectionRetryCount = 0; + this.maxConnectionRetryCount = maxConnectionRetryCount || 1; + this.currentHostIndex = 0; + const defaultPort = port || 33000; + + this.hosts = hosts.map(hostPort => { + !hostPort && (hostPort = 'localhost'); + + // Allow to provide custom ports for each host. + let ix = hostPort.indexOf(':'); + let host; + let port; + + if (ix > -1) { + host = hostPort.substr(0, ix); + port = hostPort.substr(ix); + } else { + // If port is not specified with the hostname, + // use the default port. + host = hostPort; + port = defaultPort; + } + + return { + host, + port, + }; + }); + this.user = user || 'public'; this.password = password || ''; this.database = database || 'demodb'; - // Connection timeout in milliseconds. - this._CONNECTION_TIMEOUT = connectionTimeout || 0; + // Connection timeout in milliseconds. + this.connectionTimeout = connectionTimeout || 0; + this.logger = typeof logger === 'object' ? logger : new NoopLogger(); // Session public variables - this.autoCommitMode = null; // Will be initialized on connect + this.autoCommitMode = true; this.sessionId = 0; // Execution semaphore variables; prevent double-connect-attempts, overlapping-queries etc. this.connectionOpened = false; this.connectionPending = false; - // Driver events - this.EVENT_ERROR = 'error'; - this.EVENT_CONNECTED = 'connect'; - this.EVENT_ENGINE_VERSION_AVAILABLE = 'engine version'; - this.EVENT_BATCH_COMMANDS_COMPLETED = 'batch execute done'; - this.EVENT_QUERY_DATA_AVAILABLE = 'query data'; - this.EVENT_SCHEMA_DATA_AVAILABLE = 'schema data'; - this.EVENT_FETCH_DATA_AVAILABLE = 'fetch'; - this.EVENT_FETCH_NO_MORE_DATA_AVAILABLE = 'fetch done'; - this.EVENT_BEGIN_TRANSACTION = 'begin transaction'; - this.EVENT_SET_AUTOCOMMIT_MODE_COMPLETED = 'set autocommit mode'; - this.EVENT_COMMIT_COMPLETED = 'commit'; - this.EVENT_ROLLBACK_COMPLETED = 'rollback'; - this.EVENT_QUERY_CLOSED = 'close query'; - this.EVENT_CONNECTION_CLOSED = 'close'; - this.EVENT_CONNECTION_DISCONNECTED = 'disconnect'; - this.EVENT_LOB_READ_COMPLETED = 'LOB read completed'; - this.EVENT_LOB_NEW_COMPLETED = 'LOB new completed'; - this.EVENT_LOB_WRITE_COMPLETED = 'LOB write completed'; - this.EVENT_SET_DB_PARAMETER_COMPLETED = 'set db parameter completed'; - this.EVENT_GET_DB_PARAMETER_COMPLETED = 'get db parameter completed'; - // Auto-commit constants this.AUTOCOMMIT_ON = true; this.AUTOCOMMIT_OFF = !this.AUTOCOMMIT_ON; - // Database schema variables - this.SCHEMA_TABLE = CASConstants.CUBRIDSchemaType.CCI_SCH_CLASS; - this.SCHEMA_VIEW = CASConstants.CUBRIDSchemaType.CCI_SCH_VCLASS; - this.SCHEMA_ATTRIBUTE = CASConstants.CUBRIDSchemaType.CCI_SCH_ATTRIBUTE; - this.SCHEMA_CONSTRAINT = CASConstants.CUBRIDSchemaType.CCI_SCH_CONSTRAIT; - this.SCHEMA_PRIMARY_KEY = CASConstants.CUBRIDSchemaType.CCI_SCH_PRIMARY_KEY; - this.SCHEMA_IMPORTED_KEYS = CASConstants.CUBRIDSchemaType.CCI_SCH_IMPORTED_KEYS; - this.SCHEMA_EXPORTED_KEYS = CASConstants.CUBRIDSchemaType.CCI_SCH_EXPORTED_KEYS; - this.SCHEMA_CLASS_PRIVILEGE = CASConstants.CUBRIDSchemaType.CCI_SCH_CLASS_PRIVILEGE; - - // LOB types variables - this.LOB_TYPE_BLOB = CASConstants.CUBRIDDataType.CCI_U_TYPE_BLOB; - this.LOB_TYPE_CLOB = CASConstants.CUBRIDDataType.CCI_U_TYPE_CLOB; - this._CASInfo = [0, 0xFF, 0xFF, 0xFF]; - this._queriesPacketList = []; + this._queryResultSets = {}; this._INVALID_RESPONSE_LENGTH = -1; this._LOB_MAX_IO_LENGTH = 128 * 1024; - // Database engine version - this._DB_ENGINE_VER = ''; - // Enforce query execution using the old protocol. - // One would enforce the old protocol when trying to connect - // to CUBRID SHARD Broker version 8.4.3 and 9.1.0. - // On later versions of CUBRID SHARD Broker (8.4.4+, 9.2.0+) - // users can use the default newer protocol. + // One would enforce the old protocol when trying to connect + // to CUBRID SHARD Broker version 8.4.3 and 9.1.0. + // On later versions of CUBRID SHARD Broker (8.4.4+, 9.2.0+) + // users can use the default newer protocol. this._ENFORCE_OLD_QUERY_PROTOCOL = false; - this._queue = new Queue(); - - // Used for standard callbacks 'err' parameter - this._NO_ERROR = null; + // SQL queries queue. + this._queue = new Queue(); } +// Support custom events +Util.inherits(CUBRIDConnection, EventEmitter); + /** * Get broker connection port - * @param callback * @private */ -CUBRIDConnection.prototype._doGetBrokerPort = function (callback) { - var clientInfoExchangePacket = new ClientInfoExchangePacket(), - packetWriter = new PacketWriter(clientInfoExchangePacket.getBufferLength()), - self = this, - socket = this._socket = Net.createConnection(this.initialBrokerPort, this.brokerServer); +function _doGetBrokerPort() { + this.logger.debug(`_doGetBrokerPort: connectionRetryCount = ${this.connectionRetryCount}.`); - socket.setNoDelay(true); - socket.setTimeout(this._CONNECTION_TIMEOUT); + return new Promise((resolve, reject) => { + const clientInfoExchangePacket = new ClientInfoExchangePacket(); + const packetWriter = new PacketWriter(clientInfoExchangePacket.getBufferLength()); - clientInfoExchangePacket.write(packetWriter); + const hostInfo = this.hosts[this.currentHostIndex]; - this._setSocketTimeoutErrorListeners(callback); + const socket = this._socket = Net.createConnection(hostInfo.port, hostInfo.host); - socket.once('data', function (data) { - // Clear connection timeout - this.setTimeout(0); - this.removeAllListeners('timeout') - .removeAllListeners('data'); + socket.setNoDelay(true); + socket.setTimeout(this.getConnectionTimeout()); - var packetReader = new PacketReader(); - packetReader.write(data); - clientInfoExchangePacket.parse(packetReader); + clientInfoExchangePacket.write(packetWriter); - var newPort = clientInfoExchangePacket.newConnectionPort; + let callback = (err) => { + if (err) { + this.logger.debug(`_doGetBrokerPort error`, err.message); - self.connectionBrokerPort = newPort; + // If connection has failed, we need to try to connect to the next + // broker. + if (err.message.indexOf(ErrorMessages.ERROR_CONNECTION_TIMEOUT) > -1 || + err.message.indexOf('ECONNREFUSED') > -1) { + // Check if we have any more hosts left to try connecting. + if (++this.currentHostIndex < this.hosts.length) { + // Try the next host. + return resolve(_doGetBrokerPort.call(this)); + } - if (newPort != 0) { - socket.end(); - } + // We have already tried all hosts. + // Try again from the beginning `maxConnectionRetryCount` times. + if (++this.connectionRetryCount <= this.maxConnectionRetryCount) { + this.currentHostIndex = 0; - if (newPort > -1) { - callback(); - } else { + return resolve(_doGetBrokerPort.call(this)); + } + } + + return reject(err); + } + + // Reset the retry counter on successful connection. + this.connectionRetryCount = 0; + this.logger.debug(`_doGetBrokerPort: connected to ${hostInfo.host}:${hostInfo.port}.`); + + resolve(); + }; + + _setSocketTimeoutErrorListeners.call(this, callback); + + socket.once('data', (data) => { + // Clear connection timeout + socket.setTimeout(0); + socket + .removeAllListeners('timeout') + .removeAllListeners('data'); + + const packetReader = new PacketReader(); + + packetReader.write(data); + + clientInfoExchangePacket.parse(packetReader); + + const newPort = clientInfoExchangePacket.newConnectionPort; + + this.logger.debug(`_doGetBrokerPort: newPort = ${newPort}`); + + this.connectionBrokerPort = newPort; + + if (newPort !== 0) { + // If the new port is not `0`, i.e. it has changed, we need + // to close the current socket. The new socket will be open + // in `_doDatabaseLogin()`. + // If it is `0`, we will keep using this same socket. + socket.end(); + } + + if (newPort > -1) { + return callback(); + } + + // If the `newPort` value is negative, it means + // an error has occurred. callback(new Error(ErrorMessages.ERROR_NEW_BROKER_PORT)); + }); + + socket.write(packetWriter._buffer); + }); +} + +function _setSocketTimeoutErrorListeners(callback) { + const socket = this._socket; + + this.logger.debug('_setSocketTimeoutErrorListeners'); + + socket.on('timeout', () => { + // The `timeout` event listener is a one time only event. + // Refer to http://nodejs.org/api/net.html#net_socket_settimeout_timeout_callback. + + // `timeout` is emitted (without an error message), if the socket + // times out from inactivity. This is only to notify that the + // socket has been idle. That's why we must manually close the + // connection. + // We need to force disconnection using `destroy()` function + // which will ensure that no more I/O activity happens on this + // socket. In contrast, `end()` function doesn't close the + // connection immediately; the server may still send some data, + // which we don't want. + socket.destroy(); + + this.connectionOpened = false; + + callback(new Error(ErrorMessages.ERROR_CONNECTION_TIMEOUT)); + }); + + this._socketCurrentEventCallback = callback; + + socket.on('error', (err) => { + this.logger.debug('socket error', err); + // As of node 0.10.15 there is a known open bug in Node.js + // (https://github.com/joyent/node/issues/5851) + // which escalates the stream write error to the network socket, + // thus the same error is triggered twice. To handle this case, + // we need to catch only the first of the two events and ignore + // the second one. Since the same error object is escalated, we + // can set a boolean flag whether or not this error has been + // handled by node-cubrid. + if (!err.isHandledByNodeCubrid) { + err.isHandledByNodeCubrid = true; + socket.setTimeout(0); + socket.removeAllListeners('timeout') + .removeAllListeners('data'); + + // When `error` event is emitted, the socket client gets automatically + // closed. So, no need to close it manually. + this.connectionOpened = false; + + const callback = this._socketCurrentEventCallback; + this._socketCurrentEventCallback = undefined; + + if (typeof callback === 'function') { + callback(err); + } else { + throw err; + } } }); - socket.write(packetWriter._buffer); -}; + socket.on('close', () => { + this.logger.debug('socket close'); + this.connectionOpened = false; -CUBRIDConnection.prototype._setSocketTimeoutErrorListeners = function (callback) { - var self = this, - socket = this._socket; - - socket.on('timeout', function () { - // The `timeout` event listener is a one time only event. - // Refer to http://nodejs.org/api/net.html#net_socket_settimeout_timeout_callback. - - // `timeout` is emitted (without an error message), if the socket - // times out from inactivity. This is only to notify that the - // socket has been idle. That's why we must manually close the - // connection. - // We need to force disconnection using `destroy()` function - // which will ensure that no more I/O activity happens on this - // socket. In contrast, `end()` function doesn't close the - // connection immediately; the server may still send some data, - // which we don't want. - socket.destroy(); - - self.connectionOpened = false; - - callback(new Error(ErrorMessages.ERROR_CONNECTION_TIMEOUT)); - }); - - this._socketCurrentEventCallback = callback; - - socket.on('error', function (err) { - // As of node 0.10.15 there is a known open bug in Node.js - // (https://github.com/joyent/node/issues/5851) - // which escalates the stream write error to the network socket, - // thus the same error is triggered twice. To handle this case, - // we need to catch only the first of the two events and ignore - // the second one. Since the same error object is escalated, we - // can set a boolean flag whether or not this error has been - // handled by node-cubrid. - if (!err.isHandledByNodeCubrid) { - err.isHandledByNodeCubrid = true; - this.setTimeout(0); - this.removeAllListeners('timeout') - .removeAllListeners('data'); - - // When `error` event is emitted, the socket client gets automatically - // closed. So, no need to close it manually. - self.connectionOpened = false; - - if (typeof self._socketCurrentEventCallback === 'function') { - self._socketCurrentEventCallback(err); - self._socketCurrentEventCallback = null; - } else { - throw err; - } - } - }); - - socket.on('end', function () { - self.connectionOpened = false; - - // Since node-cubrid supports reconnecting to the disconnected - // server, we do not consider socket disconnection by server - // as a fatal error. However, if anybody is listening for the - // disconnect event, we are eager to notify them. - if (self.listeners(self.EVENT_CONNECTION_DISCONNECTED).length > 0) { - self.emit(self.EVENT_CONNECTION_DISCONNECTED); - } - }); -}; + // Since node-cubrid supports reconnecting to the disconnected + // server, we do not consider socket disconnection by server + // as a fatal error. However, if anybody is listening for the + // disconnect event, we are eager to notify them. + this.emit('disconnect'); + }); +} /** * Login to a database - * @param callback * @private */ -CUBRIDConnection.prototype._doDatabaseLogin = function (callback) { - var socket; +function _doDatabaseLogin() { + this.logger.debug(`_doDatabaseLogin: connectionBrokerPort = ${this.connectionBrokerPort}`); - if (this.connectionBrokerPort) { - socket = this._socket = Net.createConnection(this.connectionBrokerPort, this.brokerServer); + return new Promise((resolve, reject) => { + let socket; - socket.setNoDelay(true); - socket.setTimeout(this._CONNECTION_TIMEOUT); + let callback = (err) => { + // Clear connection timeout + socket.setTimeout(0); + socket.removeAllListeners('timeout'); - this._setSocketTimeoutErrorListeners(callback); - } else { - socket = this._socket; - } + if (err) { + return reject(err); + } - var openDatabasePacket = new OpenDatabasePacket({ - database : this.database, - user : this.user, - password : this.password, - casInfo : this._CASInfo - }), - packetWriter = new PacketWriter(openDatabasePacket.getBufferLength()); + resolve(); + }; - openDatabasePacket.write(packetWriter); + if (this.connectionBrokerPort) { + // The broker port has changed, so we need to create + // a new socket connection. + socket = this._socket = Net.createConnection(this.connectionBrokerPort, this.host); - socket.on('data', this._receiveBytes({ - parserFunction: this._parseDatabaseLoginBuffer, - dataPacket: openDatabasePacket - }, callback)); + socket.setNoDelay(true); + socket.setTimeout(this.getConnectionTimeout()); - socket.write(packetWriter._buffer); -}; + _setSocketTimeoutErrorListeners.call(this, callback); + } else { + // The broker port has not been changed. We can reuse the socket. + socket = this._socket; + } + + let openDatabasePacket = new OpenDatabasePacket({ + database: this.database, + user: this.user, + password: this.password, + logger: this.logger + }); + const packetWriter = new PacketWriter(openDatabasePacket.getBufferLength()); + + openDatabasePacket.write(packetWriter); + + socket.on('data', _receiveBytes.call(this, { + parserFunction: _parseDatabaseLoginBuffer.bind(this), + dataPacket: openDatabasePacket + }, callback)); + + socket.write(packetWriter._buffer); + }); +} /** * Get the server database engine version - * @param callback */ -CUBRIDConnection.prototype._getEngineVersion = function (callback) { - var getEngineVersionPacket = new GetEngineVersionPacket({ - casInfo : this._CASInfo - }), - packetWriter = new PacketWriter(getEngineVersionPacket.getBufferLength()), - socket = this._socket; +function _getEngineVersion() { + this.logger.debug('_getEngineVersion'); + + return new Promise((resolve, reject) => { + let getEngineVersionPacket = new GetEngineVersionPacket({ + casInfo : this._CASInfo + }); + const packetWriter = new PacketWriter(getEngineVersionPacket.getBufferLength()); + const socket = this._socket; + + getEngineVersionPacket.write(packetWriter); - getEngineVersionPacket.write(packetWriter); + let callback = (err, engineVersion) => { + if (err) { + return reject(err); + } - this._socketCurrentEventCallback = callback; + resolve(engineVersion); + }; - socket.on('data', this._receiveBytes({ - parserFunction: this._parseEngineVersionBuffer, - dataPacket: getEngineVersionPacket - }, callback)); + this._socketCurrentEventCallback = callback; - socket.write(packetWriter._buffer); -}; + socket.on('data', _receiveBytes.call(this, { + parserFunction: _parseEngineVersionBuffer.bind(this), + dataPacket: getEngineVersionPacket + }, callback)); + + socket.write(packetWriter._buffer); + }); +} /** * Connect to database * @param callback */ -CUBRIDConnection.prototype.connect = function (callback) { - var self = this, - err = this._NO_ERROR; +CUBRIDConnection.prototype.getActiveHost = function (callback) { + return this + .connect() + .then(() => { + const host = Object.freeze(this.hosts[this.currentHostIndex]); + + if (typeof callback === 'function') { + return callback(undefined, host); + } + + return Promise.resolve(host); + }) + .catch(err => { + if (typeof callback === 'function') { + return callback(err); + } - if (this.connectionOpened === true) { - err = new Error(ErrorMessages.ERROR_CONNECTION_ALREADY_OPENED); - Helpers._emitEvent(this, err, this.EVENT_ERROR); + throw err; + }); +}; +/** + * Connect to database + * @param callback + */ +CUBRIDConnection.prototype.connect = function (callback) { + this.logger.debug(`connect with timeout = ${this.connectionTimeout} ms.`); + + return new Promise((resolve, reject) => { + if (this.connectionOpened) { + if (typeof callback === 'function') { + return callback(); + } - if (typeof(callback) === 'function') { - callback(err); + return resolve(); } - return; - } + if (this.connectionPending) { + let err = new Error(ErrorMessages.ERROR_CONNECTION_ALREADY_PENDING); - if (this.connectionPending === true) { - err = new Error(ErrorMessages.ERROR_CONNECTION_ALREADY_PENDING); - Helpers._emitEvent(this, err, this.EVENT_ERROR, null); + if (typeof callback === 'function') { + return callback(err); + } - if (typeof(callback) === 'function') { - callback(err); + return reject(err); } - return; - } + this.connectionPending = true; - this.connectionPending = true; + let cb = (err) => { + // Reset query execution status + this.connectionPending = false; + this.connectionOpened = typeof err === 'undefined'; - ActionQueue.enqueue([ - this._doGetBrokerPort.bind(this), - this._doDatabaseLogin.bind(this), - this._getEngineVersion.bind(this) - ], function (err) { - // Reset query execution status - self.connectionPending = false; - self.connectionOpened = !(typeof err !== 'undefined' && err !== null); - Helpers._emitEvent(self, err, self.EVENT_ERROR, self.EVENT_CONNECTED); + if (typeof callback === 'function') { + return callback(err); + } - if (typeof(callback) === 'function') { - callback(err); + if (err) { + return reject(err); } - } - ); -}; -CUBRIDConnection.prototype._implyConnect = function(cb) { - if (this.connectionOpened) { - process.nextTick(cb); - } else { - this.connect(cb); - } + resolve(); + }; + + _doGetBrokerPort.call(this) + .then(_doDatabaseLogin.bind(this)) + .then(cb) + .catch(cb); + }); }; /** @@ -419,19 +472,23 @@ CUBRIDConnection.prototype._implyConnect = function(cb) { * @param callback */ CUBRIDConnection.prototype.getEngineVersion = function (callback) { - var self = this; - - Helpers._emitEvent(this, this._NO_ERROR, this.EVENT_ERROR, this.EVENT_ENGINE_VERSION_AVAILABLE, this._DB_ENGINE_VER); + return this + .connect() + .then(_getEngineVersion.bind(this)) + .then(version => { + if (typeof callback === 'function') { + return callback(undefined, version); + } - if (typeof(callback) === 'function') { - // Support asynchronous call for backward compatibility. - process.nextTick(function () { - callback(self._NO_ERROR, self._DB_ENGINE_VER); - }); - } + return Promise.resolve(version); + }) + .catch(err => { + if (typeof callback === 'function') { + return callback(err); + } - // Support synchronous call. - return this._DB_ENGINE_VER; + throw err; + }); }; /** @@ -440,809 +497,856 @@ CUBRIDConnection.prototype.getEngineVersion = function (callback) { * @param callback */ CUBRIDConnection.prototype.batchExecuteNoQuery = function (sqls, callback) { - var self = this, - query = new Query(null, callback); - - this._queue.push(function (done) { - self._batchExecuteNoQuery(sqls, function (err) { - query.callback(err); - done(); - }); - }); + return new Promise((resolve, reject) => { + this._queue.push(done => { + this.logger.debug('batchExecuteNoQuery', sqls); + + this.connect() + .then(() => { + return _batchExecuteNoQuery.call(this, sqls); + }) + .then(() => { + done(); + + if (typeof callback === 'function') { + return callback(); + } + + resolve(); + }) + .catch(err => { + done(); + + if (typeof callback === 'function') { + return callback(err); + } + + return reject(err); + }); + }); + }); }; -CUBRIDConnection.prototype._batchExecuteNoQuery = function (sqls, callback) { - var err = this._NO_ERROR, - self = this; +function _batchExecuteNoQuery(sqls) { + if (!Array.isArray(sqls)) { + sqls = [sqls] + } - if (Array.isArray(sqls)) { - if (!sqls.length) { - // No commands to execute - Helpers._emitEvent(this, err, this.EVENT_ERROR, this.EVENT_BATCH_COMMANDS_COMPLETED); + if (!sqls.length) { + return; + } - if (typeof(callback) === 'function') { - callback(err); + return new Promise((resolve, reject) => { + const batchExecuteNoQueryPacket = new BatchExecuteNoQueryPacket({ + autoCommit: this.autoCommitMode, + casInfo: this._CASInfo, + logger: this.logger, + protocolVersion: this.brokerInfo.protocolVersion, + sqls, + }); + const packetWriter = new PacketWriter(batchExecuteNoQueryPacket.getBufferLength()); + const socket = this._socket; + + batchExecuteNoQueryPacket.write(packetWriter); + + let callback = (err) => { + // Propagate the error. + if (err) { + return reject(err); } - return; - } - } else { - sqls = [sqls]; - } + resolve(); + }; - ActionQueue.enqueue([ - this._implyConnect.bind(this), - function (cb) { - var batchExecuteNoQueryPacket = new BatchExecuteNoQueryPacket({ - SQLs : sqls, - casInfo : self._CASInfo, - autoCommitMode : self.autoCommitMode, - dbVersion : self._DB_ENGINE_VER - }), - packetWriter = new PacketWriter(batchExecuteNoQueryPacket.getBufferLength()), - socket = self._socket; - - batchExecuteNoQueryPacket.write(packetWriter); - - self._socketCurrentEventCallback = cb; - - socket.on('data', self._receiveBytes({ - parserFunction: self._parseBatchExecuteBuffer, - dataPacket: batchExecuteNoQueryPacket - }, cb)); + this._socketCurrentEventCallback = callback; - socket.write(packetWriter._buffer); - } - ], function (err) { - Helpers._emitEvent(self, err, self.EVENT_ERROR, self.EVENT_BATCH_COMMANDS_COMPLETED); + socket.on('data', _receiveBytes.call(this, { + parserFunction: _parseBatchExecuteBuffer.bind(this), + dataPacket: batchExecuteNoQueryPacket + }, callback)); - if (typeof(callback) === 'function') { - callback(err); - } + socket.write(packetWriter._buffer); }); -}; +} -// ## client.execute(sql, callback); +// ## client.execute(sql, params, callback); // `sql` is a string which represents a WRITE query or an array of strings // for batch processing. // `callback(err)` function accepts one argument: an error object if any. -CUBRIDConnection.prototype.execute = function (sql, callback) { - if (this._ENFORCE_OLD_QUERY_PROTOCOL === true) { - return this.executeWithTypedParams(sql, null, null, callback); - } else { - return this.batchExecuteNoQuery(sql, callback); - } -}; +CUBRIDConnection.prototype.execute = function execute(sql, params, callback) { + const query = new Query(sql, params, callback); -/** - * Execute sql statement with parameters - * @param sql - * @param arrParamsValues - * @param arrDelimiters - * @param callback - * @return {*} - */ -CUBRIDConnection.prototype.executeWithParams = function (sql, arrParamsValues, arrDelimiters, callback) { - var formattedSQL = Helpers._sqlFormat(sql, arrParamsValues, arrDelimiters); - Helpers.logInfo('Formatted sql is: ' + formattedSQL); + this.logger.info('execute', query.sql); + + if (this.shouldUseOldQueryProtocol()) { + return this.executeWithTypedParams(query.sql, undefined, undefined, query.callback); + } - return this.execute(formattedSQL, callback); + return this.batchExecuteNoQuery(query.sql, query.callback); }; /** * Execute sql statement with typed parameters * @param sql - * @param arrParamsValues - * @param arrParamsDataTypes + * @param params + * @param dataTypes * @param callback * @return {*} */ -CUBRIDConnection.prototype.executeWithTypedParams = function (sql, arrParamsValues, arrParamsDataTypes, callback) { - var self = this, - query = new Query(null, callback); - - this._queue.push(function (done) { - self._executeWithTypedParams(sql, arrParamsValues, arrParamsDataTypes, function (err) { - query.callback(err); - done(); - }); - }); +CUBRIDConnection.prototype.executeWithTypedParams = function (sql, params, dataTypes, callback) { + return new Promise((resolve, reject) => { + this._queue.push(done => { + this.logger.debug('executeWithTypedParams', sql, params, dataTypes); + + this.connect() + .then(() => { + return prepareExecute.call(this, sql, params, dataTypes); + }) + .then(() => { + done(); + + if (typeof callback === 'function') { + return callback(); + } + + resolve(); + }) + .catch(err => { + done(); + + if (typeof callback === 'function') { + return callback(err); + } + + return reject(err); + }); + }); + }); }; -CUBRIDConnection.prototype._executeWithTypedParams = function (sql, arrParamsValues, arrParamsDataTypes, callback) { - var self = this; - - ActionQueue.enqueue([ - this._implyConnect.bind(this), - function (cb) { - var prepareExecuteOldProtocolPacket = new PrepareExecuteOldProtocolPacket({ - sql : sql, - casInfo : self._CASInfo, - autoCommitMode : self.autoCommitMode, - dbVersion : self._DB_ENGINE_VER, - paramValues : arrParamsValues, - paramTypes : arrParamsDataTypes - }), - packetWriter = new PacketWriter(prepareExecuteOldProtocolPacket.getPrepareBufferLength()), - socket = self._socket; - - prepareExecuteOldProtocolPacket.writePrepare(packetWriter); - - self._socketCurrentEventCallback = cb; - - socket.on('data', self._receiveBytes({ - parserFunction: self._parsePrepareBufferForOldProtocol, - dropDataPacket: true, - dataPacket: prepareExecuteOldProtocolPacket - }, cb)); +function prepareExecute(sql, paramValues, paramTypes) { + this.logger.debug('prepareExecute', sql, paramValues, paramTypes); - socket.write(packetWriter._buffer); + return new Promise((resolve, reject) => { + if (Array.isArray(sql)) { + return reject(new Error(ErrorMessages.ERROR_MULTIPLE_QUERIES)); } - ], function (err) { - Helpers._emitEvent(self, err, self.EVENT_ERROR, self.EVENT_BATCH_COMMANDS_COMPLETED); - if (typeof(callback) === 'function') { - callback(err); - } + const prepareExecutePacket = new PrepareExecutePacket({ + autoCommit: this.autoCommitMode, + casInfo: this._CASInfo, + logger: this.logger, + paramTypes, + paramValues, + protocolVersion: this.brokerInfo.protocolVersion, + sql, + }); + const packetWriter = new PacketWriter(prepareExecutePacket.getPrepareBufferLength()); + const socket = this._socket; + + prepareExecutePacket.writePrepare(packetWriter); + + let callback = (err, result, queryHandle) => { + if (err) { + return reject(err); + } + + resolve(result ? { + queryHandle, + result, + } : undefined); + }; + + this._socketCurrentEventCallback = callback; + + socket.on('data', _receiveBytes.call(this, { + parserFunction: _parsePrepareBufferForOldProtocol.bind(this), + dataPacket: prepareExecutePacket + }, callback)); + + socket.write(packetWriter._buffer); }); -}; +} -CUBRIDConnection.prototype._receiveBytes = function (options, cb) { - this._callback = cb; - this._parserOptions = options; - this._parserFunction = options.parserFunction; - this._totalBuffLength = 0; - this._buffArr = []; - this._expectedResponseLength = this._INVALID_RESPONSE_LENGTH; +function _receiveBytes(options, cb) { + this._callback = cb; + this._parserOptions = options; + this._parserFunction = options.parserFunction; + this._totalBuffLength = 0; + this._buffArr = []; + this._expectedResponseLength = this._INVALID_RESPONSE_LENGTH; - return this._receiveFirstBytes.bind(this); -}; + return _receiveFirstBytes.bind(this); +} -CUBRIDConnection.prototype._receiveFirstBytes = function (data) { - var socket = this._socket; - - // Clear timeout if any. - socket.setTimeout(0); - socket.removeAllListeners('timeout'); - - this._totalBuffLength += data.length; - this._buffArr.push(data); - - if (this._expectedResponseLength === this._INVALID_RESPONSE_LENGTH && - this._totalBuffLength >= DATA_TYPES.DATA_LENGTH_SIZEOF) { - var l = this._buffArr.length, - buff; - - socket.pause(); - socket.removeAllListeners('data'); - - if (l > 1) { - buff = Buffer.concat(this._buffArr, this._totalBuffLength); - // For later, use this already concatenated buffer. - // First empty the array: http://stackoverflow.com/a/1234337/556678. - this._buffArr.length = 0; - // Then push this buffer in. - this._buffArr.push(buff); - } else { - buff = this._buffArr[0]; - } - - this._expectedResponseLength = Helpers._getExpectedResponseLength(buff); - - if (this._totalBuffLength < this._expectedResponseLength) { - socket.on('data', this._receiveRemainingBytes.bind(this)); - socket.resume(); - } else { - socket.resume(); - this._parseBuffer(); - } - } -}; +function _receiveFirstBytes(data) { + const socket = this._socket; -CUBRIDConnection.prototype._receiveRemainingBytes = function (data) { - this._totalBuffLength += data.length; - this._buffArr.push(data); + // Clear timeout if any. + socket.setTimeout(0); + socket.removeAllListeners('timeout'); - // If we have received all the expected data, start parsing it. - if (this._totalBuffLength === this._expectedResponseLength) { - this._parseBuffer(); - } -}; + this._totalBuffLength += data.length; + this._buffArr.push(data); -CUBRIDConnection.prototype._parseBuffer = function () { - this._socket.removeAllListeners('data'); + if (this._expectedResponseLength === this._INVALID_RESPONSE_LENGTH && + this._totalBuffLength >= DATA_TYPES.DATA_LENGTH_SIZEOF) { + let l = this._buffArr.length, + buff; - var packetReader = new PacketReader(); - packetReader.write(Buffer.concat(this._buffArr, this._totalBuffLength)); + socket.pause(); + socket.removeAllListeners('data'); - this._parserFunction(packetReader); -}; + if (l > 1) { + buff = Buffer.concat(this._buffArr, this._totalBuffLength); + // For later, use this already concatenated buffer. + // First empty the array: http://stackoverflow.com/a/1234337/556678. + this._buffArr.length = 0; + // Then push this buffer in. + this._buffArr.push(buff); + } else { + buff = this._buffArr[0]; + } -CUBRIDConnection.prototype._parseBufferForNewProtocol = function (packetReader) { - var dataPacket = this._parserOptions.dataPacket, - result = dataPacket.parse(packetReader).resultSet, - errorCode = dataPacket.errorCode, - err; + this._expectedResponseLength = Helpers._getExpectedResponseLength(buff); - if (errorCode !== 0) { - err = new Error(errorCode + ':' + dataPacket.errorMsg); - } else { - this._queriesPacketList.push(dataPacket); + if (this._totalBuffLength < this._expectedResponseLength) { + socket.on('data', _receiveRemainingBytes.bind(this)); + socket.resume(); + } else { + socket.resume(); + _parseBuffer.call(this); + } + } +} - if (this._queryCache !== null) { - this._queryCache.getSet(this._parserOptions.sql, result); - } - } +function _receiveRemainingBytes(data) { + this._totalBuffLength += data.length; + this._buffArr.push(data); - this._callback(err, result, dataPacket.queryHandle); -}; + // If we have received all the expected data, start parsing it. + if (this._totalBuffLength === this._expectedResponseLength) { + _parseBuffer.call(this); + } +} -CUBRIDConnection.prototype._parsePrepareBufferForOldProtocol = function (packetReader) { - var dataPacket = this._parserOptions.dataPacket; +function _parseBuffer() { + this._socket.removeAllListeners('data'); - dataPacket.parsePrepare(packetReader); + let packetReader = new PacketReader(); + packetReader.write(Buffer.concat(this._buffArr, this._totalBuffLength)); - var errorCode = dataPacket.errorCode; + this._parserFunction(packetReader); +} - if (errorCode !== 0) { - cb(new Error(errorCode + ':' + dataPacket.errorMsg), dataPacket); - } else { - this._parseExecuteForOldProtocol(); - } -}; +function _parseBufferForNewProtocol(packetReader) { + const dataPacket = this._parserOptions.dataPacket; + const error = dataPacket.parse(packetReader); -CUBRIDConnection.prototype._parseExecuteForOldProtocol = function () { - var dataPacket = this._parserOptions.dataPacket, - packetWriter = new PacketWriter(dataPacket.getExecuteBufferLength()), - socket = this._socket; + if (error) { + return this._callback(error); + } - dataPacket.writeExecute(packetWriter); + const queryHandle = dataPacket.queryHandle; - this._socketCurrentEventCallback = this._callback; + this._queryResultSets[queryHandle] = dataPacket; - socket.on('data', this._receiveBytes({ - parserFunction: this._parseExecuteBufferForOldProtocol, - dropDataPacket: this._parserOptions.dropDataPacket, - dataPacket: dataPacket - }, this._callback)); + this._callback(undefined, dataPacket.resultSet, queryHandle); +} - socket.write(packetWriter._buffer); -}; +function _parsePrepareBufferForOldProtocol(packetReader) { + const dataPacket = this._parserOptions.dataPacket; -CUBRIDConnection.prototype._parseExecuteBufferForOldProtocol = function (packetReader) { - var dataPacket = this._parserOptions.dataPacket, - result = dataPacket.parseExecute(packetReader).resultSet, - errorCode = dataPacket.errorCode; + const error = dataPacket.parsePrepare(packetReader); - if (errorCode !== 0) { - this._callback(new Error(errorCode + ':' + dataPacket.errorMsg)); - } else { - if (!this._parserOptions.dropDataPacket) { - this._queriesPacketList.push(dataPacket); - } + if (error) { + return this._callback(error); + } - this._callback(null, result, dataPacket.queryHandle); - } -}; + _parseExecuteForOldProtocol.call(this); +} -CUBRIDConnection.prototype._parseFetchBuffer = function (packetReader) { - var dataPacket = this._parserOptions.dataPacket, - result = dataPacket.parse(packetReader, this._queriesPacketList[this._parserOptions.i]).resultSet, - errorCode = dataPacket.errorCode, - err; +function _parseExecuteForOldProtocol() { + const dataPacket = this._parserOptions.dataPacket; + const packetWriter = new PacketWriter(dataPacket.getExecuteBufferLength()); + const socket = this._socket; - if (errorCode !== 0) { - err = new Error(errorCode + ':' + dataPacket.errorMsg); - } + dataPacket.writeExecute(packetWriter); - this._callback(err, result); -}; + this._socketCurrentEventCallback = this._callback; -CUBRIDConnection.prototype._parseBatchExecuteBuffer = function (packetReader) { - var dataPacket = this._parserOptions.dataPacket; + socket.on('data', _receiveBytes.call(this, { + parserFunction: _parseExecuteBufferForOldProtocol.bind(this), + dropDataPacket: this._parserOptions.dropDataPacket, + dataPacket: dataPacket + }, this._callback)); - dataPacket.parse(packetReader); + socket.write(packetWriter._buffer); +} - var errorCode = dataPacket.errorCode, - err; +function _parseExecuteBufferForOldProtocol(packetReader) { + const dataPacket = this._parserOptions.dataPacket; + const error = dataPacket.parseExecute(packetReader); - // If there is a gloal error, get the error message - // from dataPacket.errorMsg. - if (errorCode !== 0 && dataPacket.errorMsg) { - err = new Error(errorCode + ':' + dataPacket.errorMsg); - } else { - // Otherwise, check the individual responses of each query in the batch - // and see if there is an error. - err = []; + if (error) { + return this._callback(error); + } - for (var i = 0; i < dataPacket.arrResultsCode.length; ++i) { - if (dataPacket.arrResultsCode[i] < 0) { - err.push(new Error(dataPacket.arrResultsCode[i] + ':' + dataPacket.arrResultsMsg[i])); - } - } + const queryHandle = dataPacket.queryHandle; - if (!err.length) { - err = null; - } - } + if (dataPacket.resultSet) { + this._queryResultSets[queryHandle] = dataPacket; + } - this._callback(err); -}; + this._callback(undefined, dataPacket.resultSet, queryHandle); +} -CUBRIDConnection.prototype._parseDatabaseLoginBuffer = function (packetReader) { - var dataPacket = this._parserOptions.dataPacket; +function _parseFetchBuffer(packetReader) { + const dataPacket = this._parserOptions.dataPacket; + const error = dataPacket.parse(packetReader, this._queryResultSets[this._parserOptions.queryHandle]); - dataPacket.parse(packetReader); - this._CASInfo = dataPacket.casInfo; + this._callback(error, dataPacket.resultSet); +} - var errorCode = dataPacket.errorCode, - err; +function _parseBatchExecuteBuffer(packetReader) { + const dataPacket = this._parserOptions.dataPacket; + // CAS error. + let error = dataPacket.parse(packetReader); - if (errorCode !== 0) { - err = new Error(errorCode + ':' + dataPacket.errorMsg); - } else { - this.sessionId = dataPacket.sessionId; - this.autoCommitMode = this.AUTOCOMMIT_ON; - } + if (!error) { + // Individual SQL errors. + if (dataPacket.errors.length) { + error = dataPacket.errors; + } + } - this._callback(err); -}; + this._callback(error); +} -CUBRIDConnection.prototype._parseEngineVersionBuffer = function (packetReader) { - var dataPacket = this._parserOptions.dataPacket; +function _parseDatabaseLoginBuffer(packetReader) { + const dataPacket = this._parserOptions.dataPacket; + const error = dataPacket.parse(packetReader); - dataPacket.parse(packetReader); + if (!error) { + this._CASInfo = dataPacket.casInfo; + this.sessionId = dataPacket.sessionId; + this.brokerInfo = dataPacket.brokerInfo; + this.autoCommitMode = this.AUTOCOMMIT_ON; + } - var errorCode = dataPacket.errorCode, - err; + this._callback(error); +} - if (errorCode !== 0) { - err = new Error(errorCode + ':' + dataPacket.errorMsg); - } else { - this._DB_ENGINE_VER = dataPacket.engineVersion; - } +function _parseEngineVersionBuffer(packetReader) { + const dataPacket = this._parserOptions.dataPacket; + const error = dataPacket.parse(packetReader); - this._callback(err); -}; + this._callback(error, dataPacket.engineVersion); +} -CUBRIDConnection.prototype._parseCloseQueryBuffer = function (packetReader) { - var dataPacket = this._parserOptions.dataPacket; +function _parseCloseQueryBuffer(packetReader) { + const dataPacket = this._parserOptions.dataPacket; + const error = dataPacket.parse(packetReader); - dataPacket.parse(packetReader); + this._callback(error); +} - var errorCode = dataPacket.errorCode, - err; +function _parseCloseBuffer(packetReader) { + const dataPacket = this._parserOptions.dataPacket; + const error = dataPacket.parse(packetReader); - if (errorCode !== 0) { - err = new Error(errorCode + ':' + dataPacket.errorMsg); - } + // Close internal socket connection. + this._socket.destroy(); - this._callback(err); -}; + this._callback(error); +} -CUBRIDConnection.prototype._parseCloseBuffer = function (packetReader) { - var dataPacket = this._parserOptions.dataPacket; +function _parseResponseCodeBuffer(packetReader) { + const dataPacket = this._parserOptions.dataPacket; + const error = dataPacket.parse(packetReader); - dataPacket.parse(packetReader); - // Close internal socket connection. - this._socket.destroy(); + this._callback(error); +} - var errorCode = dataPacket.errorCode, - err; +function _parseGetSchemaBuffer(packetReader) { + const dataPacket = this._parserOptions.dataPacket; + const error = dataPacket.parseRequestSchema(packetReader); - if (errorCode !== 0) { - err = new Error(errorCode + ':' + dataPacket.errorMsg); - } + if (error) { + return this._callback(error); + } + + _parseWriteFetchSchema.call(this); +} - this._callback(err); -}; +function _parseWriteFetchSchema() { + let dataPacket = this._parserOptions.dataPacket, + packetWriter = new PacketWriter(dataPacket.getFetchSchemaBufferLength()), + socket = this._socket; -CUBRIDConnection.prototype._parseCommitBuffer = - CUBRIDConnection.prototype._parseRollbackBuffer = - CUBRIDConnection.prototype._parseSetDatabaseParameterBuffer = + dataPacket.writeFetchSchema(packetWriter); -CUBRIDConnection.prototype._parseGetDatabaseParameterBuffer = function (packetReader) { - var dataPacket = this._parserOptions.dataPacket; + this._socketCurrentEventCallback = this._callback; - dataPacket.parse(packetReader); + socket.on('data', _receiveBytes.call(this, { + parserFunction: _parseFetchSchemaBuffer.bind(this), + dataPacket: dataPacket + }, this._callback)); - var errorCode = dataPacket.errorCode, - err; + socket.write(packetWriter._buffer); +} - if (errorCode !== 0) { - err = new Error(errorCode + ':' + dataPacket.errorMsg); - } +function _parseFetchSchemaBuffer(packetReader) { + const dataPacket = this._parserOptions.dataPacket; + const error = dataPacket.parseFetchSchema(packetReader); - this._callback(err); -}; + this._callback(error, dataPacket.schemaInfo); +} -CUBRIDConnection.prototype._parseGetSchemaBuffer = function (packetReader) { - var dataPacket = this._parserOptions.dataPacket; +function _parseLobNewBuffer(packetReader) { + const dataPacket = this._parserOptions.dataPacket; + const error = dataPacket.parse(packetReader); - dataPacket.parseRequestSchema(packetReader); + this._callback(error, dataPacket.result); +} - var errorCode = dataPacket.errorCode; +CUBRIDConnection.prototype.queryAll = function (sql, params, callback) { + const query = new Query(sql, params, callback); + + return this + .query(query.sql) + .then(response => { + const result = response.result; + + return this + .fetch(response.queryHandle, /* fetch all */true) + .then(res => { + const extraValues = res.result && res.result.ColumnValues || undefined; + + if (extraValues) { + const len = extraValues.length; + let values = result.ColumnValues; + + for (let i = 0; i < len; ++i) { + values.push(extraValues[i]); + } + } + + // Auto close the query statement because we have already + // retrieved all the values. + return this.closeQuery(res.queryHandle); + }) + .then(() => { + if (typeof query.callback === 'function') { + // Return only the result without the query handle. + return query.callback(undefined, result); + } + + return Promise.resolve(result); + }); + }) + .catch(err => { + if (typeof query.callback === 'function') { + return query.callback(err); + } - if (errorCode !== 0) { - this._callback(new Error(errorCode + ':' + dataPacket.errorMsg), dataPacket); - } else { - this._parseWriteFetchSchema(); - } + throw err; + }); }; -CUBRIDConnection.prototype._parseWriteFetchSchema = function () { - var dataPacket = this._parserOptions.dataPacket, - packetWriter = new PacketWriter(dataPacket.getFetchSchemaBufferLength()), - socket = this._socket; +CUBRIDConnection.prototype.queryAllAsObjects = function (sql, params, callback) { + const query = new Query(sql, params, callback); - dataPacket.writeFetchSchema(packetWriter); + return this + .queryAll(query.sql) + .then(result => { + result = getObjects(result); - this._socketCurrentEventCallback = this._callback; + if (typeof query.callback === 'function') { + // Return only the result without the query handle. + return query.callback(undefined, result); + } - socket.on('data', this._receiveBytes({ - parserFunction: this._parseFetchSchemaBuffer, - dataPacket: dataPacket - }, this._callback)); + return Promise.resolve(result); + }) + .catch(err => { + if (typeof query.callback === 'function') { + return query.callback(err); + } - socket.write(packetWriter._buffer); + throw err; + }); }; -CUBRIDConnection.prototype._parseFetchSchemaBuffer = function (packetReader) { - var dataPacket = this._parserOptions.dataPacket, - result = dataPacket.parseFetchSchema(packetReader).schemaInfo, - errorCode = dataPacket.errorCode, - err; +function getObjects(result) { + const columnNames = result.ColumnNames; + const columnValues = result.ColumnValues; + const rowsCount = result.ColumnValues.length; + const colCount = columnNames.length; - if (errorCode !== 0) { - err = new Error(errorCode + ':' + dataPacket.errorMsg); - } + let arr = new Array(rowsCount); - this._callback(err, result); -}; + for (let i = 0; i < rowsCount; ++i) { + let row = arr[i] = {}; + + let columns = columnValues[i]; + + for (let j = 0; j < colCount; ++j) { + row[columnNames[j]] = columns[j]; + } + } + + return arr; +} -CUBRIDConnection.prototype._parseLobNewBuffer = function (packetReader) { - var dataPacket = this._parserOptions.dataPacket, - logObject = dataPacket.parse(packetReader).result, - errorCode = dataPacket.errorCode, - err; +CUBRIDConnection.prototype.queryAsObjects = function (sql, params, callback) { + const query = new Query(sql, params, callback); - if (errorCode !== 0) { - err = new Error(errorCode + ':' + dataPacket.errorMsg); - } + return this + .query(query.sql) + .then(response => { + let result = getObjects(response.result); - this._callback(err, logObject); + if (typeof query.callback === 'function') { + // Return only the result without the query handle. + return query.callback(undefined, result, response.queryHandle); + } + + return Promise.resolve({ + queryHandle: response.queryHandle, + result, + }); + }) + .catch(err => { + if (typeof query.callback === 'function') { + return query.callback(err); + } + + throw err; + }); }; CUBRIDConnection.prototype.query = function (sql, params, callback) { - var self = this, - query = new Query(sql, params, callback); - - this._queue.push(function (done) { - self._query(query.sql, function (err, result, queryHandle) { - query.callback(err, result, queryHandle); - done(); - }); - }); + return new Promise((resolve, reject) => { + this._queue.push(done => { + const query = new Query(sql, params, callback); + + this.logger.info('query', query.sql); + + this.connect() + .then(() => { + if (this.shouldUseOldQueryProtocol()) { + return prepareExecute.call(this, query.sql); + } + + return _queryNewProtocol.call(this, query.sql); + }) + .then(response => { + done(); + + if (typeof query.callback === 'function') { + return query.callback(undefined, response.result, response.queryHandle); + } + + resolve(response); + }) + .catch(err => { + done(); + + if (typeof query.callback === 'function') { + return query.callback(err); + } + + return reject(err); + }); + }); + }); }; +function _queryNewProtocol(sql) { + this.logger.debug('_queryNewProtocol'); + + return new Promise((resolve, reject) => { + const executeQueryPacket = new ExecuteQueryPacket({ + autoCommit: this.autoCommitMode, + casInfo: this._CASInfo, + logger: this.logger, + protocolVersion: this.brokerInfo.protocolVersion, + sql, + }); + const packetWriter = new PacketWriter(executeQueryPacket.getBufferLength()); + const socket = this._socket; + + executeQueryPacket.write(packetWriter); + + let callback = (err, result, queryHandle) => { + if (err) { + return reject(err); + } + + resolve({ + queryHandle, + result, + }); + }; + + this._socketCurrentEventCallback = callback; + + // `_receiveBytes()` will return a function which will process the + // incoming data. + socket.on('data', _receiveBytes.call(this, { + sql: sql, + parserFunction: _parseBufferForNewProtocol.bind(this), + dataPacket: executeQueryPacket + }, callback)); + + socket.write(packetWriter._buffer); + }); +} + /** - * Execute query and retrieve rows results - * @param sql + * Fetch query next rows results + * @param queryHandle * @param callback */ -CUBRIDConnection.prototype._query = function (sql, callback) { - if (this._ENFORCE_OLD_QUERY_PROTOCOL) { - return this._queryOldProtocol(sql, null, null, callback); - } else { - return this._queryNewProtocol(sql, callback); - } -}; +CUBRIDConnection.prototype.fetch = function (queryHandle, all, callback) { + return new Promise((resolve, reject) => { + this._queue.unshift(done => { + if (typeof all === 'function') { + callback = all; + all = false; + } -CUBRIDConnection.prototype._queryNewProtocol = function (sql, callback) { - var self = this; - - ActionQueue.enqueue([ - function (cb) { - self._implyConnect(cb); - }, - function (cb) { - // Check if data is already in cache - if (self._queryCache !== null && self._queryCache.contains(sql)) { - cb(null, self._queryCache.get(sql)); - } else { - var executeQueryPacket = new ExecuteQueryPacket({ - sql : sql, - casInfo : self._CASInfo, - autoCommitMode : self.autoCommitMode, - dbVersion : self._DB_ENGINE_VER - }), - packetWriter = new PacketWriter(executeQueryPacket.getBufferLength()), - socket = self._socket; - - executeQueryPacket.write(packetWriter); - - self._socketCurrentEventCallback = cb; - - // `_receiveBytes()` will return a function which will process the - // incoming data. - socket.on('data', self._receiveBytes({ - sql: sql, - parserFunction: self._parseBufferForNewProtocol, - dataPacket: executeQueryPacket - }, cb)); - - socket.write(packetWriter._buffer); - } - } - ], function (err, result, handle) { - Helpers._emitEvent(self, err, self.EVENT_ERROR, self.EVENT_QUERY_DATA_AVAILABLE, result, handle, sql); + const query = new Query(callback); - if (typeof(callback) === 'function') { - callback(err, result, handle); - } + this.logger.info(`fetch: queryHandle = ${queryHandle}`); + + this.connect() + .then(() => { + return _fetch.call(this, queryHandle, all); + }) + .then(response => { + done(); + + if (typeof query.callback === 'function') { + return query.callback(undefined, response.result, response.queryHandle); + } + + resolve(response); + }) + .catch(err => { + done(); + + if (typeof query.callback === 'function') { + return query.callback(err); + } + + return reject(err); + }); + }); }); }; -/** - * Execute query and retrieve rows results, using the older 8.4.x query protocol - * @param sql - * @param arrParamsValues - * @param arrParamsDataTypes - * @param callback - */ -CUBRIDConnection.prototype._queryOldProtocol = function (sql, arrParamsValues, arrParamsDataTypes, callback) { - var self = this; - - ActionQueue.enqueue([ - function (cb) { - self._implyConnect(cb); - }, - function (cb) { - var prepareExecuteOldProtocolPacket = new PrepareExecuteOldProtocolPacket({ - sql : sql, - casInfo : self._CASInfo, - autoCommitMode : self.autoCommitMode, - dbVersion : self._DB_ENGINE_VER, - paramValues : arrParamsValues, - paramTypes : arrParamsDataTypes - }), - packetWriter = new PacketWriter(prepareExecuteOldProtocolPacket.getPrepareBufferLength()), - socket = self._socket; - - prepareExecuteOldProtocolPacket.writePrepare(packetWriter); - - self._socketCurrentEventCallback = cb; - - socket.on('data', self._receiveBytes({ - parserFunction: self._parsePrepareBufferForOldProtocol, - dataPacket: prepareExecuteOldProtocolPacket - }, cb)); +function _fetch(queryHandle, all) { + return new Promise((resolve, reject) => { + const packet = this._queryResultSets[queryHandle]; + let results = null; + + if (!packet) { + return reject(new Error(ErrorMessages.ERROR_NO_ACTIVE_QUERY)); + } + + let fetchSome = (err, result) => { + if (err) { + return reject(err); + } + + if (result) { + // If we could fetch some data, add them to the existing list. + if (results) { + let values = results.ColumnValues; + const extraValues = result.ColumnValues; + + for (let i = 0, len = extraValues.length; i < len; ++i) { + values.push(extraValues[i]); + } + } else { + results = result; + } + } + + // If there is no more data left to fetch, return what we could retrieve. + // Or we have received the first batch of results and the user + // has not requested to retrieve all values, then return what + // we have. + if (packet.currentTupleCount === packet.totalTupleCount || results && !all) { + return resolve({ + queryHandle, + result: results, + }); + } + + const fetchPacket = new FetchPacket({ + casInfo: this._CASInfo, + logger: this.logger, + }); + const packetWriter = new PacketWriter(fetchPacket.getBufferLength()); + const socket = this._socket; - socket.write(packetWriter._buffer); - } - ], function (err, result, handle) { - Helpers._emitEvent(self, err, self.EVENT_ERROR, self.EVENT_QUERY_DATA_AVAILABLE, result, handle, sql); + fetchPacket.write(packetWriter, packet); - if (typeof(callback) === 'function') { - callback(err, result, handle); - } - }); -}; + socket.on('data', _receiveBytes.call(this, { + queryHandle, + parserFunction: _parseFetchBuffer.bind(this), + dataPacket: fetchPacket + }, fetchSome)); -/** - * Execute query with parameters - * @param sql - * @param arrParamsValues - * @param arrDelimiters - * @param callback - * @return {*} - */ -CUBRIDConnection.prototype.queryWithParams = function (sql, arrParamsValues, arrDelimiters, callback) { - var formattedSQL = Helpers._sqlFormat(sql, arrParamsValues, arrDelimiters); - Helpers.logInfo('Formatted sql is: ' + formattedSQL); + socket.write(packetWriter._buffer); + }; - return this.query(formattedSQL, callback); -}; + this._socketCurrentEventCallback = fetchSome; -/** - * Execute query with typed parameters - * @param sql - * @param arrParamsValues - * @param arrParamsDataTypes - * @param callback - * @return {*} - */ -CUBRIDConnection.prototype.queryWithTypedParams = function (sql, arrParamsValues, arrParamsDataTypes, callback) { - return this._queryOldProtocol(sql, arrParamsValues, arrParamsDataTypes, callback); -}; + fetchSome(undefined, null); + }); +} /** - * Fetch query next rows results + * Close query. It is important to close every query because CUBRID Broker + * (CAS actually that was assigned to this connection by the Broker) will + * keep the memory occupied by the query. The query statement resources + * will get closed automatically only on disconnection. Until then the + * query resources will be kept in memory. If not released on time, OOM + * (Out Of Memory) issue can be caused on the server side. * @param queryHandle * @param callback */ -CUBRIDConnection.prototype.fetch = function (queryHandle, callback) { - var self = this, - query = new Query(null, callback); - - this._queue.unshift(function (done) { - self._fetch(queryHandle, function (err, result, queryHandle) { - query.callback(err, result, queryHandle); - done(); - }); - }); +CUBRIDConnection.prototype.closeQuery = function (queryHandle, callback) { + return new Promise((resolve, reject) => { + this._queue.unshift(done => { + this.logger.debug('closeQuery', queryHandle); + + this.connect() + .then(() => { + return _closeQuery.call(this, queryHandle); + }) + .then(() => { + done(); + + if (typeof callback === 'function') { + return callback(); + } + + resolve(); + }) + .catch(err => { + done(); + + if (typeof callback === 'function') { + return callback(err); + } + + return reject(err); + }); + }); + }); }; -CUBRIDConnection.prototype._fetch = function (queryHandle, callback) { - var self = this, - err = this._NO_ERROR, - foundQueryHandle = false; +function _closeQuery(queryHandle) { + return new Promise((resolve, reject) => { + let queryResultSets = this._queryResultSets; - for (var i = 0; i < this._queriesPacketList.length; i++) { - if (this._queriesPacketList[i].queryHandle === queryHandle) { - foundQueryHandle = true; - break; + if (!queryResultSets[queryHandle]) { + return reject(new Error(`${ErrorMessages.ERROR_NO_ACTIVE_QUERY}: ${queryHandle}`)); } - } - if (!foundQueryHandle) { - err = new Error(ErrorMessages.ERROR_NO_ACTIVE_QUERY); + let closeQueryPacket = new CloseQueryPacket({ + casInfo: this._CASInfo, + reqHandle: queryHandle, + }); + const packetWriter = new PacketWriter(closeQueryPacket.getBufferLength()); + const socket = this._socket; - Helpers._emitEvent(this, err, this.EVENT_ERROR, null); + closeQueryPacket.write(packetWriter); - if (typeof(callback) === 'function') { - callback(err, null, null); - } - } else { - if (this._queriesPacketList[i].currentTupleCount === this._queriesPacketList[i].totalTupleCount) { - Helpers._emitEvent(this, err, this.EVENT_ERROR, this.EVENT_FETCH_NO_MORE_DATA_AVAILABLE, queryHandle); + function onResponse(err) { + // Remove the event we've previously bound to. + socket.removeListener('end', onConnectionReset); - if (typeof(callback) === 'function') { - callback(err, null, queryHandle); + if (err) { + return reject(err); } - } else { - var fetchPacket = new FetchPacket({ - casInfo : this._CASInfo, - db_version : this._DB_ENGINE_VER - }), - packetWriter = new PacketWriter(fetchPacket.getBufferLength()), - socket = this._socket; - - fetchPacket.write(packetWriter, this._queriesPacketList[i]); - - this._socketCurrentEventCallback = callback; - - socket.on('data', this._receiveBytes({ - i: i, - parserFunction: this._parseFetchBuffer, - dataPacket: fetchPacket - }, function (err, result) { - Helpers._emitEvent(self, err, self.EVENT_ERROR, self.EVENT_FETCH_DATA_AVAILABLE, result, queryHandle); - - if (typeof(callback) === 'function') { - callback(err, result, queryHandle); - } - })); - - socket.write(packetWriter._buffer); + + // Remove the referenced query packet from the hash. + delete queryResultSets[queryHandle]; + + resolve(); } - } -}; -/** - * Close query - * @param queryHandle - * @param callback - */ -CUBRIDConnection.prototype.closeQuery = function (queryHandle, callback) { - var self = this, - query = new Query(queryHandle, callback); - - this._queue.unshift(function (done) { - self._closeQuery(queryHandle, function (err) { - query.callback(err, queryHandle); - done(); - }); - }); -}; + function onConnectionReset() { + // CUBRID Broker may occasionally reset the connection between the client and the + // CAS that the Broker has assigned to this client. Refer to + // https://github.com/CUBRID/node-cubrid/issues/15 for details. According to + // CUBRID CCI native driver implementation function qe_send_close_handle_msg(), + // we can consider the connection closed operation as a successful request. + // This is true because internally CUBRID Broker manages a pool of CAS + // (CUBRID Application Server) processes. When a client connects, the Broker + // assigns/connect it to one of the CAS. Then the client sends some query requests + // to this CAS. After the client receives a response, it may decide to do some + // other application logic before it closes the query handle. Once the client is + // done with the response, it may try to close the query handle. + // In between these receive response and close query, CUBRID Broker may reassign + // the CAS to another client. Notice the client-Broker connection is not broken. + // When the actual close query request arrives to the Broker, it finds out that + // the CAS referred by the client is reassigned, it sends CONNECTION RESET to the + // client. node-cubrid should listen it and consider such event as if the close + // query request was successful. + socket.removeAllListeners('data'); + // Execute `onResponse` without an error. + onResponse(); + } -CUBRIDConnection.prototype._closeQuery = function (queryHandle, callback) { - var self = this, - err = this._NO_ERROR, - foundQueryHandle = false; + function onError(err) { + socket.removeAllListeners('data'); - for (var i = 0; i < this._queriesPacketList.length; ++i) { - if (this._queriesPacketList[i].queryHandle === queryHandle) { - foundQueryHandle = i; - break; + // `ECONNRESET` should also be considered as a connection + // reset. + onResponse(err.code == 'ECONNRESET' ? undefined : err); } - } - if (foundQueryHandle === false) { - err = new Error(ErrorMessages.ERROR_NO_ACTIVE_QUERY + ": " + queryHandle); + this._socketCurrentEventCallback = onError; + + socket.on('data', _receiveBytes.call(this, { + queryHandle: queryHandle, + parserFunction: _parseCloseQueryBuffer.bind(this), + dataPacket: closeQueryPacket + }, onResponse)); + + socket.on('end', onConnectionReset); + + socket.write(packetWriter._buffer); + }); +} + +CUBRIDConnection.prototype.getMetaData = function (queryHandle, callback) { + return new Promise((resolve, reject) => { + const queryResultSet = this._queryResultSets[queryHandle]; - if (typeof(callback) === 'function') { - callback(err); + if (!queryResultSet) { + let err = new Error(ErrorMessages.ERROR_NO_ACTIVE_QUERY); + + if (typeof callback === 'function') { + return callback(err); + } + + return reject(err); } - Helpers._emitEvent(this, err, this.EVENT_ERROR, null); - } else { - ActionQueue.enqueue([ - this._implyConnect.bind(this), - function (cb) { - var closeQueryPacket = new CloseQueryPacket({ - casInfo : self._CASInfo, - reqHandle : queryHandle, - db_version : self._DB_ENGINE_VER - }), - packetWriter = new PacketWriter(closeQueryPacket.getBufferLength()), - socket = self._socket; - - closeQueryPacket.write(packetWriter); - - function onResponse(err) { - // Remove the event we've previously bound to. - socket.removeListener('end', onConnectionReset); - - if (!err) { - // Remove the referenced query packet from the hash. - self._queriesPacketList.splice(foundQueryHandle, 1); - } - - cb(err); - } - - function onConnectionReset() { - // CUBRID Broker may occasionally reset the connection between the client and the - // CAS that the Broker has assigned to this client. Refer to - // https://github.com/CUBRID/node-cubrid/issues/15 for details. According to - // CUBRID CCI native driver implementation function qe_send_close_handle_msg(), - // we can consider the connection closed operation as a successful request. - // This is true because internally CUBRID Broker manages a pool of CAS - // (CUBRID Application Server) processes. When a client connects, the Broker - // assigns/connect it to one of the CAS. Then the client sends some query requests - // to this CAS. After the client receives a response, it may decide to do some - // other application logic before it closes the query handle. Once the client is - // done with the response, it may try to close the query handle. - // In between these receive response and close query, CUBRID Broker may reassign - // the CAS to another client. Notice the client-Broker connection is not broken. - // When the actual close query request arrives to the Broker, it finds out that - // the CAS referred by the client is reassigned, it sends CONNECTION RESET to the - // client. node-cubrid should listen it and consider such event as if the close - // query request was successful. - socket.removeAllListeners('data'); - // Execute `onResponse` without an error. - onResponse(); - } - - function onError(err) { - socket.removeAllListeners('data'); - - // `ECONNRESET` should also be considered as a connection - // reset. - onResponse(err.code == 'ECONNRESET' ? null : err); - } - - self._socketCurrentEventCallback = onError; - - socket.on('data', self._receiveBytes({ - queryHandle: queryHandle, - parserFunction: self._parseCloseQueryBuffer, - dataPacket: closeQueryPacket - }, onResponse)); - - socket.on('end', onConnectionReset); - - socket.write(packetWriter._buffer); - } - ], function (err) { - if (typeof(callback) === 'function') { - callback(err, queryHandle); - } - - Helpers._emitEvent(self, err, self.EVENT_ERROR, self.EVENT_QUERY_CLOSED, queryHandle); - }); - } + if (typeof callback === 'function') { + return callback(undefined, queryResultSet.resultSet); + } + + resolve(queryResultSet.resultSet); + }); }; /** @@ -1254,91 +1358,103 @@ CUBRIDConnection.prototype.close = close; CUBRIDConnection.prototype.end = close; function close(callback) { - var self = this; - - if (!this.connectionOpened) { - // If the connection has already been closed, no need to emit - // the error. After all this is what the client wants - to - // close the connection. - if (typeof(callback) === 'function') { - callback(); - } - - return; - } - - // Remove all pending requests. - this._queue.empty(); - - ActionQueue.enqueue([ - function (cb) { - ActionQueue.while( - function () { - return (self._queriesPacketList[0] !== null && self._queriesPacketList[0] !== undefined); - }, - function (cb) { - self.closeQuery(self._queriesPacketList[0].queryHandle, cb); - }, - function (err) { - // Log non-blocking error - if (typeof err !== 'undefined' && err !== null) { - Helpers.logError(ErrorMessages.ERROR_ON_CLOSE_QUERY_HANDLE + err); - } - - cb(); - } - ); - }, - function (cb) { - var closeDatabasePacket = new CloseDatabasePacket({ - casInfo : self._CASInfo, - db_version : self._DB_ENGINE_VER - }), - packetWriter = new PacketWriter(closeDatabasePacket.getBufferLength()), - socket = self._socket; - - closeDatabasePacket.write(packetWriter); - - self._socketCurrentEventCallback = cb; - - socket.on('data', self._receiveBytes({ - parserFunction: self._parseCloseBuffer, - dataPacket: closeDatabasePacket - }, cb)); - - socket.write(packetWriter._buffer); - } - ], function (err) { - // Reset connection status - self.connectionPending = false; - self.connectionOpened = false; - - Helpers._emitEvent(self, err, self.EVENT_ERROR, self.EVENT_CONNECTION_CLOSED); - - if (typeof(callback) === 'function') { - callback(err); - } - }); + return new Promise((resolve, reject) => { + this.logger.debug('close'); + + if (!this.connectionOpened) { + // If the connection has already been closed, no need to emit + // the error. After all this is what the client wants - to + // close the connection. + if (typeof callback === 'function') { + return callback(); + } + + return resolve(); + } + + // Remove all pending requests. + this._queue.empty(); + + let promise = Promise.resolve(); + + // Close open queries. + const queryHandles = Object.keys(this._queryResultSets); + + queryHandles.forEach(queryHandle => { + promise = promise.then(() => { + return this.closeQuery(queryHandle); + }); + }); + + let closeConnection = () => { + return new Promise((resolve, reject) => { + let closeDatabasePacket = new CloseDatabasePacket({ + casInfo: this._CASInfo, + }); + const packetWriter = new PacketWriter(closeDatabasePacket.getBufferLength()); + const socket = this._socket; + + closeDatabasePacket.write(packetWriter); + + let callback = (err) => { + // Propagate the error. + if (err) { + return reject(err); + } + + resolve(); + }; + + // `_socketCurrentEventCallback` is called only when + // an unexpected error is thrown on the socket layer. + this._socketCurrentEventCallback = callback; + + socket.on('data', _receiveBytes.call(this, { + parserFunction: _parseCloseBuffer.bind(this), + dataPacket: closeDatabasePacket + }, callback)); + + socket.write(packetWriter._buffer); + }); + }; + + // Close the connection. + promise + .then(closeConnection) + .then(() => { + // Reset connection status + this.connectionPending = false; + this.connectionOpened = false; + + if (typeof(callback) === 'function') { + return callback(); + } + + resolve(); + }) + .catch(err => { + if (typeof(callback) === 'function') { + return callback(err); + } + + reject(err); + }); + }); } /** * Start transaction * @param callback */ CUBRIDConnection.prototype.beginTransaction = function (callback) { - var self = this; - - ActionQueue.enqueue([ - this._implyConnect.bind(this), - function (cb) { - _toggleAutoCommitMode(self, self.AUTOCOMMIT_OFF, cb); - } - ], function (err) { - Helpers._emitEvent(self, err, self.EVENT_ERROR, self.EVENT_BEGIN_TRANSACTION); - - if (typeof(callback) === 'function') { - callback(err); - } - }); + return this.setAutoCommitMode(this.AUTOCOMMIT_OFF, callback); +}; + +/** + * End transaction + * @param callback + */ +CUBRIDConnection.prototype.endTransaction = function (callback) { + return this.setAutoCommitMode(this.AUTOCOMMIT_ON, callback); }; /** @@ -1347,13 +1463,15 @@ CUBRIDConnection.prototype.beginTransaction = function (callback) { * @param callback */ CUBRIDConnection.prototype.setAutoCommitMode = function (autoCommitMode, callback) { - var self = this; + return new Promise(resolve => { + // Accept any truthful value. + this.autoCommitMode = !!autoCommitMode; - _toggleAutoCommitMode(this, autoCommitMode, function (err) { - Helpers._emitEvent(self, err, self.EVENT_ERROR, self.EVENT_SET_AUTOCOMMIT_MODE_COMPLETED); - if (typeof(callback) === 'function') { - callback(err); + if (typeof callback === 'function') { + return callback(); } + + return resolve(); }); }; @@ -1369,134 +1487,119 @@ CUBRIDConnection.prototype.getAutoCommitMode = function () { * @param callback */ CUBRIDConnection.prototype.rollback = function (callback) { - var self = this, - query = new Query(null, callback); - - this._queue.unshift(function (done) { - self._rollback(function (err) { - query.callback(err); - done(); - }); - }); + return new Promise((resolve, reject) => { + this._queue.unshift(done => { + _rollback + .call(this) + .then(() => { + done(); + + if (typeof callback === 'function') { + return callback(); + } + + return resolve(); + }) + .catch(err => { + done(); + + if (typeof callback === 'function') { + return callback(err); + } + + reject(err); + }); + }); + }); }; -CUBRIDConnection.prototype._rollback = function (callback) { - var self = this, - err = this._NO_ERROR; +function _rollback() { + return new Promise((resolve, reject) => { + if (this.autoCommitMode) { + return reject(new Error(ErrorMessages.ERROR_NO_ROLLBACK)); + } - if (this.autoCommitMode === false) { - var rollbackPacket = new RollbackPacket({ - casInfo : this._CASInfo, - db_version : this._DB_ENGINE_VER - }), - packetWriter = new PacketWriter(rollbackPacket.getBufferLength()), - socket = this._socket; + const rollbackPacket = new RollbackPacket({ + casInfo: this._CASInfo, + }); + const packetWriter = new PacketWriter(rollbackPacket.getBufferLength()); + const socket = this._socket; rollbackPacket.write(packetWriter); - this._socketCurrentEventCallback = callback; - - socket.on('data', this._receiveBytes({ - parserFunction: this._parseRollbackBuffer, - dataPacket: rollbackPacket - }, function (err) { - Helpers._emitEvent(self, err, self.EVENT_ERROR, self.EVENT_ROLLBACK_COMPLETED); + let callback = (err) => { + if (err) { + return reject(err); + } - if (typeof(callback) === 'function') { - callback(err); - } - })); + resolve(); + }; - socket.write(packetWriter._buffer); - } else { - err = new Error(ErrorMessages.ERROR_NO_ROLLBACK); + this._socketCurrentEventCallback = callback; - Helpers._emitEvent(this, err, this.EVENT_ERROR, null); + socket.on('data', _receiveBytes.call(this, { + parserFunction: _parseResponseCodeBuffer.bind(this), + dataPacket: rollbackPacket + }, callback)); - if (typeof(callback) === 'function') { - callback(err); - } - } -}; + socket.write(packetWriter._buffer); + }); +} /** * Commit transaction * @param callback */ CUBRIDConnection.prototype.commit = function (callback) { - var self = this, - query = new Query(null, callback); - - this._queue.unshift(function (done) { - self._commit(function (err) { - query.callback(err); - done(); - }); - }); -}; + return new Promise((resolve, reject) => { + // `commit` request should be higher priority so that + // we can free the memory on the server side as soon + // as we can. + this._queue.unshift(done => { + this.logger.debug('commit'); + + let cb = (err) => { + done(); + + if (typeof callback === 'function') { + return callback(err); + } -CUBRIDConnection.prototype._commit = function (callback) { - var self = this, - err = this._NO_ERROR; + if (err) { + return reject(err); + } - if (this.autoCommitMode === false) { - var commitPacket = new CommitPacket({ - casInfo : this._CASInfo, - db_version : this._DB_ENGINE_VER - }), - packetWriter = new PacketWriter(commitPacket.getBufferLength()), - socket = this._socket; + resolve(); + }; - commitPacket.write(packetWriter); + if (!this.connectionOpened) { + return cb(new Error(ErrorMessages.ERROR_CLOSED_CONNECTION_COMMIT)); + } - this._socketCurrentEventCallback = callback; + if (this.autoCommitMode) { + return cb(new Error(ErrorMessages.ERROR_AUTO_COMMIT_ENABLED_COMMIT)); + } - socket.on('data', this._receiveBytes({ - parserFunction: this._parseCommitBuffer, - dataPacket: commitPacket - }, function (err) { - Helpers._emitEvent(self, err, self.EVENT_ERROR, self.EVENT_COMMIT_COMPLETED); + const commitPacket = new CommitPacket({ + casInfo: this._CASInfo, + }); + const packetWriter = new PacketWriter(commitPacket.getBufferLength()); + const socket = this._socket; - if (typeof(callback) === 'function') { - callback(err); - } - })); + commitPacket.write(packetWriter); - socket.write(packetWriter._buffer); - } else { - err = new Error(ErrorMessages.ERROR_NO_COMMIT); + this._socketCurrentEventCallback = cb; - Helpers._emitEvent(this, err, this.EVENT_ERROR, null); + socket.on('data', _receiveBytes.call(this, { + parserFunction: _parseResponseCodeBuffer.bind(this), + dataPacket: commitPacket + }, cb)); - if (typeof(callback) === 'function') { - callback(err); - } - } + socket.write(packetWriter._buffer); + }); + }); }; -/** - * Set Auto-commit mode - * @param self - * @param autoCommitMode - * @param callback - * @private - */ -function _toggleAutoCommitMode(self, autoCommitMode, callback) { - var err = self._NO_ERROR; - - if (!Helpers._validateInputBoolean(autoCommitMode)) { - err = new Error(ErrorMessages.ERROR_INPUT_VALIDATION); - - Helpers._emitEvent(self, err, self.EVENT_ERROR, null); - } else { - self.autoCommitMode = autoCommitMode; - } - - if (typeof(callback) === 'function') { - callback(err); - } -} - /** * Get database schema information * @param schemaType @@ -1504,370 +1607,447 @@ function _toggleAutoCommitMode(self, autoCommitMode, callback) { * @param callback */ CUBRIDConnection.prototype.getSchema = function (schemaType, tableNameFilter, callback) { - var self = this, - query = new Query(null, callback); - - this._queue.push(function (done) { - self._getSchema(schemaType, tableNameFilter, function (err, result) { - query.callback(err, result); - done(); - }); - }); -}; + return new Promise((resolve, reject) => { + this._queue.push(done => { + if (typeof tableNameFilter === 'function') { + callback = tableNameFilter; + tableNameFilter = undefined; + } + + const query = new Query(callback); + + this.logger.debug(`getSchema: schemaType = ${schemaType}; tableNameFilter = ${tableNameFilter}.`); -CUBRIDConnection.prototype._getSchema = function (schemaType, tableNameFilter, callback) { - var self = this; - - ActionQueue.enqueue([ - this._implyConnect.bind(this), - function (cb) { - var getSchemaPacket = new GetSchemaPacket({ - casInfo : self._CASInfo, - schemaType : schemaType, - tableNamePattern : tableNameFilter, - db_version : self._DB_ENGINE_VER - }), - packetWriter = new PacketWriter(getSchemaPacket.getRequestSchemaBufferLength()), - socket = self._socket; - - getSchemaPacket.writeRequestSchema(packetWriter); - - self._socketCurrentEventCallback = cb; - - socket.on('data', self._receiveBytes({ - parserFunction: self._parseGetSchemaBuffer, - dataPacket: getSchemaPacket - }, cb)); - - socket.write(packetWriter._buffer); - } - ], function (err, result) { - Helpers._emitEvent(self, err, self.EVENT_ERROR, self.EVENT_SCHEMA_DATA_AVAILABLE, result); - - if (typeof(callback) === 'function') { - callback(err, result); - } - }); + this.connect() + .then(() => { + return _getSchema.call(this, schemaType, tableNameFilter); + }) + .then(response => { + done(); + + if (typeof query.callback === 'function') { + return query.callback(undefined, response); + } + + resolve(response); + }) + .catch(err => { + done(); + + if (typeof query.callback === 'function') { + return query.callback(err); + } + + return reject(err); + }); + }); + }); }; +function _getSchema(schemaType, tableNameFilter) { + this.logger.debug('_getSchema', schemaType, tableNameFilter); + + return new Promise((resolve, reject) => { + const getSchemaPacket = new GetSchemaPacket({ + casInfo: this._CASInfo, + protocolVersion: this.brokerInfo.protocolVersion, + schemaType: schemaType, + shardId: this.shardId, + tableNamePattern: tableNameFilter, + }); + const packetWriter = new PacketWriter(getSchemaPacket.getRequestSchemaBufferLength()); + const socket = this._socket; + + getSchemaPacket.writeRequestSchema(packetWriter); + + let callback = (err, result) => { + if (err) { + return reject(err); + } + + resolve(result); + }; + + this._socketCurrentEventCallback = callback; + + socket.on('data', _receiveBytes.call(this, { + parserFunction: _parseGetSchemaBuffer.bind(this), + dataPacket: getSchemaPacket + }, callback)); + + socket.write(packetWriter._buffer); + }); +} + /** * Create a new LOB object * @param lobType * @param callback */ CUBRIDConnection.prototype.lobNew = function (lobType, callback) { - var self = this, - query = new Query(null, callback); - - this._queue.push(function (done) { - self._lobNew(lobType, function (err, lobObject) { - query.callback(err, lobObject); - done(); - }); - }); + return new Promise((resolve, reject) => { + this._queue.push(done => { + const query = new Query(callback); + + this.logger.debug(`lobNew: lobType = ${lobType}.`); + + this.connect() + .then(() => { + return _lobNew.call(this, lobType); + }) + .then(lobObject => { + done(); + + if (typeof query.callback === 'function') { + return query.callback(undefined, lobObject); + } + + resolve(lobObject); + }) + .catch(err => { + done(); + + if (typeof query.callback === 'function') { + return query.callback(err); + } + + return reject(err); + }); + }); + }); }; -CUBRIDConnection.prototype._lobNew = function (lobType, callback) { - var self = this; +function _lobNew(lobType) { + this.logger.debug('_lobNew', lobType); - ActionQueue.enqueue([ - this._implyConnect.bind(this), - function (cb) { - var lobNewPacket = new LOBNewPacket({ - casInfo : self._CASInfo, - lobType : lobType, - db_version : self._DB_ENGINE_VER - }), - packetWriter = new PacketWriter(lobNewPacket.getBufferLength()), - socket = self._socket; + return new Promise((resolve, reject) => { + const lobNewPacket = new LOBNewPacket({ + casInfo: this._CASInfo, + lobType, + }); + const packetWriter = new PacketWriter(lobNewPacket.getBufferLength()); + const socket = this._socket; - lobNewPacket.write(packetWriter); + lobNewPacket.write(packetWriter); - self._socketCurrentEventCallback = cb; + let callback = (err, result) => { + if (err) { + return reject(err); + } - socket.on('data', self._receiveBytes({ - parserFunction: self._parseLobNewBuffer, - dataPacket: lobNewPacket - }, cb)); + resolve(result); + }; - socket.write(packetWriter._buffer); - } - ], - function (err, lobObject) { - Helpers._emitEvent(self, err, self.EVENT_ERROR, self.EVENT_LOB_NEW_COMPLETED, lobObject); + this._socketCurrentEventCallback = callback; - if (typeof(callback) === 'function') { - callback(err, lobObject); - } + socket.on('data', _receiveBytes.call(this, { + parserFunction: _parseLobNewBuffer.bind(this), + dataPacket: lobNewPacket + }, callback)); + + socket.write(packetWriter._buffer); }); -}; +} /** * Write data to a LOB object * @param lobObject - * @param position - * @param dataBuffer + * @param offset + * @param data * @param callback */ -CUBRIDConnection.prototype.lobWrite = function (lobObject, position, dataBuffer, callback) { - var self = this, - query = new Query(null, callback); - - this._queue.push(function (done) { - self._lobWrite(lobObject, position, dataBuffer, function (err, lobObject, totalWriteLen) { - query.callback(err, lobObject, totalWriteLen); - done(); - }); - }); +CUBRIDConnection.prototype.lobWrite = function (lobObject, offset, data, callback) { + return new Promise((resolve, reject) => { + this._queue.push(done => { + const query = new Query(callback); + + this.logger.debug('lobNew'); + + this.connect() + .then(() => { + return _lobWrite.call(this, lobObject, offset, data); + }) + .then(response => { + done(); + + if (typeof query.callback === 'function') { + return query.callback(undefined, response.lobObject, response.length); + } + + resolve(response); + }) + .catch(err => { + done(); + + if (typeof query.callback === 'function') { + return query.callback(err); + } + + return reject(err); + }); + }); + }); }; -CUBRIDConnection.prototype._lobWrite = function (lobObject, position, dataBuffer, callback) { - var self = this, - err = self._NO_ERROR; +function _lobWrite(lobObject, offset, data) { + this.logger.debug('_lobWrite', lobObject, offset); - if (lobObject.lobLength + 1 !== position) { - err = new Error(ErrorMessages.ERROR_INVALID_LOB_POSITION); - Helpers.logError(ErrorMessages.ERROR_INVALID_LOB_POSITION); - return callback(err); - } + return new Promise((resolve, reject) => { + // Ensure sequential write. + if (lobObject.lobLength !== offset) { + return reject(new Error(ErrorMessages.ERROR_INVALID_LOB_POSITION)); + } - --position; + if (typeof data !== 'string' && !Buffer.isBuffer(data)) { + return reject(new Error(ErrorMessages.ERROR_INVALID_LOB_DATA)); + } - var realWriteLen, writeLen, - totalWriteLen = 0, - len = dataBuffer.length, - offset = 0; + if (typeof data === 'string') { + // Convert CLOB into a binary buffer. + data = Helpers.getBufferFromString(data); + } - ActionQueue.while( - function () { - return len > 0; - }, - function (cb) { - var expectedResponseLength = self._INVALID_RESPONSE_LENGTH; + let totalWriteLen = 0; - writeLen = Math.min(len, self._LOB_MAX_IO_LENGTH); + const totalBytesToWrite = data.length; + const writeLen = Math.min(totalBytesToWrite, this._LOB_MAX_IO_LENGTH); - var dataToWrite = null; + const callback = (err) => { + this._socketCurrentEventCallback = undefined; - if (lobObject.lobType === CASConstants.CUBRIDDataType.CCI_U_TYPE_BLOB) { - dataToWrite = dataBuffer.slice(position, position + writeLen); - } else { - if (lobObject.lobType === CASConstants.CUBRIDDataType.CCI_U_TYPE_CLOB) { - dataToWrite = dataBuffer.substring(position, position + writeLen); - } + if (err) { + return reject(err); } - var lobWritePacket = new LOBWritePacket({ - casInfo : self._CASInfo, - lobObject : lobObject, - position : position, - data : dataToWrite, - writeLen : writeLen, - db_version : self._DB_ENGINE_VER - }), - packetWriter = new PacketWriter(lobWritePacket.getBufferLength()), - totalBuffLength = 0, - buffArr = [], - socket = self._socket; + lobObject.lobLength = offset; - lobWritePacket.write(packetWriter); + resolve({ + lobObject, + length: offset, + }); + }; + + this._socketCurrentEventCallback = callback; - self._socketCurrentEventCallback = cb; + let continueWriting = (err) => { + if (err || totalWriteLen >= totalBytesToWrite) { + return callback(err); + } + + const lobWritePacket = new LOBWritePacket({ + casInfo: this._CASInfo, + data: data.slice(offset, offset + writeLen), + lobObject, + offset, + }); + const packetWriter = new PacketWriter(lobWritePacket.getBufferLength()); + const socket = this._socket; - socket.on('data', function (data) { - totalBuffLength += data.length; - buffArr.push(data); + let buffArr = []; + let totalBuffLength = 0; + let expectedResponseLength = this._INVALID_RESPONSE_LENGTH; - if (expectedResponseLength === self._INVALID_RESPONSE_LENGTH && - totalBuffLength >= DATA_TYPES.DATA_LENGTH_SIZEOF) { - var l = buffArr.length, - buff; + lobWritePacket.write(packetWriter); - if (l > 1) { - buff = Buffer.concat(buffArr, totalBuffLength); - // For later, use this already concatenated buffer. - // First empty the array: http://stackoverflow.com/a/1234337/556678. - buffArr.length = 0; - // Then push this buffer in. - buffArr.push(buff); - } else { - buff = buffArr[0]; - } + socket.on('data', (data) => { + totalBuffLength += data.length; + buffArr.push(data); + + if (expectedResponseLength === this._INVALID_RESPONSE_LENGTH && + totalBuffLength >= DATA_TYPES.DATA_LENGTH_SIZEOF) { + const l = buffArr.length; + let buff; + + if (l > 1) { + buff = Buffer.concat(buffArr, totalBuffLength); + // For later, use this already concatenated buffer. + // First empty the array: http://stackoverflow.com/a/1234337/556678. + buffArr.length = 0; + // Then push this buffer in. + buffArr.push(buff); + } else { + buff = buffArr[0]; + } - expectedResponseLength = Helpers._getExpectedResponseLength(buff); - } + expectedResponseLength = Helpers._getExpectedResponseLength(buff); + } if (totalBuffLength === expectedResponseLength) { socket.removeAllListeners('data'); - var packetReader = new PacketReader(); - packetReader.write(Buffer.concat(buffArr, totalBuffLength)); + const packetReader = new PacketReader(); + packetReader.write(Buffer.concat(buffArr, totalBuffLength)); - lobWritePacket.parse(packetReader); - realWriteLen = lobWritePacket.wroteLength; - position = position + realWriteLen; - len -= realWriteLen; - offset += realWriteLen; - totalWriteLen += realWriteLen; + const error = lobWritePacket.parse(packetReader); - var errorCode = lobWritePacket.errorCode, - errorMsg = lobWritePacket.errorMsg; - - if (errorCode !== 0) { - err = new Error(errorCode + ':' + errorMsg); + if (!error) { + const realWriteLen = lobWritePacket.bytesWritten; + offset += realWriteLen; + totalWriteLen += realWriteLen; } - cb(err); + continueWriting(error); } }); - socket.write(packetWriter._buffer); - }, - function (err) { - if (totalWriteLen > lobObject.lobLength) { - lobObject.lobLength = totalWriteLen; - } - - Helpers._emitEvent(self, err, self.EVENT_ERROR, self.EVENT_LOB_WRITE_COMPLETED, lobObject, totalWriteLen); + socket.write(packetWriter._buffer); + }; - if (typeof(callback) === 'function') { - callback(err, lobObject, totalWriteLen); - } - }); -}; + continueWriting(); + }); +} /** * Read a LOB object from the database * @param lobObject - * @param position + * @param offset * @param length * @param callback */ -CUBRIDConnection.prototype.lobRead = function (lobObject, position, length, callback) { - var self = this, - query = new Query(null, callback); - - this._queue.push(function (done) { - self._lobRead(lobObject, position, length, function (err, buffer, totalReadLen) { - query.callback(err, buffer, totalReadLen); - done(); - }); - }); +CUBRIDConnection.prototype.lobRead = function (lobObject, offset, length, callback) { + return new Promise((resolve, reject) => { + this._queue.push(done => { + const query = new Query(callback); + + this.logger.debug('lobNew'); + + this.connect() + .then(() => { + return _lobRead.call(this, lobObject, offset, length); + }) + .then(response => { + done(); + + if (typeof query.callback === 'function') { + return query.callback(undefined, response.data, response.length); + } + + resolve(response); + }) + .catch(err => { + done(); + + if (typeof query.callback === 'function') { + return query.callback(err); + } + + return reject(err); + }); + }); + }); }; -CUBRIDConnection.prototype._lobRead = function (lobObject, position, length, callback) { - var self = this, - err = self._NO_ERROR, - buffer; +function _lobRead(lobObject, offset, length) { + this.logger.debug('_lobRead', lobObject, offset, length); - if (lobObject.lobType === CASConstants.CUBRIDDataType.CCI_U_TYPE_CLOB) { - buffer = ''; - } else { - buffer = new Buffer(0); - } + return new Promise((resolve, reject) => { + if (lobObject.lobLength < offset + length) { + return reject(new Error(ErrorMessages.ERROR_INVALID_LOB_POSITION)); + } - --position; + let buffers = []; + let totalReadLen = 0; - if (lobObject.lobLength < position + length) { - err = new Error(ErrorMessages.ERROR_INVALID_LOB_POSITION); - Helpers.logError(ErrorMessages.ERROR_INVALID_LOB_POSITION); - return callback(err); - } + const callback = (err) => { + this._socketCurrentEventCallback = undefined; - var realReadLen, - readLen, - totalReadLen = 0; - - ActionQueue.while( - function () { - return length > 0; - }, - function (cb) { - var expectedResponseLength = self._INVALID_RESPONSE_LENGTH, - lobReadPacket = new LOBReadPacket({ - casInfo : self._CASInfo, - lobObject : lobObject, - position : position, - lengthToRead : length, - db_version : self._DB_ENGINE_VER - }), - packetWriter = new PacketWriter(lobReadPacket.getBufferLength()), - totalBuffLength = 0, - buffArr = [], - socket = self._socket; - - readLen = Math.min(length, self._LOB_MAX_IO_LENGTH); - - lobReadPacket.write(packetWriter); - - self._socketCurrentEventCallback = cb; - - socket.on('data', function (data) { - totalBuffLength += data.length; - buffArr.push(data); - - if (expectedResponseLength === self._INVALID_RESPONSE_LENGTH && - totalBuffLength >= DATA_TYPES.DATA_LENGTH_SIZEOF) { - var l = buffArr.length, - buff; - - if (l > 1) { - buff = Buffer.concat(buffArr, totalBuffLength); - // For later, use this already concatenated buffer. - // First empty the array: http://stackoverflow.com/a/1234337/556678. - buffArr.length = 0; - // Then push this buffer in. - buffArr.push(buff); - } else { - buff = buffArr[0]; - } - - expectedResponseLength = Helpers._getExpectedResponseLength(buff); - } + if (err) { + return reject(err); + } - if (totalBuffLength === expectedResponseLength) { - socket.removeAllListeners('data'); + buffers = Buffer.concat(buffers, totalReadLen); - var packetReader = new PacketReader(); - packetReader.write(Buffer.concat(buffArr, totalBuffLength)); + if (lobObject.lobType === CASConstants.CUBRIDDataType.CCI_U_TYPE_CLOB) { + buffers = buffers.toString(); + } - lobReadPacket.parse(packetReader); + resolve({ + data: buffers, + length: totalReadLen, + }); + }; - realReadLen = lobReadPacket.readLength; - position += realReadLen; - length -= realReadLen; - totalReadLen += realReadLen; + this._socketCurrentEventCallback = callback; - if (realReadLen === 0) { - length = 0; - } + let continueReading = (err) => { + if (err || length <= totalReadLen) { + return callback(err); + } - if (lobObject.lobType === CASConstants.CUBRIDDataType.CCI_U_TYPE_CLOB) { - buffer += lobReadPacket.lobBuffer; + const lobReadPacket = new LOBReadPacket({ + casInfo: this._CASInfo, + bytesToRead: length - totalReadLen, + lobObject, + offset, + }); + const packetWriter = new PacketWriter(lobReadPacket.getBufferLength()); + const socket = this._socket; + + let buffArr = []; + let expectedResponseLength = this._INVALID_RESPONSE_LENGTH; + let totalBuffLength = 0; + + lobReadPacket.write(packetWriter); + + socket.on('data', (data) => { + totalBuffLength += data.length; + buffArr.push(data); + + if (expectedResponseLength === this._INVALID_RESPONSE_LENGTH && + totalBuffLength >= DATA_TYPES.DATA_LENGTH_SIZEOF) { + const l = buffArr.length; + let buff; + + if (l > 1) { + buff = Buffer.concat(buffArr, totalBuffLength); + // For later, use this already concatenated buffer. + // First empty the array: http://stackoverflow.com/a/1234337/556678. + buffArr.length = 0; + // Then push this buffer in. + buffArr.push(buff); } else { - buffer = Helpers._combineData(buffer, lobReadPacket.lobBuffer); + buff = buffArr[0]; } - var errorCode = lobReadPacket.errorCode; + expectedResponseLength = Helpers._getExpectedResponseLength(buff); + } + + if (totalBuffLength === expectedResponseLength) { + socket.removeAllListeners('data'); + + const packetReader = new PacketReader(); + + packetReader.write(Buffer.concat(buffArr, totalBuffLength)); + + const error = lobReadPacket.parse(packetReader); + + if (!error) { + const realReadLen = lobReadPacket.readLength; + + // The actual data stored in CUBRID may be empty. + if (realReadLen === 0) { + length = 0; + } else { + // The data received from the server can be partial. + // So if we haven't received enough data, we need + // to keep requesting. + offset += realReadLen; + totalReadLen += realReadLen; + } - if (errorCode !== 0) { - err = new Error(errorCode + ':' + lobReadPacket.errorMsg); + buffers.push(lobReadPacket.lobBuffer); } - cb(err); + setImmediate(continueReading.bind(this, error)); } }); - socket.write(packetWriter._buffer); - }, - function (err) { - Helpers._emitEvent(self, err, self.EVENT_ERROR, self.EVENT_LOB_READ_COMPLETED, buffer, totalReadLen); + socket.write(packetWriter._buffer); + }; - if (typeof(callback) === 'function') { - callback(err, buffer, totalReadLen); - } - }); -}; + continueReading(); + }); +} /** * Set connection timeout value in milliseconds. @@ -1877,7 +2057,7 @@ CUBRIDConnection.prototype._lobRead = function (lobObject, position, length, cal * @param timeout (msec) */ CUBRIDConnection.prototype.setConnectionTimeout = function (timeout) { - this._CONNECTION_TIMEOUT = timeout >= 0 ? timeout : 0; + this.connectionTimeout = timeout > 0 ? timeout : 0; }; /** @@ -1885,7 +2065,7 @@ CUBRIDConnection.prototype.setConnectionTimeout = function (timeout) { * @return {Number} (.msec) */ CUBRIDConnection.prototype.getConnectionTimeout = function () { - return this._CONNECTION_TIMEOUT; + return this.connectionTimeout; }; /** @@ -1895,61 +2075,76 @@ CUBRIDConnection.prototype.getConnectionTimeout = function () { * @param callback */ CUBRIDConnection.prototype.setDatabaseParameter = function (parameter, value, callback) { - var self = this, - query = new Query(null, callback); - - this._queue.push(function (done) { - self._setDatabaseParameter(parameter, value, function (err) { - query.callback(err); - done(); - }); - }); + return new Promise((resolve, reject) => { + this._queue.push((done) => { + this + .connect() + .then(() => { + return _setDatabaseParameter.call(this, parameter, value); + }) + .then(() => { + done(); + + if (typeof callback === 'function') { + return callback(); + } + + resolve(); + }) + .catch(err => { + done(); + + if (typeof callback === 'function') { + return callback(err); + } + + reject(err); + }); + }); + }); }; -CUBRIDConnection.prototype._setDatabaseParameter = function (parameter, value, callback) { - var self = this, - err = this._NO_ERROR; +function _setDatabaseParameter(parameter, value) { + return new Promise((resolve, reject) => { + if (parameter === CASConstants.CCIDbParam.CCI_PARAM_MAX_STRING_LENGTH) { + // The `CCI_PARAM_MAX_STRING_LENGTH` parameter **cannot** be set + // programmatically from code as it is a CUBRID Broker parameter + // and the client can only query its current value. + let error = new Error(); + error.code = -1011; + error.message = ErrorMessages.resolveErrorCode(error.code); - if (parameter === CASConstants.CCIDbParam.CCI_PARAM_MAX_STRING_LENGTH) { - var errorCode = -1011, - errorMsg = Helpers._resolveErrorCode(errorCode); - - err = new Error(errorCode + ':' + errorMsg); - - Helpers._emitEvent(this, err, this.EVENT_ERROR, null); - - if (typeof(callback) === 'function') { - callback(err); + return reject(error); } - return; - } + const setDbParameterPacket = new SetDbParameterPacket({ + casInfo: this._CASInfo, + parameter, + value + }); + const packetWriter = new PacketWriter(setDbParameterPacket.getBufferLength()); + const socket = this._socket; - var setDbParameterPacket = new SetDbParameterPacket({ - casInfo : this._CASInfo, - parameter : parameter, - value : value - }), - packetWriter = new PacketWriter(setDbParameterPacket.getBufferLength()), - socket = this._socket; + setDbParameterPacket.write(packetWriter); - setDbParameterPacket.write(packetWriter); + let callback = (err) => { + if (err) { + return reject(err); + } - this._socketCurrentEventCallback = callback; + resolve(); + }; - socket.on('data', this._receiveBytes({ - parserFunction: this._parseSetDatabaseParameterBuffer, - dataPacket: setDbParameterPacket - }, function (err) { - Helpers._emitEvent(self, err, self.EVENT_ERROR, self.EVENT_SET_DB_PARAMETER_COMPLETED, null); + this._socketCurrentEventCallback = callback; - if (typeof(callback) === 'function') { - callback(err); - } - })); + socket.on('data', _receiveBytes.call(this, { + parserFunction: _parseResponseCodeBuffer.bind(this), + dataPacket: setDbParameterPacket + }, callback)); - socket.write(packetWriter._buffer); -}; + socket.write(packetWriter._buffer); + }); +} /** * Get a database parameter @@ -1957,60 +2152,72 @@ CUBRIDConnection.prototype._setDatabaseParameter = function (parameter, value, c * @param callback */ CUBRIDConnection.prototype.getDatabaseParameter = function (parameter, callback) { - var self = this, - query = new Query(null, callback); - - this._queue.push(function (done) { - self._getDatabaseParameter(parameter, function (err, value) { - query.callback(err, value); - done(); - }); - }); + return new Promise((resolve, reject) => { + this._queue.push((done) => { + this + .connect() + .then(() => { + return _getDatabaseParameter.call(this, parameter); + }) + .then(value => { + done(); + + if (typeof callback === 'function') { + return callback(undefined, value); + } + + resolve(value); + }) + .catch(err => { + done(); + + if (typeof callback === 'function') { + return callback(err); + } + + reject(err); + }); + }); + }); }; -CUBRIDConnection.prototype._getDatabaseParameter = function (parameter, callback) { - var self = this, - err = this._NO_ERROR; +function _getDatabaseParameter(parameter) { + return new Promise((resolve, reject) => { + if (parameter === CASConstants.CCIDbParam.CCI_PARAM_MAX_STRING_LENGTH) { + let error = new Error(); + error.code = -1011; + error.message = ErrorMessages.resolveErrorCode(error.code); - if (parameter === CASConstants.CCIDbParam.CCI_PARAM_MAX_STRING_LENGTH) { - var errorCode = -1011, - errorMsg = Helpers._resolveErrorCode(errorCode); - - err = new Error(errorCode + ':' + errorMsg); - - Helpers._emitEvent(this, err, this.EVENT_ERROR, null); - - if (typeof(callback) === 'function') { - callback(err); + return reject(error); } - return; - } + const getDbParameterPacket = new GetDbParameterPacket({ + casInfo: this._CASInfo, + parameter, + }); + const packetWriter = new PacketWriter(getDbParameterPacket.getBufferLength()); + const socket = this._socket; - var getDbParameterPacket = new GetDbParameterPacket({ - casInfo : this._CASInfo, - parameter : parameter - }), - packetWriter = new PacketWriter(getDbParameterPacket.getBufferLength()), - socket = this._socket; + getDbParameterPacket.write(packetWriter); - getDbParameterPacket.write(packetWriter); + let callback = (err) => { + if (err) { + return reject(err); + } - this._socketCurrentEventCallback = callback; + resolve(getDbParameterPacket.value); + }; - socket.on('data', this._receiveBytes({ - parserFunction: this._parseGetDatabaseParameterBuffer, - dataPacket: getDbParameterPacket - }, function (err) { - Helpers._emitEvent(self, err, self.EVENT_ERROR, self.EVENT_GET_DB_PARAMETER_COMPLETED, getDbParameterPacket.value); + this._socketCurrentEventCallback = callback; - if (typeof(callback) === 'function') { - callback(err, getDbParameterPacket.value); - } - })); + socket.on('data', _receiveBytes.call(this, { + parserFunction: _parseResponseCodeBuffer.bind(this), + dataPacket: getDbParameterPacket + }, callback)); - socket.write(packetWriter._buffer); -}; + socket.write(packetWriter._buffer); + }); +} /** * Set the protocol to be used for queries execution. @@ -2019,50 +2226,30 @@ CUBRIDConnection.prototype._getDatabaseParameter = function (parameter, callback * @param enforceOldProtocol */ CUBRIDConnection.prototype.setEnforceOldQueryProtocol = function (enforceOldProtocol) { - if (this._ENFORCE_OLD_QUERY_PROTOCOL !== enforceOldProtocol) { - this._ENFORCE_OLD_QUERY_PROTOCOL = enforceOldProtocol; - } + this.logger.info('setEnforceOldQueryProtocol', enforceOldProtocol); + + this._ENFORCE_OLD_QUERY_PROTOCOL = enforceOldProtocol; }; /** * Returns the protocol used for queries execution. * If true, the driver uses the (old) 8.4.x protocol. * If false, the driver uses the newer 9.x protocol. - * @private - */ -CUBRIDConnection.prototype.getEnforceOldQueryProtocol = function () { - return this._ENFORCE_OLD_QUERY_PROTOCOL; -}; - -/** - * Add a query to the queries queue - * @param sql SQL query to execute - * @param callback - */ -CUBRIDConnection.prototype.addQuery = function (sql, callback) { - this.query(sql, callback); -}; - -/** - * Add a non-query (direct SQL execute statement) to the queries queue - * @param sql SQL command to execute - * @param callback */ -CUBRIDConnection.prototype.addNonQuery = function (sql, callback) { - this.execute(sql, callback); +CUBRIDConnection.prototype.shouldUseOldQueryProtocol = function () { + return !!this._ENFORCE_OLD_QUERY_PROTOCOL; }; /** * Return true if there are pending queries in the queries queue * @return {Boolean} */ -CUBRIDConnection.prototype.queriesQueueIsEmpty = isQueueEmpty; -CUBRIDConnection.prototype.isQueueEmpty = isQueueEmpty; - -function isQueueEmpty() { +CUBRIDConnection.prototype.isQueueEmpty = function () { return this._queue.isEmpty(); -} +}; CUBRIDConnection.prototype.getQueueDepth = function () { - return this._queue.getDepth(); + return this._queue.getDepth(); }; + +module.exports = CUBRIDConnection; diff --git a/src/ConsoleLogger.js b/src/ConsoleLogger.js new file mode 100644 index 0000000..2856601 --- /dev/null +++ b/src/ConsoleLogger.js @@ -0,0 +1,31 @@ +/* eslint-env node */ + +function ConsoleLogger() { + +} + +ConsoleLogger.prototype.error = function () { + /* eslint-disable no-console */ + console.error.apply(console, arguments); + /* eslint-enable no-console */ +}; + +ConsoleLogger.prototype.info = function () { + /* eslint-disable no-console */ + console.error.apply(console, arguments); + /* eslint-enable no-console */ +}; + +ConsoleLogger.prototype.warn = function () { + /* eslint-disable no-console */ + console.warn.apply(console, arguments); + /* eslint-enable no-console */ +}; + +ConsoleLogger.prototype.debug = function () { + /* eslint-disable no-console */ + console.log.apply(console, arguments); + /* eslint-enable no-console */ +}; + +module.exports = ConsoleLogger; diff --git a/src/NoopLogger.js b/src/NoopLogger.js new file mode 100644 index 0000000..096b2e7 --- /dev/null +++ b/src/NoopLogger.js @@ -0,0 +1,12 @@ +function NoopLogger() { + +} + +function noop() {} + +NoopLogger.prototype.error = noop; +NoopLogger.prototype.info = noop; +NoopLogger.prototype.warn = noop; +NoopLogger.prototype.debug = noop; + +module.exports = NoopLogger; diff --git a/src/config.js b/src/config.js deleted file mode 100644 index d1f5eb2..0000000 --- a/src/config.js +++ /dev/null @@ -1,6 +0,0 @@ -/** - * Debug enabled in application? - * @type {Boolean} - * @private - */ -exports.DEBUG_ENABLED = false; diff --git a/src/constants/CASConstants.js b/src/constants/CASConstants.js index eb273c5..be309f3 100644 --- a/src/constants/CASConstants.js +++ b/src/constants/CASConstants.js @@ -1,457 +1,497 @@ +'use strict'; /** * Define CUBRID Function codes constants */ exports.CASFunctionCode = { - CAS_FC_END_TRAN : 1, - CAS_FC_PREPARE : 2, - CAS_FC_EXECUTE : 3, - CAS_FC_GET_DB_PARAMETER : 4, - CAS_FC_SET_DB_PARAMETER : 5, - CAS_FC_CLOSE_REQ_HANDLE : 6, - CAS_FC_CURSOR : 7, - CAS_FC_FETCH : 8, - CAS_FC_SCHEMA_INFO : 9, - CAS_FC_OID_GET : 10, - CAS_FC_OID_PUT : 11, - CAS_FC_DEPRECATED1 : 12, - CAS_FC_DEPRECATED2 : 13, - CAS_FC_DEPRECATED3 : 14, - CAS_FC_GET_DB_VERSION : 15, - CAS_FC_GET_CLASS_NUM_OBJS : 16, - CAS_FC_OID_CMD : 17, - CAS_FC_COLLECTION : 18, - CAS_FC_NEXT_RESULT : 19, - CAS_FC_EXECUTE_BATCH : 20, - CAS_FC_EXECUTE_ARRAY : 21, - CAS_FC_CURSOR_UPDATE : 22, - CAS_FC_GET_ATTR_TYPE_STR : 23, - CAS_FC_GET_QUERY_INFO : 24, - CAS_FC_DEPRECATED4 : 25, - CAS_FC_SAVEPOINT : 26, - CAS_FC_PARAMETER_INFO : 27, - CAS_FC_XA_PREPARE : 28, - CAS_FC_XA_RECOVER : 29, - CAS_FC_XA_END_TRAN : 30, - CAS_FC_CON_CLOSE : 31, - CAS_FC_CHECK_CAS : 32, - CAS_FC_MAKE_OUT_RS : 33, - CAS_FC_GET_GENERATED_KEYS : 34, - CAS_FC_LOB_NEW : 35, - CAS_FC_LOB_WRITE : 36, - CAS_FC_LOB_READ : 37, - CAS_FC_END_SESSION : 38, - CAS_FC_GET_ROW_COUNT : 39, - CAS_FC_GET_LAST_INSERT_ID : 40, - CAS_FC_PREPARE_AND_EXECUTE : 41 + CAS_FC_END_TRAN : 1, + CAS_FC_PREPARE : 2, + CAS_FC_EXECUTE : 3, + CAS_FC_GET_DB_PARAMETER : 4, + CAS_FC_SET_DB_PARAMETER : 5, + CAS_FC_CLOSE_REQ_HANDLE : 6, + CAS_FC_CURSOR : 7, + CAS_FC_FETCH : 8, + CAS_FC_SCHEMA_INFO : 9, + CAS_FC_OID_GET : 10, + CAS_FC_OID_PUT : 11, + CAS_FC_DEPRECATED1 : 12, + CAS_FC_DEPRECATED2 : 13, + CAS_FC_DEPRECATED3 : 14, + CAS_FC_GET_DB_VERSION : 15, + CAS_FC_GET_CLASS_NUM_OBJS : 16, + CAS_FC_OID_CMD : 17, + CAS_FC_COLLECTION : 18, + CAS_FC_NEXT_RESULT : 19, + CAS_FC_EXECUTE_BATCH : 20, + CAS_FC_EXECUTE_ARRAY : 21, + CAS_FC_CURSOR_UPDATE : 22, + CAS_FC_GET_ATTR_TYPE_STR : 23, + CAS_FC_GET_QUERY_INFO : 24, + CAS_FC_DEPRECATED4 : 25, + CAS_FC_SAVEPOINT : 26, + CAS_FC_PARAMETER_INFO : 27, + CAS_FC_XA_PREPARE : 28, + CAS_FC_XA_RECOVER : 29, + CAS_FC_XA_END_TRAN : 30, + CAS_FC_CON_CLOSE : 31, + CAS_FC_CHECK_CAS : 32, + CAS_FC_MAKE_OUT_RS : 33, + CAS_FC_GET_GENERATED_KEYS : 34, + CAS_FC_LOB_NEW : 35, + CAS_FC_LOB_WRITE : 36, + CAS_FC_LOB_READ : 37, + CAS_FC_END_SESSION : 38, + CAS_FC_GET_ROW_COUNT : 39, + CAS_FC_GET_LAST_INSERT_ID : 40, + CAS_FC_PREPARE_AND_EXECUTE : 41 }; exports.CASFunctionCode900 = { - CAS_FC_END_TRAN : 1, - CAS_FC_PREPARE : 2, - CAS_FC_EXECUTE : 3, - CAS_FC_GET_DB_PARAMETER : 4, - CAS_FC_SET_DB_PARAMETER : 5, - CAS_FC_CLOSE_REQ_HANDLE : 6, - CAS_FC_CURSOR : 7, - CAS_FC_FETCH : 8, - CAS_FC_SCHEMA_INFO : 9, - CAS_FC_OID_GET : 10, - CAS_FC_OID_PUT : 11, - CAS_FC_DEPRECATED1 : 12, - CAS_FC_DEPRECATED2 : 13, - CAS_FC_DEPRECATED3 : 14, - CAS_FC_GET_DB_VERSION : 15, - CAS_FC_GET_CLASS_NUM_OBJS : 16, - CAS_FC_OID_CMD : 17, - CAS_FC_COLLECTION : 18, - CAS_FC_NEXT_RESULT : 19, - CAS_FC_EXECUTE_BATCH : 20, - CAS_FC_EXECUTE_ARRAY : 21, - CAS_FC_CURSOR_UPDATE : 22, - CAS_FC_GET_ATTR_TYPE_STR : 23, - CAS_FC_GET_QUERY_INFO : 24, - CAS_FC_DEPRECATED4 : 25, - CAS_FC_SAVEPOINT : 26, - CAS_FC_PARAMETER_INFO : 27, - CAS_FC_XA_PREPARE : 28, - CAS_FC_XA_RECOVER : 29, - CAS_FC_XA_END_TRAN : 30, - CAS_FC_CON_CLOSE : 31, - CAS_FC_CHECK_CAS : 32, - CAS_FC_MAKE_OUT_RS : 33, - CAS_FC_GET_GENERATED_KEYS : 34, - CAS_FC_LOB_NEW : 35, - CAS_FC_LOB_WRITE : 36, - CAS_FC_LOB_READ : 37, - CAS_FC_END_SESSION : 38, - CAS_FC_GET_ROW_COUNT : 39, - CAS_FC_GET_LAST_INSERT_ID : 40, - CAS_FC_CURSOR_CLOSE : 41, - CAS_FC_PREPARE_AND_EXECUTE : 42 + CAS_FC_END_TRAN : 1, + CAS_FC_PREPARE : 2, + CAS_FC_EXECUTE : 3, + CAS_FC_GET_DB_PARAMETER : 4, + CAS_FC_SET_DB_PARAMETER : 5, + CAS_FC_CLOSE_REQ_HANDLE : 6, + CAS_FC_CURSOR : 7, + CAS_FC_FETCH : 8, + CAS_FC_SCHEMA_INFO : 9, + CAS_FC_OID_GET : 10, + CAS_FC_OID_PUT : 11, + CAS_FC_DEPRECATED1 : 12, + CAS_FC_DEPRECATED2 : 13, + CAS_FC_DEPRECATED3 : 14, + CAS_FC_GET_DB_VERSION : 15, + CAS_FC_GET_CLASS_NUM_OBJS : 16, + CAS_FC_OID_CMD : 17, + CAS_FC_COLLECTION : 18, + CAS_FC_NEXT_RESULT : 19, + CAS_FC_EXECUTE_BATCH : 20, + CAS_FC_EXECUTE_ARRAY : 21, + CAS_FC_CURSOR_UPDATE : 22, + CAS_FC_GET_ATTR_TYPE_STR : 23, + CAS_FC_GET_QUERY_INFO : 24, + CAS_FC_DEPRECATED4 : 25, + CAS_FC_SAVEPOINT : 26, + CAS_FC_PARAMETER_INFO : 27, + CAS_FC_XA_PREPARE : 28, + CAS_FC_XA_RECOVER : 29, + CAS_FC_XA_END_TRAN : 30, + CAS_FC_CON_CLOSE : 31, + CAS_FC_CHECK_CAS : 32, + CAS_FC_MAKE_OUT_RS : 33, + CAS_FC_GET_GENERATED_KEYS : 34, + CAS_FC_LOB_NEW : 35, + CAS_FC_LOB_WRITE : 36, + CAS_FC_LOB_READ : 37, + CAS_FC_END_SESSION : 38, + CAS_FC_GET_ROW_COUNT : 39, + CAS_FC_GET_LAST_INSERT_ID : 40, + CAS_FC_CURSOR_CLOSE : 41, + CAS_FC_PREPARE_AND_EXECUTE : 42 }; /** * Define CUBRID Statement types constants */ exports.CUBRIDStatementType = { - CUBRID_STMT_ALTER_CLASS : 0, - CUBRID_STMT_ALTER_SERIAL : 1, - CUBRID_STMT_COMMIT_WORK : 2, - CUBRID_STMT_REGISTER_DATABASE : 3, - CUBRID_STMT_CREATE_CLASS : 4, - CUBRID_STMT_CREATE_INDEX : 5, - CUBRID_STMT_CREATE_TRIGGER : 6, - CUBRID_STMT_CREATE_SERIAL : 7, - CUBRID_STMT_DROP_DATABASE : 8, - CUBRID_STMT_DROP_CLASS : 9, - CUBRID_STMT_DROP_INDEX : 10, - CUBRID_STMT_DROP_LABEL : 11, - CUBRID_STMT_DROP_TRIGGER : 12, - CUBRID_STMT_DROP_SERIAL : 13, - CUBRID_STMT_EVALUATE : 14, - CUBRID_STMT_RENAME_CLASS : 15, - CUBRID_STMT_ROLLBACK_WORK : 16, - CUBRID_STMT_GRANT : 17, - CUBRID_STMT_REVOKE : 18, - CUBRID_STMT_STATISTICS : 19, - CUBRID_STMT_INSERT : 20, - CUBRID_STMT_SELECT : 21, - CUBRID_STMT_UPDATE : 22, - CUBRID_STMT_DELETE : 23, - CUBRID_STMT_CALL : 24, - CUBRID_STMT_GET_ISO_LVL : 25, - CUBRID_STMT_GET_TIMEOUT : 26, - CUBRID_STMT_GET_OPT_LVL : 27, - CUBRID_STMT_SET_OPT_LVL : 28, - CUBRID_STMT_SCOPE : 29, - CUBRID_STMT_GET_TRIGGER : 30, - CUBRID_STMT_SET_TRIGGER : 31, - CUBRID_STMT_SAVEPOINT : 32, - CUBRID_STMT_PREPARE : 33, - CUBRID_STMT_ATTACH : 34, - CUBRID_STMT_USE : 35, - CUBRID_STMT_REMOVE_TRIGGER : 36, - CUBRID_STMT_RENAME_TRIGGER : 37, - CUBRID_STMT_ON_LDB : 38, - CUBRID_STMT_GET_LDB : 39, - CUBRID_STMT_SET_LDB : 40, - CUBRID_STMT_GET_STATS : 41, - CUBRID_STMT_CREATE_USER : 42, - CUBRID_STMT_DROP_USER : 43, - CUBRID_STMT_ALTER_USER : 44, - CUBRID_STMT_CALL_SP : 0x7e, - CUBRID_STMT_UNKNOWN : 0x7f + CUBRID_STMT_ALTER_CLASS : 0, + CUBRID_STMT_ALTER_SERIAL : 1, + CUBRID_STMT_COMMIT_WORK : 2, + CUBRID_STMT_REGISTER_DATABASE : 3, + CUBRID_STMT_CREATE_CLASS : 4, + CUBRID_STMT_CREATE_INDEX : 5, + CUBRID_STMT_CREATE_TRIGGER : 6, + CUBRID_STMT_CREATE_SERIAL : 7, + CUBRID_STMT_DROP_DATABASE : 8, + CUBRID_STMT_DROP_CLASS : 9, + CUBRID_STMT_DROP_INDEX : 10, + CUBRID_STMT_DROP_LABEL : 11, + CUBRID_STMT_DROP_TRIGGER : 12, + CUBRID_STMT_DROP_SERIAL : 13, + CUBRID_STMT_EVALUATE : 14, + CUBRID_STMT_RENAME_CLASS : 15, + CUBRID_STMT_ROLLBACK_WORK : 16, + CUBRID_STMT_GRANT : 17, + CUBRID_STMT_REVOKE : 18, + CUBRID_STMT_STATISTICS : 19, + CUBRID_STMT_INSERT : 20, + CUBRID_STMT_SELECT : 21, + CUBRID_STMT_UPDATE : 22, + CUBRID_STMT_DELETE : 23, + CUBRID_STMT_CALL : 24, + CUBRID_STMT_GET_ISO_LVL : 25, + CUBRID_STMT_GET_TIMEOUT : 26, + CUBRID_STMT_GET_OPT_LVL : 27, + CUBRID_STMT_SET_OPT_LVL : 28, + CUBRID_STMT_SCOPE : 29, + CUBRID_STMT_GET_TRIGGER : 30, + CUBRID_STMT_SET_TRIGGER : 31, + CUBRID_STMT_SAVEPOINT : 32, + CUBRID_STMT_PREPARE : 33, + CUBRID_STMT_ATTACH : 34, + CUBRID_STMT_USE : 35, + CUBRID_STMT_REMOVE_TRIGGER : 36, + CUBRID_STMT_RENAME_TRIGGER : 37, + CUBRID_STMT_ON_LDB : 38, + CUBRID_STMT_GET_LDB : 39, + CUBRID_STMT_SET_LDB : 40, + CUBRID_STMT_GET_STATS : 41, + CUBRID_STMT_CREATE_USER : 42, + CUBRID_STMT_DROP_USER : 43, + CUBRID_STMT_ALTER_USER : 44, + CUBRID_STMT_CALL_SP : 0x7e, + CUBRID_STMT_UNKNOWN : 0x7f }; /** * Define CUBRID Isolation levels constants */ exports.CUBRIDIsolationLevel = { - TRAN_UNKNOWN_ISOLATION : 0x00, - TRAN_COMMIT_CLASS_UNCOMMIT_INSTANCE : 0x01, - TRAN_COMMIT_CLASS_COMMIT_INSTANCE : 0x02, - TRAN_REP_CLASS_UNCOMMIT_INSTANCE : 0x03, - TRAN_REP_CLASS_COMMIT_INSTANCE : 0x04, - TRAN_REP_CLASS_REP_INSTANCE : 0x05, - TRAN_SERIALIZABLE : 0x06, - TRAN_DEFAULT_ISOLATION : 0x01 + TRAN_UNKNOWN_ISOLATION : 0x00, + TRAN_COMMIT_CLASS_UNCOMMIT_INSTANCE : 0x01, + TRAN_COMMIT_CLASS_COMMIT_INSTANCE : 0x02, + TRAN_REP_CLASS_UNCOMMIT_INSTANCE : 0x03, + TRAN_REP_CLASS_COMMIT_INSTANCE : 0x04, + TRAN_REP_CLASS_REP_INSTANCE : 0x05, + TRAN_SERIALIZABLE : 0x06, + TRAN_DEFAULT_ISOLATION : 0x01 }; /** * Define CUBRID Data types constants */ exports.CUBRIDDataType = { - CCI_U_TYPE_UNKNOWN : 0, - CCI_U_TYPE_NULL : 0, - CCI_U_TYPE_CHAR : 1, - CCI_U_TYPE_STRING : 2, - CCI_U_TYPE_NCHAR : 3, - CCI_U_TYPE_VARNCHAR : 4, - CCI_U_TYPE_BIT : 5, - CCI_U_TYPE_VARBIT : 6, - CCI_U_TYPE_NUMERIC : 7, - CCI_U_TYPE_INT : 8, - CCI_U_TYPE_SHORT : 9, - CCI_U_TYPE_MONETARY : 10, - CCI_U_TYPE_FLOAT : 11, - CCI_U_TYPE_DOUBLE : 12, - CCI_U_TYPE_DATE : 13, - CCI_U_TYPE_TIME : 14, - CCI_U_TYPE_TIMESTAMP : 15, - CCI_U_TYPE_SET : 16, - CCI_U_TYPE_MULTISET : 17, - CCI_U_TYPE_SEQUENCE : 18, - CCI_U_TYPE_OBJECT : 19, - CCI_U_TYPE_RESULTSET : 20, - CCI_U_TYPE_BIGINT : 21, - CCI_U_TYPE_DATETIME : 22, - CCI_U_TYPE_BLOB : 23, - CCI_U_TYPE_CLOB : 24, - CCI_U_TYPE_ENUM : 25 + CCI_U_TYPE_UNKNOWN : 0, + CCI_U_TYPE_NULL : 0, + CCI_U_TYPE_CHAR : 1, + CCI_U_TYPE_STRING : 2, + CCI_U_TYPE_NCHAR : 3, + CCI_U_TYPE_VARNCHAR : 4, + CCI_U_TYPE_BIT : 5, + CCI_U_TYPE_VARBIT : 6, + CCI_U_TYPE_NUMERIC : 7, + CCI_U_TYPE_INT : 8, + CCI_U_TYPE_SHORT : 9, + CCI_U_TYPE_MONETARY : 10, + CCI_U_TYPE_FLOAT : 11, + CCI_U_TYPE_DOUBLE : 12, + CCI_U_TYPE_DATE : 13, + CCI_U_TYPE_TIME : 14, + CCI_U_TYPE_TIMESTAMP : 15, + CCI_U_TYPE_SET : 16, + CCI_U_TYPE_MULTISET : 17, + CCI_U_TYPE_SEQUENCE : 18, + CCI_U_TYPE_OBJECT : 19, + CCI_U_TYPE_RESULTSET : 20, + CCI_U_TYPE_BIGINT : 21, + CCI_U_TYPE_DATETIME : 22, + CCI_U_TYPE_BLOB : 23, + CCI_U_TYPE_CLOB : 24, + CCI_U_TYPE_ENUM : 25 }; /** * Convert data type number to data type name */ exports.getCUBRIDDataTypeName = function (type) { - switch (type) { - case this.CUBRIDDataType.CCI_U_TYPE_CHAR: - return 'Char'; - case this.CUBRIDDataType.CCI_U_TYPE_NCHAR: - return 'NChar'; - case this.CUBRIDDataType.CCI_U_TYPE_STRING: - return 'String'; - case this.CUBRIDDataType.CCI_U_TYPE_VARNCHAR: - return 'VarNchar'; - case this.CUBRIDDataType.CCI_U_TYPE_SHORT: - return 'Short'; - case this.CUBRIDDataType.CCI_U_TYPE_INT: - return 'Int'; - case this.CUBRIDDataType.CCI_U_TYPE_BIGINT: - return 'Bigint'; - case this.CUBRIDDataType.CCI_U_TYPE_FLOAT: - return 'Float'; - case this.CUBRIDDataType.CCI_U_TYPE_DOUBLE: - return 'Double'; - case this.CUBRIDDataType.CCI_U_TYPE_MONETARY: - return 'Monetary'; - case this.CUBRIDDataType.CCI_U_TYPE_NUMERIC: - return 'Numeric'; - case this.CUBRIDDataType.CCI_U_TYPE_DATE: - return 'Date'; - case this.CUBRIDDataType.CCI_U_TYPE_TIME: - return 'Time'; - case this.CUBRIDDataType.CCI_U_TYPE_DATETIME: - return 'DateTime'; - case this.CUBRIDDataType.CCI_U_TYPE_TIMESTAMP: - return 'Timestamp'; - case this.CUBRIDDataType.CCI_U_TYPE_OBJECT: - return 'Object'; - case this.CUBRIDDataType.CCI_U_TYPE_BIT: - return 'Bit'; - case this.CUBRIDDataType.CCI_U_TYPE_VARBIT: - return 'Varbit'; - case this.CUBRIDDataType.CCI_U_TYPE_SET: - return 'Set'; - case this.CUBRIDDataType.CCI_U_TYPE_MULTISET: - return 'Multiset'; - case this.CUBRIDDataType.CCI_U_TYPE_SEQUENCE: - return 'Sequence'; - case this.CUBRIDDataType.CCI_U_TYPE_BLOB: - return 'Blob'; - case this.CUBRIDDataType.CCI_U_TYPE_CLOB: - return 'Clob'; - case this.CUBRIDDataType.CCI_U_TYPE_ENUM: - return 'ENUM'; - case this.CUBRIDDataType.CCI_U_TYPE_RESULTSET: - return 'Resultset'; - default: - return 'UNKNOWN'; - } + switch (type) { + case this.CUBRIDDataType.CCI_U_TYPE_CHAR: + return 'Char'; + case this.CUBRIDDataType.CCI_U_TYPE_NCHAR: + return 'NChar'; + case this.CUBRIDDataType.CCI_U_TYPE_STRING: + return 'String'; + case this.CUBRIDDataType.CCI_U_TYPE_VARNCHAR: + return 'VarNchar'; + case this.CUBRIDDataType.CCI_U_TYPE_SHORT: + return 'Short'; + case this.CUBRIDDataType.CCI_U_TYPE_INT: + return 'Int'; + case this.CUBRIDDataType.CCI_U_TYPE_BIGINT: + return 'Bigint'; + case this.CUBRIDDataType.CCI_U_TYPE_FLOAT: + return 'Float'; + case this.CUBRIDDataType.CCI_U_TYPE_DOUBLE: + return 'Double'; + case this.CUBRIDDataType.CCI_U_TYPE_MONETARY: + return 'Monetary'; + case this.CUBRIDDataType.CCI_U_TYPE_NUMERIC: + return 'Numeric'; + case this.CUBRIDDataType.CCI_U_TYPE_DATE: + return 'Date'; + case this.CUBRIDDataType.CCI_U_TYPE_TIME: + return 'Time'; + case this.CUBRIDDataType.CCI_U_TYPE_DATETIME: + return 'DateTime'; + case this.CUBRIDDataType.CCI_U_TYPE_TIMESTAMP: + return 'Timestamp'; + case this.CUBRIDDataType.CCI_U_TYPE_OBJECT: + return 'Object'; + case this.CUBRIDDataType.CCI_U_TYPE_BIT: + return 'Bit'; + case this.CUBRIDDataType.CCI_U_TYPE_VARBIT: + return 'Varbit'; + case this.CUBRIDDataType.CCI_U_TYPE_SET: + return 'Set'; + case this.CUBRIDDataType.CCI_U_TYPE_MULTISET: + return 'Multiset'; + case this.CUBRIDDataType.CCI_U_TYPE_SEQUENCE: + return 'Sequence'; + case this.CUBRIDDataType.CCI_U_TYPE_BLOB: + return 'Blob'; + case this.CUBRIDDataType.CCI_U_TYPE_CLOB: + return 'Clob'; + case this.CUBRIDDataType.CCI_U_TYPE_ENUM: + return 'ENUM'; + case this.CUBRIDDataType.CCI_U_TYPE_RESULTSET: + return 'Resultset'; + default: + return 'UNKNOWN'; + } }; /** * Convert data type name to data type number */ exports.getCUBRIDDataTypeNumber = function (type) { - type = type.toLowerCase(); - switch (type) { - case 'char': - return this.CUBRIDDataType.CCI_U_TYPE_CHAR; - case 'varchar': - return this.CUBRIDDataType.CCI_U_TYPE_STRING; - case 'nchar': - return this.CUBRIDDataType.CCI_U_TYPE_NCHAR; - case 'string': - return this.CUBRIDDataType.CCI_U_TYPE_STRING; - case 'varnchar': - return this.CUBRIDDataType.CCI_U_TYPE_VARNCHAR; - case 'short': - return this.CUBRIDDataType.CCI_U_TYPE_SHORT; - case 'int': - return this.CUBRIDDataType.CCI_U_TYPE_INT; - case 'bigint': - return this.CUBRIDDataType.CCI_U_TYPE_BIGINT; - case 'float': - return this.CUBRIDDataType.CCI_U_TYPE_FLOAT; - case 'double': - return this.CUBRIDDataType.CCI_U_TYPE_DOUBLE; - case 'monetary': - return this.CUBRIDDataType.CCI_U_TYPE_MONETARY; - case 'numeric': - return this.CUBRIDDataType.CCI_U_TYPE_NUMERIC; - case 'date': - return this.CUBRIDDataType.CCI_U_TYPE_DATE; - case 'time': - return this.CUBRIDDataType.CCI_U_TYPE_TIME; - case 'datetime': - return this.CUBRIDDataType.CCI_U_TYPE_DATETIME; - case 'timestamp': - return this.CUBRIDDataType.CCI_U_TYPE_TIMESTAMP; - case 'object': - return this.CUBRIDDataType.CCI_U_TYPE_OBJECT; - case 'bit': - return this.CUBRIDDataType.CCI_U_TYPE_BIT; - case 'varbit': - return this.CUBRIDDataType.CCI_U_TYPE_VARBIT; - case 'set': - return this.CUBRIDDataType.CCI_U_TYPE_SET; - case 'multiset': - return this.CUBRIDDataType.CCI_U_TYPE_MULTISET; - case 'sequence': - return this.CUBRIDDataType.CCI_U_TYPE_SEQUENCE; - case 'blob': - return this.CUBRIDDataType.CCI_U_TYPE_BLOB; - case 'clob': - return this.CUBRIDDataType.CCI_U_TYPE_CLOB; - case 'resultset': - return this.CUBRIDDataType.CCI_U_TYPE_RESULTSET; - default: - return this.CUBRIDDataType.CCI_U_TYPE_UNKNOWN; - } + type = type.toLowerCase(); + switch (type) { + case 'char': + return this.CUBRIDDataType.CCI_U_TYPE_CHAR; + case 'varchar': + return this.CUBRIDDataType.CCI_U_TYPE_STRING; + case 'nchar': + return this.CUBRIDDataType.CCI_U_TYPE_NCHAR; + case 'string': + return this.CUBRIDDataType.CCI_U_TYPE_STRING; + case 'varnchar': + return this.CUBRIDDataType.CCI_U_TYPE_VARNCHAR; + case 'short': + return this.CUBRIDDataType.CCI_U_TYPE_SHORT; + case 'int': + return this.CUBRIDDataType.CCI_U_TYPE_INT; + case 'bigint': + return this.CUBRIDDataType.CCI_U_TYPE_BIGINT; + case 'float': + return this.CUBRIDDataType.CCI_U_TYPE_FLOAT; + case 'double': + return this.CUBRIDDataType.CCI_U_TYPE_DOUBLE; + case 'monetary': + return this.CUBRIDDataType.CCI_U_TYPE_MONETARY; + case 'numeric': + return this.CUBRIDDataType.CCI_U_TYPE_NUMERIC; + case 'date': + return this.CUBRIDDataType.CCI_U_TYPE_DATE; + case 'time': + return this.CUBRIDDataType.CCI_U_TYPE_TIME; + case 'datetime': + return this.CUBRIDDataType.CCI_U_TYPE_DATETIME; + case 'timestamp': + return this.CUBRIDDataType.CCI_U_TYPE_TIMESTAMP; + case 'object': + return this.CUBRIDDataType.CCI_U_TYPE_OBJECT; + case 'bit': + return this.CUBRIDDataType.CCI_U_TYPE_BIT; + case 'varbit': + return this.CUBRIDDataType.CCI_U_TYPE_VARBIT; + case 'set': + return this.CUBRIDDataType.CCI_U_TYPE_SET; + case 'multiset': + return this.CUBRIDDataType.CCI_U_TYPE_MULTISET; + case 'sequence': + return this.CUBRIDDataType.CCI_U_TYPE_SEQUENCE; + case 'blob': + return this.CUBRIDDataType.CCI_U_TYPE_BLOB; + case 'clob': + return this.CUBRIDDataType.CCI_U_TYPE_CLOB; + case 'resultset': + return this.CUBRIDDataType.CCI_U_TYPE_RESULTSET; + default: + return this.CUBRIDDataType.CCI_U_TYPE_UNKNOWN; + } }; /** * Define CUBRID Schema type constants */ exports.CUBRIDSchemaType = { - CCI_SCH_CLASS : 1, - CCI_SCH_VCLASS : 2, - CCI_SCH_QUERY_SPEC : 3, - CCI_SCH_ATTRIBUTE : 4, - CCI_SCH_CLASS_ATTRIBUTE : 5, - CCI_SCH_METHOD : 6, - CCI_SCH_CLASS_METHOD : 7, - CCI_SCH_METHOD_FILE : 8, - CCI_SCH_SUPERCLASS : 9, - CCI_SCH_SUBCLASS : 10, - CCI_SCH_CONSTRAIT : 11, - CCI_SCH_TRIGGER : 12, - CCI_SCH_CLASS_PRIVILEGE : 13, - CCI_SCH_ATTR_PRIVILEGE : 14, - CCI_SCH_DIRECT_SUPER_CLASS : 15, - CCI_SCH_PRIMARY_KEY : 16, - CCI_SCH_IMPORTED_KEYS : 17, - CCI_SCH_EXPORTED_KEYS : 18, - CCI_SCH_CROSS_REFERENCE : 19 + CCI_SCH_CLASS : 1, + CCI_SCH_VCLASS : 2, + CCI_SCH_QUERY_SPEC : 3, + CCI_SCH_ATTRIBUTE : 4, + CCI_SCH_CLASS_ATTRIBUTE : 5, + CCI_SCH_METHOD : 6, + CCI_SCH_CLASS_METHOD : 7, + CCI_SCH_METHOD_FILE : 8, + CCI_SCH_SUPERCLASS : 9, + CCI_SCH_SUBCLASS : 10, + CCI_SCH_CONSTRAIT : 11, + CCI_SCH_TRIGGER : 12, + CCI_SCH_CLASS_PRIVILEGE : 13, + CCI_SCH_ATTR_PRIVILEGE : 14, + CCI_SCH_DIRECT_SUPER_CLASS : 15, + CCI_SCH_PRIMARY_KEY : 16, + CCI_SCH_IMPORTED_KEYS : 17, + CCI_SCH_EXPORTED_KEYS : 18, + CCI_SCH_CROSS_REFERENCE : 19 }; /** * Define CUBRID Prepare statement constants */ exports.CCIPrepareOption = { - CCI_PREPARE_NORMAL : 0x00, - CCI_PREPARE_INCLUDE_OID : 0x01, - CCI_PREPARE_UPDATABLE : 0x02, - CCI_PREPARE_QUERY_INFO : 0x04, - CCI_PREPARE_HOLDABLE : 0x08, - CCI_PREPARE_CALL : 0x40 + CCI_PREPARE_NORMAL : 0x00, + CCI_PREPARE_INCLUDE_OID : 0x01, + CCI_PREPARE_UPDATABLE : 0x02, + CCI_PREPARE_QUERY_INFO : 0x04, + CCI_PREPARE_HOLDABLE : 0x08, + CCI_PREPARE_CALL : 0x40 }; /** * Define CUBRID OID commands constants */ exports.OidCommand = { - DROP_BY_OID : 1, - IS_INSTANCE : 2, - GET_READ_LOCK_BY_OID : 3, - GET_WRITE_LOCK_BY_OID : 4, - GET_CLASS_NAME_BY_OID : 5 + DROP_BY_OID : 1, + IS_INSTANCE : 2, + GET_READ_LOCK_BY_OID : 3, + GET_WRITE_LOCK_BY_OID : 4, + GET_CLASS_NAME_BY_OID : 5 }; /** * Define CUBRID Transaction type constants */ exports.CCITransactionType = { - CCI_TRAN_COMMIT : 1, - CCI_TRAN_ROLLBACK : 2 + CCI_TRAN_COMMIT : 1, + CCI_TRAN_ROLLBACK : 2 }; /** * Define CUBRID Database parameters constants */ exports.CCIDbParam = { - CCI_PARAM_ISOLATION_LEVEL : 1, - CCI_PARAM_LOCK_TIMEOUT : 2, - CCI_PARAM_MAX_STRING_LENGTH : 3, - CCI_PARAM_AUTO_COMMIT : 4 + CCI_PARAM_ISOLATION_LEVEL : 1, + CCI_PARAM_LOCK_TIMEOUT : 2, + CCI_PARAM_MAX_STRING_LENGTH : 3, + CCI_PARAM_AUTO_COMMIT : 4 }; /** * Define CUBRID Collection-related commands constants */ exports.CUBRIDCollectionCommand = { - GET_COLLECTION_VALUE : 1, - GET_SIZE_OF_COLLECTION : 2, - DROP_ELEMENT_IN_SET : 3, - ADD_ELEMENT_TO_SET : 4, - DROP_ELEMENT_IN_SEQUENCE : 5, - INSERT_ELEMENT_INTO_SEQUENCE : 6, - PUT_ELEMENT_ON_SEQUENCE : 7 + GET_COLLECTION_VALUE : 1, + GET_SIZE_OF_COLLECTION : 2, + DROP_ELEMENT_IN_SET : 3, + ADD_ELEMENT_TO_SET : 4, + DROP_ELEMENT_IN_SEQUENCE : 5, + INSERT_ELEMENT_INTO_SEQUENCE : 6, + PUT_ELEMENT_ON_SEQUENCE : 7 }; /** * Define CUBRID Connection status constants */ exports.ConnectionStatus = { - CON_STATUS_OUT_TRAN : 0, - CON_STATUS_IN_TRAN : 1, - CON_STATUS_CLOSE : 2, - CON_STATUS_CLOSE_AND_CONNECT : 3 + CON_STATUS_OUT_TRAN : 0, + CON_STATUS_IN_TRAN : 1, + CON_STATUS_CLOSE : 2, + CON_STATUS_CLOSE_AND_CONNECT : 3 }; /** * Define CUBRID Cursor position constants */ exports.CCICursorPosition = { - CCI_CURSOR_FIRST : 0, - CCI_CURSOR_CURRENT : 1, - CCI_CURSOR_LAST : 2 + CCI_CURSOR_FIRST : 0, + CCI_CURSOR_CURRENT : 1, + CCI_CURSOR_LAST : 2 }; /** * Define CUBRID Statement execution type constants */ exports.StmtType = { - NORMAL : 0, - GET_BY_OID : 1, - GET_SCHEMA_INFO : 2, - GET_AUTOINCREMENT_KEYS : 3 + NORMAL : 0, + GET_BY_OID : 1, + GET_SCHEMA_INFO : 2, + GET_AUTOINCREMENT_KEYS : 3 }; /** * Define CUBRID Query execution constants */ exports.QueryExecutionMode = { - SYNC_EXEC : 0, - ASYNC_EXEC : 1 + SYNC_EXEC : 0, + ASYNC_EXEC : 1 }; /** * Define CUBRID Statement execution constants */ exports.CCIExecutionOption = { - CCI_EXEC_NORMAL : 0x00, - CCI_EXEC_ASYNC : 0x01, - CCI_EXEC_QUERY_ALL : 0x02, - CCI_EXEC_QUERY_INFO : 0x04, - CCI_EXEC_ONLY_QUERY_PLAN : 0x08, - CCI_EXEC_THREAD : 0x10, - CCI_EXEC_HOLDABLE : 0x20 + CCI_EXEC_NORMAL : 0x00, + CCI_EXEC_ASYNC : 0x01, + CCI_EXEC_QUERY_ALL : 0x02, + CCI_EXEC_QUERY_INFO : 0x04, + CCI_EXEC_ONLY_QUERY_PLAN : 0x08, + CCI_EXEC_THREAD : 0x10, + CCI_EXEC_HOLDABLE : 0x20 }; /** * Define CUBRID Schema pattern match flags */ exports.CCISchemaPatternMatchFlag = { - CCI_CLASS_NAME_PATTERN_MATCH : 0X01, - CCI_ATTR_NAME_PATTERN_MATCH : 0X02 + CCI_CLASS_NAME_PATTERN_MATCH : 0X01, + CCI_ATTR_NAME_PATTERN_MATCH : 0X02 }; /** * Define CUBRID LOB types */ exports.CCILOBType = { - CCI_LOB_TYPE_BLOB : 33, - CCI_LOB_TYPE_CLOB : 34 + CCI_LOB_TYPE_BLOB : 33, + CCI_LOB_TYPE_CLOB : 34 +}; + + +/* CAS Protocol constants */ +/** + * Define the supported protocol version + * The protocol version is validated by the CUBRID broker, + * to assess the compatibility level with the CUBRID engine. + */ +const CAS_PROTO_INDICATOR = 0x40; + +exports.CAS_PROTOCOL_VERSION = (function getProtocolVersion() { + // const CAS_PROTOCOL_VERSION_1 = /* since 8.4.1 */1; + // const CAS_PROTOCOL_VERSION_2 = /* since 9.0.0 */2; + // const CAS_PROTOCOL_VERSION_3 = /* since 8.4.3 */3; + // const CAS_PROTOCOL_VERSION_4 = /* since 9.1.0 */4; + // const CAS_PROTOCOL_VERSION_5 = /* since 9.2.0 */5; + const CAS_PROTOCOL_VERSION_6 = /* since 9.2.26 */6; + + return CAS_PROTOCOL_VERSION_6; +})(); + +exports.CAS_VERSION = CAS_PROTO_INDICATOR | exports.CAS_PROTOCOL_VERSION; + +// JDBC client type +exports.CAS_CLIENT_JDBC = 3; +// This value is defined in `broker/cas_protocol.h`. +exports.CAS_MAGIC_STRING = 'CUBRK'; + +exports.getProtocolVersion = function (version) { + // At this moment `node-cubrid` supports at most protocol version 6. + for (let protocolVersion = 0; protocolVersion < 7; ++protocolVersion) { + if ((CAS_PROTO_INDICATOR | protocolVersion) === version) { + return protocolVersion; + } + } + + // By default fall back to the latest version we support. + return exports.CAS_PROTOCOL_VERSION; }; diff --git a/src/constants/DriverVersion.js b/src/constants/DriverVersion.js deleted file mode 100644 index cce9fa2..0000000 --- a/src/constants/DriverVersion.js +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Define the supported protocol version - * The protocol version is validated by the CUBRID broker, - * to assess the compatibility level with the CUBRID engine. - */ -var CAS_PROTO_INDICATOR = 0x40; -var CAS_PROTOCOL_VERSION = 0x01; - -exports.CAS_VER = CAS_PROTO_INDICATOR | CAS_PROTOCOL_VERSION; diff --git a/src/constants/ErrorMessages.js b/src/constants/ErrorMessages.js index 9c8f512..100ecd8 100644 --- a/src/constants/ErrorMessages.js +++ b/src/constants/ErrorMessages.js @@ -2,54 +2,61 @@ * Define CUBRID internal error messages and custom driver error messages */ -exports.ERROR_NEW_BROKER_PORT = 'Error receiving a new connection port!'; -exports.ERROR_CONNECTION_ALREADY_OPENED = 'The connection is already opened! - denying a second connection request.'; -exports.ERROR_CONNECTION_ALREADY_PENDING = 'A connection is already in progress! - denying current connection request.'; -exports.ERROR_CONNECTION_ALREADY_CLOSED = 'The connection is already closed!'; -exports.ERROR_NO_ACTIVE_QUERY = 'No active query with this handle!'; -exports.ERROR_NO_ROLLBACK = 'AutoCommitMode is enabled! - denying rollback request.'; -exports.ERROR_NO_COMMIT = 'AutoCommitMode is enabled! - denying commit request.'; +exports.ERROR_NEW_BROKER_PORT = 'Error receiving a new connection port.'; +exports.ERROR_CONNECTION_ALREADY_OPENED = 'The connection is already opened: denying a second connection request.'; +exports.ERROR_CONNECTION_ALREADY_PENDING = 'A connection is already in progress: denying current connection request.'; +exports.ERROR_CONNECTION_ALREADY_CLOSED = 'The connection is already closed.'; +exports.ERROR_MULTIPLE_QUERIES = 'Multiple queries are not supported when using the old prepare-execute protocol.'; +exports.ERROR_NO_ACTIVE_QUERY = 'No active query with this handle.'; +exports.ERROR_NO_ROLLBACK = 'AutoCommitMode is enabled: denying rollback request.'; +exports.ERROR_AUTO_COMMIT_ENABLED_COMMIT = 'AutoCommitMode is enabled: denying commit request.'; exports.ERROR_ON_CLOSE_QUERY_HANDLE = 'Error closing request: '; exports.ERROR_INPUT_VALIDATION = 'Error validating input parameters.'; -exports.ERROR_INVALID_DATA_TYPE = 'Error:Invalid data type.'; -exports.ERROR_INVALID_SCHEMA_TYPE = 'Error:Invalid schema type.'; -exports.ERROR_INVALID_LOB_POSITION = 'Error: Invalid LOB position'; -exports.ERROR_INVALID_LOB_TYPE = 'Error: Invalid LOB type'; +exports.ERROR_INVALID_DATA_TYPE = 'Invalid data type.'; +exports.ERROR_INVALID_SCHEMA_TYPE = 'Invalid schema type.'; +exports.ERROR_INVALID_LOB_POSITION = 'Invalid LOB position.'; +exports.ERROR_INVALID_LOB_TYPE = 'Invalid LOB type.'; +exports.ERROR_INVALID_LOB_DATA = 'Invalid LOB data: must be a string or Buffer.'; // Set the same timeout error message as emitted by Node.js socket client. exports.ERROR_CONNECTION_TIMEOUT = 'connect ETIMEDOUT'; -exports.ERROR_CONNECTION_CLOSED = 'Connection not opened!'; -exports.ERROR_QUERIES_IN_PROGRESS = 'Can\'t close the connection - there are queries in execution!'; -exports.ERROR_QUERY_NOT_FOUND = 'Query not found in queue!'; +exports.ERROR_CLOSED_CONNECTION_COMMIT = 'Cannot commit on a closed/offline connection.'; +exports.ERROR_QUERIES_IN_PROGRESS = "Cannot close the connection: there are queries in execution."; -exports.CASErrorMsgId = [ - ['CAS_ER_DBMS' , -1000], - ['CAS_ER_INTERNAL' , -1001], - ['CAS_ER_NO_MORE_MEMORY' , -1002], - ['CAS_ER_COMMUNICATION' , -1003], - ['CAS_ER_ARGS' , -1004], - ['CAS_ER_TRAN_TYPE' , -1005], - ['CAS_ER_SRV_HANDLE' , -1006], - ['CAS_ER_NUM_BIND' , -1007], - ['CAS_ER_UNKNOWN_U_TYPE' , -1008], - ['CAS_ER_DB_VALUE' , -1009], - ['CAS_ER_TYPE_CONVERSION' , -1010], - ['CAS_ER_PARAM_NAME' , -1011], - ['CAS_ER_NO_MORE_DATA' , -1012], - ['CAS_ER_OBJECT' , -1013], - ['CAS_ER_OPEN_FILE' , -1014], - ['CAS_ER_SCHEMA_TYPE' , -1015], - ['CAS_ER_VERSION' , -1016], - ['CAS_ER_FREE_SERVER' , -1017], - ['CAS_ER_NOT_AUTHORIZED_CLIENT' , -1018], - ['CAS_ER_QUERY_CANCEL' , -1019], - ['CAS_ER_NOT_COLLECTION' , -1020], - ['CAS_ER_COLLECTION_DOMAIN' , -1021], - ['CAS_ER_NO_MORE_RESULT_SET' , -1022], - ['CAS_ER_INVALID_CALL_STMT' , -1023], - ['CAS_ER_STMT_POOLING' , -1024], - ['CAS_ER_DBSERVER_DISCONNECTED' , -1025], - ['CAS_ER_MAX_PREPARED_STMT_COUNT_EXCEEDED' , -1026], - ['CAS_ER_HOLDABLE_NOT_ALLOWED' , -1027], - ['CAS_ER_NOT_IMPLEMENTED' , -1100], - ['CAS_ER_IS' , -1200] -]; +exports.CASErrorMsgId = { + '-1000': 'CAS_ER_DBMS', + '-1001': 'CAS_ER_INTERNAL', + '-1002': 'CAS_ER_NO_MORE_MEMORY', + '-1003': 'CAS_ER_COMMUNICATION', + '-1004': 'CAS_ER_ARGS', + '-1005': 'CAS_ER_TRAN_TYPE', + '-1006': 'CAS_ER_SRV_HANDLE', + /* CUBRID 9.0.0 returns a different error code for the same error. */ + '-10007': 'CAS_ER_NUM_BIND', + '-1007': 'CAS_ER_NUM_BIND', + '-1008': 'CAS_ER_UNKNOWN_U_TYPE', + '-1009': 'CAS_ER_DB_VALUE', + '-1010': 'CAS_ER_TYPE_CONVERSION', + '-1011': 'CAS_ER_PARAM_NAME', + '-1012': 'CAS_ER_NO_MORE_DATA', + '-1013': 'CAS_ER_OBJECT', + '-1014': 'CAS_ER_OPEN_FILE', + '-1015': 'CAS_ER_SCHEMA_TYPE', + '-1016': 'CAS_ER_VERSION', + '-1017': 'CAS_ER_FREE_SERVER', + '-1018': 'CAS_ER_NOT_AUTHORIZED_CLIENT', + '-1019': 'CAS_ER_QUERY_CANCEL', + '-1020': 'CAS_ER_NOT_COLLECTION', + '-1021': 'CAS_ER_COLLECTION_DOMAIN', + '-1022': 'CAS_ER_NO_MORE_RESULT_SET', + '-1023': 'CAS_ER_INVALID_CALL_STMT', + '-1024': 'CAS_ER_STMT_POOLING', + '-1025': 'CAS_ER_DBSERVER_DISCONNECTED', + '-1026': 'CAS_ER_MAX_PREPARED_STMT_COUNT_EXCEEDED', + '-1027': 'CAS_ER_HOLDABLE_NOT_ALLOWED', + '-1100': 'CAS_ER_NOT_IMPLEMENTED', + '-1200': 'CAS_ER_IS', +}; + +exports.resolveErrorCode = function (errorCode) { + return exports.CASErrorMsgId['' + errorCode]; +}; diff --git a/src/cubrid.js b/src/cubrid.js deleted file mode 100644 index 49e971a..0000000 --- a/src/cubrid.js +++ /dev/null @@ -1,44 +0,0 @@ -var _CUBRIDConnection = require('./CUBRIDConnection.js'); -var _Helpers = require('./utils/Helpers.js'); -var _Result2Array = require('./resultset/Result2Array.js'); -var _ActionQueue = require('./utils/ActionQueue.js'); - -/** - * Helper functions - * @type {*} - */ -exports.Helpers = _Helpers; -/** - * Resultset utility functions - * @type {*} - */ -exports.Result2Array = _Result2Array; -/** - * ActionQueue utility functions - * @type {*} - */ -exports.ActionQueue = _ActionQueue; -/** - * Creates a new connection to the demodb database, using the default parameters - * @type {CUBRIDConnection} - */ -exports.createDefaultCUBRIDDemodbConnection = function () { - return new _CUBRIDConnection('localhost', 33000, 'public', '', 'demodb'); -}; - -/** - * Creates a new CUBRID connection. This function creates a new instance of - * CUBRIDConnection, however doesn't establish actual connection with the - * broker. - * - * @alias createClient, createConnection - * @param brokerServer - * @param brokerPort - * @param user - * @param password - * @param database - * @return {CUBRIDConnection} - */ -exports.createConnection = exports.createCUBRIDConnection = function (brokerServer, brokerPort, user, password, database) { - return new _CUBRIDConnection(brokerServer, brokerPort, user, password, database); -}; diff --git a/src/packets/BatchExecuteNoQueryPacket.js b/src/packets/BatchExecuteNoQueryPacket.js index cfa74df..3eeee76 100644 --- a/src/packets/BatchExecuteNoQueryPacket.js +++ b/src/packets/BatchExecuteNoQueryPacket.js @@ -1,27 +1,16 @@ -var DATA_TYPES = require('../constants/DataTypes'), - Helpers = require('../utils/Helpers'), - CAS = require('../constants/CASConstants'); +'use strict'; -module.exports = BatchExecuteNoQueryPacket; +const CAS = require('../constants/CASConstants'); +const DATA_TYPES = require('../constants/DataTypes'); /** * Constructor * @constructor */ function BatchExecuteNoQueryPacket(options) { - options = options || {}; - - this.SQLs = options.SQLs; - this.casInfo = options.casInfo; - this.autoCommit = options.autoCommitMode; - this.dbVersion = options.dbVersion; - - this.responseCode = 0; - this.errorCode = 0; - this.errorMsg = ''; + this.options = options; - this.arrResultsCode = []; - this.arrResultsMsg = []; + typeof options.timeout === 'undefined' && (options.timeout = 0); } /** @@ -29,15 +18,23 @@ function BatchExecuteNoQueryPacket(options) { * @param writer */ BatchExecuteNoQueryPacket.prototype.write = function (writer) { - writer._writeInt(this.getBufferLength() - DATA_TYPES.DATA_LENGTH_SIZEOF - DATA_TYPES.CAS_INFO_SIZE); - writer._writeBytes(DATA_TYPES.CAS_INFO_SIZE, this.casInfo); + const options = this.options; + const logger = options.logger; + + writer._writeInt(this.getBufferLength() - DATA_TYPES.DATA_LENGTH_SIZEOF - DATA_TYPES.CAS_INFO_SIZE); + writer._writeBytes(options.casInfo); writer._writeByte(CAS.CASFunctionCode.CAS_FC_EXECUTE_BATCH); - writer._writeInt(DATA_TYPES.BYTE_SIZEOF); - writer._writeByte(this.autoCommit ? 1 : 0); // Auto-commit mode value + writer.addByte(options.autoCommit ? 1 : 0); + + logger.debug(`BatchExecuteNoQueryPacket.parse: autoCommit = ${options.autoCommit}.`); - // For every sql statement in the batch - for (var j = 0; j < this.SQLs.length; j++) { - writer._writeNullTerminatedString(this.SQLs[j]); // SQL strings to be executed + if (options.protocolVersion > 3) { + writer.addInt(options.timeout); + } + + // Write every sql statement in the batch. + for (let i = 0, sqls = options.sqls, len = sqls.length; i < len; ++i) { + writer._writeNullTerminatedString(sqls[i]); } return writer; @@ -48,69 +45,84 @@ BatchExecuteNoQueryPacket.prototype.write = function (writer) { * @param parser */ BatchExecuteNoQueryPacket.prototype.parse = function (parser) { - var responseLength = parser._parseInt(), - errCode = 0; + const options = this.options; + const logger = options.logger; + const responseLength = parser._parseInt(); + + logger.debug(`BatchExecuteNoQueryPacket.parse: responseLength = ${responseLength}.`); this.casInfo = parser._parseBytes(DATA_TYPES.CAS_INFO_SIZE); this.responseCode = parser._parseInt(); if (this.responseCode < 0) { - this.errorCode = parser._parseInt(); - this.errorMsg = parser._parseNullTerminatedString(responseLength - 2 * DATA_TYPES.INT_SIZEOF); - - if (this.errorMsg.length === 0) { - this.errorMsg = Helpers._resolveErrorCode(this.errorCode); - } - } else { - this.executedCount = parser._parseInt(); + // CUBRID Broker/CAS error has occurred, not an SQL error. + // In such a case, CAS returns only the error code. + // We have a mapping to the actual error message here. - for (var i = 0; i < this.executedCount; i++) { - parser._parseByte(); //not used + return parser.readError(responseLength); + } - var result = parser._parseInt(); + this.executedCount = parser._parseInt(); + this.errors = []; + this.results = []; - if (result < 0) { - if (this.dbVersion.startsWith('8.4.3')) { - errCode = parser._parseInt(); - this.arrResultsCode.push(errCode); - } else { - this.arrResultsCode.push(result); - } + for (let i = 0; i < this.executedCount; ++i) { + // Statement Type: one of `CUBRIDStatementType`. Not used. + parser._parseByte(); + let result = parser._parseInt(); - var errMsgLength = parser._parseInt(), - errMsg = parser._parseNullTerminatedString(errMsgLength); + if (result < 0) { + // An SQL error has occurred. CAS sends the actual + // error message. + let error = new Error(); - this.arrResultsMsg.push(errMsg); + if (options.protocolVersion > 2) { + error.code = parser._parseInt(); } else { - this.arrResultsCode.push(result); - this.arrResultsMsg.push(''); - - parser._parseInt(); // Not used - parser._parseShort(); // Not used - parser._parseShort(); // Not used + error.code = result; } + + error.message = parser._parseNullTerminatedString(/* error message length */ parser._parseInt()); + + this.errors.push(error); + } else { + // The number of changes. + this.results.push(result); + + parser._parseInt(); // Not used + parser._parseShort(); // Not used + parser._parseShort(); // Not used } } - return this; + if (options.protocolVersion > 4) { + this.lastShardId = parser._parseInt(); + } }; BatchExecuteNoQueryPacket.prototype.getBufferLength = function () { - var bufferLength = - DATA_TYPES.DATA_LENGTH_SIZEOF + - DATA_TYPES.CAS_INFO_SIZE + - DATA_TYPES.BYTE_SIZEOF + - DATA_TYPES.INT_SIZEOF + - DATA_TYPES.BYTE_SIZEOF + - // The length of all queries. - DATA_TYPES.INT_SIZEOF * this.SQLs.length + - // The number of NULL terminating characters: one for each query. - this.SQLs.length; - - for (var i = 0; i < this.SQLs.length; ++i) { - bufferLength += Buffer.byteLength(this.SQLs[i]); - } - - return bufferLength; + const options = this.options; + const sqls = options.sqls; + const len = sqls.length; + + let bufferLength = + DATA_TYPES.DATA_LENGTH_SIZEOF + + DATA_TYPES.CAS_INFO_SIZE + + DATA_TYPES.BYTE_SIZEOF + + DATA_TYPES.INT_SIZEOF + + DATA_TYPES.BYTE_SIZEOF + + (options.protocolVersion > 3 ? DATA_TYPES.INT_SIZEOF * 2 : 0) + + // The length of all queries. + DATA_TYPES.INT_SIZEOF * len + + // The number of NULL terminating characters: one for each query. + len; + + for (let i = 0; i < len; ++i) { + bufferLength += Buffer.byteLength(sqls[i]); + } + + return bufferLength; }; + +module.exports = BatchExecuteNoQueryPacket; diff --git a/src/packets/ClientInfoExchangePacket.js b/src/packets/ClientInfoExchangePacket.js index 386adc6..048e094 100644 --- a/src/packets/ClientInfoExchangePacket.js +++ b/src/packets/ClientInfoExchangePacket.js @@ -1,7 +1,7 @@ -var DRIVER_VERSION = require('../constants/DriverVersion'), - DATA_TYPES = require('../constants/DataTypes'); +'use strict'; -module.exports = ClientInfoExchangePacket; +const CASConstants = require('../constants/CASConstants'); +const DATA_TYPES = require('../constants/DataTypes'); /** * Constructor @@ -16,12 +16,13 @@ function ClientInfoExchangePacket() { * @param writer */ ClientInfoExchangePacket.prototype.write = function (writer) { - writer._writeFixedLengthString('CUBRK', 0, 5); - writer._writeByte(3); // 3 = JDBC client type - writer._writeByte(DRIVER_VERSION.CAS_VER); // CAS client/driver version - writer._writeByte(0); - writer._writeByte(0); - writer._writeByte(0); + // Write the driver info which consists of 10 bytes. + writer._writeFixedLengthString(CASConstants.CAS_MAGIC_STRING, 0, CASConstants.CAS_MAGIC_STRING.length); + writer._writeByte(CASConstants.CAS_CLIENT_JDBC); + writer._writeByte(CASConstants.CAS_VERSION); + writer._writeByte(0); // Reserved by the protocol. + writer._writeByte(0); // Reserved by the protocol. + writer._writeByte(0); // Reserved by the protocol. return writer; }; @@ -31,17 +32,18 @@ ClientInfoExchangePacket.prototype.write = function (writer) { * @param parser */ ClientInfoExchangePacket.prototype.parse = function (parser) { - this.newConnectionPort = parser._parseInt(); // (TCP/IP) Port value - - return this; + // (TCP/IP) Port value + this.newConnectionPort = parser._parseInt(); }; ClientInfoExchangePacket.prototype.getBufferLength = function () { - var bufferLength = - // The length of "CUBRK" string. - 5 + - // JDBC client type + CAS version + 0 + 0 + 0. All bytes. - DATA_TYPES.BYTE_SIZEOF * 5; + const bufferLength = + // The length of "CUBRK" string. + CASConstants.CAS_MAGIC_STRING.length + + // JDBC client type + CAS version + 0 + 0 + 0. All bytes. + DATA_TYPES.BYTE_SIZEOF * 5; - return bufferLength; + return bufferLength; }; + +module.exports = ClientInfoExchangePacket; diff --git a/src/packets/CloseDatabasePacket.js b/src/packets/CloseDatabasePacket.js index 75d39bd..cc24dcd 100644 --- a/src/packets/CloseDatabasePacket.js +++ b/src/packets/CloseDatabasePacket.js @@ -1,7 +1,5 @@ -var DATA_TYPES = require('../constants/DataTypes'), - Helpers = require('../utils/Helpers'), - ErrorMessages = require('../constants/ErrorMessages'), - CAS = require('../constants/CASConstants'); +const CAS = require('../constants/CASConstants'); +const DATA_TYPES = require('../constants/DataTypes'); module.exports = CloseDatabasePacket; @@ -16,8 +14,6 @@ function CloseDatabasePacket(options) { this.casInfo = options.casInfo; this.responseCode = 0; - this.errorCode = 0; - this.errorMsg = ''; } /** @@ -26,7 +22,7 @@ function CloseDatabasePacket(options) { */ CloseDatabasePacket.prototype.write = function (writer) { writer._writeInt(this.getBufferLength() - DATA_TYPES.DATA_LENGTH_SIZEOF - DATA_TYPES.CAS_INFO_SIZE); - writer._writeBytes(DATA_TYPES.CAS_INFO_SIZE, this.casInfo); + writer._writeBytes(this.casInfo); writer._writeByte(CAS.CASFunctionCode.CAS_FC_CON_CLOSE); return writer; @@ -37,24 +33,19 @@ CloseDatabasePacket.prototype.write = function (writer) { * @param parser */ CloseDatabasePacket.prototype.parse = function (parser) { - var responseLength = parser._parseInt(); - this.casInfo = parser._parseBytes(DATA_TYPES.CAS_INFO_SIZE); + const responseLength = parser._parseInt(); + this.casInfo = parser._parseBytes(DATA_TYPES.CAS_INFO_SIZE); this.responseCode = parser._parseInt(); + if (this.responseCode < 0) { - this.errorCode = parser._parseInt(); - this.errorMsg = parser._parseNullTerminatedString(responseLength - 2 * DATA_TYPES.INT_SIZEOF); - if (this.errorMsg.length === 0) { - this.errorMsg = Helpers._resolveErrorCode(this.errorCode); - } + return parser.readError(responseLength); } - - return this; }; CloseDatabasePacket.prototype.getBufferLength = function () { - var bufferLength = DATA_TYPES.DATA_LENGTH_SIZEOF + DATA_TYPES.CAS_INFO_SIZE + - DATA_TYPES.BYTE_SIZEOF; + const bufferLength = DATA_TYPES.DATA_LENGTH_SIZEOF + DATA_TYPES.CAS_INFO_SIZE + + DATA_TYPES.BYTE_SIZEOF; - return bufferLength; + return bufferLength; }; diff --git a/src/packets/CloseQueryPacket.js b/src/packets/CloseQueryPacket.js index 381bd8f..bff9a7e 100644 --- a/src/packets/CloseQueryPacket.js +++ b/src/packets/CloseQueryPacket.js @@ -1,7 +1,5 @@ -var DATA_TYPES = require('../constants/DataTypes'), - ErrorMessages = require('../constants/ErrorMessages'), - Helpers = require('../utils/Helpers.js'), - CAS = require('../constants/CASConstants'); +const CAS = require('../constants/CASConstants'); +const DATA_TYPES = require('../constants/DataTypes'); module.exports = CloseQueryPacket; @@ -11,15 +9,12 @@ module.exports = CloseQueryPacket; * @constructor */ function CloseQueryPacket(options) { - options = options || {}; + options = options || {}; - this.casInfo = options.casInfo; - this.reqHandle = options.reqHandle; - this.dbVersion = options.dbVersion; + this.casInfo = options.casInfo; + this.reqHandle = options.reqHandle; - this.responseCode = 0; - this.errorCode = 0; - this.errorMsg = ''; + this.responseCode = 0; } /** @@ -27,17 +22,17 @@ function CloseQueryPacket(options) { * @param writer */ CloseQueryPacket.prototype.write = function (writer) { - var bufferLength = this.getBufferLength(); + var bufferLength = this.getBufferLength(); - writer._writeInt(bufferLength - DATA_TYPES.DATA_LENGTH_SIZEOF - DATA_TYPES.CAS_INFO_SIZE); - writer._writeBytes(DATA_TYPES.CAS_INFO_SIZE, this.casInfo); - writer._writeByte(CAS.CASFunctionCode.CAS_FC_CLOSE_REQ_HANDLE); - writer._writeInt(DATA_TYPES.INT_SIZEOF); - writer._writeInt(this.reqHandle); // Query handle - writer._writeInt(DATA_TYPES.BYTE_SIZEOF); - writer._writeByte(0); // Autocommit mode + writer._writeInt(bufferLength - DATA_TYPES.DATA_LENGTH_SIZEOF - DATA_TYPES.CAS_INFO_SIZE); + writer._writeBytes(this.casInfo); + writer._writeByte(CAS.CASFunctionCode.CAS_FC_CLOSE_REQ_HANDLE); + writer._writeInt(DATA_TYPES.INT_SIZEOF); + writer._writeInt(this.reqHandle); // Query handle + writer._writeInt(DATA_TYPES.BYTE_SIZEOF); + writer._writeByte(0); // Autocommit mode - return writer; + return writer; }; /** @@ -45,41 +40,34 @@ CloseQueryPacket.prototype.write = function (writer) { * @param parser */ CloseQueryPacket.prototype.parse = function (parser) { - var responseLength = parser._parseInt(); + const responseLength = parser._parseInt(); - this.casInfo = parser._parseBytes(DATA_TYPES.CAS_INFO_SIZE); - this.responseCode = parser._parseInt(); + this.casInfo = parser._parseBytes(DATA_TYPES.CAS_INFO_SIZE); + this.responseCode = parser._parseInt(); - if (this.responseCode < 0) { - this.errorCode = parser._parseInt(); - this.errorMsg = parser._parseNullTerminatedString(responseLength - 2 * DATA_TYPES.INT_SIZEOF); - - if (this.errorMsg.length === 0) { - this.errorMsg = Helpers._resolveErrorCode(this.errorCode); - } - } - - return this; + if (this.responseCode < 0) { + return parser.readError(responseLength); + } }; CloseQueryPacket.prototype.getBufferLength = function () { - var bufferLength = - // The size of the data to be sent (4-byte integer). - DATA_TYPES.DATA_LENGTH_SIZEOF + - // The size of the CAS_INFO data (also 4-byte integer). - DATA_TYPES.CAS_INFO_SIZE + - // The code of the CAS function to execute (1-byte integer value). - // "Close Query" function must be executed, i.e. the function code = `6`. - DATA_TYPES.BYTE_SIZEOF + - // The size of the next piece of data which is the ID - // of the request handler. - DATA_TYPES.INT_SIZEOF + - // The actual request handler ID as 4-byte integer. - DATA_TYPES.INT_SIZEOF + - // The size of the next piece of data. - DATA_TYPES.INT_SIZEOF + - // The value of the autocommit. - DATA_TYPES.BYTE_SIZEOF; + const bufferLength = + // The size of the data to be sent (4-byte integer). + DATA_TYPES.DATA_LENGTH_SIZEOF + + // The size of the CAS_INFO data (also 4-byte integer). + DATA_TYPES.CAS_INFO_SIZE + + // The code of the CAS function to execute (1-byte integer value). + // "Close Query" function must be executed, i.e. the function code = `6`. + DATA_TYPES.BYTE_SIZEOF + + // The size of the next piece of data which is the ID + // of the request handler. + DATA_TYPES.INT_SIZEOF + + // The actual request handler ID as 4-byte integer. + DATA_TYPES.INT_SIZEOF + + // The size of the next piece of data. + DATA_TYPES.INT_SIZEOF + + // The value of the autocommit. + DATA_TYPES.BYTE_SIZEOF; - return bufferLength; + return bufferLength; }; diff --git a/src/packets/CommitPacket.js b/src/packets/CommitPacket.js index 40d403e..fbf74ac 100644 --- a/src/packets/CommitPacket.js +++ b/src/packets/CommitPacket.js @@ -1,9 +1,5 @@ -var DATA_TYPES = require('../constants/DataTypes'), - Helpers = require('../utils/Helpers'), - ErrorMessages = require('../constants/ErrorMessages'), - CAS = require('../constants/CASConstants'); - -module.exports = CommitPacket; +const CAS = require('../constants/CASConstants'); +const DATA_TYPES = require('../constants/DataTypes'); /** * Constructor @@ -14,11 +10,8 @@ function CommitPacket(options) { options = options || {}; this.casInfo = options.casInfo; - this.dbVersion = options.dbVersion; - + this.responseCode = 0; - this.errorCode = 0; - this.errorMsg = ''; } /** @@ -27,7 +20,7 @@ function CommitPacket(options) { */ CommitPacket.prototype.write = function (writer) { writer._writeInt(this.getBufferLength() - DATA_TYPES.DATA_LENGTH_SIZEOF - DATA_TYPES.CAS_INFO_SIZE); - writer._writeBytes(DATA_TYPES.CAS_INFO_SIZE, this.casInfo); + writer._writeBytes(this.casInfo); writer._writeByte(CAS.CASFunctionCode.CAS_FC_END_TRAN); writer._writeInt(DATA_TYPES.BYTE_SIZEOF); writer._writeByte(CAS.CCITransactionType.CCI_TRAN_COMMIT); // Commit transaction @@ -40,24 +33,21 @@ CommitPacket.prototype.write = function (writer) { * @param parser */ CommitPacket.prototype.parse = function (parser) { - var responseLength = parser._parseInt(); - this.casInfo = parser._parseBytes(DATA_TYPES.CAS_INFO_SIZE); + const responseLength = parser._parseInt(); + this.casInfo = parser._parseBytes(DATA_TYPES.CAS_INFO_SIZE); this.responseCode = parser._parseInt(); + if (this.responseCode < 0) { - this.errorCode = parser._parseInt(); - this.errorMsg = parser._parseNullTerminatedString(responseLength - 2 * DATA_TYPES.INT_SIZEOF); - if (this.errorMsg.length === 0) { - this.errorMsg = Helpers._resolveErrorCode(this.errorCode); - } + return parser.readError(responseLength); } - - return this; }; CommitPacket.prototype.getBufferLength = function () { - var bufferLength = DATA_TYPES.DATA_LENGTH_SIZEOF + DATA_TYPES.CAS_INFO_SIZE + + const bufferLength = DATA_TYPES.DATA_LENGTH_SIZEOF + DATA_TYPES.CAS_INFO_SIZE + DATA_TYPES.BYTE_SIZEOF + DATA_TYPES.INT_SIZEOF + DATA_TYPES.BYTE_SIZEOF; return bufferLength; }; + +module.exports = CommitPacket; diff --git a/src/packets/ExecuteQueryPacket.js b/src/packets/ExecuteQueryPacket.js index 0c5a75a..6259b3f 100644 --- a/src/packets/ExecuteQueryPacket.js +++ b/src/packets/ExecuteQueryPacket.js @@ -1,9 +1,10 @@ -var DATA_TYPES = require('../constants/DataTypes'), - Helpers = require('../utils/Helpers'), - CAS = require('../constants/CASConstants'), - ErrorMessages = require('../constants/ErrorMessages'), - ColumnMetaData = require('../resultset/ColumnMetaData'), - ResultInfo = require('../resultset/ResultInfo'); +'use strict'; + +const CAS = require('../constants/CASConstants'); +const ColumnMetaData = require('../resultset/ColumnMetaData'); +const DATA_TYPES = require('../constants/DataTypes'); +const ErrorMessages = require('../constants/ErrorMessages'); +const ResultInfo = require('../resultset/ResultInfo'); module.exports = ExecuteQueryPacket; @@ -13,31 +14,7 @@ module.exports = ExecuteQueryPacket; * @constructor */ function ExecuteQueryPacket(options) { - options = options || {}; - - this.casInfo = options.casInfo; - this.sql = options.sql; - this.autoCommit = options.autoCommitMode; - this.dbVersion = options.dbVersion; - - this.resultSet = ''; // Resultset of the query - this.resultCacheLifetime = 0; // Cache lifetime - this.statementType = null; // Statement type - this.bindCount = 0; // Bind count - this.isUpdatable = false; // Is updatable - this.totalTupleCount = 0; // Total nomber of tuples - this.cache_reusable = 0; // Cache reusable - this.resultCount = 0; // Number of results - this.columnCount = 0; // Number of columns - this.infoArray = new ColumnMetaData(); // Column meta data - this.resultInfos = new ResultInfo(); // Result info - this.queryHandle = 0; // Query handle - this.currentTupleCount = 0; // Current number of returned tuples - this.tupleCount = 0; // Number of tuples - - this.responseCode = 0; // Response code - this.errorCode = 0; // Error code - this.errorMsg = ''; // Error message + this.options = options; } /** @@ -45,75 +22,59 @@ function ExecuteQueryPacket(options) { * @param writer */ ExecuteQueryPacket.prototype.write = function (writer) { - // Set the length of this request. Don't include the first eight bytes - // (`DATA_LENGTH_SIZEOF` and `CAS_INFO_SIZE`) because they are not - // part of the query data. - writer._writeInt(this.getBufferLength() - DATA_TYPES.DATA_LENGTH_SIZEOF - DATA_TYPES.CAS_INFO_SIZE); - // `this.casInfo` is already a buffer. Just write them as bytes. - writer._writeBytes(DATA_TYPES.CAS_INFO_SIZE, this.casInfo); - - // Then tell which CAS function should CAS execute. - // TODO: Shouldn't CAS function by an integer of four bytes? - // Why write only one byte? - writer._writeByte(this.dbVersion.startsWith('9.0.0') ? CAS.CASFunctionCode900.CAS_FC_PREPARE_AND_EXECUTE : CAS.CASFunctionCode.CAS_FC_PREPARE_AND_EXECUTE); - - // The length of the next piece of data, i.e. CAS function. - // The length of any piece of data should be represented by an - // integer value. - writer._writeInt(DATA_TYPES.INT_SIZEOF); - - // Next, write how many arguments (integer value, thus 4 bytes) - // should the CAS function accept. `CAS_FC_PREPARE_AND_EXECUTE` - // accepts `3` arguments. - writer._writeInt(3); - - // Now goes the SQL query. - writer._writeNullTerminatedString(this.sql); - - // The size of the next piece, also in 4-byte integer. - writer._writeInt(DATA_TYPES.BYTE_SIZEOF); - // The type of prepare CAS has to execute. - writer._writeByte(CAS.CCIPrepareOption.CCI_PREPARE_NORMAL); - - // The size of the next piece. - writer._writeInt(DATA_TYPES.BYTE_SIZEOF); - // Autocommit mode. - writer._writeByte(this.autoCommit ? 1 : 0); - - // Execute info. - - // The size of the next piece. - writer._writeInt(DATA_TYPES.BYTE_SIZEOF); - // Execute flag. - writer._writeByte(CAS.CCIExecutionOption.CCI_EXEC_QUERY_ALL); - - // The size of the next piece. - writer._writeInt(DATA_TYPES.INT_SIZEOF); - // `max_col_size`: The maximum length of a column in bytes to be fetched - // when it is a string data type. If this value is 0, full length is fetched. - writer._writeInt(0); - - // The size of the next piece. - writer._writeInt(DATA_TYPES.INT_SIZEOF); - // Max row size. - writer._writeInt(0); - - // NULL. - writer._writeInt(0); - - // Write cache time - writer._writeInt(2 * DATA_TYPES.INT_SIZEOF); - // Seconds. - writer._writeInt(0); - // Milliseconds. - writer._writeInt(0); - - // The size of the next piece. - writer._writeInt(DATA_TYPES.INT_SIZEOF); - // Query timeout. - writer._writeInt(0); - - return writer; + const options = this.options; + // Set the length of this request. Don't include the first eight bytes + // (`DATA_LENGTH_SIZEOF` and `CAS_INFO_SIZE`) because they are not + // part of the query data. + writer._writeInt(this.getBufferLength() - DATA_TYPES.DATA_LENGTH_SIZEOF - DATA_TYPES.CAS_INFO_SIZE); + // `this.casInfo` is already a buffer. Just write them as bytes. + writer._writeBytes(options.casInfo); + + // Then tell which CAS function should CAS execute. + // TODO: Shouldn't CAS function by an integer of four bytes? + // Why write only one byte? + writer._writeByte(options.protocolVersion === /* CUBRID v9.0.0 */2 ? CAS.CASFunctionCode900.CAS_FC_PREPARE_AND_EXECUTE : CAS.CASFunctionCode.CAS_FC_PREPARE_AND_EXECUTE); + + // Next, write how many arguments should the CAS + // function accept. `CAS_FC_PREPARE_AND_EXECUTE` + // accepts `3` arguments. + writer.addInt(3); + + // Now goes the SQL query. + writer._writeNullTerminatedString(options.sql); + + // The type of prepare CAS has to execute. + writer.addByte(CAS.CCIPrepareOption.CCI_PREPARE_NORMAL); + + // Autocommit mode. + writer.addByte(options.autoCommit ? 1 : 0); + + // Execute info. + + // Execute flag. + writer.addByte(CAS.CCIExecutionOption.CCI_EXEC_QUERY_ALL); + + // `max_col_size`: The maximum length of a column in bytes to be fetched + // when it is a string data type. If this value is 0, full length is fetched. + writer.addInt(0); + + // Max row size. + writer.addInt(0); + + // NULL. + writer._writeInt(0); + + // Write cache time + writer._writeInt(2 * DATA_TYPES.INT_SIZEOF); + // Seconds. + writer._writeInt(0); + // Milliseconds. + writer._writeInt(0); + + // Query timeout. + writer.addInt(0); + + return writer; }; /** @@ -121,89 +82,130 @@ ExecuteQueryPacket.prototype.write = function (writer) { * @param parser */ ExecuteQueryPacket.prototype.parse = function (parser) { - var responseLength = parser._parseInt(); - - this.casInfo = parser._parseBytes(DATA_TYPES.CAS_INFO_SIZE); - - this.responseCode = parser._parseInt(); - - if (this.responseCode < 0) { - this.errorCode = parser._parseInt(); - this.errorMsg = parser._parseNullTerminatedString(responseLength - 2 * DATA_TYPES.INT_SIZEOF); - - if (this.errorMsg.length === 0) { - this.errorMsg = Helpers._resolveErrorCode(this.errorCode); - } - } else { - this.queryHandle = this.responseCode; - this.resultCacheLifetime = parser._parseInt(); // Cache lifetime - this.statementType = parser._parseByte(); // Statement type - this.bindCount = parser._parseInt(); // Bind count - this.isUpdatable = (parser._parseByte() === 0); // Is updatable? - this.columnCount = parser._parseInt(); // Query result columns count - this.infoArray = []; - - for (i = 0; i < this.columnCount; i++) { - var info = new ColumnMetaData(); - info.ColumnType = parser._parseByte(); // Column type - info.scale = parser._parseShort(); // Scale - info.precision = parser._parseInt(); // Precision - var len = parser._parseInt(); - info.Name = parser._parseNullTerminatedString(len); // Column name - len = parser._parseInt(); - info.RealName = parser._parseNullTerminatedString(len); // Column real name - len = parser._parseInt(); - info.TableName = parser._parseNullTerminatedString(len); // Table name - info.IsNullable = (parser._parseByte() === 1); // Is nullable? - len = parser._parseInt(); - info.DafaultValue = parser._parseNullTerminatedString(len); // Default value - info.IsAutoIncrement = (parser._parseByte() === 1); // Is auto increment? - info.IsUniqueKey = (parser._parseByte() === 1); // Is unuque key? - info.IsPrimaryKey = (parser._parseByte() === 1); // Is primary key? - info.IsReverseIndex = (parser._parseByte() === 1); // Reserve index? - info.IsReverseUnique = (parser._parseByte() === 1); // Reserve unique? - info.IsForeignKey = (parser._parseByte() === 1); // Is foreign key? - info.IsShared = (parser._parseByte() === 1); // Shared? - this.infoArray[i] = info; - } - - this.totalTupleCount = parser._parseInt(); // Tuples count - this.cache_reusable = parser._parseByte(); // Cache reusable - this.resultCount = parser._parseInt(); // Result count - // Read result info - for (i = 0; i < this.resultCount; i++) { - var resultInfo = new ResultInfo(); - resultInfo.StmtType = parser._parseByte(); // Statement type - resultInfo.ResultCount = parser._parseInt(); // Result count - resultInfo.Oid = parser._parseBytes(DATA_TYPES.OID_SIZEOF); // OID - resultInfo.CacheTimeSec = parser._parseInt(); // Cache time seconds - resultInfo.CacheTimeUsec = parser._parseInt(); // Cache time milliseconds - this.resultInfos[i] = resultInfo; - } - } - - if (this.statementType === CAS.CUBRIDStatementType.CUBRID_STMT_SELECT) { - var fetchCode = parser._parseInt(); // Fetch code - this.tupleCount = parser._parseInt(); // Tuple count - var columnNames = new Array(this.columnCount); - var columnDataTypes = new Array(this.columnCount); - - for (var i = 0; i < this.columnCount; i++) { - columnNames[i] = this.infoArray[i].Name; - columnDataTypes[i] = CAS.getCUBRIDDataTypeName(this.infoArray[i].ColumnType); - } - - var columnValues = this._getData(parser, this.tupleCount); - - this.resultSet = JSON.stringify({ - ColumnNames : columnNames, - ColumnDataTypes : columnDataTypes, - RowsCount : this.totalTupleCount, - ColumnValues : columnValues - }); - } - - return this; + const options = this.options; + const responseLength = parser._parseInt(); + const logger = options.logger; + + logger.debug(`ExecuteQueryPacket.parse: responseLength = ${responseLength}.`); + + this.casInfo = parser._parseBytes(DATA_TYPES.CAS_INFO_SIZE); + + this.responseCode = parser._parseInt(); + + if (this.responseCode < 0) { + return parser.readError(responseLength); + } + + this.queryHandle = this.responseCode; + this.resultCacheLifetime = parser._parseInt(); // Cache lifetime + this.statementType = parser._parseByte(); // Statement type + + logger.debug(`ExecuteQueryPacket.parse: statementType = ${this.statementType}`); + + this.bindCount = parser._parseInt(); // Bind count + this.isUpdatable = (parser._parseByte() === 0); // Is updatable? + this.columnCount = parser._parseInt(); // Query result columns count + this.infoArray = []; + + let i; + let info; + let len; + + for (i = 0; i < this.columnCount; i++) { + info = new ColumnMetaData(); + info.ColumnType = parser._parseByte(); // Column type + info.scale = parser._parseShort(); // Scale + info.precision = parser._parseInt(); // Precision + len = parser._parseInt(); + info.Name = parser._parseNullTerminatedString(len); // Column name + len = parser._parseInt(); + info.RealName = parser._parseNullTerminatedString(len); // Column real name + len = parser._parseInt(); + info.TableName = parser._parseNullTerminatedString(len); // Table name + info.IsNullable = (parser._parseByte() === 1); // Is nullable? + len = parser._parseInt(); + info.DafaultValue = parser._parseNullTerminatedString(len); // Default value + info.IsAutoIncrement = (parser._parseByte() === 1); // Is auto increment? + info.IsUniqueKey = (parser._parseByte() === 1); // Is unuque key? + info.IsPrimaryKey = (parser._parseByte() === 1); // Is primary key? + info.IsReverseIndex = (parser._parseByte() === 1); // Reserve index? + info.IsReverseUnique = (parser._parseByte() === 1); // Reserve unique? + info.IsForeignKey = (parser._parseByte() === 1); // Is foreign key? + info.IsShared = (parser._parseByte() === 1); // Shared? + this.infoArray[i] = info; + } + + logger.debug('ExecuteQueryPacket.parse: infoArray =', this.infoArray); + + // Tuples count. + this.totalTupleCount = parser._parseInt(); + // Is cache reusable. + parser._parseByte(); + // Results count. + this.resultCount = parser._parseInt(); + + logger.debug('ExecuteQueryPacket.parse: totalTupleCount =', this.totalTupleCount); + logger.debug('ExecuteQueryPacket.parse: resultCount =', this.resultCount); + + // Read result info. + let resultInfo; + + this.resultInfos = []; + + for (i = 0; i < this.resultCount; ++i) { + resultInfo = new ResultInfo(); + resultInfo.StmtType = parser._parseByte(); // Statement type + resultInfo.ResultCount = parser._parseInt(); // Result count + resultInfo.Oid = parser._parseBytes(DATA_TYPES.OID_SIZEOF); // OID + resultInfo.CacheTimeSec = parser._parseInt(); // Cache time seconds + resultInfo.CacheTimeUsec = parser._parseInt(); // Cache time milliseconds + + logger.debug(`ExecuteQueryPacket.parse: resultInfo (${i}) =`, resultInfo); + + this.resultInfos.push(resultInfo); + } + + if (options.protocolVersion > 1) { + let includesColumnInfo = parser._parseByte(); + + logger.debug(`ExecuteQueryPacket.parse: include_column_info = ${includesColumnInfo}`); + + if (options.protocolVersion > 4) { + let shardID = parser._parseInt(); + + logger.debug(`ExecuteQueryPacket.parse: shardID = ${shardID}`); + } + } + + if (this.statementType === CAS.CUBRIDStatementType.CUBRID_STMT_SELECT) { + const fetchCode = parser._parseInt(); // Fetch code + this.tupleCount = parser._parseInt(); // Tuple count + this.currentTupleCount = 0; + + logger.debug(`ExecuteQueryPacket.parse: fetchCode = ${fetchCode}; tupleCount = ${this.tupleCount}`); + + let columnNames = new Array(this.columnCount); + let columnDataTypes = new Array(this.columnCount); + + for (let i = 0; i < this.columnCount; i++) { + columnNames[i] = this.infoArray[i].Name; + columnDataTypes[i] = CAS.getCUBRIDDataTypeName(this.infoArray[i].ColumnType); + } + + logger.debug('ExecuteQueryPacket.parse: columnNames =', columnNames); + logger.debug('ExecuteQueryPacket.parse: columnDataTypes =', columnDataTypes); + + let columnValues = this.getValues(parser, this.tupleCount); + + logger.debug('ExecuteQueryPacket.parse: columnValues =', columnValues); + + this.resultSet = { + ColumnDataTypes: columnDataTypes, + ColumnNames: columnNames, + ColumnValues: columnValues, + RowsCount: this.totalTupleCount, + }; + } }; /** @@ -211,154 +213,169 @@ ExecuteQueryPacket.prototype.parse = function (parser) { * @param parser * @param tupleCount */ -ExecuteQueryPacket.prototype._getData = function (parser, tupleCount) { - var columnValues = new Array(tupleCount); - - // Loop through rows. - for (var i = 0; i < tupleCount; ++i) { - var index = parser._parseInt(); // Column index - var Oid = parser._parseBytes(DATA_TYPES.OID_SIZEOF); // OID - - columnValues[i] = new Array(this.columnCount); - - for (var j = 0; j < this.columnCount; ++j) { - var size = parser._parseInt(); // Value size - var val; - - if (size <= 0) { - val = null; - } else { - var type = CAS.CUBRIDDataType.CCI_U_TYPE_NULL; - - if (this.statementType === CAS.CUBRIDStatementType.CUBRID_STMT_CALL || - this.statementType === CAS.CUBRIDStatementType.CUBRID_STMT_EVALUATE || - this.statementType === CAS.CUBRIDStatementType.CUBRID_STMT_CALL_SP || - this.infoArray[j].ColumnType === CAS.CUBRIDDataType.CCI_U_TYPE_NULL) { - type = parser._parseByte(); // Column data type - --size; - } else { - type = this.infoArray[j].ColumnType; - } - - val = this._readValue(j, type, size, parser); // Read value - - columnValues[i][j] = val; - } - } - } - this.currentTupleCount += tupleCount; - - return columnValues; +ExecuteQueryPacket.prototype.getValues = function (parser, tupleCount) { + let columnValues = new Array(tupleCount); + + const columns = this.infoArray; + const columnCount = this.columnCount; + const statementType = this.statementType; + + const CUBRID_STMT_CALL = CAS.CUBRIDStatementType.CUBRID_STMT_CALL; + const CUBRID_STMT_EVALUATE = CAS.CUBRIDStatementType.CUBRID_STMT_EVALUATE; + const CUBRID_STMT_CALL_SP = CAS.CUBRIDStatementType.CUBRID_STMT_CALL_SP; + + // Loop through rows. + for (let i = 0; i < tupleCount; ++i) { + // Column index. We don't need it at this moment. + parser._parseInt(); + + // OID. We don't need it now. + parser._parseBytes(DATA_TYPES.OID_SIZEOF); + + let column = columnValues[i] = new Array(columnCount); + + // Loop through columns in this row. + for (let j = 0; j < columnCount; ++j) { + // Value size. + let size = parser._parseInt(); + + if (size > 0) { + let type; + + if (statementType === CUBRID_STMT_CALL || + statementType === CUBRID_STMT_EVALUATE || + statementType === CUBRID_STMT_CALL_SP || + columns[j].ColumnType === CAS.CUBRIDDataType.CCI_U_TYPE_NULL) { + // Column data type + type = parser._parseByte(); + --size; + } else { + type = columns[j].ColumnType; + } + + // Read the actual value depending on its type and size. + column[j] = _readValue.call(this, parser, type, size); + } else { + column[j] = null; + } + } + } + + this.currentTupleCount += tupleCount; + + return columnValues; }; /** * Read column value from stream - * @param index + * @param parser * @param type * @param size - * @param parser */ -ExecuteQueryPacket.prototype._readValue = function (index, type, size, parser) { - switch (type) { - case CAS.CUBRIDDataType.CCI_U_TYPE_CHAR: - case CAS.CUBRIDDataType.CCI_U_TYPE_NCHAR: - case CAS.CUBRIDDataType.CCI_U_TYPE_STRING: - case CAS.CUBRIDDataType.CCI_U_TYPE_VARNCHAR: - case CAS.CUBRIDDataType.CCI_U_TYPE_ENUM: - return parser._parseNullTerminatedString(size); +function _readValue(parser, type, size) { + switch (type) { + case CAS.CUBRIDDataType.CCI_U_TYPE_CHAR: + case CAS.CUBRIDDataType.CCI_U_TYPE_NCHAR: + case CAS.CUBRIDDataType.CCI_U_TYPE_STRING: + case CAS.CUBRIDDataType.CCI_U_TYPE_VARNCHAR: + case CAS.CUBRIDDataType.CCI_U_TYPE_ENUM: + return parser._parseNullTerminatedString(size); - case CAS.CUBRIDDataType.CCI_U_TYPE_SHORT: - return parser._parseShort(); + case CAS.CUBRIDDataType.CCI_U_TYPE_SHORT: + return parser._parseShort(); - case CAS.CUBRIDDataType.CCI_U_TYPE_INT: - return parser._parseInt(); + case CAS.CUBRIDDataType.CCI_U_TYPE_INT: + return parser._parseInt(); - case CAS.CUBRIDDataType.CCI_U_TYPE_BIGINT: - return parser._parseLong(); + case CAS.CUBRIDDataType.CCI_U_TYPE_BIGINT: + return parser._parseLong(); - case CAS.CUBRIDDataType.CCI_U_TYPE_FLOAT: - return parser._parseFloat(); + case CAS.CUBRIDDataType.CCI_U_TYPE_FLOAT: + return parser._parseFloat(); - case CAS.CUBRIDDataType.CCI_U_TYPE_DOUBLE: - case CAS.CUBRIDDataType.CCI_U_TYPE_MONETARY: - return parser._parseDouble(); + case CAS.CUBRIDDataType.CCI_U_TYPE_DOUBLE: + case CAS.CUBRIDDataType.CCI_U_TYPE_MONETARY: + return parser._parseDouble(); - case CAS.CUBRIDDataType.CCI_U_TYPE_NUMERIC: - return parser._parseNumeric(size); + case CAS.CUBRIDDataType.CCI_U_TYPE_NUMERIC: + return parser._parseNumeric(size); - case CAS.CUBRIDDataType.CCI_U_TYPE_DATE: - return parser._parseDate(); + case CAS.CUBRIDDataType.CCI_U_TYPE_DATE: + return parser._parseDate(); - case CAS.CUBRIDDataType.CCI_U_TYPE_TIME: - return parser._parseTime(); + case CAS.CUBRIDDataType.CCI_U_TYPE_TIME: + return parser._parseTime(); - case CAS.CUBRIDDataType.CCI_U_TYPE_DATETIME: - return parser._parseDateTime(); + case CAS.CUBRIDDataType.CCI_U_TYPE_DATETIME: + return parser._parseDateTime(); - case CAS.CUBRIDDataType.CCI_U_TYPE_TIMESTAMP: - return parser._parseTimeStamp(); + case CAS.CUBRIDDataType.CCI_U_TYPE_TIMESTAMP: + return parser._parseTimeStamp(); - case CAS.CUBRIDDataType.CCI_U_TYPE_OBJECT: - return parser._parseObject(); + case CAS.CUBRIDDataType.CCI_U_TYPE_OBJECT: + return parser._parseObject(); - case CAS.CUBRIDDataType.CCI_U_TYPE_BIT: - case CAS.CUBRIDDataType.CCI_U_TYPE_VARBIT: - return parser._parseBytes(size); + case CAS.CUBRIDDataType.CCI_U_TYPE_BIT: + case CAS.CUBRIDDataType.CCI_U_TYPE_VARBIT: + return parser._parseBytes(size); - case CAS.CUBRIDDataType.CCI_U_TYPE_SET: - case CAS.CUBRIDDataType.CCI_U_TYPE_MULTISET: - case CAS.CUBRIDDataType.CCI_U_TYPE_SEQUENCE: - return parser._parseSequence(); + case CAS.CUBRIDDataType.CCI_U_TYPE_SET: + case CAS.CUBRIDDataType.CCI_U_TYPE_MULTISET: + case CAS.CUBRIDDataType.CCI_U_TYPE_SEQUENCE: + return parser._parseSequence(); - case CAS.CUBRIDDataType.CCI_U_TYPE_BLOB: - return parser._parseBlob(size); + case CAS.CUBRIDDataType.CCI_U_TYPE_BLOB: + return parser.readBlob(size); - case CAS.CUBRIDDataType.CCI_U_TYPE_CLOB: - return parser._parseClob(size); + case CAS.CUBRIDDataType.CCI_U_TYPE_CLOB: + return parser.readClob(size); - case CAS.CUBRIDDataType.CCI_U_TYPE_RESULTSET: - return parser._parseResultSet(); + case CAS.CUBRIDDataType.CCI_U_TYPE_RESULTSET: + return parser._parseResultSet(); - default: - return new Error(ErrorMessages.ERROR_INVALID_DATA_TYPE); - } -}; + case CAS.CUBRIDDataType.CCI_U_TYPE_NULL: + return null; + + default: + return new Error(`${type}: ${ErrorMessages.ERROR_INVALID_DATA_TYPE}`); + } +} ExecuteQueryPacket.prototype.getBufferLength = function () { - var bufferLength = // Total length of the request without itself and CAS info. - DATA_TYPES.DATA_LENGTH_SIZEOF + - // CAS info. - DATA_TYPES.CAS_INFO_SIZE + - // CAS function. - DATA_TYPES.BYTE_SIZEOF + - // TODO: what are these four bytes for? - DATA_TYPES.INT_SIZEOF + - // CAS arguments. - DATA_TYPES.INT_SIZEOF + - // TODO: These four bytes are absent below. Why? - DATA_TYPES.INT_SIZEOF + - // A NULL terminated SQL query string. - Buffer.byteLength(this.sql) + 1 + - // The length of the next part. - DATA_TYPES.INT_SIZEOF + - // The type of CCI prepare. - DATA_TYPES.BYTE_SIZEOF + - // The length of the next part. - DATA_TYPES.INT_SIZEOF + - // Autocommit mode - DATA_TYPES.BYTE_SIZEOF + - DATA_TYPES.INT_SIZEOF + - DATA_TYPES.BYTE_SIZEOF + - DATA_TYPES.INT_SIZEOF + - DATA_TYPES.INT_SIZEOF + - DATA_TYPES.INT_SIZEOF + - DATA_TYPES.INT_SIZEOF + - DATA_TYPES.INT_SIZEOF + - DATA_TYPES.INT_SIZEOF + - DATA_TYPES.INT_SIZEOF + - DATA_TYPES.INT_SIZEOF + - DATA_TYPES.INT_SIZEOF + - DATA_TYPES.INT_SIZEOF; - - return bufferLength; + let bufferLength = // Total length of the request without itself and CAS info. + DATA_TYPES.DATA_LENGTH_SIZEOF + + // CAS info. + DATA_TYPES.CAS_INFO_SIZE + + // CAS function. + DATA_TYPES.BYTE_SIZEOF + + // The length of the next part. + DATA_TYPES.INT_SIZEOF + + // CAS arguments. + DATA_TYPES.INT_SIZEOF + + // The length of the next part. + DATA_TYPES.INT_SIZEOF + + // A NULL terminated SQL query string. + Buffer.byteLength(this.options.sql) + 1 + + // The length of the next part. + DATA_TYPES.INT_SIZEOF + + // The type of CCI prepare. + DATA_TYPES.BYTE_SIZEOF + + // The length of the next part. + DATA_TYPES.INT_SIZEOF + + // Autocommit mode + DATA_TYPES.BYTE_SIZEOF + + DATA_TYPES.INT_SIZEOF + + DATA_TYPES.BYTE_SIZEOF + + DATA_TYPES.INT_SIZEOF + + DATA_TYPES.INT_SIZEOF + + DATA_TYPES.INT_SIZEOF + + DATA_TYPES.INT_SIZEOF + + DATA_TYPES.INT_SIZEOF + + DATA_TYPES.INT_SIZEOF + + DATA_TYPES.INT_SIZEOF + + DATA_TYPES.INT_SIZEOF + + DATA_TYPES.INT_SIZEOF + + DATA_TYPES.INT_SIZEOF; + + return bufferLength; }; diff --git a/src/packets/FetchPacket.js b/src/packets/FetchPacket.js index 154df9d..4ddca71 100644 --- a/src/packets/FetchPacket.js +++ b/src/packets/FetchPacket.js @@ -1,9 +1,5 @@ -var DATA_TYPES = require('../constants/DataTypes'), - Helpers = require('../utils/Helpers'), - ErrorMessages = require('../constants/ErrorMessages'), - CAS = require('../constants/CASConstants'); - -module.exports = FetchPacket; +const CAS = require('../constants/CASConstants'); +const DATA_TYPES = require('../constants/DataTypes'); /** * Constructor @@ -11,15 +7,10 @@ module.exports = FetchPacket; * @constructor */ function FetchPacket(options) { - options = options || {}; - - this.casInfo = options.casInfo; - this.dbVersion = options.dbVersion; - - this.responseCode = 0; - this.errorCode = 0; - this.errorMsg = ''; - this.resultSet = ''; // ResultSet of the fetch + this.options = options; + + // Fetch size; 0 = default; recommended = 100 + typeof options.size === 'undefined' && (options.size = 100); } /** @@ -28,8 +19,10 @@ function FetchPacket(options) { * @param queryPacket */ FetchPacket.prototype.write = function (writer, queryPacket) { + const options = this.options; + writer._writeInt(this.getBufferLength() - DATA_TYPES.DATA_LENGTH_SIZEOF - DATA_TYPES.CAS_INFO_SIZE); - writer._writeBytes(DATA_TYPES.CAS_INFO_SIZE, this.casInfo); + writer._writeBytes(options.casInfo); writer._writeByte(CAS.CASFunctionCode.CAS_FC_FETCH); writer._writeInt(DATA_TYPES.INT_SIZEOF); @@ -37,7 +30,7 @@ FetchPacket.prototype.write = function (writer, queryPacket) { writer._writeInt(DATA_TYPES.INT_SIZEOF); writer._writeInt(queryPacket.currentTupleCount + 1); // Start position (= current cursor position + 1) writer._writeInt(DATA_TYPES.INT_SIZEOF); - writer._writeInt(100); // Fetch size; 0 = default; recommended = 100 + writer._writeInt(options.size); writer._writeInt(DATA_TYPES.BYTE_SIZEOF); writer._writeByte(0); // Is case sensitive writer._writeInt(DATA_TYPES.INT_SIZEOF); @@ -52,29 +45,32 @@ FetchPacket.prototype.write = function (writer, queryPacket) { * @param queryPacket */ FetchPacket.prototype.parse = function (parser, queryPacket) { - var responseLength = parser._parseInt(); + const responseLength = parser._parseInt(); + this.casInfo = parser._parseBytes(DATA_TYPES.CAS_INFO_SIZE); this.responseCode = parser._parseInt(); + if (this.responseCode !== 0) { - this.errorCode = parser._parseInt(); - this.errorMsg = parser._parseNullTerminatedString(responseLength - 2 * DATA_TYPES.INT_SIZEOF); - if (this.errorMsg.length === 0) { - this.errorMsg = Helpers._resolveErrorCode(this.errorCode); - } - } else { - this.tupleCount = parser._parseInt(); - this.resultSet = JSON.stringify({ColumnValues : queryPacket._getData(parser, this.tupleCount)}); + return parser.readError(responseLength); } - return this; + this.tupleCount = parser._parseInt(); + + this.options.logger.debug(`fetch tupleCount = ${this.tupleCount}`); + + this.resultSet = { + ColumnValues: queryPacket.getValues(parser, this.tupleCount) + }; }; FetchPacket.prototype.getBufferLength = function () { - var bufferLength = DATA_TYPES.DATA_LENGTH_SIZEOF + DATA_TYPES.CAS_INFO_SIZE + - DATA_TYPES.BYTE_SIZEOF + DATA_TYPES.INT_SIZEOF + DATA_TYPES.INT_SIZEOF + - DATA_TYPES.INT_SIZEOF + DATA_TYPES.INT_SIZEOF + DATA_TYPES.INT_SIZEOF + DATA_TYPES.INT_SIZEOF + - DATA_TYPES.INT_SIZEOF + DATA_TYPES.BYTE_SIZEOF + DATA_TYPES.INT_SIZEOF + DATA_TYPES.INT_SIZEOF; + const bufferLength = DATA_TYPES.DATA_LENGTH_SIZEOF + DATA_TYPES.CAS_INFO_SIZE + + DATA_TYPES.BYTE_SIZEOF + DATA_TYPES.INT_SIZEOF + DATA_TYPES.INT_SIZEOF + + DATA_TYPES.INT_SIZEOF + DATA_TYPES.INT_SIZEOF + DATA_TYPES.INT_SIZEOF + DATA_TYPES.INT_SIZEOF + + DATA_TYPES.INT_SIZEOF + DATA_TYPES.BYTE_SIZEOF + DATA_TYPES.INT_SIZEOF + DATA_TYPES.INT_SIZEOF; - return bufferLength; + return bufferLength; }; + +module.exports = FetchPacket; diff --git a/src/packets/GetDbParameterPacket.js b/src/packets/GetDbParameterPacket.js index 74b7af2..f90df53 100644 --- a/src/packets/GetDbParameterPacket.js +++ b/src/packets/GetDbParameterPacket.js @@ -1,7 +1,5 @@ -var DATA_TYPES = require('../constants/DataTypes'), - Helpers = require('../utils/Helpers'), - ErrorMessages = require('../constants/ErrorMessages'), - CAS = require('../constants/CASConstants'); +const CAS = require('../constants/CASConstants'); +const DATA_TYPES = require('../constants/DataTypes'); module.exports = GetDbParameterPacket; @@ -18,8 +16,6 @@ function GetDbParameterPacket(options) { this.casInfo = options.casInfo; this.responseCode = 0; - this.errorCode = 0; - this.errorMsg = ''; } /** @@ -28,7 +24,7 @@ function GetDbParameterPacket(options) { */ GetDbParameterPacket.prototype.write = function (writer) { writer._writeInt(this.getBufferLength() - DATA_TYPES.DATA_LENGTH_SIZEOF - DATA_TYPES.CAS_INFO_SIZE); - writer._writeBytes(DATA_TYPES.CAS_INFO_SIZE, this.casInfo); + writer._writeBytes(this.casInfo); writer._writeByte(CAS.CASFunctionCode.CAS_FC_GET_DB_PARAMETER); writer._writeInt(DATA_TYPES.INT_SIZEOF); writer._writeInt(this.parameter); // Parameter type @@ -41,20 +37,16 @@ GetDbParameterPacket.prototype.write = function (writer) { * @param parser */ GetDbParameterPacket.prototype.parse = function (parser) { - var responseLength = parser._parseInt(); + const responseLength = parser._parseInt(); + this.casInfo = parser._parseBytes(DATA_TYPES.CAS_INFO_SIZE); this.responseCode = parser._parseInt(); + if (this.responseCode < 0) { - this.errorCode = parser._parseInt(); - this.errorMsg = parser._parseNullTerminatedString(responseLength - 2 * DATA_TYPES.INT_SIZEOF); - if (this.errorMsg.length === 0) { - this.errorMsg = Helpers._resolveErrorCode(this.errorCode); - } - } else { - this.value = parser._parseInt(); + return parser.readError(responseLength); } - return this; + this.value = parser._parseInt(); }; GetDbParameterPacket.prototype.getBufferLength = function () { diff --git a/src/packets/GetEngineVersionPacket.js b/src/packets/GetEngineVersionPacket.js index a233811..6c0c341 100644 --- a/src/packets/GetEngineVersionPacket.js +++ b/src/packets/GetEngineVersionPacket.js @@ -1,7 +1,5 @@ -var DATA_TYPES = require('../constants/DataTypes'), - Helpers = require('../utils/Helpers'), - ErrorMessages = require('../constants/ErrorMessages'), - CAS = require('../constants/CASConstants'); +const CAS = require('../constants/CASConstants'); +const DATA_TYPES = require('../constants/DataTypes'); module.exports = GetEngineVersionPacket; @@ -18,8 +16,6 @@ function GetEngineVersionPacket(options) { this.engineVersion = ''; this.responseCode = 0; - this.errorCode = 0; - this.errorMsg = ''; } /** @@ -28,7 +24,7 @@ function GetEngineVersionPacket(options) { */ GetEngineVersionPacket.prototype.write = function (writer) { writer._writeInt(this.getBufferLength() - DATA_TYPES.DATA_LENGTH_SIZEOF - DATA_TYPES.CAS_INFO_SIZE); - writer._writeBytes(DATA_TYPES.CAS_INFO_SIZE, this.casInfo); + writer._writeBytes(this.casInfo); writer._writeByte(CAS.CASFunctionCode.CAS_FC_GET_DB_VERSION); writer._writeInt(DATA_TYPES.BYTE_SIZEOF); writer._writeByte(1); // Auto-commit mode @@ -41,20 +37,16 @@ GetEngineVersionPacket.prototype.write = function (writer) { * @param parser */ GetEngineVersionPacket.prototype.parse = function (parser) { - var responseLength = parser._parseInt(); + const responseLength = parser._parseInt(); + this.casInfo = parser._parseBytes(DATA_TYPES.CAS_INFO_SIZE); this.responseCode = parser._parseInt(); + if (this.responseCode < 0) { - this.errorCode = parser._parseInt(); - this.errorMsg = parser._parseNullTerminatedString(responseLength - 2 * DATA_TYPES.INT_SIZEOF); - if (this.errorMsg.length === 0) { - this.errorMsg = Helpers._resolveErrorCode(this.errorCode); - } - } else { - this.engineVersion = parser._parseNullTerminatedString(responseLength - DATA_TYPES.INT_SIZEOF); // Engine version + return parser.readError(responseLength); } - return this; + this.engineVersion = parser._parseNullTerminatedString(responseLength - DATA_TYPES.INT_SIZEOF); }; GetEngineVersionPacket.prototype.getBufferLength = function () { diff --git a/src/packets/GetSchemaPacket.js b/src/packets/GetSchemaPacket.js index 315b02d..76ecba0 100644 --- a/src/packets/GetSchemaPacket.js +++ b/src/packets/GetSchemaPacket.js @@ -1,8 +1,8 @@ -var DATA_TYPES = require('../constants/DataTypes'), - Helpers = require('../utils/Helpers'), - ErrorMessages = require('../constants/ErrorMessages'), - ColumnMetaData = require('../resultset/ColumnMetaData'), - CAS = require('../constants/CASConstants'); +'use strict'; + +const CAS = require('../constants/CASConstants'); +const ColumnMetaData = require('../resultset/ColumnMetaData'); +const DATA_TYPES = require('../constants/DataTypes'); module.exports = GetSchemaPacket; @@ -12,18 +12,9 @@ module.exports = GetSchemaPacket; * @constructor */ function GetSchemaPacket(options) { - options = options || {}; - - this.casInfo = options.casInfo; - this.schemaType = options.schemaType; - this.tableNamePattern = options.tableNamePattern; - this.dbVersion = options.dbVersion; - - this.responseCode = 0; - this.resultTuple = 0; - this.errorCode = 0; - this.errorMsg = ''; - this.schemaInfo = null; + this.options = options; + + typeof options.shardId === 'undefined' && (options.shardId = 0); } /** @@ -31,24 +22,32 @@ function GetSchemaPacket(options) { * @param writer */ GetSchemaPacket.prototype.writeRequestSchema = function (writer) { + const options = this.options; + writer._writeInt(this.getRequestSchemaBufferLength() - DATA_TYPES.DATA_LENGTH_SIZEOF - DATA_TYPES.CAS_INFO_SIZE); - writer._writeBytes(DATA_TYPES.CAS_INFO_SIZE, this.casInfo); + writer._writeBytes(options.casInfo); writer._writeByte(CAS.CASFunctionCode.CAS_FC_SCHEMA_INFO); - writer._writeInt(DATA_TYPES.INT_SIZEOF); - writer._writeInt(this.schemaType); // Schema type + writer.addInt(options.schemaType); - if (this.tableNamePattern) { - writer._writeNullTerminatedString(this.tableNamePattern); // Table name pattern + if (options.tableNamePattern) { + // arg1: Table name pattern + writer._writeNullTerminatedString(options.tableNamePattern); } else { - writer._writeInt(0); // Null; this is where restrictions should go - arg1: tableNamePattern + // Null; this is where restrictions should go - arg1: tableNamePattern + writer.addNull(); } - writer._writeInt(0); // Null; this is where restrictions should go - arg2: columnNamePattern + // arg2: + writer.addNull(); - writer._writeInt(DATA_TYPES.BYTE_SIZEOF); - writer._writeByte(CAS.CCISchemaPatternMatchFlag.CCI_CLASS_NAME_PATTERN_MATCH | - CAS.CCISchemaPatternMatchFlag.CCI_ATTR_NAME_PATTERN_MATCH); // Pattern match flag + // Pattern match flag. + writer.addByte(CAS.CCISchemaPatternMatchFlag.CCI_CLASS_NAME_PATTERN_MATCH | + CAS.CCISchemaPatternMatchFlag.CCI_ATTR_NAME_PATTERN_MATCH); + + if (options.protocolVersion > 4) { + writer.addInt(options.shardId); + } return writer; }; @@ -58,20 +57,17 @@ GetSchemaPacket.prototype.writeRequestSchema = function (writer) { * @param writer */ GetSchemaPacket.prototype.writeFetchSchema = function (writer) { + const options = this.options; + writer._writeInt(this.getFetchSchemaBufferLength() - DATA_TYPES.DATA_LENGTH_SIZEOF - DATA_TYPES.CAS_INFO_SIZE); - writer._writeBytes(DATA_TYPES.CAS_INFO_SIZE, this.casInfo); + writer._writeBytes(options.casInfo); writer._writeByte(CAS.CASFunctionCode.CAS_FC_FETCH); - writer._writeInt(DATA_TYPES.INT_SIZEOF); - writer._writeInt(this.responseCode); // ServerHandler - writer._writeInt(DATA_TYPES.INT_SIZEOF); - writer._writeInt(1); //Start position - writer._writeInt(DATA_TYPES.INT_SIZEOF); - writer._writeInt(this.resultTuple); // Fetch size; 0 = default; recommended = 100 - writer._writeInt(DATA_TYPES.BYTE_SIZEOF); - writer._writeByte(0); // Is case sensitive - writer._writeInt(DATA_TYPES.INT_SIZEOF); - writer._writeInt(0); // Is the ResultSet index...? + writer.addInt(this.responseCode); // ServerHandler + writer.addInt(1); //Start position + writer.addInt(this.resultTuple); + writer.addByte(0); // Is case sensitive + writer.addInt(0); // Is the ResultSet index...? return writer; }; @@ -81,32 +77,32 @@ GetSchemaPacket.prototype.writeFetchSchema = function (writer) { * @param parser */ GetSchemaPacket.prototype.parseRequestSchema = function (parser) { - var responseLength = parser._parseInt(); - this.casInfo = parser._parseBytes(DATA_TYPES.CAS_INFO_SIZE); + const responseLength = parser._parseInt(); + this.casInfo = parser._parseBytes(DATA_TYPES.CAS_INFO_SIZE); this.responseCode = parser._parseInt(); + if (this.responseCode < 0) { - this.errorCode = parser._parseInt(); - this.errorMsg = parser._parseNullTerminatedString(responseLength - 2 * DATA_TYPES.INT_SIZEOF); - if (this.errorMsg.length === 0) { - this.errorMsg = Helpers._resolveErrorCode(this.errorCode); - } - } else { - this.resultTuple = parser._parseInt(); // Result tuple - var numColInfo = parser._parseInt(); // Number of columns - this.infoArray = []; - for (var i = 0; i < numColInfo; i++) { - var info = new ColumnMetaData(); - info.ColumnType = parser._parseByte(); // Column data type - info.scale = parser._parseShort(); // Scale - info.precision = parser._parseInt(); // Precision - var len = parser._parseInt(); - info.Name = parser._parseNullTerminatedString(len); // Column name - this.infoArray[i] = info; - } + return parser.readError(responseLength); } - return this; + this.resultTuple = parser._parseInt(); // Result tuple + const numColInfo = parser._parseInt(); // Number of columns + + this.infoArray = []; + + for (let i = 0; i < numColInfo; ++i) { + let info = new ColumnMetaData(); + + info.ColumnType = parser._parseByte(); // Column data type + info.scale = parser._parseShort(); // Scale + info.precision = parser._parseInt(); // Precision + + const len = parser._parseInt(); + info.Name = parser._parseNullTerminatedString(len); // Column name + + this.infoArray.push(info); + } }; /** @@ -114,211 +110,297 @@ GetSchemaPacket.prototype.parseRequestSchema = function (parser) { * @param parser */ GetSchemaPacket.prototype.parseFetchSchema = function (parser) { - var length = 0; - var responseLength = parser._parseInt(); + const options = this.options; + const responseLength = parser._parseInt(); + this.casInfo = parser._parseBytes(DATA_TYPES.CAS_INFO_SIZE); this.responseCode = parser._parseInt(); + if (this.responseCode !== 0) { - this.errorCode = parser._parseInt(); - this.errorMsg = parser._parseNullTerminatedString(responseLength - 2 * DATA_TYPES.INT_SIZEOF); - if (this.errorMsg.length === 0) { - this.errorMsg = Helpers._resolveErrorCode(this.errorCode); - } - } else { - this.tupleCount = parser._parseInt(); // Tuple count - var SchemaInfo = new Array(this.tupleCount); - for (var i = 0; i < this.tupleCount; i++) { - var index = parser._parseInt(); // Column index - var Oid = parser._parseBytes(DATA_TYPES.OID_SIZEOF); // OID - switch (this.schemaType) { - case CAS.CUBRIDSchemaType.CCI_SCH_CLASS: - length = parser._parseInt(); - var sch_class_name = parser._parseNullTerminatedString(length); // Table name - length = parser._parseInt(); // Always = 2 - Indicates that Table type is a short value - var sch_class_name_type = parser._parseShort(); // Table type - SchemaInfo[i] = { Name : sch_class_name, Type : sch_class_name_type}; - break; - case CAS.CUBRIDSchemaType.CCI_SCH_VCLASS: - length = parser._parseInt(); - var sch_vclass_name = parser._parseNullTerminatedString(length); // View name - length = parser._parseInt(); - var sch_vclass_type = parser._parseShort(); // View type - SchemaInfo[i] = { Name : sch_vclass_name, Type : sch_vclass_type}; - break; - case CAS.CUBRIDSchemaType.CCI_SCH_ATTRIBUTE: - length = parser._parseInt(); - var sch_attribute_columnName = parser._parseNullTerminatedString(length); // Column name - length = parser._parseInt(); - var sch_attribute_domain = parser._parseShort(); // Domain - length = parser._parseInt(); - var sch_attribute_scale = parser._parseShort(); // Scale - length = parser._parseInt(); - var sch_attribute_precision = parser._parseInt(); // Precision - length = parser._parseInt(); - var sch_attribute_indexed = parser._parseShort(); // Idexed - length = parser._parseInt(); - var sch_attribute_non_null = (parser._parseShort() === 1); // Non null - length = parser._parseInt(); - var sch_attribute_shared = parser._parseShort(); // Shared - length = parser._parseInt(); - var sch_attribute_unique = (parser._parseShort() === 1); // Unique - length = parser._parseInt(); - // If lentgth > 0 the column has a default value - if (length > 0) { - parser._parseNullTerminatedString(length); // Default value - } - length = parser._parseInt(); - var sch_attribute_attr_order = parser._parseInt(); // Column order - length = parser._parseInt(); - var sch_attribute_class_name = parser._parseNullTerminatedString(length); // Class/Table name - length = parser._parseInt(); - var sch_attribute_source_class = parser._parseNullTerminatedString(length); // Source Class/Table name - length = parser._parseInt(); - var sch_attribute_is_key = (parser._parseShort() === 1); // Is key? - SchemaInfo[i] = { - Name : sch_attribute_columnName, - Scale : sch_attribute_scale, - Precision : sch_attribute_precision, - NonNull : sch_attribute_non_null, - Unique : sch_attribute_unique, - ClassName : sch_attribute_class_name, - SourceClass : sch_attribute_source_class, - IsKey : sch_attribute_is_key - }; - break; - case CAS.CUBRIDSchemaType.CCI_SCH_CONSTRAIT: - length = parser._parseInt(); - var sch_constraint_type = parser._parseShort(); // Constraint type - length = parser._parseInt(); - var sch_constraint_constraintName = parser._parseNullTerminatedString(length); // Constraint name - length = parser._parseInt(); - var sch_constraint_attributeName = parser._parseNullTerminatedString(length); // Constraint column name - length = parser._parseInt(); - var sch_constraint_num_pages = parser._parseShort(); // Pages - length = parser._parseInt(); - var sch_constraint_num_keys = parser._parseShort(); // Keys - length = parser._parseInt(); - var sch_constraint_primaryKey = (parser._parseShort() === 1); // Primary key? - length = parser._parseInt(); - var sch_constraint_keyOrder = parser._parseShort(); // Key order - SchemaInfo[i] = { - ConstraintName : sch_constraint_constraintName, - AttributeName : sch_constraint_attributeName, - Type : sch_constraint_type, - PrimaryKey : sch_constraint_primaryKey - }; - break; - case CAS.CUBRIDSchemaType.CCI_SCH_EXPORTED_KEYS: - length = parser._parseInt(); - var sch_exported_keys_pkTableName = parser._parseNullTerminatedString(length); // Primary key table name - length = parser._parseInt(); - var sch_exported_keys_pkColumnName = parser._parseNullTerminatedString(length); // Primary key column name - length = parser._parseInt(); - var sch_exported_keys_fkTableName = parser._parseNullTerminatedString(length); // Foreig key table name - length = parser._parseInt(); - var sch_exported_keys_fkColumnName = parser._parseNullTerminatedString(length); // Foreign key column name - length = parser._parseInt(); - var sch_exported_keys_keySeq = parser._parseShort(); // Sequence type - length = parser._parseInt(); - var sch_exported_keys_updateAction = parser._parseShort(); // Update action - length = parser._parseInt(); - var sch_exported_keys_deleteAction = parser._parseShort(); // Delete action - length = parser._parseInt(); - var sch_exported_keys_fkName = parser._parseNullTerminatedString(length); // Foreign key length - length = parser._parseInt(); - var sch_exported_keys_pkName = parser._parseNullTerminatedString(length); // Primary key length - SchemaInfo[i] = { - FkName : sch_exported_keys_fkName, - PkName : sch_exported_keys_pkName, - FkTableName : sch_exported_keys_fkTableName, - PkTableName : sch_exported_keys_pkTableName, - FkColumnName : sch_exported_keys_fkColumnName, - PkColumnName : sch_exported_keys_pkColumnName, - UpdateAction : sch_exported_keys_updateAction, - DeleteAction : sch_exported_keys_deleteAction - }; - break; - case CAS.CUBRIDSchemaType.CCI_SCH_IMPORTED_KEYS: - length = parser._parseInt(); - var sch_imported_keys_pkTableName = parser._parseNullTerminatedString(length); // Primary key table name - length = parser._parseInt(); - var sch_imported_keys_pkColumnName = parser._parseNullTerminatedString(length); // Primary key column name - length = parser._parseInt(); - var sch_imported_keys_fkTableName = parser._parseNullTerminatedString(length); // Foreign key table name - length = parser._parseInt(); - var sch_imported_keys_fkColumnName = parser._parseNullTerminatedString(length); // Foreign key column name - length = parser._parseInt(); - var sch_imported_keys_keySeq = parser._parseShort(); // Sequence type - length = parser._parseInt(); - var sch_imported_keys_updateAction = parser._parseShort(); // Update action - length = parser._parseInt(); - var sch_imported_keys_deleteAction = parser._parseShort(); // Delete action - length = parser._parseInt(); - var sch_imported_keys_fkName = parser._parseNullTerminatedString(length); // Foreign key name - length = parser._parseInt(); - var sch_imported_keys_pkName = parser._parseNullTerminatedString(length); // Primary key name - SchemaInfo[i] = { - FkName : sch_imported_keys_fkName, - PkName : sch_imported_keys_pkName, - FkTableName : sch_imported_keys_fkTableName, - PkTableName : sch_imported_keys_pkTableName, - FkColumnName : sch_imported_keys_fkColumnName, - PkColumnName : sch_imported_keys_pkColumnName, - UpdateAction : sch_imported_keys_updateAction, - DeleteAction : sch_imported_keys_deleteAction - }; - break; - case CAS.CUBRIDSchemaType.CCI_SCH_PRIMARY_KEY: - length = parser._parseInt(); - var sch_primary_key_className = parser._parseNullTerminatedString(length); // Table name - length = parser._parseInt(); - var sch_primary_key_columnName = parser._parseNullTerminatedString(length); // Column name - length = parser._parseInt(); - var sch_primary_key_keySeq = parser._parseInt(); // Sequence type - length = parser._parseInt(); - var sch_primary_key_keyName = parser._parseNullTerminatedString(length); // Primary key name - SchemaInfo[i] = { - TableName : sch_primary_key_className, - ColumnName : sch_primary_key_columnName, - KeyName : sch_primary_key_keyName - }; - break; - case CAS.CUBRIDSchemaType.CCI_SCH_CLASS_PRIVILEGE: - length = parser._parseInt(); - var sch_class_privilege_className = parser._parseNullTerminatedString(length); // Table name - length = parser._parseInt(); - var sch_class_privilege_privilege = parser._parseNullTerminatedString(length); // Privilege name - length = parser._parseInt(); - var sch_class_privilege_grantable = (parser._parseNullTerminatedString(length) === 'YES'); // Grantable ('YES' or 'NO') - SchemaInfo[i] = { - TableName : sch_class_privilege_className, - Privilege : sch_class_privilege_privilege, - Grantable : sch_class_privilege_grantable - }; - break; + return parser.readError(responseLength); + } + + this.tupleCount = parser._parseInt(); + + let length = 0; + let SchemaInfo = new Array(this.tupleCount); + + for (let i = 0; i < this.tupleCount; ++i) { + // Column index. + parser._parseInt(); + // OID + parser._parseBytes(DATA_TYPES.OID_SIZEOF); + + switch (options.schemaType) { + case CAS.CUBRIDSchemaType.CCI_SCH_CLASS: { + length = parser._parseInt(); + // Table name + const Name = parser._parseNullTerminatedString(length); + // Always = 2 - Indicates that Table type is a short value + length = parser._parseInt(); + // Table type + const Type = parser._parseShort(); + + SchemaInfo[i] = { Name, Type }; + + break; } - } - this.schemaInfo = SchemaInfo; + case CAS.CUBRIDSchemaType.CCI_SCH_VCLASS: { + length = parser._parseInt(); + // View name + const Name = parser._parseNullTerminatedString(length); + length = parser._parseInt(); + // View type + const Type = parser._parseShort(); + + SchemaInfo[i] = { Name, Type }; + + break; + } + case CAS.CUBRIDSchemaType.CCI_SCH_ATTRIBUTE: { + length = parser._parseInt(); + // Column name + const Name = parser._parseNullTerminatedString(length); + length = parser._parseInt(); + // sch_attribute_domain + parser._parseShort(); + length = parser._parseInt(); + const Scale = parser._parseShort(); + length = parser._parseInt(); + const Precision = parser._parseInt(); + length = parser._parseInt(); + // sch_attribute_indexed + parser._parseShort(); + length = parser._parseInt(); + const NonNull = (parser._parseShort() === 1); + length = parser._parseInt(); + // sch_attribute_shared + parser._parseShort(); + length = parser._parseInt(); + const Unique = (parser._parseShort() === 1); + length = parser._parseInt(); + + // If `length > 0` the column has a default value + if (length) { + parser._parseNullTerminatedString(length); // Default value + } + + length = parser._parseInt(); + // sch_attribute_attr_order + parser._parseInt(); + length = parser._parseInt(); + const ClassName = parser._parseNullTerminatedString(length); + length = parser._parseInt(); + const SourceClass = parser._parseNullTerminatedString(length); + length = parser._parseInt(); + const IsKey = (parser._parseShort() === 1); + + SchemaInfo[i] = { + Name, + Scale, + Precision, + NonNull, + Unique, + ClassName, + SourceClass, + IsKey + }; + + break; + } + case CAS.CUBRIDSchemaType.CCI_SCH_CONSTRAIT: { + length = parser._parseInt(); + // Constraint type + const Type = parser._parseShort(); + length = parser._parseInt(); + const ConstraintName = parser._parseNullTerminatedString(length); // Constraint name + length = parser._parseInt(); + // Constraint column name + const AttributeName = parser._parseNullTerminatedString(length); + length = parser._parseInt(); + // sch_constraint_num_pages + parser._parseShort(); // Pages + length = parser._parseInt(); + // sch_constraint_num_keys + parser._parseShort(); + length = parser._parseInt(); + const PrimaryKey = (parser._parseShort() === 1); + length = parser._parseInt(); + // sch_constraint_keyOrder + parser._parseShort(); + SchemaInfo[i] = { + ConstraintName, + AttributeName, + Type, + PrimaryKey + }; + break; + } + case CAS.CUBRIDSchemaType.CCI_SCH_EXPORTED_KEYS: { + length = parser._parseInt(); + const PkTableName = parser._parseNullTerminatedString(length); + length = parser._parseInt(); + const PkColumnName = parser._parseNullTerminatedString(length); + length = parser._parseInt(); + const FkTableName = parser._parseNullTerminatedString(length); + length = parser._parseInt(); + const FkColumnName = parser._parseNullTerminatedString(length); + length = parser._parseInt(); + // Sequence type: sch_exported_keys_keySeq + parser._parseShort(); + length = parser._parseInt(); + const UpdateAction = parser._parseShort(); + length = parser._parseInt(); + const DeleteAction = parser._parseShort(); + length = parser._parseInt(); + const FkName = parser._parseNullTerminatedString(length); + length = parser._parseInt(); + const PkName = parser._parseNullTerminatedString(length); + + SchemaInfo[i] = { + FkName, + PkName, + FkTableName, + PkTableName, + FkColumnName, + PkColumnName, + UpdateAction, + DeleteAction + }; - return this; + break; + } + case CAS.CUBRIDSchemaType.CCI_SCH_IMPORTED_KEYS: { + length = parser._parseInt(); + const PkTableName = parser._parseNullTerminatedString(length); + length = parser._parseInt(); + const PkColumnName = parser._parseNullTerminatedString(length); + length = parser._parseInt(); + const FkTableName = parser._parseNullTerminatedString(length); + length = parser._parseInt(); + const FkColumnName = parser._parseNullTerminatedString(length); + length = parser._parseInt(); + // Sequence type: sch_imported_keys_keySeq + parser._parseShort(); + length = parser._parseInt(); + const UpdateAction = parser._parseShort(); + length = parser._parseInt(); + const DeleteAction = parser._parseShort(); + length = parser._parseInt(); + const FkName = parser._parseNullTerminatedString(length); + length = parser._parseInt(); + const PkName = parser._parseNullTerminatedString(length); + + SchemaInfo[i] = { + FkName, + PkName, + FkTableName, + PkTableName, + FkColumnName, + PkColumnName, + UpdateAction, + DeleteAction + }; + break; + } + case CAS.CUBRIDSchemaType.CCI_SCH_PRIMARY_KEY: { + length = parser._parseInt(); + const TableName = parser._parseNullTerminatedString(length); + length = parser._parseInt(); + const ColumnName = parser._parseNullTerminatedString(length); + length = parser._parseInt(); + // Sequence type: sch_primary_key_keySeq + parser._parseInt(); + length = parser._parseInt(); + const KeyName = parser._parseNullTerminatedString(length); + + SchemaInfo[i] = { + TableName, + ColumnName, + KeyName + }; + + break; + } + case CAS.CUBRIDSchemaType.CCI_SCH_CLASS_PRIVILEGE: { + length = parser._parseInt(); + const TableName = parser._parseNullTerminatedString(length); + length = parser._parseInt(); + const Privilege = parser._parseNullTerminatedString(length); + length = parser._parseInt(); + // Grantable ('YES' or 'NO') + const Grantable = (parser._parseNullTerminatedString(length) === 'YES'); + + SchemaInfo[i] = { + TableName, + Privilege, + Grantable + }; + } + break; + } } + + this.schemaInfo = SchemaInfo; }; GetSchemaPacket.prototype.getRequestSchemaBufferLength = function () { - var bufferLength = DATA_TYPES.DATA_LENGTH_SIZEOF + DATA_TYPES.CAS_INFO_SIZE + - DATA_TYPES.BYTE_SIZEOF + DATA_TYPES.INT_SIZEOF + DATA_TYPES.INT_SIZEOF + - DATA_TYPES.INT_SIZEOF + DATA_TYPES.INT_SIZEOF + DATA_TYPES.INT_SIZEOF + - DATA_TYPES.BYTE_SIZEOF + (this.tableNamePattern !== null ? this.tableNamePattern.length + 1 : 0); + const options = this.options; + + let bufferLength = + // Total length of the request without itself and CAS info. + DATA_TYPES.DATA_LENGTH_SIZEOF + + // CAS info. + DATA_TYPES.CAS_INFO_SIZE + + // CAS function. + DATA_TYPES.BYTE_SIZEOF + + // The length of the next part. + DATA_TYPES.INT_SIZEOF + + // Schema type. + DATA_TYPES.INT_SIZEOF + + // The length of the next part. + DATA_TYPES.INT_SIZEOF + + // arg1: tableNamePattern length + (typeof options.tableNamePattern === 'string' ? options.tableNamePattern.length + 1 : 0) + + // The length of the next part. + // arg2: is null. + DATA_TYPES.INT_SIZEOF + + // The length of the next part. + DATA_TYPES.INT_SIZEOF + + // Pattern match flag. + DATA_TYPES.BYTE_SIZEOF; + + if (options.protocolVersion > 4) { + bufferLength += + // The length of the next part. + DATA_TYPES.INT_SIZEOF + + // ShardId. + DATA_TYPES.INT_SIZEOF; + } - return bufferLength; + return bufferLength; }; GetSchemaPacket.prototype.getFetchSchemaBufferLength = function () { - var bufferLength = DATA_TYPES.DATA_LENGTH_SIZEOF + DATA_TYPES.CAS_INFO_SIZE + - DATA_TYPES.BYTE_SIZEOF + DATA_TYPES.INT_SIZEOF + DATA_TYPES.INT_SIZEOF + - DATA_TYPES.INT_SIZEOF + DATA_TYPES.INT_SIZEOF + DATA_TYPES.INT_SIZEOF + DATA_TYPES.INT_SIZEOF + - DATA_TYPES.INT_SIZEOF + DATA_TYPES.BYTE_SIZEOF + DATA_TYPES.INT_SIZEOF + DATA_TYPES.INT_SIZEOF; + const bufferLength = + // Total length of the request without itself and CAS info. + DATA_TYPES.DATA_LENGTH_SIZEOF + + // CAS info. + DATA_TYPES.CAS_INFO_SIZE + + // CAS function. + DATA_TYPES.BYTE_SIZEOF + + // The length of the next part. + DATA_TYPES.INT_SIZEOF + + DATA_TYPES.INT_SIZEOF + + DATA_TYPES.INT_SIZEOF + + DATA_TYPES.INT_SIZEOF + + DATA_TYPES.INT_SIZEOF + + DATA_TYPES.INT_SIZEOF + + DATA_TYPES.INT_SIZEOF + + DATA_TYPES.BYTE_SIZEOF + + DATA_TYPES.INT_SIZEOF + + DATA_TYPES.INT_SIZEOF; - return bufferLength; + return bufferLength; }; diff --git a/src/packets/LOBNewPacket.js b/src/packets/LOBNewPacket.js index da94f4f..88e5a11 100644 --- a/src/packets/LOBNewPacket.js +++ b/src/packets/LOBNewPacket.js @@ -1,7 +1,5 @@ -var DATA_TYPES = require('../constants/DataTypes'), - Helpers = require('../utils/Helpers'), - ErrorMessages = require('../constants/ErrorMessages'), - CAS = require('../constants/CASConstants'); +const CAS = require('../constants/CASConstants'); +const DATA_TYPES = require('../constants/DataTypes'); module.exports = LOBNewPacket; @@ -11,18 +9,7 @@ module.exports = LOBNewPacket; * @constructor */ function LOBNewPacket(options) { - options = options || {}; - - this.casInfo = options.casInfo; - this.lobType = options.lobType; - this.dbVersion = options.dbVersion; - - this.responseCode = 0; - this.errorCode = 0; - this.errorMsg = ''; - this.packedLobHandle = ''; - this.fileLocator = ''; - this.result = null; + this.options = options; } /** @@ -30,14 +17,13 @@ function LOBNewPacket(options) { * @param writer */ LOBNewPacket.prototype.write = function (writer) { + const options = this.options; + writer._writeInt(this.getBufferLength() - DATA_TYPES.DATA_LENGTH_SIZEOF - DATA_TYPES.CAS_INFO_SIZE); - writer._writeBytes(DATA_TYPES.CAS_INFO_SIZE, this.casInfo); + writer._writeBytes(options.casInfo); writer._writeByte(CAS.CASFunctionCode.CAS_FC_LOB_NEW); - writer._writeInt(DATA_TYPES.INT_SIZEOF); - writer._writeInt(this.lobType); // LOB type - - return writer; + writer.addInt(options.lobType); }; /** @@ -45,32 +31,29 @@ LOBNewPacket.prototype.write = function (writer) { * @param parser */ LOBNewPacket.prototype.parse = function (parser) { - var responseLength = parser._parseInt(); - this.casInfo = parser._parseBytes(DATA_TYPES.CAS_INFO_SIZE); + const responseLength = parser._parseInt(); - this.responseCode = parser._parseInt(); - if (this.responseCode < 0) { - this.errorCode = parser._parseInt(); - this.errorMsg = parser._parseNullTerminatedString(responseLength - 2 * DATA_TYPES.INT_SIZEOF); - if (this.errorMsg.length === 0) { - this.errorMsg = Helpers._resolveErrorCode(this.errorCode); - } - } else { - this.packedLobHandle = parser._parseBytes(responseLength - DATA_TYPES.INT_SIZEOF); // LOB handle - this.fileLocator = this.packedLobHandle.slice(16, this.packedLobHandle.length - 1).toString(); + // CAS Info. + parser._parseBytes(DATA_TYPES.CAS_INFO_SIZE); + const responseCode = parser._parseInt(); + + if (responseCode < 0) { + return parser.readError(responseLength); } - this.result = { - lobType : this.lobType, - packedLobHandle : this.packedLobHandle, - fileLocator : this.fileLocator, - lobLength : 0 - }; - return this; + const packedLobHandle = parser._parseBytes(responseLength - DATA_TYPES.INT_SIZEOF); + const fileLocator = packedLobHandle.slice(16, packedLobHandle.length - 1).toString(); + + this.result = { + lobType: this.options.lobType, + packedLobHandle, + fileLocator, + lobLength: 0 + }; }; LOBNewPacket.prototype.getBufferLength = function () { - var bufferLength = DATA_TYPES.DATA_LENGTH_SIZEOF + DATA_TYPES.CAS_INFO_SIZE + + const bufferLength = DATA_TYPES.DATA_LENGTH_SIZEOF + DATA_TYPES.CAS_INFO_SIZE + DATA_TYPES.BYTE_SIZEOF + DATA_TYPES.INT_SIZEOF + DATA_TYPES.INT_SIZEOF; return bufferLength; diff --git a/src/packets/LOBReadPacket.js b/src/packets/LOBReadPacket.js index e4323ff..f423607 100644 --- a/src/packets/LOBReadPacket.js +++ b/src/packets/LOBReadPacket.js @@ -1,9 +1,5 @@ -var DATA_TYPES = require('../constants/DataTypes'), - Helpers = require('../utils/Helpers'), - ErrorMessages = require('../constants/ErrorMessages'), - CAS = require('../constants/CASConstants'); - -module.exports = LOBReadPacket; +const CAS = require('../constants/CASConstants'); +const DATA_TYPES = require('../constants/DataTypes'); /** * Constructor @@ -11,20 +7,7 @@ module.exports = LOBReadPacket; * @constructor */ function LOBReadPacket(options) { - options = options || {}; - - this.casInfo = options.casInfo; - this.lobObject = options.lobObject; - this.position = options.position; - this.lengthToRead = options.lengthToRead; - this.dbVersion = options.dbVersion; - - this.lobBuffer = null; - - this.responseCode = 0; - this.errorCode = 0; - this.errorMsg = ''; - this.readLength = 0; + this.options = options; } /** @@ -32,18 +15,16 @@ function LOBReadPacket(options) { * @param writer */ LOBReadPacket.prototype.write = function (writer) { + const options = this.options; + const lobObject = options.lobObject; + writer._writeInt(this.getBufferLength() - DATA_TYPES.DATA_LENGTH_SIZEOF - DATA_TYPES.CAS_INFO_SIZE); - writer._writeBytes(DATA_TYPES.CAS_INFO_SIZE, this.casInfo); + writer._writeBytes(options.casInfo); writer._writeByte(CAS.CASFunctionCode.CAS_FC_LOB_READ); - writer._writeInt(this.lobObject.packedLobHandle.length); // LOB handle size - writer._writeBytes(this.lobObject.packedLobHandle.length, this.lobObject.packedLobHandle); // LOB handle - writer._writeInt(DATA_TYPES.LONG_SIZEOF); - writer._writeLong(this.position); // Start position from witch to read - writer._writeInt(DATA_TYPES.INT_SIZEOF); - writer._writeInt(this.lengthToRead); // Number of bytes to read - - return writer; + writer.addBytes(lobObject.packedLobHandle); // LOB handle + writer.addLong(options.offset); // Start offset from witch to read + writer.addInt(options.bytesToRead); // Number of bytes to read }; /** @@ -51,37 +32,26 @@ LOBReadPacket.prototype.write = function (writer) { * @param parser */ LOBReadPacket.prototype.parse = function (parser) { - var responseLength = parser._parseInt(); + const responseLength = parser._parseInt(); + this.casInfo = parser._parseBytes(DATA_TYPES.CAS_INFO_SIZE); + const responseCode = parser._parseInt(); - this.responseCode = parser._parseInt(); - if (this.responseCode < 0) { - this.errorCode = parser._parseInt(); - this.errorMsg = parser._parseNullTerminatedString(responseLength - 2 * DATA_TYPES.INT_SIZEOF); - if (this.errorMsg.length === 0) { - this.errorMsg = Helpers._resolveErrorCode(this.errorCode); - } - } else { - if (this.lobObject.lobType === CAS.CUBRIDDataType.CCI_U_TYPE_BLOB) { - this.lobBuffer = new Buffer(this.responseCode); - this.lobBuffer = parser._parseBytes(this.responseCode); - } else { - if (this.lobObject.lobType === CAS.CUBRIDDataType.CCI_U_TYPE_CLOB) { - this.lobBuffer = parser._parseString(this.responseCode); - } else { - Helpers.logInfo(ErrorMessages.ERROR_INVALID_LOB_TYPE); // Log non-blocking error - } - } - this.readLength = this.responseCode; + if (responseCode < 0) { + return parser.readError(responseLength); } - return this; + this.readLength = responseCode; + + this.lobBuffer = parser._parseBytes(this.readLength); }; LOBReadPacket.prototype.getBufferLength = function () { - var bufferLength = DATA_TYPES.DATA_LENGTH_SIZEOF + DATA_TYPES.CAS_INFO_SIZE + - DATA_TYPES.BYTE_SIZEOF + DATA_TYPES.INT_SIZEOF + this.lobObject.packedLobHandle.length + + const bufferLength = DATA_TYPES.DATA_LENGTH_SIZEOF + DATA_TYPES.CAS_INFO_SIZE + + DATA_TYPES.BYTE_SIZEOF + DATA_TYPES.INT_SIZEOF + this.options.lobObject.packedLobHandle.length + DATA_TYPES.INT_SIZEOF + DATA_TYPES.LONG_SIZEOF + DATA_TYPES.INT_SIZEOF + DATA_TYPES.INT_SIZEOF; return bufferLength; }; + +module.exports = LOBReadPacket; diff --git a/src/packets/LOBWritePacket.js b/src/packets/LOBWritePacket.js index d29c812..6438e36 100644 --- a/src/packets/LOBWritePacket.js +++ b/src/packets/LOBWritePacket.js @@ -1,7 +1,5 @@ -var DATA_TYPES = require('../constants/DataTypes'), - Helpers = require('../utils/Helpers'), - ErrorMessages = require('../constants/ErrorMessages'), - CAS = require('../constants/CASConstants'); +const CAS = require('../constants/CASConstants'); +const DATA_TYPES = require('../constants/DataTypes'); module.exports = LOBWritePacket; @@ -11,19 +9,7 @@ module.exports = LOBWritePacket; * @constructor */ function LOBWritePacket(options) { - options = options || {}; - - this.casInfo = options.casInfo; - this.lobObject = options.lobObject; - this.position = options.position; - this.data = options.data; - this.writeLen = options.writeLen; - this.dbVersion = options.dbVersion; - - this.responseCode = 0; - this.errorCode = 0; - this.errorMsg = ''; - this.wroteLength = 0; + this.options = options; } /** @@ -31,24 +17,20 @@ function LOBWritePacket(options) { * @param writer */ LOBWritePacket.prototype.write = function (writer) { + const options = this.options; + const lobObject = options.lobObject; + writer._writeInt(this.getBufferLength() - DATA_TYPES.DATA_LENGTH_SIZEOF - DATA_TYPES.CAS_INFO_SIZE); - writer._writeBytes(DATA_TYPES.CAS_INFO_SIZE, this.casInfo); + writer._writeBytes(options.casInfo); writer._writeByte(CAS.CASFunctionCode.CAS_FC_LOB_WRITE); - writer._writeInt(this.lobObject.packedLobHandle.length); // Length of the packedLobHandle - writer._writeBytes(this.lobObject.packedLobHandle.length, this.lobObject.packedLobHandle); // LOB handle - writer._writeInt(DATA_TYPES.LONG_SIZEOF); - writer._writeLong(this.position); // Start position from witch to write data - writer._writeInt(this.writeLen); // Length of data to be written - if (this.lobObject.lobType === CAS.CUBRIDDataType.CCI_U_TYPE_BLOB) { - writer._writeBytes(this.writeLen, this.data); - } else { - // Otherwise, it must be `CAS.CUBRIDDataType.CCI_U_TYPE_CLOB`. + writer.addBytes(lobObject.packedLobHandle); + // Offset from which to write data. + writer.addLong(options.offset); - // Convert clob string to bytes - var dataInBytes = new Buffer(this.data, 'binary'); - writer._writeBytes(this.writeLen, dataInBytes); - } + // `data` is always a buffer. The `client` already converts + // CLOB into a Buffer object. + writer.addBytes(options.data); return writer; }; @@ -58,27 +40,25 @@ LOBWritePacket.prototype.write = function (writer) { * @param parser */ LOBWritePacket.prototype.parse = function (parser) { - var responseLength = parser._parseInt(); - this.casInfo = parser._parseBytes(DATA_TYPES.CAS_INFO_SIZE); + const responseLength = parser._parseInt(); - this.responseCode = parser._parseInt(); - if (this.responseCode < 0) { - this.errorCode = parser._parseInt(); - this.errorMsg = parser._parseNullTerminatedString(responseLength - 2 * DATA_TYPES.INT_SIZEOF); - if (this.errorMsg.length === 0) { - this.errorMsg = Helpers._resolveErrorCode(this.errorCode); - } - } else { - this.wroteLength = this.responseCode; - } + // CAS Info. + parser._parseBytes(DATA_TYPES.CAS_INFO_SIZE); + const responseCode = parser._parseInt(); + + if (responseCode < 0) { + return parser.readError(responseLength); + } - return this; + this.bytesWritten = responseCode; }; LOBWritePacket.prototype.getBufferLength = function () { - var bufferLength = DATA_TYPES.DATA_LENGTH_SIZEOF + DATA_TYPES.CAS_INFO_SIZE + - DATA_TYPES.BYTE_SIZEOF + DATA_TYPES.INT_SIZEOF + this.lobObject.packedLobHandle.length + - DATA_TYPES.INT_SIZEOF + DATA_TYPES.LONG_SIZEOF + DATA_TYPES.INT_SIZEOF + this.writeLen; + const options = this.options; + + const bufferLength = DATA_TYPES.DATA_LENGTH_SIZEOF + DATA_TYPES.CAS_INFO_SIZE + + DATA_TYPES.BYTE_SIZEOF + DATA_TYPES.INT_SIZEOF + options.lobObject.packedLobHandle.length + + DATA_TYPES.INT_SIZEOF + DATA_TYPES.LONG_SIZEOF + DATA_TYPES.INT_SIZEOF + options.data.length; return bufferLength; }; diff --git a/src/packets/OpenDatabasePacket.js b/src/packets/OpenDatabasePacket.js index 74251f6..d6a9a85 100644 --- a/src/packets/OpenDatabasePacket.js +++ b/src/packets/OpenDatabasePacket.js @@ -1,9 +1,7 @@ -var DATA_TYPES = require('../constants/DataTypes'), - Helpers = require('../utils/Helpers'), - ErrorMessages = require('../constants/ErrorMessages'), - CAS = require('../constants/CASConstants'); +'use strict'; -module.exports = OpenDatabasePacket; +const CAS = require('../constants/CASConstants'); +const DATA_TYPES = require('../constants/DataTypes'); /** * Constructor @@ -11,16 +9,7 @@ module.exports = OpenDatabasePacket; * @constructor */ function OpenDatabasePacket(options) { - options = options || {}; - - this.database = options.database; - this.user = options.user; - this.password = options.password; - this.casInfo = options.casInfo; - - this.responseCode = 0; - this.errorCode = 0; - this.errorMsg = ''; + this.options = options; } /** @@ -28,9 +17,11 @@ function OpenDatabasePacket(options) { * @param writer */ OpenDatabasePacket.prototype.write = function (writer) { - writer._writeFixedLengthString(this.database, 0, 32); // Database name - writer._writeFixedLengthString(this.user, 0, 32); // User login ID - writer._writeFixedLengthString(this.password, 0, 32); // User login password + const options = this.options; + + writer._writeFixedLengthString(options.database, 0, 32); // Database name + writer._writeFixedLengthString(options.user, 0, 32); // User login ID + writer._writeFixedLengthString(options.password, 0, 32); // User login password writer._writeFiller(512, 0); // Used for extended connection info writer._writeFiller(20, 0); // Reserved @@ -42,26 +33,50 @@ OpenDatabasePacket.prototype.write = function (writer) { * @param parser */ OpenDatabasePacket.prototype.parse = function (parser) { - var responseLength = parser._parseInt(); + const logger = this.options.logger; + const responseLength = parser._parseInt(); + this.casInfo = parser._parseBytes(DATA_TYPES.CAS_INFO_SIZE); + logger.debug('OpenDatabasePacket: casInfo', this.casInfo); + this.responseCode = parser._parseInt(); + if (this.responseCode < 0) { - this.errorCode = parser._parseInt(); - this.errorMsg = parser._parseNullTerminatedString(responseLength - DATA_TYPES.INT_SIZEOF * 2); - if (this.errorMsg.length === 0) { - this.errorMsg = Helpers._resolveErrorCode(this.errorCode); - } - } else { - this.brokerInfo = parser._parseBytes(DATA_TYPES.BROKER_INFO_SIZEOF); // Broker information - this.sessionId = parser._parseInt(); // Unique session ID + return parser.readError(responseLength); } - return this; + /* + * Broker information: 8 bytes. + * Byte 1: DBMS Type. 1 = CUBRID. + * Byte 2: Reserved. 1. + * Byte 3: Statement Polling. 1. + * Byte 4: CCI_PCONNECT. 0. + * Byte 5: Protocol Version. + * Byte 6: Function Flag. + * Byte 7: Reserved. 0. + * Byte 8: Reserved. 0. + * */ + const brokerInfo = parser._parseBytes(DATA_TYPES.BROKER_INFO_SIZEOF); + + logger.debug('OpenDatabasePacket: brokerInfo', brokerInfo); + + const protocolVersion = CAS.getProtocolVersion(brokerInfo[4]); + logger.debug('OpenDatabasePacket: protocolVersion', protocolVersion); + + // Freeze the object, i.e. make it immutable. + this.brokerInfo = Object.freeze({ + dbType: brokerInfo[0], + protocolVersion, + statementPolling: brokerInfo[2], + }); + + // Unique session ID. + this.sessionId = parser._parseInt(); }; OpenDatabasePacket.prototype.getBufferLength = function () { - var bufferLength = + const bufferLength = // Fixed database length + // User login ID + // User login password. @@ -74,3 +89,5 @@ OpenDatabasePacket.prototype.getBufferLength = function () { return bufferLength; }; + +module.exports = OpenDatabasePacket; diff --git a/src/packets/PacketReader.js b/src/packets/PacketReader.js index 0735cc6..9a63ac3 100644 --- a/src/packets/PacketReader.js +++ b/src/packets/PacketReader.js @@ -1,5 +1,8 @@ -var DATA_TYPES = require('./../constants/DataTypes'), - CAS = require('../constants/CASConstants'); +'use strict'; + +const CAS = require('../constants/CASConstants'); +const DATA_TYPES = require('../constants/DataTypes'); +const ErrorMessages = require('../constants/ErrorMessages'); module.exports = PacketReader; @@ -12,6 +15,23 @@ function PacketReader() { this._offset = 0; } +/** + * Read an error code and message from the internal buffer. + * @param responseLength + */ +PacketReader.prototype.readError = function (responseLength) { + let error = new Error(); + + error.code = this._parseInt(); + error.message = this._parseNullTerminatedString(responseLength - 2 * DATA_TYPES.INT_SIZEOF); + + if (!error.message.length) { + error.message = ErrorMessages.resolveErrorCode(error.code); + } + + return error; +}; + /** * Write a buffer value to the internal buffer * @param buffer @@ -26,17 +46,17 @@ PacketReader.prototype.write = function (buffer) { * @param newBuffer */ PacketReader.prototype._append = function (newBuffer) { - var oldBuffer = this._buffer; + let oldBuffer = this._buffer; if (!oldBuffer) { this._buffer = newBuffer; return; } - var bytesRemaining = this._bytesRemaining(); - var newLength = bytesRemaining + newBuffer.length; + let bytesRemaining = this._bytesRemaining(); + let newLength = bytesRemaining + newBuffer.length; - var combinedBuffer = (this._offset > newLength) ? oldBuffer.slice(0, newLength) : new Buffer(newLength); + let combinedBuffer = (this._offset > newLength) ? oldBuffer.slice(0, newLength) : new Buffer(newLength); oldBuffer.copy(combinedBuffer, 0, this._offset); newBuffer.copy(combinedBuffer, bytesRemaining); @@ -45,22 +65,28 @@ PacketReader.prototype._append = function (newBuffer) { this._offset = 0; }; +function parseNum(length) { + let value = 0; + let i = this._offset; + const b = this._buffer; + const endIndex = i + length; + + for (; i < endIndex; ++i) { + value <<= 8; + value |= (b[i] & 0xff); + } + + this._offset = endIndex; + + return value; +} + /** * Returns an short value from the internal buffer * @return {Number} */ PacketReader.prototype._parseShort = function () { - var value = 0; - - for (var i = DATA_TYPES.SHORT_SIZEOF - 1; i >= 0; i--) { - value += this._buffer[this._offset++] * Math.pow(256, i); - } - - if (value & 0x8000) { - return value - 0xFFFF - 1; - } else { - return value; - } + return parseNum.call(this, DATA_TYPES.SHORT_SIZEOF); }; /** @@ -68,17 +94,7 @@ PacketReader.prototype._parseShort = function () { * @return {Number} */ PacketReader.prototype._parseInt = function () { - var value = 0; - - for (var i = DATA_TYPES.INT_SIZEOF - 1; i >= 0; i--) { - value += this._buffer[this._offset++] * Math.pow(256, i); - } - - if (value & 0x80000000) { - return value - 0xFFFFFFFF - 1; - } else { - return value; - } + return parseNum.call(this, DATA_TYPES.INT_SIZEOF); }; /** @@ -95,7 +111,7 @@ PacketReader.prototype._parseByte = function () { * @return {Array} */ PacketReader.prototype._parseBytes = function (bytesCount) { - var buffer = this._buffer.slice(this._offset, this._offset + bytesCount); + const buffer = this._buffer.slice(this._offset, this._offset + bytesCount); this._offset += bytesCount; @@ -108,37 +124,13 @@ PacketReader.prototype._parseBytes = function (bytesCount) { * @return {*} */ PacketReader.prototype._parseBuffer = function (bytesCount) { - var buffer = this._buffer.slice(this._offset, this._offset + bytesCount); + let buffer = this._buffer.slice(this._offset, this._offset + bytesCount); this._offset += bytesCount; return buffer; }; -/** - * Returns a string value from the internal buffer - * @param bytesCount - * @return {Buffer} - */ -PacketReader.prototype._parseString = function (bytesCount) { - if (bytesCount <= 0) { - return ''; - } - - var start = this._offset; - var end = start + bytesCount; - var buffer = this._buffer.slice(start, end); - - var value = ''; - for (var i = 0; i < buffer.length; i++) { - value += String.fromCharCode(buffer[i]); - } - - this._offset = end; - - return value; -}; - /** * Returns a string value from the internal buffer * @return {String} @@ -148,9 +140,9 @@ PacketReader.prototype._parseNullTerminatedString = function (length) { return ''; } - var valueLen = length - 1; // Get the actual null-terminated string length - var buffer = this._buffer.slice(this._offset, this._offset + valueLen); - var value = buffer.toString(); + let valueLen = length - 1; // Get the actual null-terminated string length + let buffer = this._buffer.slice(this._offset, this._offset + valueLen); + let value = buffer.toString(); this._offset += valueLen; this._parseByte(); // Read also the null-terminate @@ -163,17 +155,20 @@ PacketReader.prototype._parseNullTerminatedString = function (length) { * @return {Date} */ PacketReader.prototype._parseDate = function () { - var year = this._parseShort(); - var month = this._parseShort() - 1; - var day = this._parseShort(); - var hour = 0; - var min = 0; - var sec = 0; - var msec = 0; - - var date = new Date(); + const year = this._parseShort(); + // `month` in `Date` is zero based where `0` represents January. + const month = this._parseShort() - 1; + const day = this._parseShort(); + const hour = 0; + const min = 0; + const sec = 0; + const msec = 0; + + let date = new Date(); + date.setUTCFullYear(year, month, day); date.setUTCHours(hour, min, sec, msec); + return date; }; @@ -182,17 +177,20 @@ PacketReader.prototype._parseDate = function () { * @return {Date} */ PacketReader.prototype._parseDateTime = function () { - var year = this._parseShort(); - var month = this._parseShort() - 1; - var day = this._parseShort(); - var hour = this._parseShort(); - var min = this._parseShort(); - var sec = this._parseShort(); - var msec = this._parseShort(); - - var date = new Date(); + const year = this._parseShort(); + // `month` in `Date` is zero based where `0` represents January. + const month = this._parseShort() - 1; + const day = this._parseShort(); + const hour = this._parseShort(); + const min = this._parseShort(); + const sec = this._parseShort(); + const msec = this._parseShort(); + + let date = new Date(); + date.setUTCFullYear(year, month, day); date.setUTCHours(hour, min, sec, msec); + return date; }; @@ -201,16 +199,19 @@ PacketReader.prototype._parseDateTime = function () { * @return {Date} */ PacketReader.prototype._parseTime = function () { - var year = 0; - var month = 0; - var day = 0; - var hour = this._parseShort(); - var min = this._parseShort(); - var sec = this._parseShort(); - var msec = 0; - - var date = new Date(year, month, day, hour, min, sec, msec); - date.setUTCHours(hour, min, sec, msec); + const hour = this._parseShort(); + const min = this._parseShort(); + const sec = this._parseShort(); + + let date = new Date(); + + // `January 1, 1970` is the beginning of the Unix Epoch. + // When `TIME` data is returned by CUBRID, we receive + // only the time part of the date, so, the date is set + // to the beginning of the epoch. + date.setUTCFullYear(1970, 0, 1); + date.setUTCHours(hour, min, sec, 0); + return date; }; @@ -219,17 +220,19 @@ PacketReader.prototype._parseTime = function () { * @return {Date} */ PacketReader.prototype._parseTimeStamp = function () { - var year = this._parseShort(); - var month = this._parseShort() - 1; - var day = this._parseShort(); - var hour = this._parseShort(); - var min = this._parseShort(); - var sec = this._parseShort(); - var msec = 0; - - var date = new Date(); + const year = this._parseShort(); + const month = this._parseShort() - 1; + const day = this._parseShort(); + const hour = this._parseShort(); + const min = this._parseShort(); + const sec = this._parseShort(); + const msec = 0; + + let date = new Date(); + date.setUTCFullYear(year, month, day); date.setUTCHours(hour, min, sec, msec); + return date; }; @@ -238,9 +241,7 @@ PacketReader.prototype._parseTimeStamp = function () { * @return {String} */ PacketReader.prototype._parseChar = function () { - var val = this._parseByte(); - - return String.fromCharCode(val); + return String.fromCharCode(this._parseByte()); }; /** @@ -248,17 +249,7 @@ PacketReader.prototype._parseChar = function () { * @return {Number} */ PacketReader.prototype._parseLong = function () { - var value = 0; - - for (var i = DATA_TYPES.LONG_SIZEOF - 1; i >= 0; i--) { - value += this._buffer[this._offset++] * Math.pow(256, i); - } - - if (value & 0x8000000000000000) { - return value - 0xFFFFFFFFFFFFFFFF - 1; - } else { - return value; - } + return parseNum.call(this, DATA_TYPES.LONG_SIZEOF); }; /** @@ -266,8 +257,10 @@ PacketReader.prototype._parseLong = function () { * @return {Number} */ PacketReader.prototype._parseDouble = function () { - var value = this._buffer.readDoubleBE(this._offset); + let value = this._buffer.readDoubleBE(this._offset); + this._offset += DATA_TYPES.DOUBLE_SIZEOF; + return value; }; @@ -276,8 +269,10 @@ PacketReader.prototype._parseDouble = function () { * @return {Number} */ PacketReader.prototype._parseFloat = function () { - var value = this._buffer.readFloatBE(this._offset); + let value = this._buffer.readFloatBE(this._offset); + this._offset += DATA_TYPES.FLOAT_SIZEOF; + return value; }; @@ -298,47 +293,63 @@ PacketReader.prototype._parseObject = function () { }; /** - * Returns a BLOB object from the internal buffer + * Returns a LOB object from the internal buffer * @return {Object} */ -PacketReader.prototype._parseBlob = function (size) { - var packedLobHandle = this._parseBytes(size); - var lobSizeBuffer = packedLobHandle.slice(DATA_TYPES.INT_SIZEOF, DATA_TYPES.INT_SIZEOF + DATA_TYPES.LONG_SIZEOF); - var lobSize = 0; +function readLob(size) { + /* + * |----4 bytes----|----8 bytes----|----4 bytes----|---------------------locator size bytes-------------------| + * | db_type | LOB size | locator size | the absolute file path on the server where LOB is stored | + * |---------------|---------------|---------------|----------------------------------------------------------| + * + * */ + const packedLobHandle = this._parseBytes(size); + let lobLength = 0; + let locatorSize = 0; + // Skip the first 4 bytes which are the `db_type`. + let start = DATA_TYPES.INT_SIZEOF; + // BLOB size is represented as a long 64bit integer. + let end = DATA_TYPES.INT_SIZEOF + DATA_TYPES.LONG_SIZEOF; + + for (; start < end; ++start) { + lobLength <<= 8; + lobLength |= (packedLobHandle[start] & 0xff); + } - for (var i = DATA_TYPES.LONG_SIZEOF - 1; i >= 0; i--) { - lobSize += lobSizeBuffer[DATA_TYPES.LONG_SIZEOF - i - 1] * Math.pow(256, i); + for (end += DATA_TYPES.INT_SIZEOF; start < end; ++start) { + locatorSize <<= 8; + locatorSize |= (packedLobHandle[start] & 0xff); } - var fileLocator = packedLobHandle.slice(16, packedLobHandle.length - 1).toString(); + + let fileLocator = packedLobHandle.toString('utf8', start, start + locatorSize - 1); return { - lobType : CAS.CUBRIDDataType.CCI_U_TYPE_BLOB, // BLOB type - packedLobHandle : packedLobHandle, - fileLocator : fileLocator, - lobLength : lobSize + fileLocator, + lobLength, + packedLobHandle, }; +} + +/** + * Returns a BLOB object from the internal buffer + * @return {Object} + */ +PacketReader.prototype.readBlob = function (size) { + let lob = readLob.call(this, size); + lob.lobType = CAS.CUBRIDDataType.CCI_U_TYPE_BLOB; + + return lob; }; /** * Returns a CLOB object from the internal buffer * @return {Object} */ -PacketReader.prototype._parseClob = function (size) { - var packedLobHandle = this._parseBytes(size); - var lobSizeBuffer = packedLobHandle.slice(DATA_TYPES.INT_SIZEOF, DATA_TYPES.INT_SIZEOF + DATA_TYPES.LONG_SIZEOF); - var lobSize = 0; +PacketReader.prototype.readClob = function (size) { + let lob = readLob.call(this, size); + lob.lobType = CAS.CUBRIDDataType.CCI_U_TYPE_CLOB; - for (var i = DATA_TYPES.LONG_SIZEOF - 1; i >= 0; i--) { - lobSize += lobSizeBuffer[DATA_TYPES.LONG_SIZEOF - i - 1] * Math.pow(256, i); - } - var fileLocator = packedLobHandle.slice(16, packedLobHandle.length - 1).toString(); - - return { - lobType : CAS.CUBRIDDataType.CCI_U_TYPE_CLOB, // CLOB type - packedLobHandle : packedLobHandle, - fileLocator : fileLocator, - lobLength : lobSize - }; + return lob; }; /** @@ -346,8 +357,8 @@ PacketReader.prototype._parseClob = function (size) { * @return {Array} */ PacketReader.prototype._parseSequence = function () { - var count = this._parseInt(); - var size = this._parseInt(); + let count = this._parseInt(); + let size = this._parseInt(); this._offset += count * size; return null; // Not supported diff --git a/src/packets/PacketWriter.js b/src/packets/PacketWriter.js index e9123d6..0901590 100644 --- a/src/packets/PacketWriter.js +++ b/src/packets/PacketWriter.js @@ -1,5 +1,6 @@ -var DATA_TYPES = require('./../constants/DataTypes'), - CAS = require('../constants/CASConstants'); +'use strict'; +const DATA_TYPES = require('./../constants/DataTypes'); +const CAS = require('../constants/CASConstants'); module.exports = PacketWriter; @@ -8,7 +9,7 @@ module.exports = PacketWriter; * @constructor */ function PacketWriter(length) { - this._buffer = new Buffer(length || 0); + this._buffer = new Buffer(length || 0); this._offset = 0; } @@ -20,6 +21,223 @@ PacketWriter.prototype._toBuffer = function () { return this._buffer.slice(0, this._offset); }; +/** + * Write a byte value to the internal buffer + * @param value + */ +PacketWriter.prototype.addByte = function (value) { + this._allocate( + /* size of any data is represented as an integer */DATA_TYPES.INT_SIZEOF + + /* the value itself */DATA_TYPES.BYTE_SIZEOF + ); + + // The length of the value. + this._writeInt(DATA_TYPES.BYTE_SIZEOF); + // The actual value. + this._buffer[this._offset++] = value & 0xFF; +}; + +/** + * Write a bytes array to the internal buffer + * @param bytesCount + * @param value + */ +PacketWriter.prototype.addBytes = function (value) { + const bytesCount = value.length; + + this._allocate( + /* size of any data is represented as an integer */DATA_TYPES.INT_SIZEOF + + /* the value itself */bytesCount + ); + + // The length of the value. + this._writeInt(bytesCount); + // The actual value. + this._writeBytes(value); +}; + +/** + * Write a date value to the internal buffer + * @param value + */ +PacketWriter.prototype.addDate = function (year, month, day) { + this._allocate( + /* size of any data is represented as an integer */DATA_TYPES.INT_SIZEOF + + /* the value itself */DATA_TYPES.DATE_SIZEOF + ); + + // The length of the value. + this._writeInt(DATA_TYPES.DATE_SIZEOF); + // The actual value. + this._writeDate(year, month, day); +}; + +/** + * Write a datetime value to the internal buffer + * @param value + */ +PacketWriter.prototype.addDateTime = function (year, month, day, hour, minute, second, millisecond) { + this._allocate( + /* size of any data is represented as an integer */DATA_TYPES.INT_SIZEOF + + /* the value itself */DATA_TYPES.DATETIME_SIZEOF + ); + + // The length of the value. + this._writeInt(DATA_TYPES.DATETIME_SIZEOF); + // The actual value. + this._writeDateTime(year, month, day, hour, minute, second, millisecond); +}; + +/** + * Write a datetime value to the internal buffer + * @param value + */ +PacketWriter.prototype.addDateTime = function (year, month, day, hour, minute, second, millisecond) { + this._allocate( + /* size of any data is represented as an integer */DATA_TYPES.INT_SIZEOF + + /* the value itself */DATA_TYPES.DATETIME_SIZEOF + ); + + // The length of the value. + this._writeInt(DATA_TYPES.DATETIME_SIZEOF); + // The actual value. + this._writeDateTime(year, month, day, hour, minute, second, millisecond); +}; + +/** + * Write a datetime value to the internal buffer + * @param value + */ +PacketWriter.prototype.addTimestamp = function (year, month, day, hour, minute, second) { + this._allocate( + /* size of any data is represented as an integer */DATA_TYPES.INT_SIZEOF + + /* the value itself */DATA_TYPES.TIMESTAMP_SIZEOF + ); + + // The length of the value. + this._writeInt(DATA_TYPES.TIMESTAMP_SIZEOF); + // The actual value. + this._writeTimestamp(year, month, day, hour, minute, second); +}; + +/** + * Write a double value to the internal buffer + * @param value + */ +PacketWriter.prototype.addDouble = function (value) { + this._allocate( + /* size of any data is represented as an integer */DATA_TYPES.INT_SIZEOF + + /* the value itself */DATA_TYPES.DOUBLE_SIZEOF + ); + + // The length of the value. + this._writeInt(DATA_TYPES.DOUBLE_SIZEOF); + // The actual value. + this._writeDouble(value); +}; + +/** + * Write a float value to the internal buffer + * @param value + */ +PacketWriter.prototype.addFloat = function (value) { + this._allocate( + /* size of any data is represented as an integer */DATA_TYPES.INT_SIZEOF + + /* the value itself */DATA_TYPES.FLOAT_SIZEOF + ); + + // The length of the value. + this._writeInt(DATA_TYPES.FLOAT_SIZEOF); + // The actual value. + this._writeFloat(value); +}; + +/** + * Write a integer value to the internal buffer + * @param value + */ +PacketWriter.prototype.addInt = function (value) { + this._allocate( + /* size of any data is represented as an integer */DATA_TYPES.INT_SIZEOF * 2 + ); + + // The length of the value. + this._writeInt(DATA_TYPES.INT_SIZEOF); + // The actual value. + this._writeInt(value); +}; + +/** + * Write a short value to the internal buffer + * @param value + */ +PacketWriter.prototype.addShort = function (value) { + this._allocate( + /* size of any data is represented as an integer */DATA_TYPES.INT_SIZEOF + DATA_TYPES.SHORT_SIZEOF + ); + + // The length of the value. + this._writeInt(DATA_TYPES.SHORT_SIZEOF); + // The actual value. + this._writeShort(value); +}; + +/** + * Write a time value to the internal buffer + * @param value + */ +PacketWriter.prototype.addTime = function (hour, minute, second) { + this._allocate( + /* size of any data is represented as an integer */DATA_TYPES.INT_SIZEOF + + /* the value itself */DATA_TYPES.TIME_SIZEOF + ); + + // The length of the value. + this._writeInt(DATA_TYPES.TIME_SIZEOF); + // The actual value. + this._writeTime(hour, minute, second); +}; + +/** + * Write a long value to the internal buffer + * @param value + */ +PacketWriter.prototype.addLong = function (value) { + this._allocate( + /* size of any data is represented as an integer */DATA_TYPES.INT_SIZEOF + DATA_TYPES.LONG_SIZEOF + ); + + // The length of the value. + this._writeInt(DATA_TYPES.LONG_SIZEOF); + // The actual value. + this._writeLong(value); +}; + +/** + * Write a NULL value to the internal buffer + */ +PacketWriter.prototype.addNull = function () { + this._allocate( + /* size of any data is represented as an integer */DATA_TYPES.INT_SIZEOF + ); + + // The actual value. + this._writeInt(0); +}; +/** + * Write a integer value to the internal buffer + * @param value + */ +PacketWriter.prototype.addCacheTime = function () { + const length = /* size of any data is represented as an integer */DATA_TYPES.INT_SIZEOF * 2; + this._allocate(length); + + // The actual value. + this._writeInt(length); /* length */ + this._writeInt(0); /* second */ + this._writeInt(0); /* millisecond */ +}; + /** * Write a byte value to the internal buffer * @param value @@ -45,12 +263,14 @@ PacketWriter.prototype._writeChar = function (value) { * @param bytesCount * @param value */ -PacketWriter.prototype._writeBytes = function (bytesCount, value) { +PacketWriter.prototype._writeBytes = function (value) { + const bytesCount = value.length; + this._allocate(bytesCount); - for (var i = 0; i < bytesCount; i++) { - this._buffer[this._offset++] = value[i] & 0xFF; - } + value.copy(this._buffer, this._offset, 0, bytesCount); + + this._offset += bytesCount; }; /** @@ -82,8 +302,8 @@ PacketWriter.prototype._writeInt = function (value) { * @param value */ PacketWriter.prototype._writeLong = function (value) { - var reminder = value % Math.pow(2, 32); - var quotient = (value - reminder) / Math.pow(2, 32); + const reminder = value % Math.pow(2, 32); + const quotient = (value - reminder) / Math.pow(2, 32); this._writeInt(quotient); this._writeInt(reminder); }; @@ -122,7 +342,8 @@ PacketWriter.prototype._writeNumeric = function (value) { * @param fillerValue */ PacketWriter.prototype._writeFiller = function (bytesCount, fillerValue) { - var fillerVal; + let fillerVal; + this._allocate(bytesCount); fillerValue = typeof fillerValue !== 'undefined' ? fillerValue : 0x00; @@ -133,7 +354,7 @@ PacketWriter.prototype._writeFiller = function (bytesCount, fillerValue) { fillerVal = fillerValue & 0xFF; } - for (var i = 0; i < bytesCount; i++) { + for (let i = 0; i < bytesCount; i++) { this._buffer[this._offset++] = fillerVal; } }; @@ -143,16 +364,18 @@ PacketWriter.prototype._writeFiller = function (bytesCount, fillerValue) { * @param value */ PacketWriter.prototype._writeNullTerminatedString = function (value) { - // Typecast undefined into '' and numbers into strings - value = value || ''; - value = value + ''; + // Typecast undefined into '' and numbers into strings. + value = value ? '' + value : ''; - var stringLengthInBytes = Buffer.byteLength(value); - var count = DATA_TYPES.INT_SIZEOF + stringLengthInBytes + DATA_TYPES.BYTE_SIZEOF; - this._allocate(count); + const stringLengthInBytes = Buffer.byteLength(value); + this._allocate( + /* the length of the string */ DATA_TYPES.INT_SIZEOF + + /* the actual string */stringLengthInBytes + + /* the terminating null of 1 byte length */ DATA_TYPES.BYTE_SIZEOF + ); - //Write length - this._writeInt(stringLengthInBytes + 1); + // Write length in bytes. + this._writeInt(stringLengthInBytes + /* `null` */ 1); this._buffer.write(value, this._offset, stringLengthInBytes); this._offset += stringLengthInBytes; @@ -168,19 +391,19 @@ PacketWriter.prototype._writeNullTerminatedString = function (value) { * @param fixedLength */ PacketWriter.prototype._writeFixedLengthString = function (value, fillerValue, fixedLength) { - var fillerVal; + let fillerVal; // Typecast undefined into '' and numbers into strings value = value || ''; value = value + ''; - var count = value.length; + let count = value.length; if (count >= fixedLength) { count = fixedLength; } this._allocate(fixedLength); - for (var i = 0; i < value.length; i++) { + for (let i = 0; i < value.length; i++) { this._buffer[this._offset++] = value[i].charCodeAt(0); } @@ -190,7 +413,7 @@ PacketWriter.prototype._writeFixedLengthString = function (value, fillerValue, f fillerVal = fillerValue & 0xFF; } - for (var j = 1; j <= fixedLength - count; j++) { + for (let j = 1; j <= fixedLength - count; j++) { this._buffer[this._offset++] = fillerVal; } }; @@ -202,15 +425,7 @@ PacketWriter.prototype._writeFixedLengthString = function (value, fillerValue, f * @param day */ PacketWriter.prototype._writeDate = function (year, month, day) { - this._allocate(DATA_TYPES.DATETIME_SIZEOF); - - this._writeShort(year); - this._writeShort(month); - this._writeShort(day); - this._writeShort(0); - this._writeShort(0); - this._writeShort(0); - this._writeShort(0); + this._writeDateTime(year, month, day, 0, 0, 0, 0); }; /** @@ -227,7 +442,9 @@ PacketWriter.prototype._writeDateTime = function (year, month, day, hour, min, s this._allocate(DATA_TYPES.DATETIME_SIZEOF); this._writeShort(year); - this._writeShort(month); + // `month` in JS is `0` based; `9` is for October. + // But in CUBRID we need to store the actual value. + this._writeShort(month + 1); this._writeShort(day); this._writeShort(hour); this._writeShort(min); @@ -238,19 +455,11 @@ PacketWriter.prototype._writeDateTime = function (year, month, day, hour, min, s /** * Write a Time value to the internal buffer * @param hour - * @param min - * @param sec + * @param minute + * @param second */ -PacketWriter.prototype._writeTime = function (hour, min, sec) { - this._allocate(DATA_TYPES.DATETIME_SIZEOF); - - this._writeShort(0); - this._writeShort(0); - this._writeShort(0); - this._writeShort(hour); - this._writeShort(min); - this._writeShort(sec); - this._writeShort(0); +PacketWriter.prototype._writeTime = function (hour, minute, second) { + this._writeDateTime(0, /* month: `_writeDateTime` will do `+1` */-1, 0, hour, minute, second, 0); }; /** @@ -263,22 +472,14 @@ PacketWriter.prototype._writeTime = function (hour, min, sec) { * @param sec */ PacketWriter.prototype._writeTimestamp = function (year, month, day, hour, min, sec) { - this._allocate(DATA_TYPES.DATETIME_SIZEOF); - - this._writeShort(year); - this._writeShort(month); - this._writeShort(day); - this._writeShort(hour); - this._writeShort(min); - this._writeShort(sec); - this._writeShort(0); + this._writeDateTime(year, month, day, hour, min, sec, 0); }; /** * Write a Object value to the internal buffer * @param value */ -PacketWriter.prototype._writeObject = function (value) { +PacketWriter.prototype._writeObject = function () { this._writeByte(0); // Not supported }; @@ -286,7 +487,7 @@ PacketWriter.prototype._writeObject = function (value) { * Write a Sequence value to the internal buffer * @param value */ -PacketWriter.prototype._writeSequence = function (value) { +PacketWriter.prototype._writeSequence = function () { this._writeByte(0); // Not supported }; @@ -294,7 +495,7 @@ PacketWriter.prototype._writeSequence = function (value) { * Write a ResultSet value to the internal buffer * @param value */ -PacketWriter.prototype._writeResultSet = function (value) { +PacketWriter.prototype._writeResultSet = function () { this._writeByte(0); // Not supported }; @@ -327,7 +528,7 @@ PacketWriter.prototype._writeClob = function (value) { * @param value */ PacketWriter.prototype._writeBuffer = function (value) { - var count = value.length; + const count = value.length; this._allocate(count); value.copy(this._buffer, this._offset); @@ -342,13 +543,13 @@ PacketWriter.prototype._writeBuffer = function (value) { */ PacketWriter.prototype._allocate = function (count) { // Verify if we need to allocate more space - var bytesRemaining = this._buffer.length - this._offset; + const bytesRemaining = this._buffer.length - this._offset; if (bytesRemaining < count) { - var oldBuffer = this._buffer; + let oldBuffer = this._buffer; - this._buffer = new Buffer(oldBuffer.length + (count - bytesRemaining)); + this._buffer = new Buffer(oldBuffer.length + (count - bytesRemaining)); - oldBuffer.copy(this._buffer); + oldBuffer.copy(this._buffer); } }; diff --git a/src/packets/PrepareExecuteOldProtocolPacket.js b/src/packets/PrepareExecuteOldProtocolPacket.js deleted file mode 100644 index 6c8d65b..0000000 --- a/src/packets/PrepareExecuteOldProtocolPacket.js +++ /dev/null @@ -1,624 +0,0 @@ -var DATA_TYPES = require('../constants/DataTypes'), - Helpers = require('../utils/Helpers'), - CAS = require('../constants/CASConstants'), - ErrorMessages = require('../constants/ErrorMessages'), - ColumnMetaData = require('../resultset/ColumnMetaData'), - PacketWriter = require('../packets/PacketWriter'), - ResultInfo = require('../resultset/ResultInfo'); - -module.exports = PrepareAndExecutePacket; - -/** - * Constructor - * @param options - * @constructor - */ -function PrepareAndExecutePacket(options) { - options = options || {}; - - this.casInfo = options.casInfo; - this.sql = options.sql; - this.autoCommit = options.autoCommitMode; - this.dbVersion = options.dbVersion; - this.paramValues = options.paramValues; - this.paramTypes = options.paramTypes; - - this.resultSet = ''; - this.resultCacheLifetime = 0; // Cache lifetime - this.statementType = null; // Statement type - this.bindCount = 0; // Bind count - this.isUpdatable = false; // Is updatable - this.totalTupleCount = 0; // Total nomber of tuples - this.cache_reusable = 0; // Cache reusable - this.resultCount = 0; // Number of results - this.columnCount = 0; // Number of columns - this.infoArray = new ColumnMetaData(); // Column meta data - this.resultInfos = new ResultInfo(); // Result info - this.queryHandle = 0; // Query handle - this.currentTupleCount = 0; // Current number of returned tuples - this.tupleCount = 0; // Number of tuples - this.bindCount = 0; // Number of parameters to bind - this.isUpdatable = false; - this.resultCacheLifetime = 0; - - this.responseCode = 0; // Response code - this.errorCode = 0; // Error code - this.errorMsg = ''; // Error message -} - -/** - * Write prepare data - * @param writer - */ -PrepareAndExecutePacket.prototype.writePrepare = function (writer) { - // Prepare info - writer._writeInt(this.getPrepareBufferLength() - DATA_TYPES.DATA_LENGTH_SIZEOF - DATA_TYPES.CAS_INFO_SIZE); - writer._writeBytes(DATA_TYPES.CAS_INFO_SIZE, this.casInfo); - - writer._writeByte(CAS.CASFunctionCode.CAS_FC_PREPARE); - writer._writeNullTerminatedString(this.sql); // Sql string - writer._writeInt(DATA_TYPES.BYTE_SIZEOF); - writer._writeByte(CAS.CCIPrepareOption.CCI_PREPARE_NORMAL); // Prepare flag - writer._writeInt(DATA_TYPES.BYTE_SIZEOF); - writer._writeByte(this.autoCommit ? 1 : 0); // Autocommit mode - - return writer; -}; - -/** - * Write execute data - * @param writer - */ -PrepareAndExecutePacket.prototype.writeExecute = function (writer) { - var bufferLength = this.getExecuteBufferLength(); - - writer._writeInt(bufferLength - DATA_TYPES.DATA_LENGTH_SIZEOF - DATA_TYPES.CAS_INFO_SIZE); - writer._writeBytes(DATA_TYPES.CAS_INFO_SIZE, this.casInfo); - writer._writeByte(CAS.CASFunctionCode.CAS_FC_EXECUTE); - - writer._writeInt(DATA_TYPES.INT_SIZEOF); - writer._writeInt(this.queryHandle); - writer._writeInt(DATA_TYPES.BYTE_SIZEOF); - writer._writeByte(CAS.CCIExecutionOption.CCI_EXEC_NORMAL); // Execute flag - writer._writeInt(DATA_TYPES.INT_SIZEOF); - writer._writeInt(0); // Max col size; - writer._writeInt(DATA_TYPES.INT_SIZEOF); - writer._writeInt(0); // Max row size; - writer._writeInt(0); // NULL - writer._writeInt(DATA_TYPES.BYTE_SIZEOF); - - if (this.statementType !== CAS.CUBRIDStatementType.CUBRID_STMT_SELECT) { - writer._writeByte(0); // FetchFlag; - } else { - writer._writeByte(1); // FetchFlag; - } - - writer._writeInt(DATA_TYPES.BYTE_SIZEOF); - writer._writeByte(this.autoCommit ? 1 : 0); // Autocommit mode - writer._writeInt(DATA_TYPES.BYTE_SIZEOF); - writer._writeByte(1); // Forrward only cursor - writer._writeInt(2 * DATA_TYPES.INT_SIZEOF); // Write cache time - writer._writeInt(0); // Seconds - writer._writeInt(0); // Useconds - writer._writeInt(DATA_TYPES.INT_SIZEOF); - writer._writeInt(0); // Query timeout - - if (this.paramValues !== null) { - this._writeParamValue(writer); - } - - return writer; -}; - -/** - * Read prepare data - * @param parser - */ -PrepareAndExecutePacket.prototype.parsePrepare = function (parser) { - var responseLength = parser._parseInt(); - this.casInfo = parser._parseBytes(DATA_TYPES.CAS_INFO_SIZE); - - this.responseCode = parser._parseInt(); - if (this.responseCode < 0) { - this.errorCode = parser._parseInt(); - this.errorMsg = parser._parseNullTerminatedString(responseLength - 2 * DATA_TYPES.INT_SIZEOF); - if (this.errorMsg.length === 0) { - this.errorMsg = Helpers._resolveErrorCode(this.errorCode); - } - } else { - this.queryHandle = this.responseCode; // Query handle - this.resultCacheLifetime = parser._parseInt(); // Cache lifetime - this.statementType = parser._parseByte(); // Statement type - this.bindCount = parser._parseInt(); // Bind count - this.isUpdatable = (parser._parseByte() === 1); // Updatable? - this.columnCount = parser._parseInt(); // Column count - this.infoArray = []; - for (var i = 0; i < this.columnCount; i++) { - var info = new ColumnMetaData(); - info.ColumnType = parser._parseByte(); // Column type - info.scale = parser._parseShort(); // Scale - info.precision = parser._parseInt(); // Precision - var len = parser._parseInt(); - info.Name = parser._parseNullTerminatedString(len); // Column name - len = parser._parseInt(); - info.RealName = parser._parseNullTerminatedString(len); // Column real name - len = parser._parseInt(); - info.TableName = parser._parseNullTerminatedString(len); // Table name - info.IsNullable = (parser._parseByte() === 1); // Nullable? - len = parser._parseInt(); - info.DafaultValue = parser._parseNullTerminatedString(len); // Default value - info.IsAutoIncrement = (parser._parseByte() === 1); // Auto-increment? - info.IsUniqueKey = (parser._parseByte() === 1); // Unique key? - info.IsPrimaryKey = (parser._parseByte() === 1); // Primary key? - info.IsReverseIndex = (parser._parseByte() === 1); // Reserved key index - info.IsReverseUnique = (parser._parseByte() === 1); // Reverse unique? - info.IsForeignKey = (parser._parseByte() === 1); // Foreign key? - info.IsShared = (parser._parseByte() === 1); // Shared? - this.infoArray[i] = info; - } - } - return this; -}; - -/** - * Read execute data - * @param parser - */ -PrepareAndExecutePacket.prototype.parseExecute = function (parser) { - var responseLength = parser._parseInt(); - this.casInfo = parser._parseBytes(DATA_TYPES.CAS_INFO_SIZE); - - this.responseCode = parser._parseInt(); - if (this.responseCode < 0) { - this.errorCode = parser._parseInt(); - this.errorMsg = parser._parseNullTerminatedString(responseLength - 2 * DATA_TYPES.INT_SIZEOF); - if (this.errorMsg.length === 0) { - this.errorMsg = Helpers._resolveErrorCode(this.errorCode); - } - } else { - this.totalTupleCount = this.responseCode; - this.cache_reusable = parser._parseByte(); - this.resultCount = parser._parseInt(); - // Read result info - for (i = 0; i < this.resultCount; i++) { - var resultInfo = new ResultInfo(); - resultInfo.StmtType = parser._parseByte(); // Statement type - resultInfo.ResultCount = parser._parseInt(); // Result count - resultInfo.Oid = parser._parseBytes(DATA_TYPES.OID_SIZEOF); // OID - resultInfo.CacheTimeSec = parser._parseInt(); // Cache time seconds - resultInfo.CacheTimeUsec = parser._parseInt(); // Cache time milliseconds - this.resultInfos[i] = resultInfo; - } - - if (this.statementType === CAS.CUBRIDStatementType.CUBRID_STMT_SELECT) { - var fetchCode = parser._parseInt(); // Fetch code - this.tupleCount = parser._parseInt(); // Tuple count - var columnNames = new Array(this.columnCount); - var columnDataTypes = new Array(this.columnCount); - var columnValues = new Array(this.tupleCount); - for (var i = 0; i < this.columnCount; i++) { - columnNames[i] = this.infoArray[i].Name; - columnDataTypes[i] = CAS.getCUBRIDDataTypeName(this.infoArray[i].ColumnType); - } - - columnValues = this._getData(parser, this.tupleCount); - - this.resultSet = JSON.stringify( - { - ColumnNames : columnNames, - ColumnDataTypes : columnDataTypes, - RowsCount : this.totalTupleCount, - ColumnValues : columnValues - } - ); - } - } - - return this; -}; - -/** - * Get records data from stream - * @param parser - * @param tupleCount - */ -PrepareAndExecutePacket.prototype._getData = function (parser, tupleCount) { - var columnValues = new Array(tupleCount); - for (var i = 0; i < tupleCount; i++) { - columnValues[i] = new Array(this.columnCount); - var index = parser._parseInt(); - var Oid = parser._parseBytes(DATA_TYPES.OID_SIZEOF); - for (var j = 0; j < this.columnCount; j++) { - var size = parser._parseInt(); - var val; - if (size <= 0) { - val = null; - } else { - var type = CAS.CUBRIDDataType.CCI_U_TYPE_NULL; - - if (this.statementType === CAS.CUBRIDStatementType.CUBRID_STMT_CALL || - this.statementType === CAS.CUBRIDStatementType.CUBRID_STMT_EVALUATE || - this.statementType === CAS.CUBRIDStatementType.CUBRID_STMT_CALL_SP || - this.infoArray[j].ColumnType === CAS.CUBRIDDataType.CCI_U_TYPE_NULL) { - type = parser._parseByte(); - size--; - } else { - type = this.infoArray[j].ColumnType; - } - - val = this._readValue(j, type, size, parser); - columnValues[i][j] = val; - } - } - } - this.currentTupleCount += tupleCount; - - return columnValues; -}; - -/** - * Read column value from stream - * @param index - * @param type - * @param size - * @param parser - */ -PrepareAndExecutePacket.prototype._readValue = function (index, type, size, parser) { - switch (type) { - case CAS.CUBRIDDataType.CCI_U_TYPE_CHAR: - case CAS.CUBRIDDataType.CCI_U_TYPE_NCHAR: - case CAS.CUBRIDDataType.CCI_U_TYPE_STRING: - case CAS.CUBRIDDataType.CCI_U_TYPE_VARNCHAR: - return parser._parseNullTerminatedString(size); - - case CAS.CUBRIDDataType.CCI_U_TYPE_SHORT: - return parser._parseShort(); - - case CAS.CUBRIDDataType.CCI_U_TYPE_INT: - return parser._parseInt(); - - case CAS.CUBRIDDataType.CCI_U_TYPE_BIGINT: - return parser._parseLong(); - - case CAS.CUBRIDDataType.CCI_U_TYPE_FLOAT: - return parser._parseFloat(); - - case CAS.CUBRIDDataType.CCI_U_TYPE_DOUBLE: - case CAS.CUBRIDDataType.CCI_U_TYPE_MONETARY: - return parser._parseDouble(); - - case CAS.CUBRIDDataType.CCI_U_TYPE_NUMERIC: - return parser._parseNumeric(size); - - case CAS.CUBRIDDataType.CCI_U_TYPE_DATE: - return parser._parseDate(); - - case CAS.CUBRIDDataType.CCI_U_TYPE_TIME: - return parser._parseTime(); - - case CAS.CUBRIDDataType.CCI_U_TYPE_DATETIME: - return parser._parseDateTime(); - - case CAS.CUBRIDDataType.CCI_U_TYPE_TIMESTAMP: - return parser._parseTimeStamp(); - - case CAS.CUBRIDDataType.CCI_U_TYPE_OBJECT: - return parser._parseObject(); - - case CAS.CUBRIDDataType.CCI_U_TYPE_BIT: - case CAS.CUBRIDDataType.CCI_U_TYPE_VARBIT: - return parser._parseBytes(size); - - case CAS.CUBRIDDataType.CCI_U_TYPE_SET: - case CAS.CUBRIDDataType.CCI_U_TYPE_MULTISET: - case CAS.CUBRIDDataType.CCI_U_TYPE_SEQUENCE: - return parser._parseSequence(); - - case CAS.CUBRIDDataType.CCI_U_TYPE_BLOB: - return parser._parseBlob(size); - - case CAS.CUBRIDDataType.CCI_U_TYPE_CLOB: - return parser._parseClob(size); - - case CAS.CUBRIDDataType.CCI_U_TYPE_RESULTSET: - return parser._parseResultSet(); - - default: - return new Error(ErrorMessages.ERROR_INVALID_DATA_TYPE); - } -}; - -/** - * Write parameter value to stream - * @param value - * @param type - * @param writer - */ -PrepareAndExecutePacket.prototype._writeParamValue = function (writer) { - for (var i = 0, l = this.paramValues.length; i < l; ++i) { - var value = this.paramValues[i], - paramType = CAS.getCUBRIDDataTypeNumber(this.paramTypes[i]); - - writer._writeInt(DATA_TYPES.BYTE_SIZEOF); - writer._writeByte(paramType); - - switch (paramType) { - case CAS.CUBRIDDataType.CCI_U_TYPE_CHAR: - case CAS.CUBRIDDataType.CCI_U_TYPE_NCHAR: - case CAS.CUBRIDDataType.CCI_U_TYPE_STRING: - case CAS.CUBRIDDataType.CCI_U_TYPE_VARNCHAR: - writer._writeNullTerminatedString(value); - break; - - case CAS.CUBRIDDataType.CCI_U_TYPE_SHORT: - writer._writeInt(DATA_TYPES.SHORT_SIZEOF); - writer._writeShort(value); - break; - - case CAS.CUBRIDDataType.CCI_U_TYPE_INT: - writer._writeInt(DATA_TYPES.INT_SIZEOF); - writer._writeInt(value); - break; - - case CAS.CUBRIDDataType.CCI_U_TYPE_BIGINT: - writer._writeInt(DATA_TYPES.LONG_SIZEOF); - writer._writeLong(value); - break; - - case CAS.CUBRIDDataType.CCI_U_TYPE_FLOAT: - writer._writeInt(DATA_TYPES.FLOAT_SIZEOF); - writer._writeFloat(value); - break; - - case CAS.CUBRIDDataType.CCI_U_TYPE_DOUBLE: - case CAS.CUBRIDDataType.CCI_U_TYPE_MONETARY: - writer._writeInt(DATA_TYPES.DOUBLE_SIZEOF); - writer._writeDouble(value); - break; - - case CAS.CUBRIDDataType.CCI_U_TYPE_NUMERIC: - writer._writeNumeric(value); - break; - - case CAS.CUBRIDDataType.CCI_U_TYPE_DATE: - writer._writeInt(DATA_TYPES.DATE_SIZEOF); - writer._writeDate(value.getUTCFullYear(), value.getUTCMonth(), value.getUTCDate()); - break; - - case CAS.CUBRIDDataType.CCI_U_TYPE_TIME: - writer._writeInt(DATA_TYPES.TIME_SIZEOF); - writer._writeTime(value.getUTCHours(), value.getUTCMinutes(), value.getUTCSeconds()); - break; - - case CAS.CUBRIDDataType.CCI_U_TYPE_DATETIME: - writer._writeInt(DATA_TYPES.DATETIME_SIZEOF); - writer._writeDateTime(value.getUTCFullYear(), value.getUTCMonth(), value.getUTCDate(), - value.getUTCHours(), value.getUTCMinutes(), value.getUTCSeconds(), value.getUTCMilliseconds()); - break; - - case CAS.CUBRIDDataType.CCI_U_TYPE_TIMESTAMP: - writer._writeInt(DATA_TYPES.TIMESTAMP_SIZEOF); - writer._writeTimestamp(value.getUTCFullYear(), value.getUTCMonth(), value.getUTCDate(), - value.getUTCHours(), value.getUTCMinutes(), value.getUTCSeconds()); - break; - - case CAS.CUBRIDDataType.CCI_U_TYPE_OBJECT: - writer._writeInt(0); - writer._writeObject(value); - break; - - case CAS.CUBRIDDataType.CCI_U_TYPE_BIT: - case CAS.CUBRIDDataType.CCI_U_TYPE_VARBIT: - writer._writeInt(value.length); - writer._writeBytes(value.length, value); - break; - - case CAS.CUBRIDDataType.CCI_U_TYPE_SET: - case CAS.CUBRIDDataType.CCI_U_TYPE_MULTISET: - case CAS.CUBRIDDataType.CCI_U_TYPE_SEQUENCE: - writer._writeInt(0); - writer._writeSequence(value); - break; - - case CAS.CUBRIDDataType.CCI_U_TYPE_BLOB: - writer._writeBlob(value); - break; - - case CAS.CUBRIDDataType.CCI_U_TYPE_CLOB: - writer._writeClob(value); - break; - - case CAS.CUBRIDDataType.CCI_U_TYPE_RESULTSET: - writer._writeInt(DATA_TYPES.RESULTSET_SIZEOF); - writer._writeResultSet(value); - break; - - default: - return new Error(ErrorMessages.ERROR_INVALID_DATA_TYPE); - } - } -}; - -PrepareAndExecutePacket.prototype.getPrepareBufferLength = function () { - var bufferLength = DATA_TYPES.DATA_LENGTH_SIZEOF + DATA_TYPES.CAS_INFO_SIZE + - DATA_TYPES.BYTE_SIZEOF + DATA_TYPES.INT_SIZEOF + Buffer.byteLength(this.sql) + 1 + - DATA_TYPES.INT_SIZEOF + DATA_TYPES.BYTE_SIZEOF + DATA_TYPES.INT_SIZEOF + DATA_TYPES.BYTE_SIZEOF; - - return bufferLength; -}; - -PrepareAndExecutePacket.prototype.getExecuteBufferLength = function () { - var bufferLength = DATA_TYPES.DATA_LENGTH_SIZEOF + DATA_TYPES.CAS_INFO_SIZE + - DATA_TYPES.BYTE_SIZEOF + DATA_TYPES.INT_SIZEOF + DATA_TYPES.INT_SIZEOF + - DATA_TYPES.INT_SIZEOF + DATA_TYPES.BYTE_SIZEOF + DATA_TYPES.INT_SIZEOF + - DATA_TYPES.INT_SIZEOF + DATA_TYPES.INT_SIZEOF + DATA_TYPES.INT_SIZEOF + - DATA_TYPES.INT_SIZEOF + DATA_TYPES.INT_SIZEOF + DATA_TYPES.INT_SIZEOF + - DATA_TYPES.BYTE_SIZEOF + DATA_TYPES.INT_SIZEOF + DATA_TYPES.INT_SIZEOF + - DATA_TYPES.BYTE_SIZEOF + DATA_TYPES.INT_SIZEOF + DATA_TYPES.INT_SIZEOF + - DATA_TYPES.INT_SIZEOF + DATA_TYPES.INT_SIZEOF + DATA_TYPES.BYTE_SIZEOF + - this._getParamValuesBufferLength(); - - return bufferLength; -}; - -PrepareAndExecutePacket.prototype._getParamValuesBufferLength = function () { - var paramValuesBufferLength = 0; - - if (this.paramValues) { - for (var i = this.paramValues.length - 1; i > -1; --i) { - var value = this.paramValues[i], - paramType = CAS.getCUBRIDDataTypeNumber(this.paramTypes[i]); - - // First, determine the size of the param type. - paramValuesBufferLength += - // The length of the data type. - DATA_TYPES.INT_SIZEOF + - // The size of the value. - DATA_TYPES.BYTE_SIZEOF; - - switch (paramType) { - case CAS.CUBRIDDataType.CCI_U_TYPE_CHAR: - case CAS.CUBRIDDataType.CCI_U_TYPE_NCHAR: - case CAS.CUBRIDDataType.CCI_U_TYPE_STRING: - case CAS.CUBRIDDataType.CCI_U_TYPE_VARNCHAR: - paramValuesBufferLength += - // The length of this part. - DATA_TYPES.INT_SIZEOF + - // The bytes length of the value. - Buffer.byteLength(value) + - // null character size. - DATA_TYPES.BYTE_SIZEOF; - break; - - case CAS.CUBRIDDataType.CCI_U_TYPE_SHORT: - paramValuesBufferLength += - // The length of this part. - DATA_TYPES.INT_SIZEOF + - // The size of the value. - DATA_TYPES.SHORT_SIZEOF; - break; - - case CAS.CUBRIDDataType.CCI_U_TYPE_INT: - paramValuesBufferLength += - // The length of this part + - // the size of the value. - DATA_TYPES.INT_SIZEOF * 2; - break; - - case CAS.CUBRIDDataType.CCI_U_TYPE_BIGINT: - paramValuesBufferLength += - // The length of this part. - DATA_TYPES.INT_SIZEOF + - // The size of the value. - DATA_TYPES.LONG_SIZEOF; - break; - - case CAS.CUBRIDDataType.CCI_U_TYPE_FLOAT: - paramValuesBufferLength += - // The length of this part. - DATA_TYPES.INT_SIZEOF + - // The size of the value. - DATA_TYPES.FLOAT_SIZEOF; - break; - - case CAS.CUBRIDDataType.CCI_U_TYPE_DOUBLE: - case CAS.CUBRIDDataType.CCI_U_TYPE_MONETARY: - paramValuesBufferLength += - // The length of this part. - DATA_TYPES.INT_SIZEOF + - // The size of the value. - DATA_TYPES.DOUBLE_SIZEOF; - break; - - case CAS.CUBRIDDataType.CCI_U_TYPE_NUMERIC: - paramValuesBufferLength += - // The length of this part. - DATA_TYPES.INT_SIZEOF + - // The bytes length of the numeric value. - // See `_writeNumeric`. - Buffer.byteLength(value.toString(10)) + - // null character size. - DATA_TYPES.BYTE_SIZEOF; - break; - - case CAS.CUBRIDDataType.CCI_U_TYPE_DATE: - paramValuesBufferLength += - // The length of this part. - DATA_TYPES.INT_SIZEOF + - // The size of the data type value. - DATA_TYPES.DATE_SIZEOF; - break; - - case CAS.CUBRIDDataType.CCI_U_TYPE_TIME: - paramValuesBufferLength += - // The length of this part. - DATA_TYPES.INT_SIZEOF + - // The size of the value. - DATA_TYPES.TIME_SIZEOF; - break; - - case CAS.CUBRIDDataType.CCI_U_TYPE_DATETIME: - paramValuesBufferLength += - // The length of this part. - DATA_TYPES.INT_SIZEOF + - // The size of the value. - DATA_TYPES.DATETIME_SIZEOF; - break; - - case CAS.CUBRIDDataType.CCI_U_TYPE_TIMESTAMP: - paramValuesBufferLength += - // The length of this part. - DATA_TYPES.INT_SIZEOF + - // The size of the value. - DATA_TYPES.TIMESTAMP_SIZEOF; - break; - - case CAS.CUBRIDDataType.CCI_U_TYPE_OBJECT: - case CAS.CUBRIDDataType.CCI_U_TYPE_SET: - case CAS.CUBRIDDataType.CCI_U_TYPE_MULTISET: - case CAS.CUBRIDDataType.CCI_U_TYPE_SEQUENCE: - case CAS.CUBRIDDataType.CCI_U_TYPE_RESULTSET: - paramValuesBufferLength += - // The length of this part. - DATA_TYPES.INT_SIZEOF + - // The size of the value. - // `_writeObject`, `_writeSequence`, `_writeResultSet` - // are not supported yet but still we send the - // `0` byte. - DATA_TYPES.BYTE_SIZEOF; - break; - - case CAS.CUBRIDDataType.CCI_U_TYPE_BIT: - case CAS.CUBRIDDataType.CCI_U_TYPE_VARBIT: - paramValuesBufferLength += - // The length of this part. - DATA_TYPES.INT_SIZEOF + - // The size of the value. - value.length; - break; - - case CAS.CUBRIDDataType.CCI_U_TYPE_BLOB: - case CAS.CUBRIDDataType.CCI_U_TYPE_CLOB: - paramValuesBufferLength += - // The length of this part + - // the type of the value. - DATA_TYPES.INT_SIZEOF * 2 + - // The length of the type of this CLOB. - DATA_TYPES.LONG_SIZEOF + - // The actual length. - DATA_TYPES.INT_SIZEOF + - // The length of the value in bytes. - Buffer.byteLength(value.fileLocator) + - // The null character size. - DATA_TYPES.BYTE_SIZEOF; - break; - - default: - return new Error(ErrorMessages.ERROR_INVALID_DATA_TYPE); - } - - } - } - - return paramValuesBufferLength; -}; diff --git a/src/packets/PrepareExecutePacket.js b/src/packets/PrepareExecutePacket.js new file mode 100644 index 0000000..0b4166c --- /dev/null +++ b/src/packets/PrepareExecutePacket.js @@ -0,0 +1,620 @@ +'use strict'; + +const CAS = require('../constants/CASConstants'); +const DATA_TYPES = require('../constants/DataTypes'); +const ErrorMessages = require('../constants/ErrorMessages'); +const ColumnMetaData = require('../resultset/ColumnMetaData'); +const ResultInfo = require('../resultset/ResultInfo'); + +/** + * Constructor + * @param options + * @constructor + */ +function PrepareExecutePacket(options) { + this.options = options; +} + +/** + * Write prepare data + * @param writer + */ +PrepareExecutePacket.prototype.writePrepare = function (writer) { + const options = this.options; + + writer._writeInt(this.getPrepareBufferLength() - DATA_TYPES.DATA_LENGTH_SIZEOF - DATA_TYPES.CAS_INFO_SIZE); + writer._writeBytes(options.casInfo); + + writer._writeByte(CAS.CASFunctionCode.CAS_FC_PREPARE); + writer._writeNullTerminatedString(options.sql); + writer.addByte(CAS.CCIPrepareOption.CCI_PREPARE_NORMAL); + writer.addByte(options.autoCommit ? 1 : 0); + + return writer; +}; + +/** + * Write execute data + * @param writer + */ +PrepareExecutePacket.prototype.writeExecute = function (writer) { + const bufferLength = this.getExecuteBufferLength(); + const options = this.options; + + writer._writeInt(bufferLength - DATA_TYPES.DATA_LENGTH_SIZEOF - DATA_TYPES.CAS_INFO_SIZE); + writer._writeBytes(options.casInfo); + writer._writeByte(CAS.CASFunctionCode.CAS_FC_EXECUTE); + + writer.addInt(this.queryHandle); + writer.addByte(CAS.CCIExecutionOption.CCI_EXEC_NORMAL); // Execute flag + writer.addInt(0); // Max col size; + writer.addInt(0); // Max row size; + writer.addNull(); // NULL + writer._writeInt(DATA_TYPES.BYTE_SIZEOF); + + // FetchFlag; + if (this.statementType === CAS.CUBRIDStatementType.CUBRID_STMT_SELECT) { + writer._writeByte(1); + } else { + writer._writeByte(0); + } + + writer.addByte(options.autoCommit ? 1 : 0); // Autocommit mode + writer.addByte(1); // Forward only cursor + writer.addCacheTime(); // Write cache time + + writer.addInt(0); // Query timeout + + if (options.paramValues) { + this._writeParamValue(writer); + } + + return writer; +}; + +/** + * Read prepare data + * @param parser + */ +PrepareExecutePacket.prototype.parsePrepare = function (parser) { + const responseLength = parser._parseInt(); + this.casInfo = parser._parseBytes(DATA_TYPES.CAS_INFO_SIZE); + + this.responseCode = parser._parseInt(); + + if (this.responseCode < 0) { + return parser.readError(responseLength); + } + + this.queryHandle = this.responseCode; // Query handle + this.resultCacheLifetime = parser._parseInt(); // Cache lifetime + this.statementType = parser._parseByte(); // Statement type + this.bindCount = parser._parseInt(); // Bind count + this.isUpdatable = parser._parseByte() === 1; // Updatable? + this.columnCount = parser._parseInt(); // Column count + this.infoArray = []; + + for (let i = 0; i < this.columnCount; ++i) { + let info = new ColumnMetaData(); + + info.ColumnType = parser._parseByte(); // Column type + info.scale = parser._parseShort(); // Scale + info.precision = parser._parseInt(); // Precision + + let len = parser._parseInt(); + + info.Name = parser._parseNullTerminatedString(len); // Column name + len = parser._parseInt(); + info.RealName = parser._parseNullTerminatedString(len); // Column real name + len = parser._parseInt(); + info.TableName = parser._parseNullTerminatedString(len); // Table name + info.IsNullable = (parser._parseByte() === 1); // Nullable? + len = parser._parseInt(); + info.DafaultValue = parser._parseNullTerminatedString(len); // Default value + info.IsAutoIncrement = (parser._parseByte() === 1); // Auto-increment? + info.IsUniqueKey = (parser._parseByte() === 1); // Unique key? + info.IsPrimaryKey = (parser._parseByte() === 1); // Primary key? + info.IsReverseIndex = (parser._parseByte() === 1); // Reserved key index + info.IsReverseUnique = (parser._parseByte() === 1); // Reverse unique? + info.IsForeignKey = (parser._parseByte() === 1); // Foreign key? + info.IsShared = (parser._parseByte() === 1); // Shared? + + this.infoArray.push(info); + } +}; + +/** + * Read execute data + * @param parser + */ +PrepareExecutePacket.prototype.parseExecute = function (parser) { + const options = this.options; + const responseLength = parser._parseInt(); + + this.casInfo = parser._parseBytes(DATA_TYPES.CAS_INFO_SIZE); + + this.responseCode = parser._parseInt(); + + if (this.responseCode < 0) { + return parser.readError(responseLength); + } + + this.totalTupleCount = this.responseCode; + // Cache reusable. + parser._parseByte(); + // Number of results executed. + this.resultCount = parser._parseInt(); + this.resultInfos = []; + + // Read result info. + for (let i = 0; i < this.resultCount; i++) { + let resultInfo = new ResultInfo(); + + resultInfo.StmtType = parser._parseByte(); // Statement type + resultInfo.ResultCount = parser._parseInt(); // Result count + + resultInfo.Oid = parser._parseBytes(DATA_TYPES.OID_SIZEOF); // OID + + resultInfo.CacheTimeSec = parser._parseInt(); // Cache time seconds + resultInfo.CacheTimeUsec = parser._parseInt(); // Cache time milliseconds + + this.resultInfos.push(resultInfo); + } + + if (options.protocolVersion > 1) { + // include_column_info + if (parser._parseByte() === 1) { + // TODO: this part of the code should process a specific case that is not used in node-cubrid. + } + } + + if (options.protocolVersion > 4) { + this.shardId = parser._parseInt(); + } + + if (this.statementType === CAS.CUBRIDStatementType.CUBRID_STMT_SELECT) { + // Fetch code. + parser._parseInt(); + this.tupleCount = parser._parseInt(); // Tuple count + this.currentTupleCount = 0; // Current number of returned tuples + + let columnNames = new Array(this.columnCount); + let columnDataTypes = new Array(this.columnCount); + + for (let i = 0; i < this.columnCount; i++) { + columnNames[i] = this.infoArray[i].Name; + columnDataTypes[i] = CAS.getCUBRIDDataTypeName(this.infoArray[i].ColumnType); + } + + let columnValues = this.getValues(parser, this.tupleCount); + + this.resultSet = { + ColumnNames : columnNames, + ColumnDataTypes : columnDataTypes, + RowsCount : this.totalTupleCount, + ColumnValues : columnValues + }; + } +}; + +/** + * Get records data from stream + * @param parser + * @param tupleCount + */ +PrepareExecutePacket.prototype.getValues = function (parser, tupleCount) { + let columnValues = new Array(tupleCount); + const columns = this.infoArray; + const columnCount = this.columnCount; + const statementType = this.statementType; + + const CUBRID_STMT_CALL = CAS.CUBRIDStatementType.CUBRID_STMT_CALL; + const CUBRID_STMT_EVALUATE = CAS.CUBRIDStatementType.CUBRID_STMT_EVALUATE; + const CUBRID_STMT_CALL_SP = CAS.CUBRIDStatementType.CUBRID_STMT_CALL_SP; + + for (let i = 0; i < tupleCount; i++) { + // Index of the column. + parser._parseInt(); + // OID + parser._parseBytes(DATA_TYPES.OID_SIZEOF); + + let column = columnValues[i] = new Array(columnCount); + + for (let j = 0; j < columnCount; j++) { + let size = parser._parseInt(); + + if (size > 0) { + let type; + + if (statementType === CUBRID_STMT_CALL || + statementType === CUBRID_STMT_EVALUATE || + statementType === CUBRID_STMT_CALL_SP || + columns[j].ColumnType === CAS.CUBRIDDataType.CCI_U_TYPE_NULL) { + type = parser._parseByte(); + size--; + } else { + type = columns[j].ColumnType; + } + + column[j] = this._readValue(j, type, size, parser); + } else { + column[j] = null; + } + } + } + + this.currentTupleCount += tupleCount; + + return columnValues; +}; + +/** + * Read column value from stream + * @param index + * @param type + * @param size + * @param parser + */ +PrepareExecutePacket.prototype._readValue = function (index, type, size, parser) { + switch (type) { + case CAS.CUBRIDDataType.CCI_U_TYPE_CHAR: + case CAS.CUBRIDDataType.CCI_U_TYPE_NCHAR: + case CAS.CUBRIDDataType.CCI_U_TYPE_STRING: + case CAS.CUBRIDDataType.CCI_U_TYPE_VARNCHAR: + case CAS.CUBRIDDataType.CCI_U_TYPE_ENUM: + return parser._parseNullTerminatedString(size); + + case CAS.CUBRIDDataType.CCI_U_TYPE_SHORT: + return parser._parseShort(); + + case CAS.CUBRIDDataType.CCI_U_TYPE_INT: + return parser._parseInt(); + + case CAS.CUBRIDDataType.CCI_U_TYPE_BIGINT: + return parser._parseLong(); + + case CAS.CUBRIDDataType.CCI_U_TYPE_FLOAT: + return parser._parseFloat(); + + case CAS.CUBRIDDataType.CCI_U_TYPE_DOUBLE: + case CAS.CUBRIDDataType.CCI_U_TYPE_MONETARY: + return parser._parseDouble(); + + case CAS.CUBRIDDataType.CCI_U_TYPE_NUMERIC: + return parser._parseNumeric(size); + + case CAS.CUBRIDDataType.CCI_U_TYPE_DATE: + return parser._parseDate(); + + case CAS.CUBRIDDataType.CCI_U_TYPE_TIME: + return parser._parseTime(); + + case CAS.CUBRIDDataType.CCI_U_TYPE_DATETIME: + return parser._parseDateTime(); + + case CAS.CUBRIDDataType.CCI_U_TYPE_TIMESTAMP: + return parser._parseTimeStamp(); + + case CAS.CUBRIDDataType.CCI_U_TYPE_OBJECT: + return parser._parseObject(); + + case CAS.CUBRIDDataType.CCI_U_TYPE_BIT: + case CAS.CUBRIDDataType.CCI_U_TYPE_VARBIT: + return parser._parseBytes(size); + + case CAS.CUBRIDDataType.CCI_U_TYPE_SET: + case CAS.CUBRIDDataType.CCI_U_TYPE_MULTISET: + case CAS.CUBRIDDataType.CCI_U_TYPE_SEQUENCE: + return parser._parseSequence(); + + case CAS.CUBRIDDataType.CCI_U_TYPE_BLOB: + return parser.readBlob(size); + + case CAS.CUBRIDDataType.CCI_U_TYPE_CLOB: + return parser.readClob(size); + + case CAS.CUBRIDDataType.CCI_U_TYPE_RESULTSET: + return parser._parseResultSet(); + + default: + return new Error(`${type}: ${ErrorMessages.ERROR_INVALID_DATA_TYPE}`); + } +}; + +/** + * Write parameter value to stream + * @param value + * @param type + * @param writer + */ +PrepareExecutePacket.prototype._writeParamValue = function (writer) { + const options = this.options; + + for (let i = 0, l = options.paramValues.length; i < l; ++i) { + const value = options.paramValues[i]; + const paramType = CAS.getCUBRIDDataTypeNumber(options.paramTypes[i]); + + writer.addByte(paramType); + + switch (paramType) { + case CAS.CUBRIDDataType.CCI_U_TYPE_CHAR: + case CAS.CUBRIDDataType.CCI_U_TYPE_NCHAR: + case CAS.CUBRIDDataType.CCI_U_TYPE_STRING: + case CAS.CUBRIDDataType.CCI_U_TYPE_VARNCHAR: + case CAS.CUBRIDDataType.CCI_U_TYPE_ENUM: + writer._writeNullTerminatedString(value); + break; + + case CAS.CUBRIDDataType.CCI_U_TYPE_SHORT: + writer.addShort(value); + break; + + case CAS.CUBRIDDataType.CCI_U_TYPE_INT: + writer.addInt(value); + break; + + case CAS.CUBRIDDataType.CCI_U_TYPE_BIGINT: + writer.addLong(value); + break; + + case CAS.CUBRIDDataType.CCI_U_TYPE_FLOAT: + writer.addFloat(value); + break; + + case CAS.CUBRIDDataType.CCI_U_TYPE_DOUBLE: + case CAS.CUBRIDDataType.CCI_U_TYPE_MONETARY: + writer.addDouble(value); + break; + + case CAS.CUBRIDDataType.CCI_U_TYPE_NUMERIC: + writer._writeNumeric(value); + break; + + case CAS.CUBRIDDataType.CCI_U_TYPE_DATE: + writer.addDate(value.getUTCFullYear(), value.getUTCMonth(), value.getUTCDate()); + break; + + case CAS.CUBRIDDataType.CCI_U_TYPE_TIME: + writer.addTime(value.getUTCHours(), value.getUTCMinutes(), value.getUTCSeconds()); + break; + + case CAS.CUBRIDDataType.CCI_U_TYPE_DATETIME: + writer.addDateTime(value.getUTCFullYear(), value.getUTCMonth(), value.getUTCDate(), + value.getUTCHours(), value.getUTCMinutes(), value.getUTCSeconds(), value.getUTCMilliseconds()); + break; + + case CAS.CUBRIDDataType.CCI_U_TYPE_TIMESTAMP: + writer.addTimestamp(value.getUTCFullYear(), value.getUTCMonth(), value.getUTCDate(), + value.getUTCHours(), value.getUTCMinutes(), value.getUTCSeconds()); + break; + + case CAS.CUBRIDDataType.CCI_U_TYPE_OBJECT: + writer._writeInt(0); + writer._writeObject(value); + break; + + case CAS.CUBRIDDataType.CCI_U_TYPE_BIT: + case CAS.CUBRIDDataType.CCI_U_TYPE_VARBIT: + writer.addBytes(value); + break; + + case CAS.CUBRIDDataType.CCI_U_TYPE_SET: + case CAS.CUBRIDDataType.CCI_U_TYPE_MULTISET: + case CAS.CUBRIDDataType.CCI_U_TYPE_SEQUENCE: + writer._writeInt(0); + writer._writeSequence(value); + break; + + case CAS.CUBRIDDataType.CCI_U_TYPE_BLOB: + writer._writeBlob(value); + break; + + case CAS.CUBRIDDataType.CCI_U_TYPE_CLOB: + writer._writeClob(value); + break; + + case CAS.CUBRIDDataType.CCI_U_TYPE_RESULTSET: + writer._writeInt(DATA_TYPES.RESULTSET_SIZEOF); + writer._writeResultSet(value); + break; + + default: + return new Error(`${paramType}: ${ErrorMessages.ERROR_INVALID_DATA_TYPE}`); + } + } +}; + +PrepareExecutePacket.prototype.getPrepareBufferLength = function () { + const bufferLength = + DATA_TYPES.DATA_LENGTH_SIZEOF + + DATA_TYPES.CAS_INFO_SIZE + + DATA_TYPES.BYTE_SIZEOF + + DATA_TYPES.INT_SIZEOF + + Buffer.byteLength(this.options.sql) + 1 + + DATA_TYPES.INT_SIZEOF + + DATA_TYPES.BYTE_SIZEOF + + DATA_TYPES.INT_SIZEOF + + DATA_TYPES.BYTE_SIZEOF; + + return bufferLength; +}; + +PrepareExecutePacket.prototype.getExecuteBufferLength = function () { + const bufferLength = DATA_TYPES.DATA_LENGTH_SIZEOF + DATA_TYPES.CAS_INFO_SIZE + + DATA_TYPES.BYTE_SIZEOF + DATA_TYPES.INT_SIZEOF + DATA_TYPES.INT_SIZEOF + + DATA_TYPES.INT_SIZEOF + DATA_TYPES.BYTE_SIZEOF + DATA_TYPES.INT_SIZEOF + + DATA_TYPES.INT_SIZEOF + DATA_TYPES.INT_SIZEOF + DATA_TYPES.INT_SIZEOF + + DATA_TYPES.INT_SIZEOF + DATA_TYPES.INT_SIZEOF + DATA_TYPES.INT_SIZEOF + + DATA_TYPES.BYTE_SIZEOF + DATA_TYPES.INT_SIZEOF + DATA_TYPES.INT_SIZEOF + + DATA_TYPES.BYTE_SIZEOF + DATA_TYPES.INT_SIZEOF + DATA_TYPES.INT_SIZEOF + + DATA_TYPES.INT_SIZEOF + DATA_TYPES.INT_SIZEOF + DATA_TYPES.BYTE_SIZEOF + + this._getParamValuesBufferLength(); + + return bufferLength; +}; + +PrepareExecutePacket.prototype._getParamValuesBufferLength = function () { + const options = this.options; + + let paramValuesBufferLength = 0; + + if (options.paramValues) { + for (let i = options.paramValues.length - 1; i > -1; --i) { + const value = options.paramValues[i]; + const paramType = CAS.getCUBRIDDataTypeNumber(options.paramTypes[i]); + + // First, determine the size of the param type. + paramValuesBufferLength += + // The length of the data type. + DATA_TYPES.INT_SIZEOF + + // The size of the value. + DATA_TYPES.BYTE_SIZEOF; + + switch (paramType) { + case CAS.CUBRIDDataType.CCI_U_TYPE_CHAR: + case CAS.CUBRIDDataType.CCI_U_TYPE_NCHAR: + case CAS.CUBRIDDataType.CCI_U_TYPE_STRING: + case CAS.CUBRIDDataType.CCI_U_TYPE_VARNCHAR: + paramValuesBufferLength += + // The length of this part. + DATA_TYPES.INT_SIZEOF + + // The bytes length of the value. + Buffer.byteLength(value) + + // null character size. + DATA_TYPES.BYTE_SIZEOF; + break; + + case CAS.CUBRIDDataType.CCI_U_TYPE_SHORT: + paramValuesBufferLength += + // The length of this part. + DATA_TYPES.INT_SIZEOF + + // The size of the value. + DATA_TYPES.SHORT_SIZEOF; + break; + + case CAS.CUBRIDDataType.CCI_U_TYPE_INT: + paramValuesBufferLength += + // The length of this part + + // the size of the value. + DATA_TYPES.INT_SIZEOF * 2; + break; + + case CAS.CUBRIDDataType.CCI_U_TYPE_BIGINT: + paramValuesBufferLength += + // The length of this part. + DATA_TYPES.INT_SIZEOF + + // The size of the value. + DATA_TYPES.LONG_SIZEOF; + break; + + case CAS.CUBRIDDataType.CCI_U_TYPE_FLOAT: + paramValuesBufferLength += + // The length of this part. + DATA_TYPES.INT_SIZEOF + + // The size of the value. + DATA_TYPES.FLOAT_SIZEOF; + break; + + case CAS.CUBRIDDataType.CCI_U_TYPE_DOUBLE: + case CAS.CUBRIDDataType.CCI_U_TYPE_MONETARY: + paramValuesBufferLength += + // The length of this part. + DATA_TYPES.INT_SIZEOF + + // The size of the value. + DATA_TYPES.DOUBLE_SIZEOF; + break; + + case CAS.CUBRIDDataType.CCI_U_TYPE_NUMERIC: + paramValuesBufferLength += + // The length of this part. + DATA_TYPES.INT_SIZEOF + + // The bytes length of the numeric value. + // See `_writeNumeric`. + Buffer.byteLength(value.toString(10)) + + // null character size. + DATA_TYPES.BYTE_SIZEOF; + break; + + case CAS.CUBRIDDataType.CCI_U_TYPE_DATE: + paramValuesBufferLength += + // The length of this part. + DATA_TYPES.INT_SIZEOF + + // The size of the data type value. + DATA_TYPES.DATE_SIZEOF; + break; + + case CAS.CUBRIDDataType.CCI_U_TYPE_TIME: + paramValuesBufferLength += + // The length of this part. + DATA_TYPES.INT_SIZEOF + + // The size of the value. + DATA_TYPES.TIME_SIZEOF; + break; + + case CAS.CUBRIDDataType.CCI_U_TYPE_DATETIME: + paramValuesBufferLength += + // The length of this part. + DATA_TYPES.INT_SIZEOF + + // The size of the value. + DATA_TYPES.DATETIME_SIZEOF; + break; + + case CAS.CUBRIDDataType.CCI_U_TYPE_TIMESTAMP: + paramValuesBufferLength += + // The length of this part. + DATA_TYPES.INT_SIZEOF + + // The size of the value. + DATA_TYPES.TIMESTAMP_SIZEOF; + break; + + case CAS.CUBRIDDataType.CCI_U_TYPE_OBJECT: + case CAS.CUBRIDDataType.CCI_U_TYPE_SET: + case CAS.CUBRIDDataType.CCI_U_TYPE_MULTISET: + case CAS.CUBRIDDataType.CCI_U_TYPE_SEQUENCE: + case CAS.CUBRIDDataType.CCI_U_TYPE_RESULTSET: + paramValuesBufferLength += + // The length of this part. + DATA_TYPES.INT_SIZEOF + + // The size of the value. + // `_writeObject`, `_writeSequence`, `_writeResultSet` + // are not supported yet but still we send the + // `0` byte. + DATA_TYPES.BYTE_SIZEOF; + break; + + case CAS.CUBRIDDataType.CCI_U_TYPE_BIT: + case CAS.CUBRIDDataType.CCI_U_TYPE_VARBIT: + paramValuesBufferLength += + // The length of this part. + DATA_TYPES.INT_SIZEOF + + // The size of the value. + value.length; + break; + + case CAS.CUBRIDDataType.CCI_U_TYPE_BLOB: + case CAS.CUBRIDDataType.CCI_U_TYPE_CLOB: + paramValuesBufferLength += + // The length of this part + + // the type of the value. + DATA_TYPES.INT_SIZEOF * 2 + + // The length of the type of this CLOB. + DATA_TYPES.LONG_SIZEOF + + // The actual length. + DATA_TYPES.INT_SIZEOF + + // The length of the value in bytes. + Buffer.byteLength(value.fileLocator) + + // The null character size. + DATA_TYPES.BYTE_SIZEOF; + break; + + default: + return new Error(ErrorMessages.ERROR_INVALID_DATA_TYPE); + } + + } + } + + return paramValuesBufferLength; +}; + +module.exports = PrepareExecutePacket; diff --git a/src/packets/RollbackPacket.js b/src/packets/RollbackPacket.js index 4adc30c..2e469a2 100644 --- a/src/packets/RollbackPacket.js +++ b/src/packets/RollbackPacket.js @@ -1,7 +1,5 @@ -var DATA_TYPES = require('../constants/DataTypes'), - Helpers = require('../utils/Helpers'), - ErrorMessages = require('../constants/ErrorMessages'), - CAS = require('../constants/CASConstants'); +const CAS = require('../constants/CASConstants'); +const DATA_TYPES = require('../constants/DataTypes'); module.exports = RollbackPacket; @@ -14,11 +12,8 @@ function RollbackPacket(options) { options = options || {}; this.casInfo = options.casInfo; - this.dbVersion = options.dbVersion; - + this.responseCode = 0; - this.errorCode = 0; - this.errorMsg = ''; } /** @@ -27,7 +22,7 @@ function RollbackPacket(options) { */ RollbackPacket.prototype.write = function (writer) { writer._writeInt(this.getBufferLength() - DATA_TYPES.DATA_LENGTH_SIZEOF - DATA_TYPES.CAS_INFO_SIZE); - writer._writeBytes(DATA_TYPES.CAS_INFO_SIZE, this.casInfo); + writer._writeBytes(this.casInfo); writer._writeByte(CAS.CASFunctionCode.CAS_FC_END_TRAN); writer._writeInt(DATA_TYPES.BYTE_SIZEOF); writer._writeByte(CAS.CCITransactionType.CCI_TRAN_ROLLBACK); // Rollback transaction @@ -40,19 +35,14 @@ RollbackPacket.prototype.write = function (writer) { * @param parser */ RollbackPacket.prototype.parse = function (parser) { - var responseLength = parser._parseInt(); - this.casInfo = parser._parseBytes(DATA_TYPES.CAS_INFO_SIZE); + const responseLength = parser._parseInt(); + this.casInfo = parser._parseBytes(DATA_TYPES.CAS_INFO_SIZE); this.responseCode = parser._parseInt(); + if (this.responseCode < 0) { - this.errorCode = parser._parseInt(); - this.errorMsg = parser._parseNullTerminatedString(responseLength - 2 * DATA_TYPES.INT_SIZEOF); - if (this.errorMsg.length === 0) { - this.errorMsg = Helpers._resolveErrorCode(this.errorCode); - } + return parser.readError(responseLength); } - - return this; }; RollbackPacket.prototype.getBufferLength = function () { diff --git a/src/packets/SetAutoCommitModePacket.js b/src/packets/SetAutoCommitModePacket.js index c69a1c2..02ccd2c 100644 --- a/src/packets/SetAutoCommitModePacket.js +++ b/src/packets/SetAutoCommitModePacket.js @@ -1,9 +1,5 @@ -var DATA_TYPES = require('../constants/DataTypes'), - Helpers = require('../utils/Helpers'), - ErrorMessages = require('../constants/ErrorMessages'), - CAS = require('../constants/CASConstants'); - -module.exports = SetAutoCommitModePacket; +const CAS = require('../constants/CASConstants'); +const DATA_TYPES = require('../constants/DataTypes'); /** * Constructor @@ -15,11 +11,8 @@ function SetAutoCommitModePacket(options) { this.casInfo = options.casInfo; this.autoCommitMode = options.autoCommitMode; - this.dbVersion = options.dbVersion; - + this.responseCode = 0; - this.errorCode = 0; - this.errorMsg = ''; } /** @@ -28,7 +21,7 @@ function SetAutoCommitModePacket(options) { */ SetAutoCommitModePacket.prototype.write = function (writer) { writer._writeInt(this.getBufferLength() - DATA_TYPES.DATA_LENGTH_SIZEOF - DATA_TYPES.CAS_INFO_SIZE); - writer._writeBytes(DATA_TYPES.CAS_INFO_SIZE, this.casInfo); + writer._writeBytes(this.casInfo); writer._writeByte(CAS.CASFunctionCode.CAS_FC_SET_DB_PARAMETER); writer._writeInt(DATA_TYPES.INT_SIZEOF); writer._writeInt(CAS.CCIDbParam.CCI_PARAM_AUTO_COMMIT); // Parameter type auto-commit mode @@ -43,24 +36,21 @@ SetAutoCommitModePacket.prototype.write = function (writer) { * @param parser */ SetAutoCommitModePacket.prototype.parse = function (parser) { - var responseLength = parser._parseInt(); + const responseLength = parser._parseInt(); + this.casInfo = parser._parseBytes(DATA_TYPES.CAS_INFO_SIZE); - this.responseCode = parser._parseInt(); + if (this.responseCode < 0) { - this.errorCode = parser._parseInt(); - this.errorMsg = parser._parseNullTerminatedString(responseLength - 2 * DATA_TYPES.INT_SIZEOF); - if (this.errorMsg.length === 0) { - this.errorMsg = Helpers._resolveErrorCode(this.errorCode); - } + return parser.readError(responseLength); } - - return this; }; SetAutoCommitModePacket.prototype.getBufferLength = function () { - var bufferLength = DATA_TYPES.DATA_LENGTH_SIZEOF + DATA_TYPES.CAS_INFO_SIZE + + const bufferLength = DATA_TYPES.DATA_LENGTH_SIZEOF + DATA_TYPES.CAS_INFO_SIZE + DATA_TYPES.BYTE_SIZEOF + 2 * DATA_TYPES.INT_SIZEOF + 2 * DATA_TYPES.INT_SIZEOF; return bufferLength; }; + +module.exports = SetAutoCommitModePacket; diff --git a/src/packets/SetDbParameterPacket.js b/src/packets/SetDbParameterPacket.js index cad0c3d..a431a4d 100644 --- a/src/packets/SetDbParameterPacket.js +++ b/src/packets/SetDbParameterPacket.js @@ -1,9 +1,5 @@ -var DATA_TYPES = require('../constants/DataTypes'), - Helpers = require('../utils/Helpers'), - ErrorMessages = require('../constants/ErrorMessages'), - CAS = require('../constants/CASConstants'); - -module.exports = SetDbParameterPacket; +const CAS = require('../constants/CASConstants'); +const DATA_TYPES = require('../constants/DataTypes'); /** * Constructor @@ -11,16 +7,12 @@ module.exports = SetDbParameterPacket; * @constructor */ function SetDbParameterPacket(options) { - options = options || {}; - this.parameter = options.parameter; this.value = options.value; this.casInfo = options.casInfo; this.responseCode = 0; - this.errorCode = 0; - this.errorMsg = ''; } /** @@ -29,7 +21,7 @@ function SetDbParameterPacket(options) { */ SetDbParameterPacket.prototype.write = function (writer) { writer._writeInt(this.getBufferLength() - DATA_TYPES.DATA_LENGTH_SIZEOF - DATA_TYPES.CAS_INFO_SIZE); - writer._writeBytes(DATA_TYPES.CAS_INFO_SIZE, this.casInfo); + writer._writeBytes(this.casInfo); writer._writeByte(CAS.CASFunctionCode.CAS_FC_SET_DB_PARAMETER); writer._writeInt(DATA_TYPES.INT_SIZEOF); writer._writeInt(this.parameter); // Parameter type @@ -44,25 +36,23 @@ SetDbParameterPacket.prototype.write = function (writer) { * @param parser */ SetDbParameterPacket.prototype.parse = function (parser) { - var responseLength = parser._parseInt(); + const responseLength = parser._parseInt(); + this.casInfo = parser._parseBytes(DATA_TYPES.CAS_INFO_SIZE); this.responseCode = parser._parseInt(); + if (this.responseCode < 0) { - this.errorCode = parser._parseInt(); - this.errorMsg = parser._parseNullTerminatedString(responseLength - 2 * DATA_TYPES.INT_SIZEOF); - if (this.errorMsg.length === 0) { - this.errorMsg = Helpers._resolveErrorCode(this.errorCode); - } + return parser.readError(responseLength); } - - return this; }; SetDbParameterPacket.prototype.getBufferLength = function () { - var bufferLength = DATA_TYPES.DATA_LENGTH_SIZEOF + DATA_TYPES.CAS_INFO_SIZE + + const bufferLength = DATA_TYPES.DATA_LENGTH_SIZEOF + DATA_TYPES.CAS_INFO_SIZE + DATA_TYPES.BYTE_SIZEOF + DATA_TYPES.INT_SIZEOF + DATA_TYPES.INT_SIZEOF + DATA_TYPES.INT_SIZEOF + DATA_TYPES.INT_SIZEOF; return bufferLength; }; + +module.exports = SetDbParameterPacket; diff --git a/src/query/Query.js b/src/query/Query.js index 7d4168a..78270d1 100644 --- a/src/query/Query.js +++ b/src/query/Query.js @@ -1,16 +1,16 @@ -var Helpers = require('../utils/Helpers'); +const Helpers = require('../utils/Helpers'); module.exports = Query; -function noOp() {} - function Query(sql, params, cb) { - if (!params || typeof params === 'function') { - this.sql = sql; - cb = cb || params; - } else { - this.sql = Helpers._sqlFormat(sql, params); - } + if (typeof sql === 'function') { + cb = sql; + } else if (typeof params === 'function' || Array.isArray(sql)) { + this.sql = sql; + cb = params; + } else if (typeof sql === 'string') { + this.sql = Helpers._sqlFormat(sql, params); + } - this.callback = cb || noOp; + this.callback = cb; } diff --git a/src/query/Queue.js b/src/query/Queue.js index 7591dc5..94db51d 100644 --- a/src/query/Queue.js +++ b/src/query/Queue.js @@ -1,48 +1,62 @@ module.exports = Queue; function Queue() { - this.items = []; -}; + this.items = []; +} Queue.prototype.push = function (item) { - this.items.push(item); - this.process(); + this.items.push(item); + this.process(); }; Queue.prototype.unshift = function (item) { - this.items.unshift(item); - this.process(); + this.items.unshift(item); + this.process(); }; Queue.prototype.process = function () { - if (!this.currentItem && this.items.length) { - // Get the front item. - this.currentItem = this.items.shift(); - - var self = this; - - // Every item is a function which calls the callback - // we pass when done. - this.currentItem(function () { - self.currentItem = null; - - self.process(); - }); - } + if (!this.currentItem && this.items.length) { + // Get the front item. + this.currentItem = this.items.shift(); + + /* + * From http://stackoverflow.com/a/15349865/556678. + * Use `setImmediate` if you want to queue the function + * behind whatever I/O event callbacks that are already + * in the event queue. Use `process.nextTick` to effectively + * queue the function at the head of the event queue so + * that it executes immediately after the current function + * completes. + * So in a case where you're trying to break up a long + * running, CPU-bound job using recursion, you would now + * want to use `setImmediate` rather than `process.nextTick` + * to queue the next iteration as otherwise any I/O event + * callbacks wouldn't get the chance to run between iterations. + * */ + setImmediate(() => { + // Every item is a function which calls the callback + // we pass when done. + this.currentItem(() => { + this.currentItem = null; + + this.process(); + }); + }) + } }; Queue.prototype.getDepth = function () { - return this.items.length + (this.currentItem ? 1 : 0); + return this.items.length + (this.currentItem ? 1 : 0); }; Queue.prototype.isEmpty = function () { - return this.items.length == 0 && !this.currentItem; + return this.items.length == 0 && !this.currentItem; }; Queue.prototype.empty = function () { - // The most efficient way to empty an array is the following - // as stated in http://stackoverflow.com/a/1232046/556678. - this.items.length = 0; - // Remember, that this functions will remove all pending - // requests, but does not terminate the running query. + // The most efficient way to empty an array is the following + // as stated in http://stackoverflow.com/a/1232046/556678. + this.items.length = 0; + // Remember, that this functions will remove all pending + // requests, but does not terminate the running query. }; diff --git a/src/resultset/ColumnMetaData.js b/src/resultset/ColumnMetaData.js index 3d43268..af2f740 100644 --- a/src/resultset/ColumnMetaData.js +++ b/src/resultset/ColumnMetaData.js @@ -1,6 +1,4 @@ -var CAS = require('../constants/CASConstants'); - -module.exports = ColumnMetaData; +const CAS = require('../constants/CASConstants'); /** * Column meta data @@ -26,3 +24,4 @@ function ColumnMetaData() { this.IsShared = false; } +module.exports = ColumnMetaData; diff --git a/src/resultset/Result2Array.js b/src/resultset/Result2Array.js deleted file mode 100644 index 6451cf3..0000000 --- a/src/resultset/Result2Array.js +++ /dev/null @@ -1,148 +0,0 @@ -/** - * Returns an array with the query results - * @param jsonData - * @return {*} - * @constructor - */ -exports.RowsArray = function (jsonData) { - if (typeof jsonData === 'undefined' || jsonData === null || jsonData.length === 0) { - return new Array(0); - } - - try { - var fullArray = JSON.parse(jsonData); - var arr = []; - - var rowsCount = fullArray.ColumnValues.length; - if (rowsCount <= 0) { - return new Array(0); - } else { - for (var i = 0; i < rowsCount; i++) { - arr[i] = fullArray.ColumnValues[i]; - } - } - return arr; - } - catch (ignored) { - return new Array(0); - } -}; - -/** - * Returns an array with the query results column names - * @param jsonData - * @return {*} - * @constructor - */ -exports.ColumnNamesArray = function (jsonData) { - if (typeof jsonData === 'undefined' || jsonData === null || jsonData.length === 0) { - return new Array(0); - } - - var fullArray = ''; - - try { - fullArray = JSON.parse(jsonData); - - var rowsCount = fullArray.ColumnNames.length; - if (rowsCount <= 0) { - return new Array(0); - } else { - return fullArray.ColumnNames; - } - } - catch (ignored) { - return new Array(0); - } -}; - -/** - * Returns an array with the query results columns data types - * @param jsonData - * @return {*} - * @constructor - */ -exports.ColumnTypesArray = function (jsonData) { - if (typeof jsonData === 'undefined' || jsonData === null || jsonData.length === 0) { - return new Array(0); - } - - var fullArray = ''; - - try { - fullArray = JSON.parse(jsonData); - - var rowsCount = fullArray.ColumnDataTypes.length; - if (rowsCount <= 0) { - return new Array(0); - } else { - return fullArray.ColumnDataTypes; - } - } - catch (ignored) { - return new Array(0); - } -}; - -/** - * Returns the query results rows count - * Please note that this is the total query rows count and not the current "batch of data" rows count. - * @param jsonData - * @return {*} - * @constructor - */ -exports.TotalRowsCount = function (jsonData) { - if (typeof jsonData === 'undefined' || jsonData === null || jsonData.length === 0) { - return 0; - } - - var fullArray = ''; - - try { - fullArray = JSON.parse(jsonData); - - var rowsCount = fullArray.RowsCount; - if (rowsCount <= 0) { - return 0; - } else { - return fullArray.RowsCount; - } - } - catch (ignored) { - return 0; - } -}; - -/** - * Returns an array of objects where column names are keys - * @param jsonData - * @return {*} - * @constructor - */ -exports.ObjectsArray = function(jsonData) { - if (typeof jsonData === 'undefined' || jsonData === null || jsonData.length === 0) { - return new Array(0); - } - - try { - var fullArray = JSON.parse(jsonData); - var arr = []; - - var rowsCount = fullArray.ColumnValues.length; - var colCount = fullArray.ColumnNames.length; - if (rowsCount <= 0) { - return new Array(0); - } else { - for (var i = 0; i < rowsCount; i++) { - arr[i] = {}; - for(var j = 0; j < colCount; j++) { - arr[i][fullArray.ColumnNames[j]] = fullArray.ColumnValues[i][j]; - } - } - } - return arr; - } - catch (ignored) { - return new Array(0); - } -}; diff --git a/src/utils/ActionQueue.js b/src/utils/ActionQueue.js deleted file mode 100644 index 3f16a4a..0000000 --- a/src/utils/ActionQueue.js +++ /dev/null @@ -1,83 +0,0 @@ -/* - Based on code originating from the 'async' module - author license included here below: - - Copyright (c) 2010 Caolan McMahon - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. - */ - -exports.enqueue = function _enqueue(tasks, callback) { - callback = callback || function () { - }; - if (!tasks.length) { - return callback(); - } - - var wrapIterator = function (iterator) { - return function (err) { - if (err) { - callback(err); - callback = function () { - }; - } else { - var args = Array.prototype.slice.call(arguments, 1); - var next = iterator.next(); - if (next) { - args.push(wrapIterator(next)); - } else { - args.push(callback); - } - process.nextTick(function () { - iterator.apply(null, args); - }); - } - }; - }; - wrapIterator(iterator(tasks))(); -}; - -exports.while = function _while(test, iterator, callback) { - if (test()) { - iterator(function (err) { - if (err) { - return callback(err); - } - _while(test, iterator, callback); - }); - } else { - callback(); - } -}; - -function iterator(tasks) { - var makeCallback = function (index) { - var fn = function () { - if (tasks.length) { - tasks[index].apply(null, arguments); - } - return fn.next(); - }; - fn.next = function () { - return (index < tasks.length - 1) ? makeCallback(index + 1) : null; - }; - return fn; - }; - return makeCallback(0); -} - diff --git a/src/utils/Cache.js b/src/utils/Cache.js deleted file mode 100644 index 7a95180..0000000 --- a/src/utils/Cache.js +++ /dev/null @@ -1,58 +0,0 @@ -var Helpers = require('./Helpers'); - -/** - * Code adapted from MicroCache library: - * https://github.com/jeromeetienne/microcache.js - * License: https://github.com/jeromeetienne/MicroCache.js/blob/master/MIT-LICENSE.txt - */ - -var Cache = function (expireAfterSeconds) { - var _values = {}; - var createdTime = (new Date()).getTime(); - - var _expire = function () { - if (typeof expireAfterSeconds !== 'undefined' && expireAfterSeconds > 0) { - if ((new Date()).getTime() - createdTime >= expireAfterSeconds * 1000) { - _values = {}; - createdTime = (new Date()).getTime(); - } - } - }; - - return { - get : function (key) { - _expire(); - return _values[key]; - }, - _set : function (key, value) { - _expire(); - _values[key] = value; - }, - contains : function (key) { - _expire(); - return key in _values; - }, - /** - * Get a value from cache; if the value is not found, then add it to the cache - */ - getSet : function (key, value) { - _expire(); - if (!this.contains(key)) { - this._set(key, value); - } - return this.get(key); - }, - /** - * Clear all values in cache - */ - clear : function () { - _values = {}; - } - }; -}; - -if (typeof module !== 'undefined' && ('exports' in module)) { - module.exports = Cache; -} - - diff --git a/src/utils/Helpers.js b/src/utils/Helpers.js index b507d1e..af4676f 100644 --- a/src/utils/Helpers.js +++ b/src/utils/Helpers.js @@ -1,58 +1,8 @@ -var DEBUG_ENABLED = require('../config').DEBUG_ENABLED, - DATA_TYPES = require('../constants/DataTypes'), - ErrorMessages = require('../constants/ErrorMessages'), - CAS = require('../constants/CASConstants'), -// Default delimiter to wrap character strings in SQL queries. - DEFAULT_DELIMITER = "'"; +'use strict'; -/** - * Emit event only if there are registered listeners for the event - * @param obj - * @param successEvent - * @param arg1 - * @param arg2 - * @param arg3 - * @private - */ -function _emitSafeEvent(obj, successEvent, arg1, arg2, arg3) { - if (obj.listeners(successEvent).length > 0) { - if (typeof arg1 !== 'undefined' && typeof arg2 !== 'undefined' && typeof arg3 !== 'undefined') { - obj.emit(successEvent, arg1, arg2, arg3); - } else { - if (typeof arg1 !== 'undefined' && typeof arg2 !== 'undefined') { - obj.emit(successEvent, arg1, arg2); - } else { - if (typeof arg1 !== 'undefined') { - obj.emit(successEvent, arg1); - } else { - obj.emit(successEvent); - } - } - } - } -} - -/** - * Emit ERROR event or success event - * @param obj - * @param err - * @param errorEvent - * @param successEvent - * @param arg1 - * @param arg2 - * @param arg3 - * @private - */ -exports._emitEvent = function (obj, err, errorEvent, successEvent, arg1, arg2, arg3) { - if (typeof err !== 'undefined' && err !== null) { - // Emit the event only if somebody is listening. - if (obj.listeners(errorEvent).length > 0) { - obj.emit(errorEvent, err); - } - } else { - _emitSafeEvent(obj, successEvent, arg1, arg2, arg3); - } -}; +const DATA_TYPES = require('../constants/DataTypes'); +// Default delimiter to wrap character strings in SQL queries. +const DEFAULT_DELIMITER = "'"; /** * Validate if the value is an accepted "boolean"-compatible input @@ -97,19 +47,6 @@ exports._validateInputPositive = function (val) { return true; }; -/** - * Validate if the value is a strict positive "number" input - * @param val - * @return {Boolean} - */ -exports._validateInputStrictPositive = function (val) { - if (typeof val === 'undefined' || val === null || !(typeof val === 'number' && val > 0)) { - return false; - } - - return true; -}; - /** * Validate if the value is an accepted function input string * @param str @@ -146,12 +83,12 @@ exports._validateInputSQLString = function (sql) { */ Number.prototype.formatAsMoney = function (decimals, decimal_sep, thousands_sep) { var n = this, - c = isNaN(decimals) ? 2 : Math.abs(decimals), // If decimal is zero we must take it, it means user does not want to show any decimal - d = decimal_sep || '.', // If no decimal separator is passed we use the dot as default decimal separator (we MUST use a decimal separator) - t = (typeof thousands_sep === 'undefined') ? ',' : thousands_sep, // If you don't want to use a thousands separator you can pass empty string as thousands_sep value - sign = (n < 0) ? '-' : '', - i = parseInt(n = Math.abs(n).toFixed(c)) + '', - j; + c = isNaN(decimals) ? 2 : Math.abs(decimals), // If decimal is zero we must take it, it means user does not want to show any decimal + d = decimal_sep || '.', // If no decimal separator is passed we use the dot as default decimal separator (we MUST use a decimal separator) + t = (typeof thousands_sep === 'undefined') ? ',' : thousands_sep, // If you don't want to use a thousands separator you can pass empty string as thousands_sep value + sign = (n < 0) ? '-' : '', + i = parseInt(n = Math.abs(n).toFixed(c)) + '', + j; j = ((j = i.length) > 3) ? j % 3 : 0; @@ -165,46 +102,48 @@ Number.prototype.formatAsMoney = function (decimals, decimal_sep, thousands_sep) * @private */ var _escapeString = function (val, delimiter) { - val = val.replace(/[\0\n\r\b\t\\'"\x1a]/g, function (s) { - switch (s) { - case "\0": - return "\\0"; - case "\n": - return "\\n"; - case "\r": - return "\\r"; - case "\b": - return "\\b"; - case "\t": - return "\\t"; - case "\x1a": - return "\\Z"; - case "'": - // If the string includes a single quote and we are wrapping - // the string with single quotes, then we need to escape these single quotes. - if (!delimiter || s == delimiter) { - return "''"; - } - - // Otherwise, no need to escape single quotes if the string is - // wrapped by double quotes. - return s; - case '"': - // If the string includes a double quote and we are wrapping - // the string with double quotes, then we need to escape these double quotes. - if (!delimiter || s == delimiter) { - return '""'; - } - - // Otherwise, no need to escape double quotes if the string is - // wrapped by single quotes. - return s; - default: - return "\\" + s; - } - }); - - return val; + /* eslint-disable no-control-regex */ + val = val.replace(/[\0\n\r\b\t\\'"\x1a]/g, function (s) { + switch (s) { + case "\0": + return "\\0"; + case "\n": + return "\\n"; + case "\r": + return "\\r"; + case "\b": + return "\\b"; + case "\t": + return "\\t"; + case "\x1a": + return "\\Z"; + case "'": + // If the string includes a single quote and we are wrapping + // the string with single quotes, then we need to escape these single quotes. + if (!delimiter || s == delimiter) { + return "''"; + } + + // Otherwise, no need to escape single quotes if the string is + // wrapped by double quotes. + return s; + case '"': + // If the string includes a double quote and we are wrapping + // the string with double quotes, then we need to escape these double quotes. + if (!delimiter || s == delimiter) { + return '""'; + } + + // Otherwise, no need to escape double quotes if the string is + // wrapped by single quotes. + return s; + default: + return "\\" + s; + } + }); + /* eslint-enable no-control-regex */ + + return val; }; exports._escapeString = _escapeString; @@ -218,130 +157,67 @@ exports._escapeString = _escapeString; * @private */ exports._sqlFormat = function (sql, arrValues, arrDelimiters) { - if (!Array.isArray(arrValues)) { + if (!Array.isArray(arrValues)) { arrValues = [arrValues]; - } + } + + if (!Array.isArray(arrDelimiters)) { + arrDelimiters = [arrDelimiters]; + } - if (!Array.isArray(arrDelimiters)) { - arrDelimiters = [arrDelimiters]; - } + const valCount = arrValues.length; + const delimitersCount = arrDelimiters.length; - var i = -1, - valCount = arrValues.length, - delimitersCount = arrDelimiters.length; + let i = -1; - return sql.replace(/\?/g, function (match) { + return sql.replace(/\?/g, function (match) { if (++i == valCount) { return match; } - // Get the value for the current placeholder. - // We iterate via `i` instead of shifting from the front of the - // array because we do not want to alter the original array - // received from the application. The application may - // choose to reuse it in the loop. - var val = arrValues[i], - // And its delimiter. If not defined, use single quotes. - delimiter = (i >= delimitersCount ? DEFAULT_DELIMITER : arrDelimiters[i]); - - if (val === undefined || val === null) { - return 'NULL'; - } - - // Send numbers as real numbers. Numbers wrapped in strings - // are not considered as numbers. They are sent as strings. - if (typeof val === 'number') { - return val; - } - - // Delimiters must be specified as strings. - if (typeof delimiter !== 'string') { - delimiter = DEFAULT_DELIMITER; - } - - // If the value is of Date type, convert it into - // CUBRID compatible DATETIME format strings. - if (val instanceof Date) { - // CUBRID 8.4.1+ supports many formats of DATETIME value. - // Refer to http://www.cubrid.org/manual/841/en/DATETIME - // for more information. - // In the communication between node-cubrid and CUBRID - // Broker we choose the - // `'mm/dd[/yyyy] hh:mi[:ss[.ff]] [am|pm]'` format. - - return delimiter + - // Month value in JavaScript is 0 based, i.e. 0-11, - // but CUBRID is 1-12. Also CUBRID doesn't care if - // dates are zero-padded or not. - (val.getMonth() + 1) + '/' + val.getDate() + '/' + val.getFullYear() + - ' ' + val.getHours() + ':' + val.getMinutes() + ':' + val.getSeconds() + - '.' + val.getMilliseconds() + delimiter; + // Get the value for the current placeholder. + // We iterate via `i` instead of shifting from the front of the + // array because we do not want to alter the original array + // received from the application. The application may + // choose to reuse it in the loop. + const val = arrValues[i]; + // And its delimiter. If not defined, use single quotes. + let delimiter = (i >= delimitersCount ? DEFAULT_DELIMITER : arrDelimiters[i]); + + if (val === undefined || val === null) { + return 'NULL'; } - // Otherwise, safely escape the string. - return delimiter + _escapeString(val, delimiter) + delimiter; - }); -}; - -/** - * Verifies if a string starts with the specified value - */ -if (typeof String.prototype.startsWith !== 'function') { - String.prototype.startsWith = function (str) { - return this.indexOf(str) === 0; - }; -} - -/** - * Appends two buffers data into a new buffer - * @param buffer - * @param value - * @return {Buffer} - * @private - */ -exports._combineData = function (buffer, value) { - var newBuffer = new Buffer(buffer.length + value.length); - - buffer.copy(newBuffer, 0); - if (Array.isArray(value)) { - for (var i = 0; i < value.length; i++) { - if (typeof value[i] === 'string') { - newBuffer[buffer.length + i] = value[i].charCodeAt(0); - } else { - newBuffer[buffer.length + i] = value[i]; - } - } - } else { - if (typeof value === 'Buffer') { - value.copy(newBuffer, buffer.length); - } else { - new Buffer(value).copy(newBuffer, buffer.length); + // Send numbers as real numbers. Numbers wrapped in strings + // are not considered as numbers. They are sent as strings. + if (typeof val === 'number') { + return val; } - } - return newBuffer; -}; + // Delimiters must be specified as strings. + if (typeof delimiter !== 'string') { + delimiter = DEFAULT_DELIMITER; + } -/** - * Overrides the console output - * Logs data to the standard console output - * @param data - */ -exports.logInfo = function logInfo(data) { - if (DEBUG_ENABLED) { - console.warn(data); - } -}; + // If the value is of Date type, convert it into + // CUBRID compatible DATETIME format strings. + if (val instanceof Date) { + // CUBRID 8.4.1+ supports many formats of DATETIME value. + // Refer to http://www.cubrid.org/manual/841/en/DATETIME + // for more information. + // In the communication between node-cubrid and CUBRID + // Broker we choose the + // `'mm/dd[/yyyy] hh:mi[:ss[.ff]] [am|pm]'` format. + + // Month value in JavaScript is 0 based, i.e. 0-11, + // but CUBRID is 1-12. Also CUBRID doesn't care if + // dates are zero-padded or not. + return `${delimiter}${val.getUTCMonth() + 1}/${val.getUTCDate()}/${val.getUTCFullYear()} ${val.getUTCHours()}:${val.getUTCMinutes()}:${val.getUTCSeconds()}.${val.getUTCMilliseconds()}${delimiter}`; + } -/** - * Overrides the console output - * Logs data to the standard console output - * @param data - */ -exports.logError = function logError(data) { - if (DEBUG_ENABLED) { - console.error(data); - } + // Otherwise, safely escape the string. + return delimiter + _escapeString(val, delimiter) + delimiter; + }); }; /** @@ -359,15 +235,11 @@ exports._getExpectedResponseLength = function (buffer) { return value + DATA_TYPES.DATA_LENGTH_SIZEOF + DATA_TYPES.CAS_INFO_SIZE; }; -/** - * Try to resolve the error code to a CUBRID error message - * @param errorCode - * @return {*} - */ -exports._resolveErrorCode = function (errorCode) { - for (var i = 0; i < ErrorMessages.CASErrorMsgId.length; i++) { - if (errorCode === ErrorMessages.CASErrorMsgId[i][1]) { - return ErrorMessages.CASErrorMsgId[i][0]; - } +exports.getBufferFromString = function (str, encoding) { + if (process.version >= 'v4.5.0') { + return Buffer.from(str, encoding); } + + // Older Node versions. + return new Buffer(str, encoding); }; diff --git a/test/.DS_Store b/test/.DS_Store new file mode 100644 index 0000000..b9937fd Binary files /dev/null and b/test/.DS_Store differ diff --git a/test/.eslintrc.yml b/test/.eslintrc.yml new file mode 100644 index 0000000..1eba859 --- /dev/null +++ b/test/.eslintrc.yml @@ -0,0 +1,8 @@ +extends: eslint:recommended +installedESLint: true +env: + es6: true + node: true + mocha: true +rules: + no-console: off diff --git a/test/CUBRID.createConnection.js b/test/CUBRID.createConnection.js new file mode 100644 index 0000000..8c306c7 --- /dev/null +++ b/test/CUBRID.createConnection.js @@ -0,0 +1,144 @@ +'use strict'; + +const expect = require('chai').expect; +const CUBRID = require('../'); +const testSetup = require('./testSetup'); + +describe('CUBRID', function () { + describe('createConnection', function () { + it('should succeed to create and close several client connections', function (done) { + const config = testSetup.config; + let closedCount = 0; + + // Create a connection by passing a list of parameters. + const client1 = new CUBRID.createCUBRIDConnection(config.hosts, config.port, config.user, config.password, config.database); + + // Create a connection by passing an object of parameters. + const client2 = new CUBRID.createCUBRIDConnection({ + host: config.hosts, + port: config.port, + user: config.user, + password: config.password, + database: config.database + }); + + // Now test the alias function. + // Create a connection by passing a list of parameters. + const client3 = new CUBRID.createConnection(config.hosts, config.port, config.user, config.password, config.database); + + // Create a connection by passing an object of parameters. + const client4 = new CUBRID.createConnection({ + hosts: config.hosts, + port: config.port, + user: config.user, + password: config.password, + database: config.database + }); + + // Default `host`, `port`, `user`, `password`, and `database` + // values should be used when not provided. + const client5 = new CUBRID.createConnection(); + + // Create a connection by passing an object of parameters. + const client6 = new CUBRID.createConnection({ + hosts: config.hosts, + port: config.port, + user: config.user, + password: config.password, + database: config.database, + connectionTimeout: 2000, + maxConnectionRetryCount: 2, + }); + + // Ensure the options reached the client. + expect(client6) + .to.have.property('connectionTimeout') + .to.equal(2000); + + expect(client6) + .to.have.property('maxConnectionRetryCount') + .to.equal(2); + + expect(client6) + .to.have.property('hosts') + .to.be.an('array') + .with.length(1); + + const clients = [client1, client2, client3, client4, client5, client6]; + + let promise = Promise.resolve(); + + clients.forEach(client => { + promise = promise.then(() => { + return client + .connect() + .then(() => { + return client.getEngineVersion(); + }) + .then(() => { + return client.close(); + }) + .then(() => { + ++closedCount; + }); + }); + }); + + promise + .then(() => { + expect(closedCount).to.equal(clients.length); + + done(); + }) + .catch(done); + }); + + it('should auto connect to the second host when the first host is down', function () { + const config = testSetup.config; + + const client = new CUBRID.createConnection({ + hosts: ['80.80.80.80'].concat(config.hosts), + port: config.port, + user: config.user, + password: config.password, + database: config.database, + connectionTimeout: 2000, + maxConnectionRetryCount: 2, + }); + + // Ensure the options reached the client. + expect(client) + .to.have.property('connectionTimeout') + .to.equal(2000); + + expect(client) + .to.have.property('maxConnectionRetryCount') + .to.equal(2); + + expect(client) + .to.have.property('hosts') + .to.be.an('array') + .with.length(2); + + return client + .connect() + .then(() => { + return client.getActiveHost(); + }) + .then(host => { + expect(host) + .to.be.an('object') + .to.have.property('host') + .to.be.a('string') + .to.equal(config.hosts[0]); + + expect(host) + .to.have.property('port') + .to.be.a('number') + .to.equal(config.port); + + return client.close(); + }); + }); + }); +}); diff --git a/test/CUBRIDConnection.batchExecuteNoQuery.js b/test/CUBRIDConnection.batchExecuteNoQuery.js new file mode 100644 index 0000000..cf5f829 --- /dev/null +++ b/test/CUBRIDConnection.batchExecuteNoQuery.js @@ -0,0 +1,918 @@ +'use strict'; + +const expect = require('chai').expect; +const testSetup = require('./testSetup'); + +describe('CUBRIDConnection', function () { + describe('batchExecuteNoQuery', function () { + const TABLE_NAME = 'tbl_test'; + + beforeEach(testSetup.cleanup(TABLE_NAME)); + after(testSetup.cleanup(TABLE_NAME)); + + it('should verify there are no query packets after calling batchExecuteNoQuery(sqls) with multiple queries', function () { + let client = testSetup.createDefaultCUBRIDDemodbConnection(); + let queries = [ + `CREATE TABLE ${TABLE_NAME}(id INT)`, + `INSERT INTO ${TABLE_NAME} (id) VALUES (1), (2), (3)`, + `DROP TABLE ${TABLE_NAME}` + ]; + + return client.batchExecuteNoQuery(queries) + .then(() => { + return client.query('SHOW TABLES'); + }) + .then(response => { + expect(response) + .to.be.an('object') + .to.have.property('queryHandle') + .to.be.a('number') + .to.be.above(0); + + expect(response) + .to.have.property('result') + .to.be.an('object'); + + let result = response.result; + + expect(result) + .to.be.an('object') + .to.have.property('RowsCount') + .to.be.a('number') + .to.equal(10); + + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.have.all.keys(['' + response.queryHandle]); + + return client.close(); + }); + }); + + it('should verify there are no query packets after calling batchExecuteNoQuery(sqls, callback) with multiple queries', function (done) { + let client = testSetup.createDefaultCUBRIDDemodbConnection(); + let queries = [ + `CREATE TABLE ${TABLE_NAME}(id INT)`, + `INSERT INTO ${TABLE_NAME} (id) VALUES (1), (2), (3)`, + `DROP TABLE ${TABLE_NAME}` + ]; + + client.batchExecuteNoQuery(queries, function (err) { + if (err) { + return done(err); + } + + client + .query('SHOW TABLES') + .then(response => { + expect(response) + .to.be.an('object') + .to.have.property('queryHandle') + .to.be.a('number') + .to.be.above(0); + + expect(response) + .to.have.property('result') + .to.be.an('object'); + + let result = response.result; + + expect(result) + .to.be.an('object') + .to.have.property('RowsCount') + .to.be.a('number') + .to.equal(10); + + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.have.all.keys(['' + response.queryHandle]); + + return client.close(); + }) + .then(done) + .catch(done); + }); + }); + + it('should succeed to call batchExecuteNoQuery(sqls) with no queries', function () { + let client = testSetup.createDefaultCUBRIDDemodbConnection(); + let queries = []; + + return client.batchExecuteNoQuery(queries) + .then(() => { + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.be.empty; + + return client.close(); + }); + }); + + it('should succeed to call batchExecuteNoQuery(sqls, callback) with no queries', function (done) { + let client = testSetup.createDefaultCUBRIDDemodbConnection(); + let queries = []; + + client.batchExecuteNoQuery(queries, (err) => { + if (err) { + return done(err); + } + + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.be.empty; + + client.close(done); + }); + }); + + it('should succeed to call batchExecuteNoQuery() and let another client see the writes', function (done) { + let client = testSetup.createDefaultCUBRIDDemodbConnection(); + let client2 = testSetup.createDefaultCUBRIDDemodbConnection(); + let queries = [ + `CREATE TABLE ${TABLE_NAME}(id INT)`, + `INSERT INTO ${TABLE_NAME} (id) VALUES (1), (2), (3)`, + ]; + + client.batchExecuteNoQuery(queries) + .then(() => { + return client2.query('SHOW TABLES'); + }) + .then(response => { + expect(response) + .to.be.an('object') + .to.have.property('queryHandle') + .to.be.a('number') + .to.be.above(0); + + expect(response) + .to.have.property('result') + .to.be.an('object'); + + let result = response.result; + + expect(result) + .to.be.an('object') + .to.have.property('RowsCount') + .to.be.a('number') + .to.equal(11); + + expect(result) + .to.have.property('ColumnValues') + .to.be.an('array') + .with.length(11); + + expect(client2) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.have.all.keys(['' + response.queryHandle]); + + // If the table exists, delete it. + let tables = result.ColumnValues.map(row => row[0]); + + expect(tables).to.contain(TABLE_NAME); + + return client2.query(`SELECT * FROM ${TABLE_NAME}`); + }) + .then(response => { + expect(response) + .to.be.an('object') + .to.have.property('queryHandle') + .to.be.a('number') + .to.be.above(0); + + expect(response) + .to.have.property('result') + .to.be.an('object'); + + let result = response.result; + + expect(result) + .to.be.an('object') + .to.have.property('RowsCount') + .to.be.a('number') + .to.equal(3); + + expect(result) + .to.have.property('ColumnValues') + .to.be.an('array') + .with.length(3); + + expect(client2) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.contain.keys(['' + response.queryHandle]); + + expect(Object.keys(client2._queryResultSets)) + .to.have.length(2); + + // If the table exists, delete it. + let ids = result.ColumnValues.map(row => row[0]); + + expect(ids) + .to.be.an('array') + .with.length(3); + + expect(ids).to.contain(1); + expect(ids).to.contain(2); + expect(ids).to.contain(3); + + return client2.execute(`DROP table ${TABLE_NAME}`); + }) + .then(() => { + return client.query('SHOW TABLES'); + }) + .then(response => { + expect(response) + .to.be.an('object') + .to.have.property('queryHandle') + .to.be.a('number') + .to.be.above(0); + + expect(response) + .to.have.property('result') + .to.be.an('object'); + + let result = response.result; + + expect(result) + .to.be.an('object') + .to.have.property('RowsCount') + .to.be.a('number') + .to.equal(10); + + expect(result) + .to.have.property('ColumnValues') + .to.be.an('array') + .with.length(10); + + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.have.all.keys(['' + response.queryHandle]); + + // If the table exists, delete it. + let tables = result.ColumnValues.map(row => row[0]); + + expect(tables).to.not.contain(TABLE_NAME); + + return client.close(); + }) + .then(() => { + return client2.close(); + }) + .then(done) + .catch(done); + }); + + describe('when SQL is not a string', function () { + function verifyError(client, err) { + console.log(err); + console.log('client.brokerInfo.protocolVersion', client.brokerInfo.protocolVersion); + + let error = new Error(); + error.code = -493; + + switch (client.brokerInfo.protocolVersion) { + case 1: + error.message = 'Syntax: syntax error, unexpected UNSIGNED_INTEGER '; + break; + case 2: + error.message = "Syntax: In line 1, column 1 before END OF STATEMENT\nSyntax error: unexpected '1234', expecting SELECT or VALUE or VALUES or '(' "; + + break; + case 3: + error.message = 'Syntax: syntax error, unexpected UNSIGNED_INTEGER '; + + expect(err) + .to.be.an('array') + .with.length(1); + + err = err[0]; + break; + default: + // There is a space at the end. + error.message = "Syntax: In line 1, column 1 before END OF STATEMENT\nSyntax error: unexpected '1234', expecting SELECT or VALUE or VALUES or '(' "; + + expect(err) + .to.be.an('array') + .with.length(1); + + err = err[0]; + } + + expect(err).to.be.an.instanceOf(Error); + + // There is a space at the end. + expect(err.code).to.equal(error.code); + expect(err.message).to.equal(error.message); + } + + it('should fail to call batchExecuteNoQuery(sqls, callback) when SQL is not a string but an array of an integer', function (done) { + let client = testSetup.createDefaultCUBRIDDemodbConnection(); + let queries = [1234]; + + client.batchExecuteNoQuery(queries, (err) => { + verifyError(client, err); + + client.close(done); + }); + }); + + it('should fail to call batchExecuteNoQuery(sqls) when SQL is not a string but an array of an integer', function () { + let client = testSetup.createDefaultCUBRIDDemodbConnection(); + let queries = [1234]; + + return client.batchExecuteNoQuery(queries) + .then(() => { + throw new Error('Batch execute should have failed.') + }) + .catch(err => { + verifyError(client, err); + + return client.close(); + }); + }); + + it('should fail to call batchExecuteNoQuery(sqls, callback) when SQL is not a string but an integer', function (done) { + let client = testSetup.createDefaultCUBRIDDemodbConnection(); + let queries = 1234; + + client.batchExecuteNoQuery(queries, (err) => { + verifyError(client, err); + + client.close(done); + }); + }); + + it('should fail to call batchExecuteNoQuery(sqls) when SQL is not a string but an integer', function () { + let client = testSetup.createDefaultCUBRIDDemodbConnection(); + let queries = 1234; + + return client.batchExecuteNoQuery(queries) + .then(() => { + throw new Error('Batch execute should have failed.') + }) + .catch(err => { + verifyError(client, err); + + return client.close(); + }); + }); + }); + + describe('no SQL is specified', function () { + function verifyError(client, err) { + console.log(err); + console.log('client.brokerInfo.protocolVersion', client.brokerInfo.protocolVersion); + + let error = new Error('No statement to execute.'); + error.code = -424; + + switch (client.brokerInfo.protocolVersion) { + case 1: + case 2: + break; + default: + expect(err) + .to.be.an('array') + .with.length(1); + + err = err[0]; + } + + expect(err).to.be.an.instanceOf(Error); + + // There is a space at the end. + expect(err.code).to.equal(error.code); + expect(err.message).to.equal(error.message); + } + + it('should fail to call batchExecuteNoQuery(sqls, callback) when SQL is not specified', function (done) { + let client = testSetup.createDefaultCUBRIDDemodbConnection(); + let queries = ''; + + client.batchExecuteNoQuery(queries, (err) => { + verifyError(client, err); + + client.close(done); + }); + }); + + it('should fail to call batchExecuteNoQuery(sqls) when SQL is not specified', function () { + let client = testSetup.createDefaultCUBRIDDemodbConnection(); + let queries = ''; + + return client.batchExecuteNoQuery(queries) + .then(() => { + throw new Error('Batch execute should have failed.') + }) + .catch(err => { + verifyError(client, err); + + return client.close(); + }); + }); + }); + + describe('when one of the batch queries has an invalid syntax', function () { + function verifyError(client, err) { + console.log(err); + console.log('client.brokerInfo.protocolVersion', client.brokerInfo.protocolVersion); + + let error = new Error(); + error.code = -493; + + switch (client.brokerInfo.protocolVersion) { + case 1: + error.message = 'Syntax: syntax error, unexpected $end '; + break; + case 2: + error.message = 'Syntax: Syntax error: unexpected END OF STATEMENT '; + break; + case 3: + error.message = 'Syntax: syntax error, unexpected $end '; + + expect(err) + .to.be.an('array') + .with.length(1); + + err = err[0]; + break; + default: + // There is a space at the end. + error.message = 'Syntax: Syntax error: unexpected END OF STATEMENT '; + + expect(err) + .to.be.an('array') + .with.length(1); + + err = err[0]; + } + + expect(err).to.be.an.instanceOf(Error); + + // There is a space at the end. + expect(err.code).to.equal(error.code); + expect(err.message).to.equal(error.message); + } + + it('should commit only the first SQL while the second SQL is invalid when calling batchExecuteNoQuery()', function () { + let client = testSetup.createDefaultCUBRIDDemodbConnection(); + let queries = [ + `CREATE TABLE ${TABLE_NAME}(id INT)`, + `INSERT INTO ${TABLE_NAME} (id)`, + ]; + + return client + .batchExecuteNoQuery(queries) + .catch(err => { + verifyError(client, err); + + return client + .query('SHOW TABLES') + .then(response => { + expect(response) + .to.be.an('object') + .to.have.property('queryHandle') + .to.be.a('number') + .to.be.above(0); + + expect(response) + .to.have.property('result') + .to.be.an('object'); + + let result = response.result; + + expect(result) + .to.be.an('object') + .to.have.property('RowsCount') + .to.be.a('number') + .to.equal(11); + + expect(result) + .to.have.property('ColumnValues') + .to.be.an('array') + .with.length(11); + + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.have.all.keys(['' + response.queryHandle]); + + // If the table exists, delete it. + let tables = result.ColumnValues.map(row => row[0]); + + // The first query should be committed. + expect(tables).to.contain(TABLE_NAME); + + // But no records should be inserted due to + // an invalid SQL. + return client.query(`SELECT * FROM ${TABLE_NAME}`); + }) + .then(response => { + expect(response) + .to.be.an('object') + .to.have.property('queryHandle') + .to.be.a('number') + .to.be.above(0); + + expect(response) + .to.have.property('result') + .to.be.an('object'); + + let result = response.result; + + expect(result) + .to.be.an('object') + .to.have.property('RowsCount') + .to.be.a('number') + .to.equal(0); + + expect(result) + .to.have.property('ColumnValues') + .to.be.an('array') + .with.length(0); + + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.contain.keys(['' + response.queryHandle]); + + expect(Object.keys(client._queryResultSets)) + .to.have.length(2); + + return client.execute(`DROP table ${TABLE_NAME}`); + }) + .then(() => { + return client.query('SHOW TABLES'); + }) + .then(response => { + expect(response) + .to.be.an('object') + .to.have.property('queryHandle') + .to.be.a('number') + .to.be.above(0); + + expect(response) + .to.have.property('result') + .to.be.an('object'); + + let result = response.result; + + expect(result) + .to.be.an('object') + .to.have.property('RowsCount') + .to.be.a('number') + .to.equal(10); + + expect(result) + .to.have.property('ColumnValues') + .to.be.an('array') + .with.length(10); + + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.contain.keys(['' + response.queryHandle]); + + expect(Object.keys(client._queryResultSets)) + .to.have.length(3); + + // If the table exists, delete it. + let tables = result.ColumnValues.map(row => row[0]); + + expect(tables).to.not.contain(TABLE_NAME); + + return client.close(); + }); + }); + }); + + it('should commit only the first SQL while the second SQL is invalid when calling batchExecuteNoQuery(callback)', function (done) { + let client = testSetup.createDefaultCUBRIDDemodbConnection(); + let queries = [ + `CREATE TABLE ${TABLE_NAME}(id INT)`, + `INSERT INTO ${TABLE_NAME} (id)`, + ]; + + client.batchExecuteNoQuery(queries, function (err) { + verifyError(client, err); + + return client + .query('SHOW TABLES') + .then(response => { + expect(response) + .to.be.an('object') + .to.have.property('queryHandle') + .to.be.a('number') + .to.be.above(0); + + expect(response) + .to.have.property('result') + .to.be.an('object'); + + let result = response.result; + + expect(result) + .to.be.an('object') + .to.have.property('RowsCount') + .to.be.a('number') + .to.equal(11); + + expect(result) + .to.have.property('ColumnValues') + .to.be.an('array') + .with.length(11); + + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.have.all.keys(['' + response.queryHandle]); + + // If the table exists, delete it. + let tables = result.ColumnValues.map(row => row[0]); + + // The first query should be committed. + expect(tables).to.contain(TABLE_NAME); + + // But no records should be inserted due to + // an invalid SQL. + return client.query(`SELECT * FROM ${TABLE_NAME}`); + }) + .then(response => { + expect(response) + .to.be.an('object') + .to.have.property('queryHandle') + .to.be.a('number') + .to.be.above(0); + + expect(response) + .to.have.property('result') + .to.be.an('object'); + + let result = response.result; + + expect(result) + .to.be.an('object') + .to.have.property('RowsCount') + .to.be.a('number') + .to.equal(0); + + expect(result) + .to.have.property('ColumnValues') + .to.be.an('array') + .with.length(0); + + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.contain.keys(['' + response.queryHandle]); + + expect(Object.keys(client._queryResultSets)) + .to.have.length(2); + + return client.execute(`DROP table ${TABLE_NAME}`); + }) + .then(() => { + return client.query('SHOW TABLES'); + }) + .then(response => { + expect(response) + .to.be.an('object') + .to.have.property('queryHandle') + .to.be.a('number') + .to.be.above(0); + + expect(response) + .to.have.property('result') + .to.be.an('object'); + + let result = response.result; + + expect(result) + .to.be.an('object') + .to.have.property('RowsCount') + .to.be.a('number') + .to.equal(10); + + expect(result) + .to.have.property('ColumnValues') + .to.be.an('array') + .with.length(10); + + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.contain.keys(['' + response.queryHandle]); + + expect(Object.keys(client._queryResultSets)) + .to.have.length(3); + + // If the table exists, delete it. + let tables = result.ColumnValues.map(row => row[0]); + + expect(tables).to.not.contain(TABLE_NAME); + + return client.close(); + }) + .then(done) + .catch(done); + }); + }); + }); + + describe('when multiple queries in the batch have an invalid syntax', function () { + function getColumnTypeError(client, invalidType) { + let error = new Error(); + error.code = -494; + + switch (client.brokerInfo.protocolVersion) { + case 1: /* 8.4.1 */ + case 3: /* 8.4.3 */ + error.message = `Semantic: ${invalidType} is not defined. create class ${TABLE_NAME} ( id ${invalidType} ) `; + break; + case 2: /* 9.0.0 */ + case 4: /* 9.1.0 */ + default: /* since 9.2.0 */ + error.message = `Semantic: before ' ${invalidType})'\n${invalidType} is not defined. create class ${TABLE_NAME} ( id ${invalidType} ) `; + } + + return error; + } + + function verifyError(client, err, queriesCount) { + console.log(err); + console.log('client.brokerInfo.protocolVersion', client.brokerInfo.protocolVersion); + + let e = getColumnTypeError(client, 'xyz'); + + switch (client.brokerInfo.protocolVersion) { + case 1: /* 8.4.1 */ + expect(err).to.be.an.instanceOf(Error); + expect(err.code).to.equal(e.code); + expect(err.message).to.equal(e.message); + break; + case 2: /* 9.0.0 */ + case 4: /* 9.1.0 */ + break; + default: /* 8.4.3 && since 9.2.0 */ + expect(err) + .to.be.an('array') + .with.length(queriesCount); + + err.forEach(e => { + expect(e).to.be.an.instanceOf(Error); + }); + + expect(err[0].code).to.equal(e.code); + expect(err[0].message).to.equal(e.message); + + e = getColumnTypeError(client, 'abc'); + expect(err[1].code).to.equal(e.code); + expect(err[1].message).to.equal(e.message); + } + } + + it('should fail all queries when they contain invalid syntax when calling batchExecuteNoQuery(queries)', function () { + let client = testSetup.createDefaultCUBRIDDemodbConnection(); + let queries = [ + `CREATE TABLE ${TABLE_NAME}(id xyz)`, + `CREATE TABLE ${TABLE_NAME}(id abc)`, + ]; + + return client + .batchExecuteNoQuery(queries) + .then(() => { + throw new Error('batchExecuteNoQuery(queries) should have failed with an invalid syntax error.') + }) + .catch(err => { + verifyError(client, err, queries.length); + + return client + .query('SHOW TABLES') + .then(response => { + expect(response) + .to.be.an('object') + .to.have.property('queryHandle') + .to.be.a('number') + .to.be.above(0); + + expect(response) + .to.have.property('result') + .to.be.an('object'); + + let result = response.result; + + expect(result) + .to.be.an('object') + .to.have.property('RowsCount') + .to.be.a('number') + .to.equal(10); + + expect(result) + .to.have.property('ColumnValues') + .to.be.an('array') + .with.length(10); + + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.have.all.keys(['' + response.queryHandle]); + + let tables = result.ColumnValues.map(row => row[0]); + + // The first query should be committed. + expect(tables).to.not.contain(TABLE_NAME); + + return client.close(); + }); + }); + }); + }); + + describe('when data includes Unicode characters', function () { + beforeEach(testSetup.cleanup(TABLE_NAME)); + + const unicodeDataArr = [ + // The following sentences mean: 'I would like to send off this package.' + { + lang: 'Korean', + string: '이 소포를 부치고 싶은데요.', + }, + { + lang: 'Russian', + string: 'Я хотел бы отослать этот пакет', + }, + ]; + + unicodeDataArr.forEach(data => { + const testData = data.string; + + it(`should succeed to properly encode ${data.lang} characters`, function () { + let client = testSetup.createDefaultCUBRIDDemodbConnection(); + + return client + .batchExecuteNoQuery(`CREATE TABLE ${TABLE_NAME}(str VARCHAR(256))`) + .then(() => { + return client.batchExecuteNoQuery(`INSERT INTO ${TABLE_NAME} VALUES('${testData}')`); + }) + .then(() => { + return client.query(`SELECT * FROM ${TABLE_NAME} WHERE str = ?`, [testData]); + }) + .then(response => { + expect(response) + .to.be.an('object') + .to.have.property('queryHandle') + .to.be.a('number') + .to.be.above(0); + + expect(response) + .to.have.property('result') + .to.be.an('object'); + + let result = response.result; + + expect(result) + .to.be.an('object') + .to.have.property('RowsCount') + .to.be.a('number') + .to.equal(1); + + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.have.all.keys(['' + response.queryHandle]); + + expect(result) + .to.have.property('ColumnValues') + .to.be.an('array') + .with.length(1); + + expect(result.ColumnValues[0][0]).to.equal(testData); + + return client.close(); + }); + }); + }); + }); + }); +}); diff --git a/test/CUBRIDConnection.beginTransaction.js b/test/CUBRIDConnection.beginTransaction.js new file mode 100644 index 0000000..fdfc7f0 --- /dev/null +++ b/test/CUBRIDConnection.beginTransaction.js @@ -0,0 +1,245 @@ +'use strict'; + +const expect = require('chai').expect; +const testSetup = require('./testSetup'); + +describe('CUBRIDConnection', function () { + describe('beginTransaction', function () { + const TABLE_NAME = 'test_tran'; + + beforeEach(testSetup.cleanup(TABLE_NAME)); + after(testSetup.cleanup(TABLE_NAME)); + + it('should succeed to automatically rollback the changes when the connection has been abruptly disconnected without commit after using beginTransaction()', function () { + const client = testSetup.createDefaultCUBRIDDemodbConnection(); + + return client + .connect() + .then(() => { + return client.execute(`CREATE TABLE ${TABLE_NAME}(id INT)`); + }) + .then(() => { + return client.beginTransaction(); + }) + .then(() => { + return client.execute(`INSERT INTO ${TABLE_NAME} VALUES(1)`); + }) + .then(() => { + // Abruptly close the connection to make sure the + // changes are rolled back on the server side. + return client.close(); + }) + .then(() => { + return client.query(`SELECT * FROM ${TABLE_NAME}`); + }) + .then(response => { + // Calling `query` above will reestablish the connection + // which in turn will set auto commit mode back to true. + expect(client.getAutoCommitMode()).to.be.true; + + expect(response) + .to.be.an('object') + .to.have.property('queryHandle') + .to.be.a('number') + .to.be.above(0); + + expect(response) + .to.have.property('result') + .to.be.an('object'); + + let result = response.result; + + expect(result) + .to.be.an('object') + .to.have.property('RowsCount') + .to.be.a('number') + .to.equal(0); + + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.have.all.keys(['' + response.queryHandle]); + + return client.execute(`DROP TABLE ${TABLE_NAME}`); + }) + .then(() => { + // Abruptly close the connection again to see if the + // changes are persisted or not. + return client.close(); + }) + .then(() => { + return client.query(`SELECT COUNT(*) FROM db_class WHERE class_name = '${TABLE_NAME}'`); + }) + .then(response => { + expect(response) + .to.be.an('object') + .to.have.property('queryHandle') + .to.be.a('number') + .to.be.above(0); + + expect(response) + .to.have.property('result') + .to.be.an('object'); + + let result = response.result; + + expect(result) + .to.be.an('object') + .to.have.property('RowsCount') + .to.be.a('number') + .to.equal(1); + + expect(result) + .to.have.property('ColumnValues') + .to.be.an('array') + .with.length(1); + + expect(result.ColumnValues[0]) + .to.be.an('array') + .with.length(1); + + expect(result.ColumnValues[0][0]) + .to.be.a('number') + // No such table should exist. + .to.equal(0); + + expect(result) + .to.have.property('ColumnNames') + .to.be.an('array') + .with.length(1); + + expect(result.ColumnNames[0]) + .to.equal('count(*)'); + + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.have.all.keys(['' + response.queryHandle]); + + return client.close(); + }); + }); + + it('should succeed to automatically rollback the changes when the connection has been abruptly disconnected without commit after using beginTransaction(callback)', function () { + const client = testSetup.createDefaultCUBRIDDemodbConnection(); + + return client + .connect() + .then(() => { + return client.execute(`CREATE TABLE ${TABLE_NAME}(id INT)`); + }) + .then(() => { + return new Promise((resolve, reject) => { + client.beginTransaction(function (err) { + if (err) { + return reject(err); + } + + resolve(); + }); + }); + }) + .then(() => { + return client.execute(`INSERT INTO ${TABLE_NAME} VALUES(1)`); + }) + .then(() => { + // Abruptly close the connection to make sure the + // changes are rolled back on the server side. + return client.close(); + }) + .then(() => { + return client.query(`SELECT * FROM ${TABLE_NAME}`); + }) + .then(response => { + // Calling `query` above will reestablish the connection + // which in turn will set auto commit mode back to true. + expect(client.getAutoCommitMode()).to.be.true; + + expect(response) + .to.be.an('object') + .to.have.property('queryHandle') + .to.be.a('number') + .to.be.above(0); + + expect(response) + .to.have.property('result') + .to.be.an('object'); + + let result = response.result; + + expect(result) + .to.be.an('object') + .to.have.property('RowsCount') + .to.be.a('number') + .to.equal(0); + + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.have.all.keys(['' + response.queryHandle]); + + return client.execute(`DROP TABLE ${TABLE_NAME}`); + }) + .then(() => { + // Abruptly close the connection again to see if the + // changes are persisted or not. + return client.close(); + }) + .then(() => { + return client.query(`SELECT COUNT(*) FROM db_class WHERE class_name = '${TABLE_NAME}'`); + }) + .then(response => { + expect(response) + .to.be.an('object') + .to.have.property('queryHandle') + .to.be.a('number') + .to.be.above(0); + + expect(response) + .to.have.property('result') + .to.be.an('object'); + + let result = response.result; + + expect(result) + .to.be.an('object') + .to.have.property('RowsCount') + .to.be.a('number') + .to.equal(1); + + expect(result) + .to.have.property('ColumnValues') + .to.be.an('array') + .with.length(1); + + expect(result.ColumnValues[0]) + .to.be.an('array') + .with.length(1); + + expect(result.ColumnValues[0][0]) + .to.be.a('number') + // No such table should exist. + .to.equal(0); + + expect(result) + .to.have.property('ColumnNames') + .to.be.an('array') + .with.length(1); + + expect(result.ColumnNames[0]) + .to.equal('count(*)'); + + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.have.all.keys(['' + response.queryHandle]); + + return client.close(); + }); + }); + }); +}); diff --git a/test/CUBRIDConnection.close.js b/test/CUBRIDConnection.close.js new file mode 100644 index 0000000..305c1b8 --- /dev/null +++ b/test/CUBRIDConnection.close.js @@ -0,0 +1,44 @@ +'use strict'; + +const expect = require('chai').expect; +const testSetup = require('./testSetup'); + +describe('CUBRIDConnection', function () { + describe('close', function () { + it('should emit the "disconnect" event on close()', function () { + const client = testSetup.createDefaultCUBRIDDemodbConnection(); + let disconnected = false; + + return client + .connect() + .then(() => { + client.once('disconnect', function () { + disconnected = true; + }); + + return client.close(); + }) + .then(() => { + return new Promise(resolve => { + setTimeout(() => { + expect(disconnected).to.be.true; + + resolve(); + }, 300); + }); + }); + }); + + it('should succeed to close() when a connection is not established', function () { + const client = testSetup.createDefaultCUBRIDDemodbConnection(); + + return client.close(); + }); + + it('should succeed to close(callback) when a connection is not established', function (done) { + const client = testSetup.createDefaultCUBRIDDemodbConnection(); + + client.close(done); + }); + }); +}); diff --git a/test/CUBRIDConnection.closeQuery.js b/test/CUBRIDConnection.closeQuery.js new file mode 100644 index 0000000..df15c93 --- /dev/null +++ b/test/CUBRIDConnection.closeQuery.js @@ -0,0 +1,61 @@ +'use strict'; + +const expect = require('chai').expect; +const testSetup = require('./testSetup'); +const ErrorMessages = require('../src/constants/ErrorMessages'); + +describe('CUBRIDConnection', function () { + describe('closeQuery', function () { + it('should fail to closeQuery() with an invalid query handle', function () { + const client = testSetup.createDefaultCUBRIDDemodbConnection(); + const queryHandle = 1234; + + return client.closeQuery(queryHandle) + .then(() => { + throw new Error('Should have failed to close the query with an invalid query handle.') + }) + .catch(err => { + expect(err).to.be.an.instanceOf(Error); + expect(err.message).to.equal(`${ErrorMessages.ERROR_NO_ACTIVE_QUERY}: ${queryHandle}`); + }); + }); + + it('should fail to closeQuery(callback) with an invalid query handle', function (done) { + const client = testSetup.createDefaultCUBRIDDemodbConnection(); + const queryHandle = 1234; + + client.closeQuery(queryHandle, function (err) { + expect(err).to.be.an.instanceOf(Error); + expect(err.message).to.equal(`${ErrorMessages.ERROR_NO_ACTIVE_QUERY}: ${queryHandle}`); + + done(); + }); + }); + + it('should fail to closeQuery() with an undefined query handle', function () { + const client = testSetup.createDefaultCUBRIDDemodbConnection(); + let queryHandle; + + return client.closeQuery(queryHandle) + .then(() => { + throw new Error('Should have failed to close the query with an invalid query handle.') + }) + .catch(err => { + expect(err).to.be.an.instanceOf(Error); + expect(err.message).to.equal(`${ErrorMessages.ERROR_NO_ACTIVE_QUERY}: ${queryHandle}`); + }); + }); + + it('should fail to closeQuery(callback) with an invalid query handle', function (done) { + const client = testSetup.createDefaultCUBRIDDemodbConnection(); + let queryHandle; + + client.closeQuery(queryHandle, function (err) { + expect(err).to.be.an.instanceOf(Error); + expect(err.message).to.equal(`${ErrorMessages.ERROR_NO_ACTIVE_QUERY}: ${queryHandle}`); + + done(); + }); + }); + }); +}); diff --git a/test/CUBRIDConnection.commit.js b/test/CUBRIDConnection.commit.js new file mode 100644 index 0000000..1603a6f --- /dev/null +++ b/test/CUBRIDConnection.commit.js @@ -0,0 +1,75 @@ +'use strict'; + +const expect = require('chai').expect; +const ErrorMessages = require('../src/constants/ErrorMessages'); +const testSetup = require('./testSetup'); + +describe('CUBRIDConnection', function () { + describe('commit', function () { + it('should fail to commit() when a connection is offline', function () { + const client = testSetup.createDefaultCUBRIDDemodbConnection(); + + return client.commit() + .then(() => { + throw new Error(ErrorMessages.ERROR_CLOSED_CONNECTION_COMMIT); + }) + .catch(err => { + expect(err).to.be.an.instanceOf(Error); + expect(err.message).to.equal(ErrorMessages.ERROR_CLOSED_CONNECTION_COMMIT); + }); + }); + + it('should fail to commit(callback) when a connection is offline', function (done) { + const client = testSetup.createDefaultCUBRIDDemodbConnection(); + + client.commit(function (err) { + expect(err).to.be.an.instanceOf(Error); + expect(err.message).to.equal(ErrorMessages.ERROR_CLOSED_CONNECTION_COMMIT); + + done(); + }); + }); + + it('should fail to commit() when a auto commit mode is enabled', function () { + const client = testSetup.createDefaultCUBRIDDemodbConnection(); + + return client + .connect() + .then(() => { + return client.commit(); + }) + .then(() => { + throw new Error(ErrorMessages.ERROR_AUTO_COMMIT_ENABLED_COMMIT); + }) + .catch(err => { + expect(err).to.be.an.instanceOf(Error); + expect(err.message).to.equal(ErrorMessages.ERROR_AUTO_COMMIT_ENABLED_COMMIT); + }); + }); + + it('should fail to commit(callback) when a auto commit mode is enabled', function () { + const client = testSetup.createDefaultCUBRIDDemodbConnection(); + + return client + .connect() + .then(() => { + return new Promise((resolve, reject) => { + client.commit(function (err) { + if (err) { + return reject(err); + } + + resolve(); + }) + }); + }) + .then(() => { + throw new Error(ErrorMessages.ERROR_AUTO_COMMIT_ENABLED_COMMIT); + }) + .catch(err => { + expect(err).to.be.an.instanceOf(Error); + expect(err.message).to.equal(ErrorMessages.ERROR_AUTO_COMMIT_ENABLED_COMMIT); + }); + }); + }); +}); diff --git a/test/CUBRIDConnection.connect.js b/test/CUBRIDConnection.connect.js new file mode 100644 index 0000000..785f805 --- /dev/null +++ b/test/CUBRIDConnection.connect.js @@ -0,0 +1,277 @@ +'use strict'; + +const expect = require('chai').expect; +const CUBRID = require('../'); +const ErrorMessages = require('../src/constants/ErrorMessages'); +const testSetup = require('./testSetup'); +const config = testSetup.config; + +describe('CUBRIDConnection', function () { + describe('connect', function () { + describe('to a non-existing database', function () { + const nonExistingDatabase = 'demodb_xyz'; + + let nonExistingDatabaseError = new Error(`Failed to connect to database server, '${nonExistingDatabase}', on the following host(s): localhost:localhost`); + let nonExistingDatabaseErrorShort = new Error(`Failed to connect to database server, '${nonExistingDatabase}', on the following host(s): localhost`); + nonExistingDatabaseError.code = -677; + + // const errors = [ + // // This is the correct message, CUBRID should return when a database is not found. + // "-677:Failed to connect to database server, 'demodb_xyz', on the following host(s): localhost:localhost", + // // When CUBRID is installed and started as a root, the following error is returned. + // // This may be a CUBRID bug or a spec. Need to keep these until we figure out + // // whether this is a bug or not. + // '-985:The hostname on the database connection string should be specified when multihost is set in "databases.txt".', + // // On CUBRID 9.1 and 8.4.1 the following error is returned. + // "-985:No error message available."]; + + it('should fail to connect to a non-existing database using a callback', function (done) { + const client = CUBRID.createConnection(config.hosts, config.port, config.user, config.password, nonExistingDatabase, 0, config.maxConnectionRetryCount, config.logger); + + client.connect(function (err) { + if (err) { + expect(err).to.be.an.instanceOf(Error); + // Error `-191` is `ER_NET_CANT_CONNECT_SERVER` + // Error `-677` is `ER_BO_CONNECT_FAILED` + // https://github.com/CUBRID/cubrid/blob/2b45b718bb50abef0ede89f3920b3501b7302ca3/src/base/error_code.h + expect([-191, -677]).to.include(err.code); + + if (err.code === -191) { + expect(err.message).to.equal(nonExistingDatabaseErrorShort.message); + } else { + expect(err.message).to.equal(nonExistingDatabaseError.message); + } + + return done(); + } + + done(new Error('The connection should have failed to a non-existing database.')); + }); + }); + + it('should fail to connect to a non-existing database using a promise', function () { + const client = CUBRID.createConnection(config.hosts, config.port, config.user, config.password, nonExistingDatabase, 0, config.maxConnectionRetryCount, config.logger); + + return client + .connect() + .then(() => { + throw new Error('The connection should have failed to a non-existing database.'); + }) + .catch(err => { + expect(err).to.be.an.instanceOf(Error); + // Error `-191` is `ER_NET_CANT_CONNECT_SERVER` + // Error `-677` is `ER_BO_CONNECT_FAILED` + // https://github.com/CUBRID/cubrid/blob/2b45b718bb50abef0ede89f3920b3501b7302ca3/src/base/error_code.h + expect([-191, -677]).to.include(err.code); + + if (err.code === -191) { + expect(err.message).to.equal(nonExistingDatabaseErrorShort.message); + } else { + expect(err.message).to.equal(nonExistingDatabaseError.message); + } + }); + }); + }); + + describe('to a wrong port', function () { + const port = 80; + const connectionTimeout = 5000; + + this.timeout(connectionTimeout * 2); + + it('should fail to connect to an incorrect port using a callback', function (done) { + const client = CUBRID.createConnection(config.hosts, port, config.user, config.password, config.database, connectionTimeout, config.maxConnectionRetryCount, config.maxConnectionRetryCount, config.logger); + + client.connect(function (err) { + expect(err).to.be.an.instanceOf(Error); + expect(err.message).to.contain('connect ECONNREFUSED'); + + done(); + }); + }); + + it('should fail to connect to an incorrect port using a promise', function () { + const client = CUBRID.createConnection(config.hosts, port, config.user, config.password, config.database, connectionTimeout, config.maxConnectionRetryCount, config.logger); + + return client + .connect() + .then(() => { + throw new Error('The connection should have failed.'); + }) + .catch(err => { + expect(err).to.be.an.instanceOf(Error); + expect(err.message).to.contain('connect ECONNREFUSED'); + }); + }); + }); + + describe('to a wrong host', function () { + const host = '80.80.80.80'; + const connectionTimeout = 5000; + + this.timeout(connectionTimeout * 2); + + it('should fail to connect to an incorrect port using a callback', function (done) { + const client = CUBRID.createConnection(host, config.port, config.user, config.password, config.database, connectionTimeout, config.maxConnectionRetryCount, config.logger); + + client.connect(function (err) { + expect(err).to.be.an.instanceOf(Error); + expect(err.message).to.equal(`connect ECONNREFUSED ${host}:${config.port}`); + + done(); + }); + }); + + it('should fail to connect to an incorrect port using a promise', function () { + const client = CUBRID.createConnection(host, config.port, config.user, config.password, config.database, connectionTimeout, config.maxConnectionRetryCount, config.logger); + + return client + .connect() + .then(() => { + throw new Error('The connection should have failed.'); + }) + .catch(err => { + expect(err).to.be.an.instanceOf(Error); + expect(err.message).to.equal(`connect ECONNREFUSED ${host}:${config.port}`); + }); + }); + + it('should fail to connect to a valid but non-CUBRID host within 1.5 seconds', function () { + const client = new CUBRID.createConnection('www.google.com'); + const newTimeoutValue = 1500; + + client.setConnectionTimeout(newTimeoutValue); + expect(client.getConnectionTimeout()).to.equal(newTimeoutValue); + + // By default the client will retry the connection one more time + // if it failed, so the timeout should be increased. + this.timeout(newTimeoutValue * 3); + + return client + .connect() + .then(() => { + throw new Error('Connection should have failed.'); + }) + .catch(err => { + expect(err).to.be.an.instanceOf(Error); + expect(err.message).to.equal(ErrorMessages.ERROR_CONNECTION_TIMEOUT); + expect(client.connectionOpened).to.be.false; + }); + }); + }); + + describe('when a username is invalid', function () { + const username = 'unknown_user'; + const connectionTimeout = 5000; + const errors = [`User "${username}" is invalid.`, 'Your transaction has been aborted by the system due to server failure or mode change.']; + + this.timeout(connectionTimeout * 2); + + it('should fail to connect(callback) when a username is invalid', function (done) { + const client = CUBRID.createConnection(config.hosts, config.port, username, config.password, config.database, connectionTimeout, config.maxConnectionRetryCount, config.logger); + + client.connect(function (err) { + expect(err).to.be.an.instanceOf(Error); + expect(err.code).to.equal(-165); + expect(errors).to.include(err.message); + + done(); + }); + }); + + it('should fail to connect() when a username is invalid', function () { + const client = CUBRID.createConnection(config.hosts, config.port, username, config.password, config.database, connectionTimeout, config.maxConnectionRetryCount, config.logger); + + return client + .connect() + .then(() => { + throw new Error('The connection should have failed.'); + }) + .catch(err => { + expect(err).to.be.an.instanceOf(Error); + expect(err.code).to.equal(-165); + expect(errors).to.include(err.message); + }); + }); + }); + + describe('to a valid server', function () { + it('should succeed to connect to a valid server using a callback', function (done) { + const client = testSetup.createDefaultCUBRIDDemodbConnection(); + + client.connect(function (err) { + if (err) { + return done(err); + } + + client.close(done); + }); + }); + + it('should succeed to connect to a valid server using a promise', function () { + const client = testSetup.createDefaultCUBRIDDemodbConnection(); + + return client + .connect() + .then(() => { + return client.close(); + }); + }); + + it('should fail to call connect() second time if the first connection request is in progress, i.e. pending', function () { + const client = testSetup.createDefaultCUBRIDDemodbConnection(); + + client.connect(); + + return client + .connect() + .then(() => { + throw new Error('The second connection should have failed.') + }) + .catch(err => { + expect(err).to.be.an.instanceOf(Error); + expect(err.message).to.equal(ErrorMessages.ERROR_CONNECTION_ALREADY_PENDING); + + return client.close(); + }); + }); + + it('should fail to call connect() using a callback second time if the first connection request is in progress, i.e. pending', function (done) { + const client = testSetup.createDefaultCUBRIDDemodbConnection(); + + this.timeout(3000); + + client.connect(); + + client.connect(function (err) { + expect(err).to.be.an.instanceOf(Error); + expect(err.message).to.equal(ErrorMessages.ERROR_CONNECTION_ALREADY_PENDING); + + client.close(done); + }); + }); + + it('should succeed to call connect() as a promise second time if the first connection request is completed, i.e. opened', function () { + const client = testSetup.createDefaultCUBRIDDemodbConnection(); + + return client + .connect() + .then(() => { + return client.connect(); + }); + }); + + it('should succeed to call connect(callback) second time if the first connection request is completed, i.e. opened', function (done) { + const client = testSetup.createDefaultCUBRIDDemodbConnection(); + + client.connect(function (err) { + if (err) { + return done(err); + } + + client.connect(done); + }); + }); + }); + }); +}); diff --git a/test/CUBRIDConnection.end.js b/test/CUBRIDConnection.end.js new file mode 100644 index 0000000..2b0b7c4 --- /dev/null +++ b/test/CUBRIDConnection.end.js @@ -0,0 +1,107 @@ +'use strict'; + +const expect = require('chai').expect; +const testSetup = require('./testSetup'); + +describe('CUBRIDConnection', function () { + describe('end', function () { + it('should succeed to close the connection using end(callback)', function () { + let client = testSetup.createDefaultCUBRIDDemodbConnection(); + + return client + .connect() + .then(() => { + return client.query('SELECT * FROM nation'); + }) + .then(response => { + expect(response) + .to.be.an('object') + .to.have.property('queryHandle') + .to.be.a('number') + .to.be.above(0); + + expect(response) + .to.have.property('result') + .to.be.an('object'); + + let result = response.result; + + expect(result) + .to.be.an('object') + .to.have.property('RowsCount') + .to.be.a('number'); + + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.have.all.keys(['' + response.queryHandle]); + + return new Promise((resolve, reject) => { + client.end(function (err) { + if (err) { + return reject(err); + } + + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.be.empty; + + resolve(); + }); + }); + }) + .then(() => { + return client.close(); + }); + }); + + it('should succeed to close the connection using end(callback)', function () { + let client = testSetup.createDefaultCUBRIDDemodbConnection(); + + return client + .connect() + .then(() => { + return client.query('SELECT * FROM nation'); + }) + .then(response => { + expect(response) + .to.be.an('object') + .to.have.property('queryHandle') + .to.be.a('number') + .to.be.above(0); + + expect(response) + .to.have.property('result') + .to.be.an('object'); + + let result = response.result; + + expect(result) + .to.be.an('object') + .to.have.property('RowsCount') + .to.be.a('number'); + + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.have.all.keys(['' + response.queryHandle]); + + return client + .end() + .then(() => { + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.be.empty; + + return client.close(); + }); + }); + }); + }); +}); diff --git a/test/CUBRIDConnection.execute.js b/test/CUBRIDConnection.execute.js new file mode 100644 index 0000000..67d0724 --- /dev/null +++ b/test/CUBRIDConnection.execute.js @@ -0,0 +1,541 @@ +'use strict'; + +const expect = require('chai').expect; +const testSetup = require('./testSetup'); +const ErrorMessages = require('../src/constants/ErrorMessages'); + +describe('CUBRIDConnection', function () { + describe('execute', function () { + const TABLE_NAME = 'tbl_test'; + + before(testSetup.cleanup(TABLE_NAME)); + after(testSetup.cleanup(TABLE_NAME)); + + describe('when using the new protocol', function () { + it('should verify there are no query packets after calling execute(sql)', function () { + const client = testSetup.createDefaultCUBRIDDemodbConnection(); + + return client + // Disable the autocommit mode to make sure the changes + // are not applied. + .setAutoCommitMode(false) + .then(() => { + return client.execute(`DELETE FROM code WHERE s_name = 'ZZZZ'`); + }) + .then(() => { + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.be.empty; + + return client.close(); + }); + }); + + it('should verify there are no query packets after calling execute(sql, callback)', function () { + const client = testSetup.createDefaultCUBRIDDemodbConnection(); + + return client + // Disable the autocommit mode to make sure the changes + // are not applied. + .setAutoCommitMode(false) + .then(() => { + return new Promise((resolve, reject) => { + client.execute(`DELETE FROM code WHERE s_name = 'ZZZZ'`, function (err) { + if (err) { + return reject(err); + } + + resolve(); + }); + }); + }) + .then(() => { + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.be.empty; + + return client.close(); + }); + }); + + it('should verify there are no query packets after calling execute(sql) multiple times', function () { + const client = testSetup.createDefaultCUBRIDDemodbConnection(); + let queries = [ + { + sql: `CREATE TABLE ${TABLE_NAME}(id INT)` + }, + { + sql: `INSERT INTO ${TABLE_NAME} (id) VALUES (1), (2), (3)` + }, + { + sql: `DROP TABLE ${TABLE_NAME}` + } + ]; + + let queriesCount = queries.length; + let promise = Promise.resolve(); + + for (var i = 0; i < queriesCount; ++i) { + promise = promise.then(() => { + let query = queries.shift(); + + return client + .execute(query.sql) + .then(() => { + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.be.empty; + }); + }); + } + + return promise + .then(() => { + return client.query('SHOW TABLES'); + }) + .then(response => { + expect(response) + .to.be.an('object') + .to.have.property('queryHandle') + .to.be.a('number') + .to.be.above(0); + + expect(response) + .to.have.property('result') + .to.be.an('object'); + + let result = response.result; + + expect(result) + .to.be.an('object') + .to.have.property('RowsCount') + .to.be.a('number') + .to.equal(10); + + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.have.all.keys(['' + response.queryHandle]); + + return client.close(); + }); + }); + + it('should verify there are no query packets after calling execute(sql, callback) multiple times', function () { + const client = testSetup.createDefaultCUBRIDDemodbConnection(); + let queries = [ + { + sql: `CREATE TABLE ${TABLE_NAME}(id INT)` + }, + { + sql: `INSERT INTO ${TABLE_NAME} (id) VALUES (?), (?), (?)`, + params: [1, 2, 3] + }, + { + sql: `DROP TABLE ${TABLE_NAME}` + } + ]; + + let queriesCount = queries.length; + let promise = Promise.resolve(); + + for (var i = 0; i < queriesCount; ++i) { + promise = promise.then(() => { + let query = queries.shift(); + + return new Promise((resolve, reject) => { + client.execute(query.sql, query.params, function (err) { + if (err) { + return reject(err); + } + + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.be.empty; + + resolve(); + }); + }); + }); + } + + return promise + .then(() => { + return client.query('SHOW TABLES'); + }) + .then(response => { + expect(response) + .to.be.an('object') + .to.have.property('queryHandle') + .to.be.a('number') + .to.be.above(0); + + expect(response) + .to.have.property('result') + .to.be.an('object'); + + let result = response.result; + + expect(result) + .to.be.an('object') + .to.have.property('RowsCount') + .to.be.a('number') + .to.equal(10); + + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.have.all.keys(['' + response.queryHandle]); + + return client.close(); + }); + }); + + it('should succeed to call execute(sql, params)', function () { + const client = testSetup.createDefaultCUBRIDDemodbConnection(); + + return client + // Disable the autocommit mode to make sure the changes + // are not applied. + .setAutoCommitMode(false) + .then(() => { + return client.execute(`DELETE FROM code WHERE s_name = ?`, ['ZZZZ']); + }) + .then(() => { + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.be.empty; + + return client.close(); + }); + }); + + it('should succeed to call execute(sql, params, callback)', function () { + const client = testSetup.createDefaultCUBRIDDemodbConnection(); + + return client + // Disable the autocommit mode to make sure the changes + // are not applied. + .setAutoCommitMode(false) + .then(() => { + return new Promise((resolve, reject) => { + client.execute(`DELETE FROM code WHERE s_name = ?`, ['ZZZZ'], function (err) { + if (err) { + return reject(err); + } + + resolve(); + }) + }); + }) + .then(() => { + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.be.empty; + + return client.close(); + }); + }); + + it('should succeed to call execute(sql, params) with literal params', function () { + const client = testSetup.createDefaultCUBRIDDemodbConnection(); + + return client + // Disable the autocommit mode to make sure the changes + // are not applied. + .setAutoCommitMode(false) + .then(() => { + return client.execute(`DELETE FROM code WHERE s_name = ?`, 'ZZZZ'); + }) + .then(() => { + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.be.empty; + + return client.close(); + }); + }); + + it('should succeed to call execute(sql, params, callback) with literal params', function () { + const client = testSetup.createDefaultCUBRIDDemodbConnection(); + + return client + // Disable the autocommit mode to make sure the changes + // are not applied. + .setAutoCommitMode(false) + .then(() => { + return new Promise((resolve, reject) => { + client.execute(`DELETE FROM code WHERE s_name = ?`, 'ZZZZ', function (err) { + if (err) { + return reject(err); + } + + resolve(); + }) + }); + }) + .then(() => { + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.be.empty; + + return client.close(); + }); + }); + + it('should succeed to call execute(sqls)', function () { + const client = testSetup.createDefaultCUBRIDDemodbConnection(); + + return client + // Disable the autocommit mode to make sure the changes + // are not applied. + .setAutoCommitMode(false) + .then(() => { + const queries = [ + `DELETE FROM code WHERE s_name = 'ZZZZ'`, + `DELETE FROM code WHERE s_name = 'ZZZZ'`, + ]; + + return client.execute(queries); + }) + .then(() => { + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.be.empty; + + return client.close(); + }); + }); + + it('should succeed to call execute(sqls, callback)', function () { + const client = testSetup.createDefaultCUBRIDDemodbConnection(); + + return client + // Disable the autocommit mode to make sure the changes + // are not applied. + .setAutoCommitMode(false) + .then(() => { + const queries = [ + `DELETE FROM code WHERE s_name = 'ZZZZ'`, + `DELETE FROM code WHERE s_name = 'ZZZZ'`, + ]; + + return new Promise((resolve, reject) => { + client.execute(queries, function (err) { + if (err) { + return reject(err); + } + + resolve(); + }); + }); + }) + .then(() => { + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.be.empty; + + return client.close(); + }); + }); + }); + + describe('when using the old protocol', function () { + it('should verify there are no query packets after calling execute(sql)', function () { + const client = testSetup.createDefaultCUBRIDDemodbConnection(); + + client.setEnforceOldQueryProtocol(true); + + return client + // Disable the autocommit mode to make sure the changes + // are not applied. + .setAutoCommitMode(false) + .then(() => { + return client.execute(`DELETE FROM code WHERE s_name = 'ZZZZ'`); + }) + .then(() => { + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.be.empty; + + return client.close(); + }); + }); + + it('should verify there are no query packets after calling execute(sql) multiple times', function () { + const client = testSetup.createDefaultCUBRIDDemodbConnection(); + let queries = [ + { + sql: `CREATE TABLE ${TABLE_NAME}(id INT)` + }, + { + sql: `INSERT INTO ${TABLE_NAME} (id) VALUES (1), (2), (3)` + }, + { + sql: `DROP TABLE ${TABLE_NAME}` + } + ]; + + let queriesCount = queries.length; + let promise = Promise.resolve(); + + client.setEnforceOldQueryProtocol(true); + + for (var i = 0; i < queriesCount; ++i) { + promise = promise.then(() => { + let query = queries.shift(); + + return client + .execute(query.sql) + .then(() => { + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.be.empty; + }); + }); + } + + return promise + .then(() => { + return client.query('SHOW TABLES'); + }) + .then(response => { + expect(response) + .to.be.an('object') + .to.have.property('queryHandle') + .to.be.a('number') + .to.be.above(0); + + expect(response) + .to.have.property('result') + .to.be.an('object'); + + let result = response.result; + + expect(result) + .to.be.an('object') + .to.have.property('RowsCount') + .to.be.a('number') + .to.equal(10); + + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.have.all.keys(['' + response.queryHandle]); + + return client.close(); + }); + }); + + it('should succeed to call execute(sql, params)', function () { + const client = testSetup.createDefaultCUBRIDDemodbConnection(); + + client.setEnforceOldQueryProtocol(true); + + return client + // Disable the autocommit mode to make sure the changes + // are not applied. + .setAutoCommitMode(false) + .then(() => { + return client.execute(`DELETE FROM code WHERE s_name = ?`, ['ZZZZ']); + }) + .then(() => { + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.be.empty; + + return client.close(); + }); + }); + + it('should succeed to call execute(sqls)', function () { + const client = testSetup.createDefaultCUBRIDDemodbConnection(); + + client.setEnforceOldQueryProtocol(true); + + return client + // Disable the autocommit mode to make sure the changes + // are not applied. + .setAutoCommitMode(false) + .then(() => { + const queries = [ + `DELETE FROM code WHERE s_name = 'ZZZZ'`, + `DELETE FROM code WHERE s_name = 'ZZZZ'`, + ]; + + return client.execute(queries); + }) + .then(() => { + throw new Error('Should have failed to execute multiple queries when using an old protocol.'); + }) + .catch(err => { + expect(err).to.be.an.instanceOf(Error); + expect(err.message).to.equal(ErrorMessages.ERROR_MULTIPLE_QUERIES); + }); + }); + + it('should succeed to call execute(sqls, callback)', function () { + const client = testSetup.createDefaultCUBRIDDemodbConnection(); + + client.setEnforceOldQueryProtocol(true); + + return client + // Disable the autocommit mode to make sure the changes + // are not applied. + .setAutoCommitMode(false) + .then(() => { + const queries = [ + `DELETE FROM code WHERE s_name = 'ZZZZ'`, + `DELETE FROM code WHERE s_name = 'ZZZZ'`, + ]; + + return new Promise((resolve, reject) => { + client.execute(queries, function (err) { + if (err) { + return reject(err); + } + + resolve(); + }); + }); + }) + .then(() => { + throw new Error('Should have failed to execute multiple queries when using an old protocol.'); + }) + .catch(err => { + expect(err).to.be.an.instanceOf(Error); + expect(err.message).to.equal(ErrorMessages.ERROR_MULTIPLE_QUERIES); + }); + }); + }); + }); +}); diff --git a/test/CUBRIDConnection.executeWithTypedParams.js b/test/CUBRIDConnection.executeWithTypedParams.js new file mode 100644 index 0000000..b326dcb --- /dev/null +++ b/test/CUBRIDConnection.executeWithTypedParams.js @@ -0,0 +1,589 @@ +'use strict'; + +const expect = require('chai').expect; +const testSetup = require('./testSetup'); + +describe('CUBRIDConnection', function () { + describe('executeWithTypedParams', function () { + const TABLE_NAME = 'tbl_test'; + + beforeEach(testSetup.cleanup(TABLE_NAME)); + after(testSetup.cleanup(TABLE_NAME)); + + const BIG_STRING_LENGTH = 10; + const query = ` + CREATE TABLE ${TABLE_NAME}( + a BIGINT, + b BIT(8), + c BIT VARYING(8), + d CHARACTER(1), + e DATE, + f DATETIME, + g DOUBLE, + h FLOAT, + i INTEGER, + j MONETARY, + k NATIONAL CHARACTER(1), + l NATIONAL CHARACTER VARYING(100), + m NUMERIC(15,0), + n CHARACTER VARYING(100), + o TIME, + p TIMESTAMP, + q CHARACTER VARYING(4096), + r CHAR(${BIG_STRING_LENGTH})${/* big string test */''} + ) + `; + + let bitValue = new Buffer(1); + let date = new Date(); + let varBitValue = new Buffer(1); + + bitValue[0] = 0; + date.setUTCFullYear(2012, /* 0 based; 9 is for October */9, 2); + date.setUTCHours(13, 25, 45, 100); + varBitValue[0] = 128; + + const valueMappings = [ + { + type: 'bigint', + value: 15 + }, + { + type: 'bit', + value: bitValue + }, + { + type: 'varbit', + value: varBitValue + }, + { + type: 'char', + value: 'a' + }, + { + type: 'date', + value: date + }, + { + type: 'datetime', + value: date + }, + { + type: 'double', + value: 1.5 + }, + { + type: 'float', + value: 2.5 + }, + { + type: 'int', + value: 14 + }, + { + type: 'monetary', + value: 3.14 + }, + { + type: 'nchar', + value: '9' + }, + { + type: 'varnchar', + value: '95' + }, + { + type: 'numeric', + value: 16 + }, + { + type: 'varchar', + value: 'varnchar' + }, + { + type: 'time', + value: date + }, + { + type: 'timestamp', + value: date + }, + { + type: 'varchar', + value: 'varchar' + }, + { + type: 'char', + value: (function getRandomChars(charsCount) { + let value = ''; + + while (charsCount--) { + value += 'A'; + } + + return value; + })(BIG_STRING_LENGTH) + } + ]; + + it('should succeed calling executeWithTypedParams(sql, params, delimiters)', function () { + let client = testSetup.createDefaultCUBRIDDemodbConnection(); + + return client + .batchExecuteNoQuery(query) + .then(() => { + const sql = `INSERT INTO ${TABLE_NAME} VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`; + let params = []; + let types = []; + + valueMappings.forEach(mapping => { + params.push(mapping.value); + types.push(mapping.type); + }); + + return client.executeWithTypedParams(sql, params, types); + }) + .then(() => { + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.be.empty; + + return client.query(`SELECT * FROM ${TABLE_NAME}`); + }) + .then(response => { + expect(response) + .to.be.an('object') + .to.have.property('queryHandle') + .to.be.a('number') + .to.be.above(0); + + expect(response) + .to.have.property('result') + .to.be.an('object'); + + let result = response.result; + + expect(result) + .to.be.an('object') + .to.have.property('RowsCount') + .to.be.a('number') + .to.equal(1); + + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.have.all.keys(['' + response.queryHandle]); + + expect(result) + .to.have.property('ColumnValues') + .to.be.an('array') + .with.length(1); + + const values = result.ColumnValues[0]; + + expect(values) + .to.be.an('array') + .with.length(valueMappings.length); + + expect(values[0]) + .to.be.a('number') + .to.equal(valueMappings[0].value); + + expect(values[1]) + .to.be.an.instanceOf(Buffer); + + expect(values[1]) + .to.have.length(1); + + expect(values[1][0]) + .to.equal(valueMappings[1].value[0]); + + expect(values[2]) + .to.be.an.instanceOf(Buffer); + + expect(values[2]) + .to.have.length(1); + + expect(values[2][0]) + .to.equal(valueMappings[2].value[0]); + + expect(values[3]) + .to.be.a('string') + .to.equal(valueMappings[3].value); + + expect(values[4]) + .to.be.an.instanceOf(Date); + + // We cannot directly compare the date values because + // an instance of `Date` removes time information when + // storing the data in CUBRID into `DATE` type. + let dateOnly = new Date(valueMappings[4].value); + dateOnly.setUTCHours(0, 0, 0, 0); + + expect(values[4]) + .to.deep.equal(dateOnly); + + expect(values[5]) + .to.be.an.instanceOf(Date); + + expect(values[5]) + .to.deep.equal(valueMappings[5].value); + + expect(values[6]) + .to.be.a('number') + .to.equal(valueMappings[6].value); + + expect(values[7]) + .to.be.a('number') + .to.equal(valueMappings[7].value); + + expect(values[8]) + .to.be.a('number') + .to.equal(valueMappings[8].value); + + expect(values[9]) + .to.be.a('number') + .to.equal(valueMappings[9].value); + + expect(values[10]) + .to.be.a('string') + .to.equal(valueMappings[10].value); + + expect(values[11]) + .to.be.a('string') + .to.equal(valueMappings[11].value); + + expect(values[12]) + .to.be.a('number') + .to.equal(valueMappings[12].value); + + expect(values[13]) + .to.be.a('string') + .to.equal(valueMappings[13].value); + + expect(values[14]) + .to.be.an.instanceOf(Date); + + // We cannot directly compare the date values because + // an instance of `Date` removes date information when + // storing the data in CUBRID as a `TIME` type. + let timeOnly = new Date(valueMappings[14].value); + timeOnly.setUTCFullYear(1970, 0, 1); + // `TIME` in CUBRID does not include the millisecond part. + timeOnly.setMilliseconds(0); + + expect(values[14]) + .to.deep.equal(timeOnly); + + expect(values[15]) + .to.be.an.instanceOf(Date); + + // We cannot directly compare the date values because + // an instance of `Date` removes millisecond information when + // storing the data in CUBRID as a `TIMESTAMP` type. + let timestamp = new Date(valueMappings[15].value); + timestamp.setMilliseconds(0); + + expect(values[15]) + .to.deep.equal(timestamp); + + expect(values[16]) + .to.be.a('string') + .to.equal(valueMappings[16].value); + + expect(values[17]) + .to.be.a('string') + .with.length(BIG_STRING_LENGTH); + + expect(values[17]).to.satisfy(function (str) { + return str.indexOf(valueMappings[17].value) === 0; + }); + + return client.close(); + }); + }); + + it('should succeed calling executeWithTypedParams(sql, params, delimiters, callback)', function () { + let client = testSetup.createDefaultCUBRIDDemodbConnection(); + + return client + .batchExecuteNoQuery(query) + .then(() => { + const sql = `INSERT INTO ${TABLE_NAME} VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`; + let params = []; + let types = []; + + valueMappings.forEach(mapping => { + params.push(mapping.value); + types.push(mapping.type); + }); + + return new Promise((resolve, reject) => { + client.executeWithTypedParams(sql, params, types, function (err) { + if (err) { + return reject(err); + } + + resolve(); + }); + }); + }) + .then(() => { + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.be.empty; + + return client.query(`SELECT * FROM ${TABLE_NAME}`); + }) + .then(response => { + expect(response) + .to.be.an('object') + .to.have.property('queryHandle') + .to.be.a('number') + .to.be.above(0); + + expect(response) + .to.have.property('result') + .to.be.an('object'); + + let result = response.result; + + expect(result) + .to.be.an('object') + .to.have.property('RowsCount') + .to.be.a('number') + .to.equal(1); + + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.have.all.keys(['' + response.queryHandle]); + + expect(result) + .to.have.property('ColumnValues') + .to.be.an('array') + .with.length(1); + + const values = result.ColumnValues[0]; + + expect(values) + .to.be.an('array') + .with.length(valueMappings.length); + + expect(values[0]) + .to.be.a('number') + .to.equal(valueMappings[0].value); + + expect(values[1]) + .to.be.an.instanceOf(Buffer); + + expect(values[1]) + .to.have.length(1); + + expect(values[1][0]) + .to.equal(valueMappings[1].value[0]); + + expect(values[2]) + .to.be.an.instanceOf(Buffer); + + expect(values[2]) + .to.have.length(1); + + expect(values[2][0]) + .to.equal(valueMappings[2].value[0]); + + expect(values[3]) + .to.be.a('string') + .to.equal(valueMappings[3].value); + + expect(values[4]) + .to.be.an.instanceOf(Date); + + // We cannot directly compare the date values because + // an instance of `Date` removes time information when + // storing the data in CUBRID into `DATE` type. + let dateOnly = new Date(valueMappings[4].value); + dateOnly.setUTCHours(0, 0, 0, 0); + + expect(values[4]) + .to.deep.equal(dateOnly); + + expect(values[5]) + .to.be.an.instanceOf(Date); + + expect(values[5]) + .to.deep.equal(valueMappings[5].value); + + expect(values[6]) + .to.be.a('number') + .to.equal(valueMappings[6].value); + + expect(values[7]) + .to.be.a('number') + .to.equal(valueMappings[7].value); + + expect(values[8]) + .to.be.a('number') + .to.equal(valueMappings[8].value); + + expect(values[9]) + .to.be.a('number') + .to.equal(valueMappings[9].value); + + expect(values[10]) + .to.be.a('string') + .to.equal(valueMappings[10].value); + + expect(values[11]) + .to.be.a('string') + .to.equal(valueMappings[11].value); + + expect(values[12]) + .to.be.a('number') + .to.equal(valueMappings[12].value); + + expect(values[13]) + .to.be.a('string') + .to.equal(valueMappings[13].value); + + expect(values[14]) + .to.be.an.instanceOf(Date); + + // We cannot directly compare the date values because + // an instance of `Date` removes date information when + // storing the data in CUBRID as a `TIME` type. + let timeOnly = new Date(valueMappings[14].value); + timeOnly.setUTCFullYear(1970, 0, 1); + // `TIME` in CUBRID does not include the millisecond part. + timeOnly.setMilliseconds(0); + + expect(values[14]) + .to.deep.equal(timeOnly); + + expect(values[15]) + .to.be.an.instanceOf(Date); + + // We cannot directly compare the date values because + // an instance of `Date` removes millisecond information when + // storing the data in CUBRID as a `TIMESTAMP` type. + let timestamp = new Date(valueMappings[15].value); + timestamp.setMilliseconds(0); + + expect(values[15]) + .to.deep.equal(timestamp); + + expect(values[16]) + .to.be.a('string') + .to.equal(valueMappings[16].value); + + expect(values[17]) + .to.be.a('string') + .with.length(BIG_STRING_LENGTH); + + expect(values[17]).to.satisfy(function (str) { + return str.indexOf(valueMappings[17].value) === 0; + }); + + return client.close(); + }); + }); + + it('should fail calling executeWithTypedParams(sql, params, delimiters) when the INSERT query has less "?" parameter placeholders than the provided number of parameters', function () { + let client = testSetup.createDefaultCUBRIDDemodbConnection(); + + return client + .batchExecuteNoQuery(query) + .then(() => { + const sql = `INSERT INTO ${TABLE_NAME} VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`; + let params = []; + let types = []; + + valueMappings.forEach(mapping => { + params.push(mapping.value); + types.push(mapping.type); + }); + + return client.executeWithTypedParams(sql, params, types); + }) + .then(() => { + return new Error('executeWithTypedParams() should have failed with an invalid query.') + }) + .catch(err => { + expect(err).to.be.an.instanceOf(Error); + + expect(err) + .to.have.property('code') + .to.be.a('number'); + + if (client.brokerInfo.protocolVersion === 2) { + expect(err.code) + .to.equal(-10007); + } else { + expect(err.code) + .to.equal(-1007); + } + + expect(err) + .to.have.property('message') + .to.be.a('string') + .to.equal('CAS_ER_NUM_BIND'); + }); + }); + + it('should fail calling executeWithTypedParams(sql, params, delimiters, callback) when the INSERT query has less "?" parameter placeholders than the provided number of parameters', function () { + let client = testSetup.createDefaultCUBRIDDemodbConnection(); + + return client + .batchExecuteNoQuery(query) + .then(() => { + const sql = `INSERT INTO ${TABLE_NAME} VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`; + let params = []; + let types = []; + + valueMappings.forEach(mapping => { + params.push(mapping.value); + types.push(mapping.type); + }); + + return new Promise((resolve, reject) => { + client.executeWithTypedParams(sql, params, types, function (err) { + if (err) { + return reject(err); + } + + resolve(); + }); + }); + }) + .then(() => { + return new Error('executeWithTypedParams() should have failed with an invalid query.') + }) + .catch(err => { + expect(err).to.be.an.instanceOf(Error); + + expect(err) + .to.have.property('code') + .to.be.a('number'); + + if (client.brokerInfo.protocolVersion === 2) { + expect(err.code) + .to.equal(-10007); + } else { + expect(err.code) + .to.equal(-1007); + } + + expect(err) + .to.have.property('message') + .to.be.a('string') + .to.equal('CAS_ER_NUM_BIND'); + }); + }); + }); +}); diff --git a/test/CUBRIDConnection.fetch.js b/test/CUBRIDConnection.fetch.js new file mode 100644 index 0000000..7bd9f9a --- /dev/null +++ b/test/CUBRIDConnection.fetch.js @@ -0,0 +1,1145 @@ +'use strict'; + +const expect = require('chai').expect; +const testSetup = require('./testSetup'); +const ErrorMessages = require('../src/constants/ErrorMessages'); + +describe('CUBRIDConnection', function () { + describe('fetch', function () { + describe('when using the new protocol', function () { + // The new protocol returns less records than when using the old protocol. + let fetchedRecordsCount = 235; + + it('should succeed to execute fetch(queryHandle) after query(sql)', function () { + let client = testSetup.createDefaultCUBRIDDemodbConnection(); + + this.timeout(3000); + + return client + .query('SELECT * FROM game') + .then(response => { + expect(response) + .to.be.an('object') + .to.have.property('queryHandle') + .to.be.a('number') + .to.be.above(0); + + expect(response) + .to.have.property('result') + .to.be.an('object'); + + let result = response.result; + const TOTAL_ROWS = 8653; + + expect(result) + .to.be.an('object') + .to.have.property('RowsCount') + .to.be.a('number') + .to.equal(TOTAL_ROWS); + + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.have.all.keys(['' + response.queryHandle]); + + const COLUMNS_COUNT = 7; + const COLUMN_NAMES = ['host_year', 'event_code', 'athlete_code', 'stadium_code', 'nation_code', 'medal', 'game_date']; + const COLUMN_TYPES = ['Int', 'Int', 'Int', 'Int', 'Char', 'Char', 'Date']; + + expect(result) + .to.have.property('ColumnNames') + .to.be.an('array') + .with.length(COLUMNS_COUNT); + + expect(result.ColumnNames) + .to.deep.equal(COLUMN_NAMES); + + expect(result) + .to.have.property('ColumnDataTypes') + .to.be.an('array') + .with.length(COLUMNS_COUNT); + + expect(result.ColumnDataTypes) + .to.deep.equal(COLUMN_TYPES); + + expect(result) + .to.have.property('ColumnValues') + .to.be.an('array') + .with.length(fetchedRecordsCount); + + // Validate the first row. + expect(result.ColumnValues[0]).to.satisfy(columns => { + expect(columns) + .to.be.an('array') + .with.length(COLUMNS_COUNT); + + expect(columns[0]) + .to.be.a('number') + .to.equal(2004); + + expect(columns[1]) + .to.be.a('number') + .to.equal(20021); + + expect(columns[2]) + .to.be.a('number') + .to.equal(14345); + + expect(columns[3]) + .to.be.a('number') + .to.equal(30116); + + expect(columns[4]) + .to.be.a('string') + .to.equal('NGR'); + + expect(columns[5]) + .to.be.a('string') + .to.equal('B'); + + expect(columns[6]) + .to.be.an.instanceOf(Date) + .to.deep.equal(new Date('2004-08-28T09:00:00+0900')); + + return true; + }); + + // Validate the last row. + expect(result.ColumnValues[result.ColumnValues.length - 1]).to.satisfy(columns => { + expect(columns) + .to.be.an('array') + .with.length(COLUMNS_COUNT); + + expect(columns[0]) + .to.be.a('number') + .to.equal(2004); + + expect(columns[1]) + .to.be.a('number') + .to.equal(20317); + + expect(columns[2]) + .to.be.a('number') + .to.equal(14457); + + expect(columns[3]) + .to.be.a('number') + .to.equal(30124); + + expect(columns[4]) + .to.be.a('string') + .to.equal('ITA'); + + expect(columns[5]) + .to.be.a('string') + .to.equal('G'); + + expect(columns[6]) + .to.be.an.instanceOf(Date) + .to.deep.equal(new Date('2004-08-26T09:00:00+0900')); + + return true; + }); + + // Now fetch the rest rows. + function fetch(queryHandle) { + return client + .fetch(queryHandle) + .then(response => { + expect(response) + .to.be.an('object') + .to.have.property('queryHandle') + .to.be.a('number') + .to.equal(queryHandle); + + expect(response) + .to.have.property('result'); + + if (response.result) { + expect(response.result) + .to.be.an('object'); + + let result = response.result; + + expect(result) + .to.be.an('object') + .to.not.have.property('RowsCount'); + + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.have.all.keys(['' + response.queryHandle]); + + expect(result) + .to.not.have.property('ColumnNames'); + + expect(result) + .to.not.have.property('ColumnDataTypes'); + + expect(result) + .to.have.property('ColumnValues') + .to.be.an('array') + .with.length.above(0); + + return fetch(queryHandle); + } else { + expect(response.result) + .to.be.null; + + return response; + } + }); + } + + return fetch(response.queryHandle); + }) + .then(response => { + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.have.all.keys(['' + response.queryHandle]); + + return client.close(); + }) + .then(() => { + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.be.empty; + }); + }); + + it('should succeed to execute fetch(queryHandle, callback) after query(sql)', function () { + let client = testSetup.createDefaultCUBRIDDemodbConnection(); + + this.timeout(3000); + + return client + .query('SELECT * FROM game') + .then(response => { + expect(response) + .to.be.an('object') + .to.have.property('queryHandle') + .to.be.a('number') + .to.be.above(0); + + expect(response) + .to.have.property('result') + .to.be.an('object'); + + let result = response.result; + const TOTAL_ROWS = 8653; + + expect(result) + .to.be.an('object') + .to.have.property('RowsCount') + .to.be.a('number') + .to.equal(TOTAL_ROWS); + + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.have.all.keys(['' + response.queryHandle]); + + const COLUMNS_COUNT = 7; + const COLUMN_NAMES = ['host_year', 'event_code', 'athlete_code', 'stadium_code', 'nation_code', 'medal', 'game_date']; + const COLUMN_TYPES = ['Int', 'Int', 'Int', 'Int', 'Char', 'Char', 'Date']; + + expect(result) + .to.have.property('ColumnNames') + .to.be.an('array') + .with.length(COLUMNS_COUNT); + + expect(result.ColumnNames) + .to.deep.equal(COLUMN_NAMES); + + expect(result) + .to.have.property('ColumnDataTypes') + .to.be.an('array') + .with.length(COLUMNS_COUNT); + + expect(result.ColumnDataTypes) + .to.deep.equal(COLUMN_TYPES); + + expect(result) + .to.have.property('ColumnValues') + .to.be.an('array') + .with.length(fetchedRecordsCount); + + // Validate the first row. + expect(result.ColumnValues[0]).to.satisfy(columns => { + expect(columns) + .to.be.an('array') + .with.length(COLUMNS_COUNT); + + expect(columns[0]) + .to.be.a('number') + .to.equal(2004); + + expect(columns[1]) + .to.be.a('number') + .to.equal(20021); + + expect(columns[2]) + .to.be.a('number') + .to.equal(14345); + + expect(columns[3]) + .to.be.a('number') + .to.equal(30116); + + expect(columns[4]) + .to.be.a('string') + .to.equal('NGR'); + + expect(columns[5]) + .to.be.a('string') + .to.equal('B'); + + expect(columns[6]) + .to.be.an.instanceOf(Date) + .to.deep.equal(new Date('2004-08-28T09:00:00+0900')); + + return true; + }); + + // Validate the last row. + expect(result.ColumnValues[result.ColumnValues.length - 1]).to.satisfy(columns => { + expect(columns) + .to.be.an('array') + .with.length(COLUMNS_COUNT); + + expect(columns[0]) + .to.be.a('number') + .to.equal(2004); + + expect(columns[1]) + .to.be.a('number') + .to.equal(20317); + + expect(columns[2]) + .to.be.a('number') + .to.equal(14457); + + expect(columns[3]) + .to.be.a('number') + .to.equal(30124); + + expect(columns[4]) + .to.be.a('string') + .to.equal('ITA'); + + expect(columns[5]) + .to.be.a('string') + .to.equal('G'); + + expect(columns[6]) + .to.be.an.instanceOf(Date) + .to.deep.equal(new Date('2004-08-26T09:00:00+0900')); + + return true; + }); + + // Now fetch the rest rows. + function fetch(queryHandle) { + return new Promise((resolve, reject) => { + client.fetch(response.queryHandle, function (err, result, queryHandle) { + if (err) { + return reject(err); + } + + resolve({ + queryHandle, + result, + }); + }) + }) + .then(response => { + expect(response) + .to.be.an('object') + .to.have.property('queryHandle') + .to.be.a('number') + .to.equal(queryHandle); + + expect(response) + .to.have.property('result'); + + if (response.result) { + expect(response.result) + .to.be.an('object'); + + let result = response.result; + + expect(result) + .to.be.an('object') + .to.not.have.property('RowsCount'); + + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.have.all.keys(['' + response.queryHandle]); + + expect(result) + .to.not.have.property('ColumnNames'); + + expect(result) + .to.not.have.property('ColumnDataTypes'); + + expect(result) + .to.have.property('ColumnValues') + .to.be.an('array') + .with.length.above(0); + + return fetch(queryHandle); + } else { + expect(response.result) + .to.be.null; + + return response; + } + }); + } + + return fetch(response.queryHandle); + }) + .then(response => { + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.have.all.keys(['' + response.queryHandle]); + + return client.close(); + }) + .then(() => { + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.be.empty; + }); + }); + + it('should fail prematurely when fetch(queryHandle, callback) with an invalid queryHandle', function () { + let client = testSetup.createDefaultCUBRIDDemodbConnection(); + + return client.query('SELECT * FROM game') + .then(response => { + expect(response) + .to.be.an('object') + .to.have.property('queryHandle') + .to.be.a('number') + .to.be.above(0); + + expect(response) + .to.have.property('result') + .to.be.an('object'); + + let result = response.result; + const TOTAL_ROWS = 8653; + + expect(result) + .to.be.an('object') + .to.have.property('RowsCount') + .to.be.a('number') + .to.equal(TOTAL_ROWS); + + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.have.all.keys(['' + response.queryHandle]); + + const COLUMNS_COUNT = 7; + const COLUMN_NAMES = ['host_year', 'event_code', 'athlete_code', 'stadium_code', 'nation_code', 'medal', 'game_date']; + const COLUMN_TYPES = ['Int', 'Int', 'Int', 'Int', 'Char', 'Char', 'Date']; + + expect(result) + .to.have.property('ColumnNames') + .to.be.an('array') + .with.length(COLUMNS_COUNT); + + expect(result.ColumnNames) + .to.deep.equal(COLUMN_NAMES); + + expect(result) + .to.have.property('ColumnDataTypes') + .to.be.an('array') + .with.length(COLUMNS_COUNT); + + expect(result.ColumnDataTypes) + .to.deep.equal(COLUMN_TYPES); + + expect(result) + .to.have.property('ColumnValues') + .to.be.an('array') + .with.length(fetchedRecordsCount); + + // Validate the first row. + expect(result.ColumnValues[0]).to.satisfy(columns => { + expect(columns) + .to.be.an('array') + .with.length(COLUMNS_COUNT); + + expect(columns[0]) + .to.be.a('number') + .to.equal(2004); + + expect(columns[1]) + .to.be.a('number') + .to.equal(20021); + + expect(columns[2]) + .to.be.a('number') + .to.equal(14345); + + expect(columns[3]) + .to.be.a('number') + .to.equal(30116); + + expect(columns[4]) + .to.be.a('string') + .to.equal('NGR'); + + expect(columns[5]) + .to.be.a('string') + .to.equal('B'); + + expect(columns[6]) + .to.be.an.instanceOf(Date) + .to.deep.equal(new Date('2004-08-28T09:00:00+0900')); + + return true; + }); + + // Validate the last row. + expect(result.ColumnValues[result.ColumnValues.length - 1]).to.satisfy(columns => { + expect(columns) + .to.be.an('array') + .with.length(COLUMNS_COUNT); + + expect(columns[0]) + .to.be.a('number') + .to.equal(2004); + + expect(columns[1]) + .to.be.a('number') + .to.equal(20317); + + expect(columns[2]) + .to.be.a('number') + .to.equal(14457); + + expect(columns[3]) + .to.be.a('number') + .to.equal(30124); + + expect(columns[4]) + .to.be.a('string') + .to.equal('ITA'); + + expect(columns[5]) + .to.be.a('string') + .to.equal('G'); + + expect(columns[6]) + .to.be.an.instanceOf(Date) + .to.deep.equal(new Date('2004-08-26T09:00:00+0900')); + + return true; + }); + + return new Promise((resolve, reject) => { + client.fetch(-1234, function (err, result, queryHandle) { + if (err) { + return reject(err); + } + + resolve({ + queryHandle, + result, + }); + }); + }); + }) + .then(() => { + throw new Error('fetch() should have failed when providing an invalid queryHandle'); + }) + .catch(err => { + expect(err).to.be.an.instanceOf(Error); + expect(err.message).to.equal(ErrorMessages.ERROR_NO_ACTIVE_QUERY); + }); + }); + + it('should fail prematurely when fetch(queryHandle) with an invalid queryHandle', function () { + let client = testSetup.createDefaultCUBRIDDemodbConnection(); + + return client.query('SELECT * FROM game') + .then(response => { + expect(response) + .to.be.an('object') + .to.have.property('queryHandle') + .to.be.a('number') + .to.be.above(0); + + expect(response) + .to.have.property('result') + .to.be.an('object'); + + let result = response.result; + const TOTAL_ROWS = 8653; + + expect(result) + .to.be.an('object') + .to.have.property('RowsCount') + .to.be.a('number') + .to.equal(TOTAL_ROWS); + + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.have.all.keys(['' + response.queryHandle]); + + const COLUMNS_COUNT = 7; + const COLUMN_NAMES = ['host_year', 'event_code', 'athlete_code', 'stadium_code', 'nation_code', 'medal', 'game_date']; + const COLUMN_TYPES = ['Int', 'Int', 'Int', 'Int', 'Char', 'Char', 'Date']; + + expect(result) + .to.have.property('ColumnNames') + .to.be.an('array') + .with.length(COLUMNS_COUNT); + + expect(result.ColumnNames) + .to.deep.equal(COLUMN_NAMES); + + expect(result) + .to.have.property('ColumnDataTypes') + .to.be.an('array') + .with.length(COLUMNS_COUNT); + + expect(result.ColumnDataTypes) + .to.deep.equal(COLUMN_TYPES); + + expect(result) + .to.have.property('ColumnValues') + .to.be.an('array') + .with.length(fetchedRecordsCount); + + // Validate the first row. + expect(result.ColumnValues[0]).to.satisfy(columns => { + expect(columns) + .to.be.an('array') + .with.length(COLUMNS_COUNT); + + expect(columns[0]) + .to.be.a('number') + .to.equal(2004); + + expect(columns[1]) + .to.be.a('number') + .to.equal(20021); + + expect(columns[2]) + .to.be.a('number') + .to.equal(14345); + + expect(columns[3]) + .to.be.a('number') + .to.equal(30116); + + expect(columns[4]) + .to.be.a('string') + .to.equal('NGR'); + + expect(columns[5]) + .to.be.a('string') + .to.equal('B'); + + expect(columns[6]) + .to.be.an.instanceOf(Date) + .to.deep.equal(new Date('2004-08-28T09:00:00+0900')); + + return true; + }); + + // Validate the last row. + expect(result.ColumnValues[result.ColumnValues.length - 1]).to.satisfy(columns => { + expect(columns) + .to.be.an('array') + .with.length(COLUMNS_COUNT); + + expect(columns[0]) + .to.be.a('number') + .to.equal(2004); + + expect(columns[1]) + .to.be.a('number') + .to.equal(20317); + + expect(columns[2]) + .to.be.a('number') + .to.equal(14457); + + expect(columns[3]) + .to.be.a('number') + .to.equal(30124); + + expect(columns[4]) + .to.be.a('string') + .to.equal('ITA'); + + expect(columns[5]) + .to.be.a('string') + .to.equal('G'); + + expect(columns[6]) + .to.be.an.instanceOf(Date) + .to.deep.equal(new Date('2004-08-26T09:00:00+0900')); + + return true; + }); + + return client.fetch(-1234); + }) + .then(() => { + throw new Error('fetch() should have failed when providing an invalid queryHandle'); + }) + .catch(err => { + expect(err).to.be.an.instanceOf(Error); + expect(err.message).to.equal(ErrorMessages.ERROR_NO_ACTIVE_QUERY); + }); + }); + }); + + describe('when using the old protocol', function () { + let fetchedRecordsCount = 241; + + it('should succeed to execute fetch(queryHandle) after query(sql)', function () { + let client = testSetup.createDefaultCUBRIDDemodbConnection(); + + client.setEnforceOldQueryProtocol(true); + + this.timeout(4000); + + return client + .query('SELECT * FROM game') + .then(response => { + expect(response) + .to.be.an('object') + .to.have.property('queryHandle') + .to.be.a('number') + .to.be.above(0); + + expect(response) + .to.have.property('result') + .to.be.an('object'); + + let result = response.result; + const TOTAL_ROWS = 8653; + + expect(result) + .to.be.an('object') + .to.have.property('RowsCount') + .to.be.a('number') + .to.equal(TOTAL_ROWS); + + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.have.all.keys(['' + response.queryHandle]); + + const COLUMNS_COUNT = 7; + const COLUMN_NAMES = ['host_year', 'event_code', 'athlete_code', 'stadium_code', 'nation_code', 'medal', 'game_date']; + const COLUMN_TYPES = ['Int', 'Int', 'Int', 'Int', 'Char', 'Char', 'Date']; + + expect(result) + .to.have.property('ColumnNames') + .to.be.an('array') + .with.length(COLUMNS_COUNT); + + expect(result.ColumnNames) + .to.deep.equal(COLUMN_NAMES); + + expect(result) + .to.have.property('ColumnDataTypes') + .to.be.an('array') + .with.length(COLUMNS_COUNT); + + expect(result.ColumnDataTypes) + .to.deep.equal(COLUMN_TYPES); + + expect(result) + .to.have.property('ColumnValues') + .to.be.an('array') + .with.length(fetchedRecordsCount); + + // Validate the first row. + expect(result.ColumnValues[0]).to.satisfy(columns => { + expect(columns) + .to.be.an('array') + .with.length(COLUMNS_COUNT); + + expect(columns[0]) + .to.be.a('number') + .to.equal(2004); + + expect(columns[1]) + .to.be.a('number') + .to.equal(20021); + + expect(columns[2]) + .to.be.a('number') + .to.equal(14345); + + expect(columns[3]) + .to.be.a('number') + .to.equal(30116); + + expect(columns[4]) + .to.be.a('string') + .to.equal('NGR'); + + expect(columns[5]) + .to.be.a('string') + .to.equal('B'); + + expect(columns[6]) + .to.be.an.instanceOf(Date) + .to.deep.equal(new Date('2004-08-28T09:00:00+0900')); + + return true; + }); + + // Validate the last row. + expect(result.ColumnValues[result.ColumnValues.length - 1]).to.satisfy(columns => { + expect(columns) + .to.be.an('array') + .with.length(COLUMNS_COUNT); + + expect(columns[0]) + .to.be.a('number') + .to.equal(2004); + + expect(columns[1]) + .to.be.a('number') + .to.equal(20317); + + expect(columns[2]) + .to.be.a('number') + .to.equal(12906); + + expect(columns[3]) + .to.be.a('number') + .to.equal(30124); + + expect(columns[4]) + .to.be.a('string') + .to.equal('USA'); + + expect(columns[5]) + .to.be.a('string') + .to.equal('B'); + + expect(columns[6]) + .to.be.an.instanceOf(Date) + .to.deep.equal(new Date('2004-08-26T09:00:00+0900')); + + return true; + }); + + // Now fetch the rest rows. + function fetch(queryHandle) { + return client + .fetch(response.queryHandle) + .then(response => { + expect(response) + .to.be.an('object') + .to.have.property('queryHandle') + .to.be.a('number') + .to.equal(queryHandle); + + expect(response) + .to.have.property('result'); + + if (response.result) { + expect(response.result) + .to.be.an('object'); + + let result = response.result; + + expect(result) + .to.be.an('object') + .to.not.have.property('RowsCount'); + + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.have.all.keys(['' + response.queryHandle]); + + expect(result) + .to.not.have.property('ColumnNames'); + + expect(result) + .to.not.have.property('ColumnDataTypes'); + + expect(result) + .to.have.property('ColumnValues') + .to.be.an('array') + .with.length.above(0); + + return fetch(queryHandle); + } else { + expect(response.result) + .to.be.null; + + return response; + } + }); + } + + return fetch(response.queryHandle); + }) + .then(response => { + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.have.all.keys(['' + response.queryHandle]); + + return client.close(); + }) + .then(() => { + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.be.empty; + }); + }); + + it('should succeed to execute fetch(queryHandle, callback) after query(sql)', function () { + let client = testSetup.createDefaultCUBRIDDemodbConnection(); + + client.setEnforceOldQueryProtocol(true); + + this.timeout(3000); + + return client + .query('SELECT * FROM game') + .then(response => { + expect(response) + .to.be.an('object') + .to.have.property('queryHandle') + .to.be.a('number') + .to.be.above(0); + + expect(response) + .to.have.property('result') + .to.be.an('object'); + + let result = response.result; + const TOTAL_ROWS = 8653; + + expect(result) + .to.be.an('object') + .to.have.property('RowsCount') + .to.be.a('number') + .to.equal(TOTAL_ROWS); + + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.have.all.keys(['' + response.queryHandle]); + + const COLUMNS_COUNT = 7; + const COLUMN_NAMES = ['host_year', 'event_code', 'athlete_code', 'stadium_code', 'nation_code', 'medal', 'game_date']; + const COLUMN_TYPES = ['Int', 'Int', 'Int', 'Int', 'Char', 'Char', 'Date']; + + expect(result) + .to.have.property('ColumnNames') + .to.be.an('array') + .with.length(COLUMNS_COUNT); + + expect(result.ColumnNames) + .to.deep.equal(COLUMN_NAMES); + + expect(result) + .to.have.property('ColumnDataTypes') + .to.be.an('array') + .with.length(COLUMNS_COUNT); + + expect(result.ColumnDataTypes) + .to.deep.equal(COLUMN_TYPES); + + expect(result) + .to.have.property('ColumnValues') + .to.be.an('array') + .with.length(fetchedRecordsCount); + + // Validate the first row. + expect(result.ColumnValues[0]).to.satisfy(columns => { + expect(columns) + .to.be.an('array') + .with.length(COLUMNS_COUNT); + + expect(columns[0]) + .to.be.a('number') + .to.equal(2004); + + expect(columns[1]) + .to.be.a('number') + .to.equal(20021); + + expect(columns[2]) + .to.be.a('number') + .to.equal(14345); + + expect(columns[3]) + .to.be.a('number') + .to.equal(30116); + + expect(columns[4]) + .to.be.a('string') + .to.equal('NGR'); + + expect(columns[5]) + .to.be.a('string') + .to.equal('B'); + + expect(columns[6]) + .to.be.an.instanceOf(Date) + .to.deep.equal(new Date('2004-08-28T09:00:00+0900')); + + return true; + }); + + // Validate the last row. + expect(result.ColumnValues[result.ColumnValues.length - 1]).to.satisfy(columns => { + expect(columns) + .to.be.an('array') + .with.length(COLUMNS_COUNT); + + expect(columns[0]) + .to.be.a('number') + .to.equal(2004); + + expect(columns[1]) + .to.be.a('number') + .to.equal(20317); + + expect(columns[2]) + .to.be.a('number') + .to.equal(12906); + + expect(columns[3]) + .to.be.a('number') + .to.equal(30124); + + expect(columns[4]) + .to.be.a('string') + .to.equal('USA'); + + expect(columns[5]) + .to.be.a('string') + .to.equal('B'); + + expect(columns[6]) + .to.be.an.instanceOf(Date) + .to.deep.equal(new Date('2004-08-26T09:00:00+0900')); + + return true; + }); + + // Now fetch the rest rows. + function fetch(queryHandle) { + return new Promise((resolve, reject) => { + client.fetch(response.queryHandle, function (err, result, queryHandle) { + if (err) { + return reject(err); + } + + resolve({ + queryHandle, + result, + }); + }) + }) + .then(response => { + expect(response) + .to.be.an('object') + .to.have.property('queryHandle') + .to.be.a('number') + .to.equal(queryHandle); + + expect(response) + .to.have.property('result'); + + if (response.result) { + expect(response.result) + .to.be.an('object'); + + let result = response.result; + + expect(result) + .to.be.an('object') + .to.not.have.property('RowsCount'); + + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.have.all.keys(['' + response.queryHandle]); + + expect(result) + .to.not.have.property('ColumnNames'); + + expect(result) + .to.not.have.property('ColumnDataTypes'); + + expect(result) + .to.have.property('ColumnValues') + .to.be.an('array') + .with.length.above(0); + + return fetch(queryHandle); + } else { + expect(response.result) + .to.be.null; + + return response; + } + }); + } + + return fetch(response.queryHandle); + }) + .then(response => { + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.have.all.keys(['' + response.queryHandle]); + + return client.close(); + }) + .then(() => { + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.be.empty; + }); + }); + }); + }); +}); diff --git a/test/CUBRIDConnection.getConnectionTimeout.js b/test/CUBRIDConnection.getConnectionTimeout.js new file mode 100644 index 0000000..e5addba --- /dev/null +++ b/test/CUBRIDConnection.getConnectionTimeout.js @@ -0,0 +1,19 @@ +'use strict'; + +const expect = require('chai').expect; +const testSetup = require('./testSetup'); + +describe('CUBRIDConnection', function () { + describe('getConnectionTimeout', function () { + it('should succeed to get the connection timeout value', function () { + const client = testSetup.createDefaultCUBRIDDemodbConnection(); + const newTimeoutValue = 2000; + + expect(client.getConnectionTimeout()).to.equal(0); + + client.setConnectionTimeout(newTimeoutValue); + + expect(client.getConnectionTimeout()).to.equal(newTimeoutValue); + }); + }); +}); diff --git a/test/CUBRIDConnection.getDatabaseParameter.js b/test/CUBRIDConnection.getDatabaseParameter.js new file mode 100644 index 0000000..8c5fe65 --- /dev/null +++ b/test/CUBRIDConnection.getDatabaseParameter.js @@ -0,0 +1,47 @@ +'use strict'; + +const expect = require('chai').expect; +const testSetup = require('./testSetup'); +const CAS = require('../src/constants/CASConstants'); +const ErrorMessages = require('../src/constants/ErrorMessages'); + +describe('CUBRIDConnection', function () { + describe('getDatabaseParameter', function () { + it(`should succeed to set and get the database parameter`, function () { + let client = testSetup.createDefaultCUBRIDDemodbConnection(); + + const isolationLevel = CAS.CCIDbParam.CCI_PARAM_ISOLATION_LEVEL; + const tranRepClassCommitInstance = CAS.CUBRIDIsolationLevel.TRAN_REP_CLASS_COMMIT_INSTANCE; + + return client + .setDatabaseParameter(isolationLevel, tranRepClassCommitInstance) + .then(() => { + return client.getDatabaseParameter(isolationLevel); + }) + .then(value => { + expect(value).to.equal(tranRepClassCommitInstance); + + return client.close(); + }); + }); + + it(`should fail to get the database parameter`, function () { + let client = testSetup.createDefaultCUBRIDDemodbConnection(); + + const paramName = CAS.CCIDbParam.CCI_PARAM_MAX_STRING_LENGTH; + + return client + .getDatabaseParameter(paramName, 0) + .then(() => { + return new Error('Should have failed to set the database parameter.'); + }) + .catch(err => { + expect(err).to.be.an.instanceOf(Error); + expect(err.code).to.equal(-1011); + expect(err.message).to.equal(ErrorMessages.resolveErrorCode(err.code)); + + return client.close(); + }); + }); + }); +}); diff --git a/test/CUBRIDConnection.getEngineVersion.js b/test/CUBRIDConnection.getEngineVersion.js new file mode 100644 index 0000000..62f8665 --- /dev/null +++ b/test/CUBRIDConnection.getEngineVersion.js @@ -0,0 +1,71 @@ +'use strict'; + +const expect = require('chai').expect; +const testSetup = require('./testSetup'); +const CUBRID = require('../'); + +describe('CUBRIDConnection', function () { + describe('getEngineVersion', function () { + it('should succeed to call getEngineVersion()', function () { + const client = testSetup.createDefaultCUBRIDDemodbConnection(); + + return client + .getEngineVersion() + .then(version => { + expect(version) + .to.be.a('string') + .with.length.above(0); + }); + }); + + it('should succeed to call getEngineVersion(callback)', function (done) { + const client = testSetup.createDefaultCUBRIDDemodbConnection(); + + client.getEngineVersion(function (err, version) { + if (err) { + return done(err); + } + + expect(version) + .to.be.a('string') + .with.length.above(0); + + done(); + }); + }); + + it('should fail to getEngineVersion() when the connection is not established', function () { + const client = new CUBRID.createConnection('zzz host'); + const timeout = 3000; + + this.timeout(timeout * 2); + client.setConnectionTimeout(timeout); + + return client + .getEngineVersion() + .then(() => { + throw new Error('The connection should have failed.'); + }) + .catch(err => { + expect(err).to.be.an.instanceOf(Error); + expect(err.message).to.contain('getaddrinfo ENOTFOUND'); + }); + }); + + it('should fail to getEngineVersion(callback) when the connection is not established', function (done) { + const client = new CUBRID.createConnection('zzz host'); + const timeout = 3000; + + this.timeout(timeout * 2); + client.setConnectionTimeout(timeout); + + client.getEngineVersion(function (err, version) { + expect(err).to.be.an.instanceOf(Error); + expect(err.message).to.contain('getaddrinfo ENOTFOUND'); + expect(version).to.be.undefined; + + done(); + }); + }); + }); +}); diff --git a/test/CUBRIDConnection.getSchema.js b/test/CUBRIDConnection.getSchema.js new file mode 100644 index 0000000..bf820f0 --- /dev/null +++ b/test/CUBRIDConnection.getSchema.js @@ -0,0 +1,84 @@ +'use strict'; + +const expect = require('chai').expect; +const testSetup = require('./testSetup'); +const CAS = require('../src/constants/CASConstants'); + +describe('CUBRIDConnection', function () { + describe('getSchema', function () { + it('should succeed to getSchema()', function () { + const client = testSetup.createDefaultCUBRIDDemodbConnection(); + + this.timeout(10000); + + return client + .getSchema(CAS.CUBRIDSchemaType.CCI_SCH_CLASS) + .then(schema => { + if ([/* 8.4.1 */1, /* 8.4.3 */3].indexOf(client.brokerInfo.protocolVersion) > -1) { + expect(schema) + .to.be.an('array') + .with.length(32); + } else { + expect(schema) + .to.be.an('array') + .with.length(33); + } + + return client.getSchema(CAS.CUBRIDSchemaType.CCI_SCH_VCLASS); + }) + .then(schema => { + if ([/* 8.4.1 */1, /* 8.4.3 */3].indexOf(client.brokerInfo.protocolVersion) > -1) { + expect(schema) + .to.be.an('array') + .with.length(16); + } else { + expect(schema) + .to.be.an('array') + .with.length(17); + } + + return client.close(); + }); + }); + + it('should succeed to getSchema(callback)', function (done) { + const client = testSetup.createDefaultCUBRIDDemodbConnection(); + + this.timeout(10000); + + client.getSchema(CAS.CUBRIDSchemaType.CCI_SCH_CLASS, function (err, schema) { + if (err) { + return done(err); + } + + if ([/* 8.4.1 */1, /* 8.4.3 */3].indexOf(client.brokerInfo.protocolVersion) > -1) { + expect(schema) + .to.be.an('array') + .with.length(32); + } else { + expect(schema) + .to.be.an('array') + .with.length(33); + } + + client.getSchema(CAS.CUBRIDSchemaType.CCI_SCH_VCLASS, function (err, schema) { + if (err) { + return done(err); + } + + if ([/* 8.4.1 */1, /* 8.4.3 */3].indexOf(client.brokerInfo.protocolVersion) > -1) { + expect(schema) + .to.be.an('array') + .with.length(16); + } else { + expect(schema) + .to.be.an('array') + .with.length(17); + } + + client.close(done); + }); + }); + }); + }); +}); diff --git a/test/CUBRIDConnection.lobRead.js b/test/CUBRIDConnection.lobRead.js new file mode 100644 index 0000000..64b6e82 --- /dev/null +++ b/test/CUBRIDConnection.lobRead.js @@ -0,0 +1,535 @@ +'use strict'; + +const expect = require('chai').expect; +const testSetup = require('./testSetup'); +const ErrorMessages = require('../src/constants/ErrorMessages'); + +describe('CUBRIDConnection', function () { + describe('lobRead', function () { + const TABLE_NAME = 'tbl_test'; + let data = ''; + + const bytesCount = 5120; + + for (var i = 0; i < bytesCount; i++) { + // These are 8 bits representing a single byte `255`. + // This means the `data` will have `5120` bytes stored + // because we are storing it as a binary not text. + data += '11111111'; + } + + beforeEach(testSetup.cleanup(TABLE_NAME)); + after(testSetup.cleanup(TABLE_NAME)); + + describe('BLOB (Binary Large Object)', function () { + const queries = [ + `CREATE TABLE ${TABLE_NAME}(lob BLOB)`, + `INSERT INTO ${TABLE_NAME} VALUES(BIT_TO_BLOB(B'${data}'))` + ]; + + it('should succeed to lobRead() binary data', function () { + let client = testSetup.createDefaultCUBRIDDemodbConnection(); + + return client + .batchExecuteNoQuery(queries) + .then(() => { + return client.query(`SELECT * FROM ${TABLE_NAME}`); + }) + .then(response => { + expect(response) + .to.be.an('object') + .to.have.property('queryHandle') + .to.be.a('number') + .to.be.above(0); + + expect(response) + .to.have.property('result') + .to.be.an('object'); + + let result = response.result; + + expect(result) + .to.be.an('object') + .to.have.property('RowsCount') + .to.be.a('number') + .to.equal(1); + + expect(result) + .to.have.property('ColumnValues') + .to.be.an('array') + .with.length(1); + + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.have.all.keys(['' + response.queryHandle]); + + const columns = result.ColumnValues[0]; + + // The first query should be committed. + expect(columns) + .to.be.an('array') + .with.length(1); + + const lobObject = result.ColumnValues[0][0]; + + expect(lobObject) + .to.be.an('object') + .to.have.property('lobType') + .to.be.a('number'); + + expect(lobObject) + .to.have.property('lobLength') + .to.be.a('number'); + + return client.lobRead(lobObject, 0, lobObject.lobLength); + }) + .then(response => { + expect(response) + .to.be.an('object') + .to.have.property('data') + .to.be.an.instanceOf(Buffer); + + const buffer = response.data; + + expect(buffer) + .to.have.length(bytesCount); + + expect(response) + .to.have.property('length') + .to.be.a('number') + .to.equal(bytesCount); + + for (let i = 0; i < bytesCount; ++i) { + expect(buffer[i] === 255); + } + + return client.close(); + }); + }); + + it('should succeed to lobRead(callback) binary data', function () { + let client = testSetup.createDefaultCUBRIDDemodbConnection(); + + return client + .batchExecuteNoQuery(queries) + .then(() => { + return client.query(`SELECT * FROM ${TABLE_NAME}`); + }) + .then(response => { + expect(response) + .to.be.an('object') + .to.have.property('queryHandle') + .to.be.a('number') + .to.be.above(0); + + expect(response) + .to.have.property('result') + .to.be.an('object'); + + let result = response.result; + + expect(result) + .to.be.an('object') + .to.have.property('RowsCount') + .to.be.a('number') + .to.equal(1); + + expect(result) + .to.have.property('ColumnValues') + .to.be.an('array') + .with.length(1); + + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.have.all.keys(['' + response.queryHandle]); + + const columns = result.ColumnValues[0]; + + // The first query should be committed. + expect(columns) + .to.be.an('array') + .with.length(1); + + const lobObject = result.ColumnValues[0][0]; + + expect(lobObject) + .to.be.an('object') + .to.have.property('lobType') + .to.be.a('number'); + + expect(lobObject) + .to.have.property('lobLength') + .to.be.a('number'); + + return new Promise((resolve, reject) => { + client.lobRead(lobObject, 0, lobObject.lobLength, function (err, data, length) { + if (err) { + return reject(err); + } + + resolve({ + data, + length, + }); + }); + }); + }) + .then(response => { + expect(response) + .to.be.an('object') + .to.have.property('data') + .to.be.an.instanceOf(Buffer); + + const buffer = response.data; + + expect(buffer) + .to.have.length(bytesCount); + + expect(response) + .to.have.property('length') + .to.be.a('number') + .to.equal(bytesCount); + + for (let i = 0; i < bytesCount; ++i) { + expect(buffer[i] === 255); + } + + return client.close(); + }); + }); + + it('should fail to lobRead() when the `position` is invalid', function () { + let client = testSetup.createDefaultCUBRIDDemodbConnection(); + + return client + .batchExecuteNoQuery(queries) + .then(() => { + return client.query(`SELECT * FROM ${TABLE_NAME}`); + }) + .then(response => { + expect(response) + .to.be.an('object') + .to.have.property('queryHandle') + .to.be.a('number') + .to.be.above(0); + + expect(response) + .to.have.property('result') + .to.be.an('object'); + + let result = response.result; + + expect(result) + .to.be.an('object') + .to.have.property('RowsCount') + .to.be.a('number') + .to.equal(1); + + expect(result) + .to.have.property('ColumnValues') + .to.be.an('array') + .with.length(1); + + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.have.all.keys(['' + response.queryHandle]); + + const columns = result.ColumnValues[0]; + + // The first query should be committed. + expect(columns) + .to.be.an('array') + .with.length(1); + + const lobObject = result.ColumnValues[0][0]; + + expect(lobObject) + .to.be.an('object') + .to.have.property('lobType') + .to.be.a('number'); + + expect(lobObject) + .to.have.property('lobLength') + .to.be.a('number'); + + // `10 + lobObject.lobLength` is already beyond the + // maximum bytes the data has. + return client.lobRead(lobObject, 10, lobObject.lobLength); + }) + .then(() => { + throw new Error('Should have failed to lobRead() when the `position` is invalid'); + }) + .catch(err => { + expect(err).to.be.an.instanceOf(Error); + expect(err.message).to.equal(ErrorMessages.ERROR_INVALID_LOB_POSITION); + }); + }); + + it('should fail to lobRead(callback) when the `position` is invalid', function () { + let client = testSetup.createDefaultCUBRIDDemodbConnection(); + + return client + .batchExecuteNoQuery(queries) + .then(() => { + return client.query(`SELECT * FROM ${TABLE_NAME}`); + }) + .then(response => { + expect(response) + .to.be.an('object') + .to.have.property('queryHandle') + .to.be.a('number') + .to.be.above(0); + + expect(response) + .to.have.property('result') + .to.be.an('object'); + + let result = response.result; + + expect(result) + .to.be.an('object') + .to.have.property('RowsCount') + .to.be.a('number') + .to.equal(1); + + expect(result) + .to.have.property('ColumnValues') + .to.be.an('array') + .with.length(1); + + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.have.all.keys(['' + response.queryHandle]); + + const columns = result.ColumnValues[0]; + + // The first query should be committed. + expect(columns) + .to.be.an('array') + .with.length(1); + + const lobObject = result.ColumnValues[0][0]; + + expect(lobObject) + .to.be.an('object') + .to.have.property('lobType') + .to.be.a('number'); + + expect(lobObject) + .to.have.property('lobLength') + .to.be.a('number'); + + return new Promise((resolve, reject) => { + // `10 + lobObject.lobLength` is already beyond the + // maximum bytes the data has. + client.lobRead(lobObject, 10, lobObject.lobLength, function (err, data, length) { + if (err) { + return reject(err); + } + + resolve({ + data, + length, + }); + }); + }); + }) + .then(() => { + throw new Error('Should have failed to lobRead() when the `position` is invalid'); + }) + .catch(err => { + expect(err).to.be.an.instanceOf(Error); + expect(err.message).to.equal(ErrorMessages.ERROR_INVALID_LOB_POSITION); + }); + }); + }); + + describe('CLOB (Character Large Object)', function () { + const queries = [ + `CREATE TABLE ${TABLE_NAME}(lob CLOB)`, + `INSERT INTO ${TABLE_NAME} VALUES(CHAR_TO_CLOB('${data}'))` + ]; + const lobLength = data.length; + + it('should succeed to lobRead() text data', function () { + let client = testSetup.createDefaultCUBRIDDemodbConnection(); + + return client + .batchExecuteNoQuery(queries) + .then(() => { + return client.query(`SELECT * FROM ${TABLE_NAME}`); + }) + .then(response => { + expect(response) + .to.be.an('object') + .to.have.property('queryHandle') + .to.be.a('number') + .to.be.above(0); + + expect(response) + .to.have.property('result') + .to.be.an('object'); + + let result = response.result; + + expect(result) + .to.be.an('object') + .to.have.property('RowsCount') + .to.be.a('number') + .to.equal(1); + + expect(result) + .to.have.property('ColumnValues') + .to.be.an('array') + .with.length(1); + + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.have.all.keys(['' + response.queryHandle]); + + const columns = result.ColumnValues[0]; + + // The first query should be committed. + expect(columns) + .to.be.an('array') + .with.length(1); + + const lobObject = result.ColumnValues[0][0]; + + expect(lobObject) + .to.be.an('object') + .to.have.property('lobType') + .to.be.a('number'); + + expect(lobObject) + .to.have.property('lobLength') + .to.be.a('number') + .to.equal(lobLength); + + return client.lobRead(lobObject, 0, lobObject.lobLength); + }) + .then(response => { + expect(response) + .to.be.an('object') + .to.have.property('data') + .to.be.a('string') + .with.length(lobLength); + + const text = response.data; + + expect(response) + .to.have.property('length') + .to.be.a('number') + .to.equal(lobLength); + + for (let i = 0; i < lobLength; ++i) { + expect(text[i] === '1'); + } + + return client.close(); + }); + }); + + it('should succeed to lobRead(callback) binary data', function () { + let client = testSetup.createDefaultCUBRIDDemodbConnection(); + + return client + .batchExecuteNoQuery(queries) + .then(() => { + return client.query(`SELECT * FROM ${TABLE_NAME}`); + }) + .then(response => { + expect(response) + .to.be.an('object') + .to.have.property('queryHandle') + .to.be.a('number') + .to.be.above(0); + + expect(response) + .to.have.property('result') + .to.be.an('object'); + + let result = response.result; + + expect(result) + .to.be.an('object') + .to.have.property('RowsCount') + .to.be.a('number') + .to.equal(1); + + expect(result) + .to.have.property('ColumnValues') + .to.be.an('array') + .with.length(1); + + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.have.all.keys(['' + response.queryHandle]); + + const columns = result.ColumnValues[0]; + + // The first query should be committed. + expect(columns) + .to.be.an('array') + .with.length(1); + + const lobObject = result.ColumnValues[0][0]; + + expect(lobObject) + .to.be.an('object') + .to.have.property('lobType') + .to.be.a('number'); + + expect(lobObject) + .to.have.property('lobLength') + .to.be.a('number'); + + return new Promise((resolve, reject) => { + client.lobRead(lobObject, 0, lobObject.lobLength, function (err, data, length) { + if (err) { + return reject(err); + } + + resolve({ + data, + length, + }); + }); + }); + }) + .then(response => { + expect(response) + .to.be.an('object') + .to.have.property('data') + .to.be.a('string') + .with.length(lobLength); + + const text = response.data; + + expect(response) + .to.have.property('length') + .to.be.a('number') + .to.equal(lobLength); + + for (let i = 0; i < lobLength; ++i) { + expect(text[i] === '1'); + } + + return client.close(); + }); + }); + }); + }); +}); diff --git a/test/CUBRIDConnection.lobWrite.js b/test/CUBRIDConnection.lobWrite.js new file mode 100644 index 0000000..c995845 --- /dev/null +++ b/test/CUBRIDConnection.lobWrite.js @@ -0,0 +1,975 @@ +'use strict'; + +const expect = require('chai').expect; +const CAS = require('../src/constants/CASConstants'); +const ErrorMessages = require('../src/constants/ErrorMessages'); +const testSetup = require('./testSetup'); + +describe('CUBRIDConnection', function () { + describe('lobWrite', function () { + const TABLE_NAME = 'tbl_test'; + const tempTableName = 'ces_temp'; + const tempLOBFileLocatorRE = new RegExp(`file:.+/demodb/.+/${tempTableName}\.[\\d_]+`); + + beforeEach(testSetup.cleanup(TABLE_NAME)); + after(testSetup.cleanup(TABLE_NAME)); + + function validateLOBObject(lobObject, type, length, re) { + expect(lobObject) + .to.be.an('object') + .to.have.property('lobType') + .to.equal(type); + + if (!re) { + re = new RegExp(`file:.+/demodb/.+/${TABLE_NAME}\.[\\d_]+`); + } + + expect(lobObject) + .to.have.property('fileLocator') + .to.be.a('string') + .to.match(re); + + expect(lobObject) + .to.have.property('lobLength') + .to.be.a('number') + .to.equal(length); + + expect(lobObject) + .to.have.property('packedLobHandle') + .to.be.an.instanceOf(Buffer); + + expect(lobObject.packedLobHandle) + .to.have.length(lobObject.fileLocator.length + /* db_type */4 + /* log size*/ 8 + /* locator size */ 4 + /* null */1); + } + + describe('BLOB (Binary Large Object)', function () { + const queries = [ + `CREATE TABLE ${TABLE_NAME}(id INT, lob BLOB)`, + ]; + + it('should succeed to write a new BLOB object using lobWrite()', function () { + let client = testSetup.createDefaultCUBRIDDemodbConnection(); + + const maxBytes = 2 * client._LOB_MAX_IO_LENGTH; + let data = new Buffer(maxBytes); + + for (let i = 0; i < maxBytes; ++i) { + data[i] = i % 8; + } + + return client + .batchExecuteNoQuery(queries) + .then(() => { + return client.lobNew(CAS.CUBRIDDataType.CCI_U_TYPE_BLOB); + }) + .then(lobObject => { + validateLOBObject(lobObject, CAS.CUBRIDDataType.CCI_U_TYPE_BLOB, /* initial size */0, tempLOBFileLocatorRE); + + return client.lobWrite(lobObject, 0, data); + }) + .then(response => { + validateLOBObject(response.lobObject, CAS.CUBRIDDataType.CCI_U_TYPE_BLOB, + /* all bytes should be written */maxBytes, tempLOBFileLocatorRE); + + expect(response) + .to.have.property('length') + .to.equal(maxBytes); + + const params = [response.lobObject]; + const types = ['blob']; + + return client.executeWithTypedParams(`INSERT INTO ${TABLE_NAME} VALUES(1, ?)`, params, types); + }) + .then(() => { + return client.query(`SELECT * FROM ${TABLE_NAME}`); + }) + .then(response => { + expect(response) + .to.be.an('object') + .to.have.property('queryHandle') + .to.be.a('number') + .to.be.above(0); + + expect(response) + .to.have.property('result') + .to.be.an('object'); + + let result = response.result; + + expect(result) + .to.be.an('object') + .to.have.property('RowsCount') + .to.be.a('number') + .to.equal(1); + + expect(result) + .to.have.property('ColumnValues') + .to.be.an('array') + .with.length(1); + + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.have.all.keys(['' + response.queryHandle]); + + const columns = result.ColumnValues[0]; + + expect(columns) + .to.be.an('array') + .with.length(2); + + expect(columns[0]) + .to.be.a('number') + .to.equal(1); + + const lobObject = columns[1]; + + validateLOBObject(lobObject, CAS.CUBRIDDataType.CCI_U_TYPE_BLOB, maxBytes); + + return client.lobRead(lobObject, 0, lobObject.lobLength); + }) + .then(response => { + expect(response) + .to.be.an('object') + .to.have.property('data') + .to.be.an.instanceOf(Buffer); + + const buffer = response.data; + + expect(buffer) + .to.have.length(maxBytes); + + expect(response) + .to.have.property('length') + .to.be.a('number') + .to.equal(maxBytes); + + for (let i = 0; i < maxBytes; ++i) { + expect(buffer[i] === i % 8); + } + + return client.close(); + }); + }); + + it('should succeed to write a new BLOB object using lobWrite(callback)', function () { + let client = testSetup.createDefaultCUBRIDDemodbConnection(); + + const maxBytes = 2 * client._LOB_MAX_IO_LENGTH; + let data = new Buffer(maxBytes); + + for (let i = 0; i < maxBytes; ++i) { + data[i] = i % 8; + } + + return client + .batchExecuteNoQuery(queries) + .then(() => { + return new Promise((resolve, reject) => { + client.lobNew(CAS.CUBRIDDataType.CCI_U_TYPE_BLOB, function (err, lobObject) { + if (err) { + return reject(err); + } + + resolve(lobObject); + }); + }); + }) + .then(lobObject => { + validateLOBObject(lobObject, CAS.CUBRIDDataType.CCI_U_TYPE_BLOB, /* initial size */0, tempLOBFileLocatorRE); + + return new Promise((resolve, reject) => { + client.lobWrite(lobObject, 0, data, function (err, lobObject, length) { + if (err) { + return reject(err); + } + + resolve({ + length, + lobObject, + }); + }); + }); + }) + .then(response => { + validateLOBObject(response.lobObject, CAS.CUBRIDDataType.CCI_U_TYPE_BLOB, + /* all bytes should be written */maxBytes, tempLOBFileLocatorRE); + + expect(response) + .to.have.property('length') + .to.equal(maxBytes); + + const params = [response.lobObject]; + const types = ['blob']; + + return client.executeWithTypedParams(`INSERT INTO ${TABLE_NAME} VALUES(1, ?)`, params, types); + }) + .then(() => { + return client.query(`SELECT * FROM ${TABLE_NAME}`); + }) + .then(response => { + expect(response) + .to.be.an('object') + .to.have.property('queryHandle') + .to.be.a('number') + .to.be.above(0); + + expect(response) + .to.have.property('result') + .to.be.an('object'); + + let result = response.result; + + expect(result) + .to.be.an('object') + .to.have.property('RowsCount') + .to.be.a('number') + .to.equal(1); + + expect(result) + .to.have.property('ColumnValues') + .to.be.an('array') + .with.length(1); + + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.have.all.keys(['' + response.queryHandle]); + + const columns = result.ColumnValues[0]; + + expect(columns) + .to.be.an('array') + .with.length(2); + + expect(columns[0]) + .to.be.a('number') + .to.equal(1); + + const lobObject = columns[1]; + + validateLOBObject(lobObject, CAS.CUBRIDDataType.CCI_U_TYPE_BLOB, maxBytes); + + return client.lobRead(lobObject, 0, lobObject.lobLength); + }) + .then(response => { + expect(response) + .to.be.an('object') + .to.have.property('data') + .to.be.an.instanceOf(Buffer); + + const buffer = response.data; + + expect(buffer) + .to.have.length(maxBytes); + + expect(response) + .to.have.property('length') + .to.be.a('number') + .to.equal(maxBytes); + + for (let i = 0; i < maxBytes; ++i) { + expect(buffer[i] === i % 8); + } + + return client.close(); + }); + }); + + it('should fail to write a new BLOB object using lobWrite(callback) when an invalid "offset" is provided', function () { + let client = testSetup.createDefaultCUBRIDDemodbConnection(); + + const maxBytes = 2 * client._LOB_MAX_IO_LENGTH; + let data = new Buffer(maxBytes); + + for (let i = 0; i < maxBytes; ++i) { + data[i] = i % 8; + } + + return client + .batchExecuteNoQuery(queries) + .then(() => { + return new Promise((resolve, reject) => { + client.lobNew(CAS.CUBRIDDataType.CCI_U_TYPE_BLOB, function (err, lobObject) { + if (err) { + return reject(err); + } + + resolve(lobObject); + }); + }); + }) + .then(lobObject => { + validateLOBObject(lobObject, CAS.CUBRIDDataType.CCI_U_TYPE_BLOB, /* initial size */0, tempLOBFileLocatorRE); + + return new Promise((resolve, reject) => { + /* pass an invalid offset, i.e. not equal to `lobObject.lobLength`. */ + client.lobWrite(lobObject, 1, data, function (err, lobObject, length) { + if (err) { + return reject(err); + } + + resolve({ + length, + lobObject, + }); + }); + }); + }) + .then(() => { + throw new Error('Should have failed to `lobWrite` when an invalid "offset" is provided.'); + }) + .catch(err => { + expect(err).to.be.an.instanceOf(Error); + expect(err.message).to.equal(ErrorMessages.ERROR_INVALID_LOB_POSITION); + }); + }); + + it('should fail to write a new BLOB object using lobWrite() when an invalid "offset" is provided', function () { + let client = testSetup.createDefaultCUBRIDDemodbConnection(); + + const maxBytes = 2 * client._LOB_MAX_IO_LENGTH; + let data = new Buffer(maxBytes); + + for (let i = 0; i < maxBytes; ++i) { + data[i] = i % 8; + } + + return client + .batchExecuteNoQuery(queries) + .then(() => { + return client.lobNew(CAS.CUBRIDDataType.CCI_U_TYPE_BLOB); + }) + .then(lobObject => { + validateLOBObject(lobObject, CAS.CUBRIDDataType.CCI_U_TYPE_BLOB, /* initial size */0, tempLOBFileLocatorRE); + + /* pass an invalid offset, i.e. not equal to `lobObject.lobLength`. */ + return client.lobWrite(lobObject, 1, data); + }) + .then(() => { + throw new Error('Should have failed to `lobWrite` when an invalid "offset" is provided.'); + }) + .catch(err => { + expect(err).to.be.an.instanceOf(Error); + expect(err.message).to.equal(ErrorMessages.ERROR_INVALID_LOB_POSITION); + }); + }); + + it('should fail to write a new BLOB object using lobWrite() when an invalid LOB data is provided', function () { + let client = testSetup.createDefaultCUBRIDDemodbConnection(); + + return client + .batchExecuteNoQuery(queries) + .then(() => { + return client.lobNew(CAS.CUBRIDDataType.CCI_U_TYPE_BLOB); + }) + .then(lobObject => { + validateLOBObject(lobObject, CAS.CUBRIDDataType.CCI_U_TYPE_BLOB, /* initial size */0, tempLOBFileLocatorRE); + + return client.lobWrite(lobObject, 0, /* LOB data */1234); + }) + .then(() => { + throw new Error('Should have failed to `lobWrite` when an invalid LOB data is provided.'); + }) + .catch(err => { + expect(err).to.be.an.instanceOf(Error); + expect(err.message).to.equal(ErrorMessages.ERROR_INVALID_LOB_DATA); + }); + }); + + it('should fail to write a new BLOB object using lobWrite(callback) when an invalid "lobType" is provided', function () { + let client = testSetup.createDefaultCUBRIDDemodbConnection(); + + return client + .batchExecuteNoQuery(queries) + .then(() => { + return client.lobNew(CAS.CUBRIDDataType.CCI_U_TYPE_BLOB); + }) + .then(lobObject => { + validateLOBObject(lobObject, CAS.CUBRIDDataType.CCI_U_TYPE_BLOB, /* initial size */0, tempLOBFileLocatorRE); + + return new Promise((resolve, reject) => { + client.lobWrite(lobObject, 0, /* LOB data */1234, function (err, lobObject, length) { + if (err) { + return reject(err); + } + + resolve({ + length, + lobObject, + }); + }); + }); + }) + .then(() => { + throw new Error('Should have failed to `lobWrite` when an invalid LOB data is provided.'); + }) + .catch(err => { + expect(err).to.be.an.instanceOf(Error); + expect(err.message).to.equal(ErrorMessages.ERROR_INVALID_LOB_DATA); + }); + }); + }); + + describe('CLOB (Character Large Object)', function () { + const queries = [ + `CREATE TABLE ${TABLE_NAME}(id INT, lob CLOB)`, + ]; + + it('should succeed to write a new CLOB object using lobWrite()', function () { + let client = testSetup.createDefaultCUBRIDDemodbConnection(); + + const maxBytes = 2 * client._LOB_MAX_IO_LENGTH; + let data = ''; + const CAPITAL_LETTERS_ASCII_RANGE = /* letter Z*/90 - /* letter A*/65; + + for (let i = 0; i < maxBytes; ++i) { + data += String.fromCharCode(65 + i % CAPITAL_LETTERS_ASCII_RANGE); + } + + return client + .batchExecuteNoQuery(queries) + .then(() => { + return client.lobNew(CAS.CUBRIDDataType.CCI_U_TYPE_CLOB); + }) + .then(lobObject => { + validateLOBObject(lobObject, CAS.CUBRIDDataType.CCI_U_TYPE_CLOB, /* initial size */0, tempLOBFileLocatorRE); + + return client.lobWrite(lobObject, 0, data); + }) + .then(response => { + validateLOBObject(response.lobObject, CAS.CUBRIDDataType.CCI_U_TYPE_CLOB, + /* all bytes should be written */maxBytes, tempLOBFileLocatorRE); + + expect(response) + .to.have.property('length') + .to.equal(maxBytes); + + const params = [response.lobObject]; + const types = ['clob']; + + return client.executeWithTypedParams(`INSERT INTO ${TABLE_NAME} VALUES(1, ?)`, params, types); + }) + .then(() => { + return client.query(`SELECT * FROM ${TABLE_NAME}`); + }) + .then(response => { + expect(response) + .to.be.an('object') + .to.have.property('queryHandle') + .to.be.a('number') + .to.be.above(0); + + expect(response) + .to.have.property('result') + .to.be.an('object'); + + let result = response.result; + + expect(result) + .to.be.an('object') + .to.have.property('RowsCount') + .to.be.a('number') + .to.equal(1); + + expect(result) + .to.have.property('ColumnValues') + .to.be.an('array') + .with.length(1); + + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.have.all.keys(['' + response.queryHandle]); + + const columns = result.ColumnValues[0]; + + expect(columns) + .to.be.an('array') + .with.length(2); + + expect(columns[0]) + .to.be.a('number') + .to.equal(1); + + const lobObject = columns[1]; + + validateLOBObject(lobObject, CAS.CUBRIDDataType.CCI_U_TYPE_CLOB, maxBytes); + + return client.lobRead(lobObject, 0, lobObject.lobLength); + }) + .then(response => { + expect(response) + .to.be.an('object') + .to.have.property('data') + .to.be.a('string') + .with.length(maxBytes); + + expect(response) + .to.have.property('length') + .to.be.a('number') + .to.equal(maxBytes); + + const text = response.data; + + for (let i = 0; i < maxBytes; ++i) { + expect(text[i]).to.equal(String.fromCharCode(65 + i % CAPITAL_LETTERS_ASCII_RANGE)); + } + + return client.close(); + }); + }); + + it('should succeed to write a new CLOB object using lobWrite(callback)', function () { + let client = testSetup.createDefaultCUBRIDDemodbConnection(); + + const maxBytes = 2 * client._LOB_MAX_IO_LENGTH; + let data = ''; + const CAPITAL_LETTERS_ASCII_RANGE = /* letter Z*/90 - /* letter A*/65; + + for (let i = 0; i < maxBytes; ++i) { + data += String.fromCharCode(65 + i % CAPITAL_LETTERS_ASCII_RANGE); + } + + return client + .batchExecuteNoQuery(queries) + .then(() => { + return new Promise((resolve, reject) => { + client.lobNew(CAS.CUBRIDDataType.CCI_U_TYPE_CLOB, function (err, lobObject) { + if (err) { + return reject(err); + } + + resolve(lobObject); + }); + }); + }) + .then(lobObject => { + validateLOBObject(lobObject, CAS.CUBRIDDataType.CCI_U_TYPE_CLOB, /* initial size */0, tempLOBFileLocatorRE); + + return new Promise((resolve, reject) => { + client.lobWrite(lobObject, 0, data, function (err, lobObject, length) { + if (err) { + return reject(err); + } + + resolve({ + length, + lobObject, + }); + }); + }); + }) + .then(response => { + validateLOBObject(response.lobObject, CAS.CUBRIDDataType.CCI_U_TYPE_CLOB, + /* all bytes should be written */maxBytes, tempLOBFileLocatorRE); + + expect(response) + .to.have.property('length') + .to.equal(maxBytes); + + const params = [response.lobObject]; + const types = ['clob']; + + return client.executeWithTypedParams(`INSERT INTO ${TABLE_NAME} VALUES(1, ?)`, params, types); + }) + .then(() => { + return client.query(`SELECT * FROM ${TABLE_NAME}`); + }) + .then(response => { + expect(response) + .to.be.an('object') + .to.have.property('queryHandle') + .to.be.a('number') + .to.be.above(0); + + expect(response) + .to.have.property('result') + .to.be.an('object'); + + let result = response.result; + + expect(result) + .to.be.an('object') + .to.have.property('RowsCount') + .to.be.a('number') + .to.equal(1); + + expect(result) + .to.have.property('ColumnValues') + .to.be.an('array') + .with.length(1); + + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.have.all.keys(['' + response.queryHandle]); + + const columns = result.ColumnValues[0]; + + expect(columns) + .to.be.an('array') + .with.length(2); + + expect(columns[0]) + .to.be.a('number') + .to.equal(1); + + const lobObject = columns[1]; + + validateLOBObject(lobObject, CAS.CUBRIDDataType.CCI_U_TYPE_CLOB, maxBytes); + + return client.lobRead(lobObject, 0, lobObject.lobLength); + }) + .then(response => { + expect(response) + .to.be.an('object') + .to.have.property('data') + .to.be.a('string') + .with.length(maxBytes); + + expect(response) + .to.have.property('length') + .to.be.a('number') + .to.equal(maxBytes); + + const text = response.data; + + for (let i = 0; i < maxBytes; ++i) { + expect(text[i]).to.equal(String.fromCharCode(65 + i % CAPITAL_LETTERS_ASCII_RANGE)); + } + + return client.close(); + }); + }); + + it('should succeed to write a new Korean Unicode CLOB using lobWrite()', function () { + let client = testSetup.createDefaultCUBRIDDemodbConnection(); + + let data = ''; + + for (let i = 0; i < client._LOB_MAX_IO_LENGTH; ++i) { + // These are 3-byte characters. + data += '이'; + } + + // Ensure the data is bigger than the `client._LOB_MAX_IO_LENGTH`. + data += '이렇께'; + + let maxBytes = Buffer.byteLength(data); + + return client + .batchExecuteNoQuery(queries) + .then(() => { + return client.lobNew(CAS.CUBRIDDataType.CCI_U_TYPE_CLOB); + }) + .then(lobObject => { + validateLOBObject(lobObject, CAS.CUBRIDDataType.CCI_U_TYPE_CLOB, /* initial size */0, tempLOBFileLocatorRE); + + return client.lobWrite(lobObject, 0, data); + }) + .then(response => { + validateLOBObject(response.lobObject, CAS.CUBRIDDataType.CCI_U_TYPE_CLOB, + /* all bytes should be written */maxBytes, tempLOBFileLocatorRE); + + expect(response) + .to.have.property('length') + .to.equal(maxBytes); + + const params = [response.lobObject]; + const types = ['clob']; + + return client.executeWithTypedParams(`INSERT INTO ${TABLE_NAME} VALUES(1, ?)`, params, types); + }) + .then(() => { + return client.query(`SELECT * FROM ${TABLE_NAME}`); + }) + .then(response => { + expect(response) + .to.be.an('object') + .to.have.property('queryHandle') + .to.be.a('number') + .to.be.above(0); + + expect(response) + .to.have.property('result') + .to.be.an('object'); + + let result = response.result; + + expect(result) + .to.be.an('object') + .to.have.property('RowsCount') + .to.be.a('number') + .to.equal(1); + + expect(result) + .to.have.property('ColumnValues') + .to.be.an('array') + .with.length(1); + + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.have.all.keys(['' + response.queryHandle]); + + const columns = result.ColumnValues[0]; + + expect(columns) + .to.be.an('array') + .with.length(2); + + expect(columns[0]) + .to.be.a('number') + .to.equal(1); + + const lobObject = columns[1]; + + validateLOBObject(lobObject, CAS.CUBRIDDataType.CCI_U_TYPE_CLOB, maxBytes); + + return client.lobRead(lobObject, 0, lobObject.lobLength); + }) + .then(response => { + expect(response) + .to.be.an('object') + .to.have.property('data') + .to.be.a('string') + .with.length(data.length); + + expect(response.data).to.equal(data); + + expect(Buffer.byteLength(response.data)) + .to.equal(maxBytes); + + expect(response) + .to.have.property('length') + .to.be.a('number') + .to.equal(maxBytes); + + return client.close(); + }); + }); + + it('should succeed to write a new Russian Unicode CLOB using lobWrite()', function () { + let client = testSetup.createDefaultCUBRIDDemodbConnection(); + + let data = ''; + + for (let i = 0; i < client._LOB_MAX_IO_LENGTH; ++i) { + // These are 2-byte characters. + data += 'Щ'; + } + + // Ensure the data is bigger than the `client._LOB_MAX_IO_LENGTH`. + data += 'подъезд'; + + let maxBytes = Buffer.byteLength(data); + + return client + .batchExecuteNoQuery(queries) + .then(() => { + return client.lobNew(CAS.CUBRIDDataType.CCI_U_TYPE_CLOB); + }) + .then(lobObject => { + validateLOBObject(lobObject, CAS.CUBRIDDataType.CCI_U_TYPE_CLOB, /* initial size */0, tempLOBFileLocatorRE); + + return client.lobWrite(lobObject, 0, data); + }) + .then(response => { + validateLOBObject(response.lobObject, CAS.CUBRIDDataType.CCI_U_TYPE_CLOB, + /* all bytes should be written */maxBytes, tempLOBFileLocatorRE); + + expect(response) + .to.have.property('length') + .to.equal(maxBytes); + + const params = [response.lobObject]; + const types = ['clob']; + + return client.executeWithTypedParams(`INSERT INTO ${TABLE_NAME} VALUES(1, ?)`, params, types); + }) + .then(() => { + return client.query(`SELECT * FROM ${TABLE_NAME}`); + }) + .then(response => { + expect(response) + .to.be.an('object') + .to.have.property('queryHandle') + .to.be.a('number') + .to.be.above(0); + + expect(response) + .to.have.property('result') + .to.be.an('object'); + + let result = response.result; + + expect(result) + .to.be.an('object') + .to.have.property('RowsCount') + .to.be.a('number') + .to.equal(1); + + expect(result) + .to.have.property('ColumnValues') + .to.be.an('array') + .with.length(1); + + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.have.all.keys(['' + response.queryHandle]); + + const columns = result.ColumnValues[0]; + + expect(columns) + .to.be.an('array') + .with.length(2); + + expect(columns[0]) + .to.be.a('number') + .to.equal(1); + + const lobObject = columns[1]; + + validateLOBObject(lobObject, CAS.CUBRIDDataType.CCI_U_TYPE_CLOB, maxBytes); + + return client.lobRead(lobObject, 0, lobObject.lobLength); + }) + .then(response => { + expect(response) + .to.be.an('object') + .to.have.property('data') + .to.be.a('string') + .with.length(data.length); + + expect(response.data).to.equal(data); + + expect(Buffer.byteLength(response.data)) + .to.equal(maxBytes); + + expect(response) + .to.have.property('length') + .to.be.a('number') + .to.equal(maxBytes); + + return client.close(); + }); + }); + + it('should succeed to write a new Chinese Unicode CLOB using lobWrite()', function () { + let client = testSetup.createDefaultCUBRIDDemodbConnection(); + + let data = ''; + + for (let i = 0; i < client._LOB_MAX_IO_LENGTH; ++i) { + // These are 3-byte characters. + data += '梯'; + } + + // Ensure the data is bigger than the `client._LOB_MAX_IO_LENGTH`. + data += '电梯'; + + let maxBytes = Buffer.byteLength(data); + + return client + .batchExecuteNoQuery(queries) + .then(() => { + return client.lobNew(CAS.CUBRIDDataType.CCI_U_TYPE_CLOB); + }) + .then(lobObject => { + validateLOBObject(lobObject, CAS.CUBRIDDataType.CCI_U_TYPE_CLOB, /* initial size */0, tempLOBFileLocatorRE); + + return client.lobWrite(lobObject, 0, data); + }) + .then(response => { + validateLOBObject(response.lobObject, CAS.CUBRIDDataType.CCI_U_TYPE_CLOB, + /* all bytes should be written */maxBytes, tempLOBFileLocatorRE); + + expect(response) + .to.have.property('length') + .to.equal(maxBytes); + + const params = [response.lobObject]; + const types = ['clob']; + + return client.executeWithTypedParams(`INSERT INTO ${TABLE_NAME} VALUES(1, ?)`, params, types); + }) + .then(() => { + return client.query(`SELECT * FROM ${TABLE_NAME}`); + }) + .then(response => { + expect(response) + .to.be.an('object') + .to.have.property('queryHandle') + .to.be.a('number') + .to.be.above(0); + + expect(response) + .to.have.property('result') + .to.be.an('object'); + + let result = response.result; + + expect(result) + .to.be.an('object') + .to.have.property('RowsCount') + .to.be.a('number') + .to.equal(1); + + expect(result) + .to.have.property('ColumnValues') + .to.be.an('array') + .with.length(1); + + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.have.all.keys(['' + response.queryHandle]); + + const columns = result.ColumnValues[0]; + + expect(columns) + .to.be.an('array') + .with.length(2); + + expect(columns[0]) + .to.be.a('number') + .to.equal(1); + + const lobObject = columns[1]; + + validateLOBObject(lobObject, CAS.CUBRIDDataType.CCI_U_TYPE_CLOB, maxBytes); + + return client.lobRead(lobObject, 0, lobObject.lobLength); + }) + .then(response => { + expect(response) + .to.be.an('object') + .to.have.property('data') + .to.be.a('string') + .with.length(data.length); + + expect(response.data).to.equal(data); + + expect(Buffer.byteLength(response.data)) + .to.equal(maxBytes); + + expect(response) + .to.have.property('length') + .to.be.a('number') + .to.equal(maxBytes); + + return client.close(); + }); + }); + }); + }); +}); diff --git a/test/CUBRIDConnection.query.js b/test/CUBRIDConnection.query.js new file mode 100644 index 0000000..7254bc9 --- /dev/null +++ b/test/CUBRIDConnection.query.js @@ -0,0 +1,2031 @@ +'use strict'; + +const expect = require('chai').expect; +const testSetup = require('./testSetup'); +const CAS = require('../src/constants/CASConstants'); + +describe('CUBRIDConnection', function () { + describe('query', function () { + const TABLE_NAME = 'tbl_test'; + + function getDate() { + let d = new Date; + d.setUTCFullYear(2004, /* 7 is for August */7, 28); + + return d; + } + + beforeEach(testSetup.cleanup(TABLE_NAME)); + after(testSetup.cleanup(TABLE_NAME)); + + function verifyError(client, err) { + console.log(err); + console.log('client.brokerInfo.protocolVersion', client.brokerInfo.protocolVersion); + + let error = new Error(); + error.code = -493; + + switch (client.brokerInfo.protocolVersion) { + case 1: + case 3: + error.message = `Syntax: syntax error, unexpected '*' `; + break; + default: + // There is a space at the end. + error.message = `Syntax: In line 1, column 20 before ') FROM game'\nSyntax error: unexpected '*', expecting SELECT or VALUE or VALUES or '(' `; + break; + } + + expect(err).to.be.an.instanceOf(Error); + + // There is a space at the end. + expect(err.code).to.equal(error.code); + expect(err.message).to.equal(error.message); + } + + describe('when using the new protocol', function () { + it('should succeed to execute query(sql)', function () { + const client = testSetup.createDefaultCUBRIDDemodbConnection(); + + return client + .query('SHOW TABLES') + .then(response => { + expect(response) + .to.be.an('object') + .to.have.property('queryHandle') + .to.be.a('number') + .to.be.above(0); + + expect(response) + .to.have.property('result') + .to.be.an('object'); + + let result = response.result; + + expect(result) + .to.be.an('object') + .to.have.property('RowsCount') + .to.be.a('number') + .to.equal(10); + + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.have.all.keys(['' + response.queryHandle]); + + return client.closeQuery(response.queryHandle); + }) + .then(() => { + return client.close(); + }); + }); + + it('should succeed to execute query(sql, callback)', function (done) { + const client = testSetup.createDefaultCUBRIDDemodbConnection(); + + client.query('SHOW TABLES', function (err, result, queryHandle) { + if (err) { + return done(err); + } + + expect(queryHandle) + .to.be.a('number') + .to.be.above(0); + + expect(result) + .to.be.an('object') + .to.have.property('RowsCount') + .to.be.a('number') + .to.equal(10); + + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.have.all.keys(['' + queryHandle]); + + client.closeQuery(queryHandle, function (err) { + if (err) { + return done(err); + } + + client.close(done); + }); + }); + }); + + it('should succeed to execute query(sql, callback) multiple times with closeQuery', function (done) { + const client = testSetup.createDefaultCUBRIDDemodbConnection(); + let queriesCount = 10; + let promise = Promise.resolve(); + + for (var i = 0; i < queriesCount; ++i) { + promise = promise.then(() => { + return client + .query('SHOW TABLES') + .then(response => { + expect(response) + .to.be.an('object') + .to.have.property('queryHandle') + .to.be.a('number') + .to.be.above(0); + + expect(response) + .to.have.property('result') + .to.be.an('object'); + + let result = response.result; + + expect(result) + .to.be.an('object') + .to.have.property('RowsCount') + .to.be.a('number') + .to.equal(10); + + expect(client) + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.have.all.keys(['' + response.queryHandle]); + + return client.closeQuery(response.queryHandle); + }); + }); + } + + promise + .then(() => { + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.be.empty; + + return client.close(); + }) + .then(() => { + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.be.empty; + + done(); + }) + .catch(done); + }); + + it('should succeed to execute SHOW TABLES query(sql, callback) multiple times', function (done) { + const client = testSetup.createDefaultCUBRIDDemodbConnection(); + let queriesCount = 10; + let promise = Promise.resolve(); + + for (var i = 0; i < queriesCount; ++i) { + promise = promise.then(() => { + return client.query('SHOW TABLES').then(response => { + expect(response) + .to.be.an('object') + .to.have.property('queryHandle') + .to.be.a('number') + .to.be.above(0); + + expect(response) + .to.have.property('result') + .to.be.an('object'); + + let result = response.result; + + expect(result) + .to.be.an('object') + .to.have.property('RowsCount') + .to.be.a('number') + .to.equal(10); + + expect(client) + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.be.not.empty; + }); + }); + } + + promise + .then(() => { + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object'); + + expect(Object.keys(client._queryResultSets)) + .to.have.length(queriesCount); + + return client.close(); + }) + .then(() => { + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.be.empty; + + done(); + }) + .catch(done); + }); + + it('should succeed to execute query(sql, params)', function () { + const client = testSetup.createDefaultCUBRIDDemodbConnection(); + + return client + .query('SELECT * FROM nation WHERE continent = ?', ['Asia']) + .then(response => { + expect(response) + .to.be.an('object') + .to.have.property('queryHandle') + .to.be.a('number') + .to.be.above(0); + + expect(response) + .to.have.property('result') + .to.be.an('object'); + + let result = response.result; + + expect(result) + .to.be.an('object') + .to.have.property('RowsCount') + .to.be.a('number') + .to.equal(47); + + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.have.all.keys(['' + response.queryHandle]); + + return client.closeQuery(response.queryHandle); + }) + .then(() => { + return client.close(); + }); + }); + + it('should succeed to execute query(sql, params, callback)', function () { + const client = testSetup.createDefaultCUBRIDDemodbConnection(); + + const promise = new Promise((resolve, reject) => { + client.query('SELECT * FROM nation WHERE continent = ?', ['Asia'], function (err, result, queryHandle) { + if (err) { + return reject(err); + } + + resolve({ + queryHandle, + result, + }); + }); + }); + + return promise + .then(response => { + expect(response) + .to.be.an('object') + .to.have.property('queryHandle') + .to.be.a('number') + .to.be.above(0); + + expect(response) + .to.have.property('result') + .to.be.an('object'); + + let result = response.result; + + expect(result) + .to.be.an('object') + .to.have.property('RowsCount') + .to.be.a('number') + .to.equal(47); + + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.have.all.keys(['' + response.queryHandle]); + + return client.closeQuery(response.queryHandle); + }) + .then(() => { + return client.close(); + }); + }); + + it('should succeed to execute query(sql, params) multiple times without closeQuery', function (done) { + this.timeout(100000000); + + const client = testSetup.createDefaultCUBRIDDemodbConnection(); + + let queries = [ + { + sql: "SHOW TABLES", + params: null, + rowsCount: 10 + }, + { + sql: "SELECT * FROM nation", + params: [], + rowsCount: 215 + }, + { + sql: "SELECT * FROM nation WHERE continent = ?", + params: ['Asia'], + rowsCount: 47 + }, + { + sql: "SELECT * FROM nation WHERE continent = ?", + params: 'Asia', + rowsCount: 47 + }, + { + sql: "SELECT * FROM history WHERE host_year = ?", + params: [2004], + rowsCount: 64 + }, + { + sql: "SELECT * FROM history WHERE host_year = ?", + params: 2004, + rowsCount: 64 + }, + { + sql: "SELECT * FROM history WHERE host_year = ?", + params: ['2004'], + rowsCount: 64 + }, + { + sql: "SELECT * FROM history WHERE host_year = ?", + params: '2004', + rowsCount: 64 + }, + { + sql: "SELECT * FROM game WHERE game_date = ?", + params: ['08/28/2004'], + rowsCount: 311 + }, + { + sql: "SELECT * FROM game WHERE game_date = ?", + params: '08/28/2004', + rowsCount: 311 + }, + { + sql: "SELECT * FROM game WHERE game_date = ?", + params: [getDate()], + rowsCount: 311 + }, + { + sql: "SELECT * FROM game WHERE game_date = ?", + params: getDate(), + rowsCount: 311 + }, + { + sql: "SELECT * FROM game WHERE game_date = ?", + params: [new Date()], + rowsCount: 0 + }, + { + sql: "SELECT * FROM game WHERE game_date = ?", + params: new Date(), + rowsCount: 0 + } + ]; + const queriesCount = queries.length; + let promise = Promise.resolve(); + + for (var i = 0; i < queriesCount; ++i) { + promise = promise.then(() => { + let query = queries.pop(); + + return client + .query(query.sql, query.params) + .then(response => { + expect(response) + .to.be.an('object') + .to.have.property('queryHandle') + .to.be.a('number') + .to.be.above(0); + + expect(response) + .to.have.property('result') + .to.be.an('object'); + + let result = response.result; + + expect(result) + .to.be.an('object') + .to.have.property('RowsCount') + .to.be.a('number') + .to.equal(query.rowsCount); + + expect(client) + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.be.not.empty; + }); + }); + } + + promise + .then(() => { + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object'); + + expect(Object.keys(client._queryResultSets)) + .to.have.length(queriesCount); + + return client.close(); + }) + .then(() => { + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.be.empty; + + done(); + }) + .catch(done); + }); + + it('should succeed to execute query(sql, params, callback) multiple times without closeQuery', function (done) { + this.timeout(100000000); + + const client = testSetup.createDefaultCUBRIDDemodbConnection(); + + let queries = [ + { + sql: "SHOW TABLES", + params: null, + rowsCount: 10 + }, + { + sql: "SELECT * FROM nation", + params: [], + rowsCount: 215 + }, + { + sql: "SELECT * FROM nation WHERE continent = ?", + params: undefined, + rowsCount: 0 + }, + { + sql: "SELECT * FROM nation WHERE continent = ?", + params: null, + rowsCount: 0 + }, + { + sql: "SELECT * FROM nation WHERE continent = ?", + params: ['Asia'], + rowsCount: 47 + }, + { + sql: "SELECT * FROM nation WHERE continent = ?", + params: 'Asia', + rowsCount: 47 + }, + { + sql: "SELECT * FROM history WHERE host_year = ?", + params: [2004], + rowsCount: 64 + }, + { + sql: "SELECT * FROM history WHERE host_year = ?", + params: 2004, + rowsCount: 64 + }, + { + sql: "SELECT * FROM history WHERE host_year = ?", + params: ['2004'], + rowsCount: 64 + }, + { + sql: "SELECT * FROM history WHERE host_year = ?", + params: '2004', + rowsCount: 64 + }, + { + sql: "SELECT * FROM game WHERE game_date = ?", + params: ['08/28/2004'], + rowsCount: 311 + }, + { + sql: "SELECT * FROM game WHERE game_date = ?", + params: '08/28/2004', + rowsCount: 311 + }, + { + sql: "SELECT * FROM game WHERE game_date = ?", + params: [getDate()], + rowsCount: 311 + }, + { + sql: "SELECT * FROM game WHERE game_date = ?", + params: getDate(), + rowsCount: 311 + }, + { + sql: "SELECT * FROM game WHERE game_date = ?", + params: [new Date()], + rowsCount: 0 + }, + { + sql: "SELECT * FROM game WHERE game_date = ?", + params: new Date(), + rowsCount: 0 + } + ]; + const queriesCount = queries.length; + let promise = Promise.resolve(); + + for (var i = 0; i < queriesCount; ++i) { + promise = promise.then(() => { + let query = queries.pop(); + + const queryPromise = new Promise((resolve, reject) => { + client.query(query.sql, query.params, function (err, result, queryHandle) { + if (err) { + return reject(err); + } + + resolve({ + queryHandle, + result, + }); + }); + }); + + return queryPromise + .then(response => { + expect(response) + .to.be.an('object') + .to.have.property('queryHandle') + .to.be.a('number') + .to.be.above(0); + + expect(response) + .to.have.property('result') + .to.be.an('object'); + + let result = response.result; + + expect(result) + .to.be.an('object') + .to.have.property('RowsCount') + .to.be.a('number') + .to.equal(query.rowsCount); + + expect(client) + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.be.not.empty; + }); + }); + } + + promise + .then(() => { + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object'); + + expect(Object.keys(client._queryResultSets)) + .to.have.length(queriesCount); + + return client.close(); + }) + .then(() => { + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.be.empty; + + done(); + }) + .catch(done); + }); + + it('should fail to execute query(sql) against a non existing table', function () { + const client = testSetup.createDefaultCUBRIDDemodbConnection(); + + this.timeout(3000); + + return client.query('SELECT * FROM game_xyz') + .then(() => { + throw new Error('Executing query() should have failed.'); + }) + .catch(err => { + expect(err).to.be.an.instanceOf(Error); + expect(err.code).to.equal(-493); + expect(err.message).to.equal('Syntax: Unknown class "game_xyz". select * from game_xyz'); + }); + }); + + it('should fail to execute query(sql, callback) against a non existing table', function (done) { + const client = testSetup.createDefaultCUBRIDDemodbConnection(); + + this.timeout(3000); + + client.query('SELECT * FROM game_xyz', (err) => { + expect(err).to.be.an.instanceOf(Error); + expect(err.code).to.equal(-493); + expect(err.message).to.equal('Syntax: Unknown class "game_xyz". select * from game_xyz'); + + done(); + }); + }); + + it('should fail to execute query(sql) when the query has a syntax error', function () { + const client = testSetup.createDefaultCUBRIDDemodbConnection(); + + return client + .query('SELECT wrong_count(*) FROM game') + .then(() => { + throw new Error('Should have failed due to a syntax error.') + }) + .catch(err => { + verifyError(client, err); + }); + }); + + it('should fail to execute query(sql, callback) when the query has a syntax error', function (done) { + const client = testSetup.createDefaultCUBRIDDemodbConnection(); + + client.query('SELECT wrong_count(*) FROM game', (err) => { + verifyError(client, err); + + done(); + }); + }); + + it('should succeed to query(sql) multiple queries in the same order they were queued', function () { + const client = testSetup.createDefaultCUBRIDDemodbConnection(); + let query1Response; + + client + .query('SELECT * FROM event') + .then(response => { + query1Response = response; + }); + + expect(query1Response).to.be.undefined; + + return client + .query('SELECT * FROM record') + .then(response => { + // When the second query results are returned, the + // previous query should already be fullfilled. + expect(query1Response) + .to.be.an('object'); + + expect(response) + .to.be.an('object'); + }); + }); + + it('should succeed to query(sql) the LAST_INSERT_ID()', function () { + const client = testSetup.createDefaultCUBRIDDemodbConnection(); + const queries = [ + `CREATE TABLE ${TABLE_NAME}(id INT AUTO_INCREMENT NOT NULL PRIMARY KEY, text VARCHAR(32))`, + `INSERT INTO ${TABLE_NAME} VALUES(NULL, 'database'), (NULL, 'manager')`, + ]; + + return client.batchExecuteNoQuery(queries) + .then(() => { + return client.query('SELECT LAST_INSERT_ID()'); + }) + .then(response => { + expect(response) + .to.be.an('object') + .to.have.property('queryHandle') + .to.be.a('number') + .to.be.above(0); + + expect(response) + .to.have.property('result') + .to.be.an('object'); + + let result = response.result; + + expect(result) + .to.be.an('object') + .to.have.property('RowsCount') + .to.be.a('number') + .to.equal(1); + + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.have.all.keys(['' + response.queryHandle]); + + expect(result) + .to.have.property('ColumnValues') + .to.be.an('array') + .with.length(1); + + expect(result.ColumnValues[0]) + .to.be.an('array') + .with.length(1); + + expect(result.ColumnValues[0][0]) + .to.be.a('number') + .to.equal(1); + + return client.closeQuery(response.queryHandle); + }) + .then(() => { + return client.close(); + }); + }); + + it('should succeed to query(sql) a constant value', function () { + const client = testSetup.createDefaultCUBRIDDemodbConnection(); + + return client.query('SELECT 1') + .then(response => { + expect(response) + .to.be.an('object') + .to.have.property('queryHandle') + .to.be.a('number') + .to.be.above(0); + + expect(response) + .to.have.property('result') + .to.be.an('object'); + + let result = response.result; + + expect(result) + .to.be.an('object') + .to.have.property('RowsCount') + .to.be.a('number') + .to.equal(1); + + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.have.all.keys(['' + response.queryHandle]); + + expect(result) + .to.have.property('ColumnValues') + .to.be.an('array') + .with.length(1); + + expect(result.ColumnValues[0]) + .to.be.an('array') + .with.length(1); + + expect(result.ColumnValues[0][0]) + .to.be.a('number') + .to.equal(1); + + return client.closeQuery(response.queryHandle); + }) + .then(() => { + return client.close(); + }); + }); + + it('should succeed to query(sql) a NULL value', function () { + const client = testSetup.createDefaultCUBRIDDemodbConnection(); + + return client.query('SELECT null FROM nation WHERE rownum < 3') + .then(response => { + expect(response) + .to.be.an('object') + .to.have.property('queryHandle') + .to.be.a('number') + .to.be.above(0); + + expect(response) + .to.have.property('result') + .to.be.an('object'); + + let result = response.result; + + expect(result) + .to.be.an('object') + .to.have.property('RowsCount') + .to.be.a('number') + .to.equal(2); + + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.have.all.keys(['' + response.queryHandle]); + + expect(result) + .to.have.property('ColumnValues') + .to.be.an('array') + .with.length(2); + + result.ColumnValues.forEach(columns => { + expect(columns) + .to.be.an('array') + .with.length(1); + + expect(columns[0]) + .to.be.null; + }); + + return client.closeQuery(response.queryHandle); + }) + .then(() => { + return client.close(); + }); + }); + + it('should succeed to query(sql) various data types', function () { + const client = testSetup.createDefaultCUBRIDDemodbConnection(); + + const lobField = 'qwerty'; + const char = 'a'; + let date = new Date(); + date.setUTCFullYear(2012, /* 0 based; 9 is for October */9, 2); + date.setUTCHours(18, 25, 45, 100); + const double = 1.5; + const float = 2.5; + const int = 14; + const money = 3.14; + const numeric = 16; + const nChar = '9'; + const nVarChar = '95'; + const varChar = 'varchar'; + const enumString = 'blue'; + + let supportsENUM; + + return client + .connect() + .then(() => { + // CUBRID >=9.0 supports `ENUM`. + supportsENUM = [/* 8.4.1 */1, /* 8.4.3 */3].indexOf(client.brokerInfo.protocolVersion) === -1; + + const createTableQuery = + `CREATE TABLE ${TABLE_NAME}( + a BIGINT, + b BIT(1), + c BIT VARYING(1), + d BLOB, + e CHARACTER(1), + f CLOB, + g DATE, + h DATETIME, + i DOUBLE, + j FLOAT, + k INTEGER, + l MONETARY, + m NATIONAL CHARACTER(1), + o NATIONAL CHARACTER VARYING(100), + p NUMERIC(15,0), + r CHARACTER VARYING(100), + s TIME, + t TIMESTAMP, + ${supportsENUM ? "z ENUM('red', 'blue', 'yellow') DEFAULT 'red'," : ''} + u VARCHAR(4096) + )`; + + return client.execute(createTableQuery); + }) + .then(() => { + const insertQuery = `INSERT INTO ${TABLE_NAME} VALUES(15, B'0', B'0', ?, ?, ?, ?, ?, ?, ?, ?, ?, N'${nChar}', N'${nVarChar}', ?, ?, ?, ?, ${supportsENUM ? `'${enumString}', ` : ''} ?)`; + const params = [lobField, char, lobField, date, date, double, float, int, money, numeric, varChar, date, date, varChar]; + + return client.execute(insertQuery, params) + }) + .then(() => { + return client.query(`SELECT * FROM ${TABLE_NAME}`); + }) + .then(response => { + expect(response) + .to.be.an('object') + .to.have.property('queryHandle') + .to.be.a('number') + .to.be.above(0); + + expect(response) + .to.have.property('result') + .to.be.an('object'); + + let result = response.result; + + expect(result) + .to.be.an('object') + .to.have.property('RowsCount') + .to.be.a('number') + .to.equal(1); + + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.have.all.keys(['' + response.queryHandle]); + + expect(result) + .to.have.property('ColumnValues') + .to.be.an('array') + .with.length(1); + + const values = result.ColumnValues[0]; + + expect(values) + .to.be.an('array') + .with.length(supportsENUM ? 20 : 19); + + expect(values[0]) + .to.be.a('number') + .to.equal(15); + + expect(values[1]) + .to.be.an.instanceOf(Buffer); + + expect(values[1]) + .to.have.length(1); + + expect(values[1][0]) + .to.equal(0); + + expect(values[2]) + .to.be.an.instanceOf(Buffer); + + expect(values[2]) + .to.have.length(1); + + expect(values[2][0]) + .to.equal(0); + + expect(values[3]) + .to.be.an('object') + .to.have.property('lobType') + .to.be.a('number') + .to.equal(CAS.CUBRIDDataType.CCI_U_TYPE_BLOB); + + expect(values[3]) + .to.have.property('lobLength') + .to.be.a('number') + .to.equal(lobField.length); + + const re = new RegExp(`file:.+/demodb/.+/${TABLE_NAME}\.[\\d_]+`); + + expect(values[3]) + .to.have.property('fileLocator') + .to.be.a('string') + .to.match(re); + + expect(values[3]) + .to.have.property('packedLobHandle') + .to.be.an.instanceOf(Buffer); + + expect(values[3].packedLobHandle) + .to.have.length(values[3].fileLocator.length + /* db_type */4 + /* log size*/ 8 + /* locator size */ 4 + /* null */1); + + expect(values[4]) + .to.be.a('string') + .to.equal(char); + + expect(values[5]) + .to.be.an('object') + .to.have.property('lobType') + .to.be.a('number') + .to.equal(CAS.CUBRIDDataType.CCI_U_TYPE_CLOB); + + expect(values[5]) + .to.have.property('lobLength') + .to.be.a('number') + .to.equal(lobField.length); + + expect(values[5]) + .to.have.property('fileLocator') + .to.be.a('string') + .to.match(re); + + expect(values[5]) + .to.have.property('packedLobHandle') + .to.be.an.instanceOf(Buffer); + + expect(values[5].packedLobHandle) + .to.have.length(values[5].fileLocator.length + /* db_type */4 + /* log size*/ 8 + /* locator size */ 4 + /* null */1); + + expect(values[6]) + .to.be.an.instanceOf(Date); + + // We cannot directly compare the date values because + // an instance of `Date` removes time information when + // storing the data in CUBRID into `DATE` type. + let dateOnly = new Date(date); + dateOnly.setUTCHours(0, 0, 0, 0); + + expect(values[6]) + .to.deep.equal(dateOnly); + + expect(values[7]) + .to.be.an.instanceOf(Date); + + expect(values[7]) + .to.deep.equal(date); + + expect(values[8]) + .to.be.a('number') + .to.equal(double); + + expect(values[9]) + .to.be.a('number') + .to.equal(float); + + expect(values[10]) + .to.be.a('number') + .to.equal(int); + + expect(values[11]) + .to.be.a('number') + .to.equal(money); + + expect(values[12]) + .to.be.a('string') + .to.equal(nChar); + + expect(values[13]) + .to.be.a('string') + .to.equal(nVarChar); + + expect(values[14]) + .to.be.a('number') + .to.equal(numeric); + + expect(values[15]) + .to.be.a('string') + .to.equal(varChar); + + expect(values[16]) + .to.be.an.instanceOf(Date); + // We cannot directly compare the date values because + // an instance of `Date` removes date information when + // storing the data in CUBRID as a `TIME` type. + let timeOnly = new Date(date); + timeOnly.setUTCFullYear(1970, 0, 1); + // `TIME` in CUBRID does not include the millisecond part. + timeOnly.setMilliseconds(0); + + expect(values[16]) + .to.deep.equal(timeOnly); + + expect(values[17]) + .to.be.an.instanceOf(Date); + + // We cannot directly compare the date values because + // an instance of `Date` removes millisecond information when + // storing the data in CUBRID as a `TIMESTAMP` type. + let timestamp = new Date(date); + timestamp.setMilliseconds(0); + + expect(values[17]) + .to.deep.equal(timestamp); + + if (supportsENUM) { + expect(values[18]) + .to.be.a('string') + .to.equal(enumString); + + expect(values[19]) + .to.be.a('string') + .to.equal(varChar); + } else { + expect(values[18]) + .to.be.a('string') + .to.equal(varChar); + } + + return client.closeQuery(response.queryHandle); + }) + .then(() => { + return client.close(); + }); + }); + + it('should fail to execute query(sql) when the socket connection has been destroyed', function () { + const client = testSetup.createDefaultCUBRIDDemodbConnection(); + + return client + .connect() + .then(() => { + client._socket.destroy(); + + return client.query('SELECT * FROM nation'); + }) + .then(() => { + throw new Error('Should have failed to query when the socket connection has been destroyed.'); + }) + .catch(err => { + expect(err).to.be.an.instanceOf(Error); + // Node `v6` reports an error that has no `.` at the end of the + // error message, while previous versions included the `.`. + expect(err.message).to.contain('This socket is closed'); + }); + }); + }); + + describe('when using the old protocol', function () { + it('should succeed to execute query(sql)', function () { + const client = testSetup.createDefaultCUBRIDDemodbConnection(); + + client.setEnforceOldQueryProtocol(true); + + expect(client.shouldUseOldQueryProtocol()).to.be.true; + + return client.query('SHOW TABLES') + .then(response => { + expect(response) + .to.be.an('object') + .to.have.property('queryHandle') + .to.be.a('number') + .to.be.above(0); + + expect(response) + .to.have.property('result') + .to.be.an('object'); + + let result = response.result; + + expect(result) + .to.be.an('object') + .to.have.property('RowsCount') + .to.be.a('number') + .to.equal(10); + + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.have.all.keys(['' + response.queryHandle]); + + return client.closeQuery(response.queryHandle); + }) + .then(() => { + return client.close(); + }); + }); + + it('should succeed to execute query(sql, callback)', function (done) { + const client = testSetup.createDefaultCUBRIDDemodbConnection(); + + client.setEnforceOldQueryProtocol(true); + + client.query('SHOW TABLES', function (err, result, queryHandle) { + if (err) { + return done(err); + } + + expect(queryHandle) + .to.be.a('number') + .to.be.above(0); + + expect(result) + .to.be.an('object') + .to.have.property('RowsCount') + .to.be.a('number') + .to.equal(10); + + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.have.all.keys(['' + queryHandle]); + + client.closeQuery(queryHandle, function (err) { + if (err) { + return done(err); + } + + client.close(done); + }); + }); + }); + + it('should succeed to execute query(sql, callback) multiple times with closeQuery', function (done) { + const client = testSetup.createDefaultCUBRIDDemodbConnection(); + let queriesCount = 10; + let promise = Promise.resolve(); + + client.setEnforceOldQueryProtocol(true); + + for (var i = 0; i < queriesCount; ++i) { + promise = promise.then(() => { + return client + .query('SHOW TABLES') + .then(response => { + expect(response) + .to.be.an('object') + .to.have.property('queryHandle') + .to.be.a('number') + .to.be.above(0); + + expect(response) + .to.have.property('result') + .to.be.an('object'); + + let result = response.result; + + expect(result) + .to.be.an('object') + .to.have.property('RowsCount') + .to.be.a('number') + .to.equal(10); + + expect(client) + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.have.all.keys(['' + response.queryHandle]); + + return client.closeQuery(response.queryHandle); + }); + }); + } + + promise + .then(() => { + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.be.empty; + + return client.close(); + }) + .then(() => { + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.be.empty; + + done(); + }) + .catch(done); + }); + + it('should succeed to execute SHOW TABLES query(sql, callback) multiple times', function (done) { + const client = testSetup.createDefaultCUBRIDDemodbConnection(); + let queriesCount = 10; + let promise = Promise.resolve(); + + client.setEnforceOldQueryProtocol(true); + + for (var i = 0; i < queriesCount; ++i) { + promise = promise.then(() => { + return client.query('SHOW TABLES').then(response => { + expect(response) + .to.be.an('object') + .to.have.property('queryHandle') + .to.be.a('number') + .to.be.above(0); + + expect(response) + .to.have.property('result') + .to.be.an('object'); + + let result = response.result; + + expect(result) + .to.be.an('object') + .to.have.property('RowsCount') + .to.be.a('number') + .to.equal(10); + + expect(client) + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.be.not.empty; + }); + }); + } + + promise + .then(() => { + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object'); + + expect(Object.keys(client._queryResultSets)) + .to.have.length(queriesCount); + + return client.close(); + }) + .then(() => { + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.be.empty; + + done(); + }) + .catch(done); + }); + + it('should succeed to execute query(sql, params)', function (done) { + const client = testSetup.createDefaultCUBRIDDemodbConnection(); + + client.setEnforceOldQueryProtocol(true); + + client.query('SELECT * FROM nation WHERE continent = ?', ['Asia']) + .then(response => { + expect(response) + .to.be.an('object') + .to.have.property('queryHandle') + .to.be.a('number') + .to.be.above(0); + + expect(response) + .to.have.property('result') + .to.be.an('object'); + + let result = response.result; + + expect(result) + .to.be.an('object') + .to.have.property('RowsCount') + .to.be.a('number') + .to.equal(47); + + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.have.all.keys(['' + response.queryHandle]); + + return client.closeQuery(response.queryHandle); + }) + .then(() => { + return client.close(); + }) + .then(done) + .catch(done); + }); + + it('should succeed to execute query(sql, callback) multiple times', function (done) { + this.timeout(100000000); + + const client = testSetup.createDefaultCUBRIDDemodbConnection(); + let queries = [ + { + sql: "SHOW TABLES", + params: null, + rowsCount: 10 + }, + { + sql: "SELECT * FROM nation", + params: [], + rowsCount: 215 + }, + { + sql: "SELECT * FROM nation WHERE continent = ?", + params: ['Asia'], + rowsCount: 47 + }, + { + sql: "SELECT * FROM nation WHERE continent = ?", + params: 'Asia', + rowsCount: 47 + }, + { + sql: "SELECT * FROM history WHERE host_year = ?", + params: [2004], + rowsCount: 64 + }, + { + sql: "SELECT * FROM history WHERE host_year = ?", + params: 2004, + rowsCount: 64 + }, + { + sql: "SELECT * FROM history WHERE host_year = ?", + params: ['2004'], + rowsCount: 64 + }, + { + sql: "SELECT * FROM history WHERE host_year = ?", + params: '2004', + rowsCount: 64 + }, + { + sql: "SELECT * FROM game WHERE game_date = ?", + params: ['08/28/2004'], + rowsCount: 311 + }, + { + sql: "SELECT * FROM game WHERE game_date = ?", + params: '08/28/2004', + rowsCount: 311 + }, + { + sql: "SELECT * FROM game WHERE game_date = ?", + params: [getDate()], + rowsCount: 311 + }, + { + sql: "SELECT * FROM game WHERE game_date = ?", + params: getDate(), + rowsCount: 311 + }, + { + sql: "SELECT * FROM game WHERE game_date = ?", + params: [new Date()], + rowsCount: 0 + }, + { + sql: "SELECT * FROM game WHERE game_date = ?", + params: new Date(), + rowsCount: 0 + } + ]; + let queriesCount = queries.length; + let promise = Promise.resolve(); + + client.setEnforceOldQueryProtocol(true); + + for (var i = 0; i < queriesCount; ++i) { + promise = promise.then(() => { + let query = queries.pop(); + + return client.query(query.sql, query.params) + .then(response => { + expect(response) + .to.be.an('object') + .to.have.property('queryHandle') + .to.be.a('number') + .to.be.above(0); + + expect(response) + .to.have.property('result') + .to.be.an('object'); + + let result = response.result; + + expect(result) + .to.be.an('object') + .to.have.property('RowsCount') + .to.be.a('number') + .to.equal(query.rowsCount); + + expect(client) + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.be.not.empty; + }); + }); + } + + promise + .then(() => { + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object'); + + expect(Object.keys(client._queryResultSets)) + .to.have.length(queriesCount); + + return client.close(); + }) + .then(() => { + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.be.empty; + + done(); + }) + .catch(done); + }); + + it('should fail to execute query(sql) against a non existing table', function () { + const client = testSetup.createDefaultCUBRIDDemodbConnection(); + + client.setEnforceOldQueryProtocol(true); + + this.timeout(3000); + + return client.query('SELECT * FROM game_xyz') + .then(() => { + throw new Error('Executing query() should have failed.'); + }) + .catch(err => { + expect(err).to.be.an.instanceOf(Error); + expect(err.code).to.equal(-493); + expect(err.message).to.equal('Syntax: Unknown class "game_xyz". select * from game_xyz'); + }); + }); + + it('should fail to execute query(sql, callback) against a non existing table', function (done) { + const client = testSetup.createDefaultCUBRIDDemodbConnection(); + + client.query('SELECT * FROM game_xyz', (err) => { + expect(err).to.be.an.instanceOf(Error); + expect(err.code).to.equal(-493); + expect(err.message).to.equal('Syntax: Unknown class "game_xyz". select * from game_xyz'); + + done(); + }); + }); + + it('should fail to execute query(sql) when the query has a syntax error', function () { + const client = testSetup.createDefaultCUBRIDDemodbConnection(); + + client.setEnforceOldQueryProtocol(true); + + return client + .query('SELECT wrong_count(*) FROM game') + .then(() => { + throw new Error('Should have failed due to a syntax error.') + }) + .catch((err) => { + verifyError(client, err); + }); + }); + + it('should fail to execute query(sql, callback) when the query has a syntax error', function (done) { + const client = testSetup.createDefaultCUBRIDDemodbConnection(); + + client.setEnforceOldQueryProtocol(true); + + client.query('SELECT wrong_count(*) FROM game', (err) => { + verifyError(client, err); + + done(); + }); + }); + + it('should succeed to query(sql) multiple queries in the same order they were queued', function () { + const client = testSetup.createDefaultCUBRIDDemodbConnection(); + let query1Response; + + client.setEnforceOldQueryProtocol(true); + + client + .query('SELECT * FROM event') + .then(response => { + query1Response = response; + }); + + expect(query1Response).to.be.undefined; + + return client + .query('SELECT * FROM record') + .then(response => { + // When the second query results are returned, the + // previous query should already be fullfilled. + expect(query1Response) + .to.be.an('object'); + + expect(response) + .to.be.an('object'); + }); + }); + + it('should succeed to query(sql) the LAST_INSERT_ID()', function () { + const client = testSetup.createDefaultCUBRIDDemodbConnection(); + const queries = [ + `CREATE TABLE ${TABLE_NAME}(id INT AUTO_INCREMENT NOT NULL PRIMARY KEY, text VARCHAR(32))`, + `INSERT INTO ${TABLE_NAME} VALUES(NULL, 'database'), (NULL, 'manager')`, + ]; + + client.setEnforceOldQueryProtocol(true); + + return client.batchExecuteNoQuery(queries) + .then(() => { + return client.query('SELECT LAST_INSERT_ID()'); + }) + .then(response => { + expect(response) + .to.be.an('object') + .to.have.property('queryHandle') + .to.be.a('number') + .to.be.above(0); + + expect(response) + .to.have.property('result') + .to.be.an('object'); + + let result = response.result; + + expect(result) + .to.be.an('object') + .to.have.property('RowsCount') + .to.be.a('number') + .to.equal(1); + + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.have.all.keys(['' + response.queryHandle]); + + expect(result) + .to.have.property('ColumnValues') + .to.be.an('array') + .with.length(1); + + expect(result.ColumnValues[0]) + .to.be.an('array') + .with.length(1); + + expect(result.ColumnValues[0][0]) + .to.be.a('number') + .to.equal(1); + + return client.closeQuery(response.queryHandle); + }) + .then(() => { + return client.close(); + }); + }); + + it('should succeed to query(sql) a constant value', function () { + const client = testSetup.createDefaultCUBRIDDemodbConnection(); + + client.setEnforceOldQueryProtocol(true); + + return client.query('SELECT 1') + .then(response => { + expect(response) + .to.be.an('object') + .to.have.property('queryHandle') + .to.be.a('number') + .to.be.above(0); + + expect(response) + .to.have.property('result') + .to.be.an('object'); + + let result = response.result; + + expect(result) + .to.be.an('object') + .to.have.property('RowsCount') + .to.be.a('number') + .to.equal(1); + + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.have.all.keys(['' + response.queryHandle]); + + expect(result) + .to.have.property('ColumnValues') + .to.be.an('array') + .with.length(1); + + expect(result.ColumnValues[0]) + .to.be.an('array') + .with.length(1); + + expect(result.ColumnValues[0][0]) + .to.be.a('number') + .to.equal(1); + + return client.closeQuery(response.queryHandle); + }) + .then(() => { + return client.close(); + }); + }); + + it('should succeed to query(sql) a NULL value', function () { + const client = testSetup.createDefaultCUBRIDDemodbConnection(); + + client.setEnforceOldQueryProtocol(true); + + return client.query('SELECT null FROM nation WHERE rownum < 3') + .then(response => { + expect(response) + .to.be.an('object') + .to.have.property('queryHandle') + .to.be.a('number') + .to.be.above(0); + + expect(response) + .to.have.property('result') + .to.be.an('object'); + + let result = response.result; + + expect(result) + .to.be.an('object') + .to.have.property('RowsCount') + .to.be.a('number') + .to.equal(2); + + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.have.all.keys(['' + response.queryHandle]); + + expect(result) + .to.have.property('ColumnValues') + .to.be.an('array') + .with.length(2); + + result.ColumnValues.forEach(columns => { + expect(columns) + .to.be.an('array') + .with.length(1); + + expect(columns[0]) + .to.be.null; + }); + + return client.closeQuery(response.queryHandle); + }) + .then(() => { + return client.close(); + }); + }); + + it('should succeed to query(sql) various data types', function () { + const client = testSetup.createDefaultCUBRIDDemodbConnection(); + + client.setEnforceOldQueryProtocol(true); + + const lobField = 'qwerty'; + const char = 'a'; + let date = new Date(); + date.setUTCFullYear(2012, /* 0 based; 9 is for October */9, 2); + date.setUTCHours(18, 25, 45, 100); + const double = 1.5; + const float = 2.5; + const int = 14; + const money = 3.14; + const numeric = 16; + const nChar = '9'; + const nVarChar = '95'; + const varChar = 'varchar'; + const enumString = 'blue'; + + let supportsENUM; + + return client + .connect() + .then(() => { + // CUBRID >=9.0 supports `ENUM`. + supportsENUM = [/* 8.4.1 */1, /* 8.4.3 */3].indexOf(client.brokerInfo.protocolVersion) === -1; + + const createTableQuery = + `CREATE TABLE ${TABLE_NAME}( + a BIGINT, + b BIT(1), + c BIT VARYING(1), + d BLOB, + e CHARACTER(1), + f CLOB, + g DATE, + h DATETIME, + i DOUBLE, + j FLOAT, + k INTEGER, + l MONETARY, + m NATIONAL CHARACTER(1), + o NATIONAL CHARACTER VARYING(100), + p NUMERIC(15,0), + r CHARACTER VARYING(100), + s TIME, + t TIMESTAMP, + ${supportsENUM ? "z ENUM('red', 'blue', 'yellow') DEFAULT 'red'," : ''} + u VARCHAR(4096) + )`; + + return client.execute(createTableQuery); + }) + .then(() => { + const insertQuery = `INSERT INTO ${TABLE_NAME} VALUES(15, B'0', B'0', ?, ?, ?, ?, ?, ?, ?, ?, ?, N'${nChar}', N'${nVarChar}', ?, ?, ?, ?, ${supportsENUM ? `'${enumString}', ` : ''} ?)`; + const params = [lobField, char, lobField, date, date, double, float, int, money, numeric, varChar, date, date, varChar]; + + return client.execute(insertQuery, params) + }) + .then(() => { + return client.query(`SELECT * FROM ${TABLE_NAME}`); + }) + .then(response => { + expect(response) + .to.be.an('object') + .to.have.property('queryHandle') + .to.be.a('number') + .to.be.above(0); + + expect(response) + .to.have.property('result') + .to.be.an('object'); + + let result = response.result; + + expect(result) + .to.be.an('object') + .to.have.property('RowsCount') + .to.be.a('number') + .to.equal(1); + + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.have.all.keys(['' + response.queryHandle]); + + expect(result) + .to.have.property('ColumnValues') + .to.be.an('array') + .with.length(1); + + const values = result.ColumnValues[0]; + + expect(values) + .to.be.an('array') + .with.length(supportsENUM ? 20 : 19); + + expect(values[0]) + .to.be.a('number') + .to.equal(15); + + expect(values[1]) + .to.be.an.instanceOf(Buffer); + + expect(values[1]) + .to.have.length(1); + + expect(values[1][0]) + .to.equal(0); + + expect(values[2]) + .to.be.an.instanceOf(Buffer); + + expect(values[2]) + .to.have.length(1); + + expect(values[2][0]) + .to.equal(0); + + expect(values[3]) + .to.be.an('object') + .to.have.property('lobType') + .to.be.a('number') + .to.equal(CAS.CUBRIDDataType.CCI_U_TYPE_BLOB); + + expect(values[3]) + .to.have.property('lobLength') + .to.be.a('number') + .to.equal(lobField.length); + + const re = new RegExp(`file:.+/demodb/.+/${TABLE_NAME}\.[\\d_]+`); + + expect(values[3]) + .to.have.property('fileLocator') + .to.be.a('string') + .to.match(re); + + expect(values[3]) + .to.have.property('packedLobHandle') + .to.be.an.instanceOf(Buffer); + + expect(values[3].packedLobHandle) + .to.have.length(values[3].fileLocator.length + /* db_type */4 + /* log size*/ 8 + /* locator size */ 4 + /* null */1); + + expect(values[4]) + .to.be.a('string') + .to.equal(char); + + expect(values[5]) + .to.be.an('object') + .to.have.property('lobType') + .to.be.a('number') + .to.equal(CAS.CUBRIDDataType.CCI_U_TYPE_CLOB); + + expect(values[5]) + .to.have.property('lobLength') + .to.be.a('number') + .to.equal(lobField.length); + + expect(values[5]) + .to.have.property('fileLocator') + .to.be.a('string') + .to.match(re); + + expect(values[5]) + .to.have.property('packedLobHandle') + .to.be.an.instanceOf(Buffer); + + expect(values[5].packedLobHandle) + .to.have.length(values[5].fileLocator.length + /* db_type */4 + /* log size*/ 8 + /* locator size */ 4 + /* null */1); + + expect(values[6]) + .to.be.an.instanceOf(Date); + + // We cannot directly compare the date values because + // an instance of `Date` removes time information when + // storing the data in CUBRID into `DATE` type. + let dateOnly = new Date(date); + dateOnly.setUTCHours(0, 0, 0, 0); + + expect(values[6]) + .to.deep.equal(dateOnly); + + expect(values[7]) + .to.be.an.instanceOf(Date); + + expect(values[7]) + .to.deep.equal(date); + + expect(values[8]) + .to.be.a('number') + .to.equal(double); + + expect(values[9]) + .to.be.a('number') + .to.equal(float); + + expect(values[10]) + .to.be.a('number') + .to.equal(int); + + expect(values[11]) + .to.be.a('number') + .to.equal(money); + + expect(values[12]) + .to.be.a('string') + .to.equal(nChar); + + expect(values[13]) + .to.be.a('string') + .to.equal(nVarChar); + + expect(values[14]) + .to.be.a('number') + .to.equal(numeric); + + expect(values[15]) + .to.be.a('string') + .to.equal(varChar); + + expect(values[16]) + .to.be.an.instanceOf(Date); + // We cannot directly compare the date values because + // an instance of `Date` removes date information when + // storing the data in CUBRID as a `TIME` type. + let timeOnly = new Date(date); + timeOnly.setUTCFullYear(1970, 0, 1); + // `TIME` in CUBRID does not include the millisecond part. + timeOnly.setMilliseconds(0); + + expect(values[16]) + .to.deep.equal(timeOnly); + + expect(values[17]) + .to.be.an.instanceOf(Date); + + // We cannot directly compare the date values because + // an instance of `Date` removes millisecond information when + // storing the data in CUBRID as a `TIMESTAMP` type. + let timestamp = new Date(date); + timestamp.setMilliseconds(0); + + expect(values[17]) + .to.deep.equal(timestamp); + + if (supportsENUM) { + expect(values[18]) + .to.be.a('string') + .to.equal(enumString); + + expect(values[19]) + .to.be.a('string') + .to.equal(varChar); + } else { + expect(values[18]) + .to.be.a('string') + .to.equal(varChar); + } + + return client.closeQuery(response.queryHandle); + }) + .then(() => { + return client.close(); + }); + }); + }); + }); +}); diff --git a/test/CUBRIDConnection.queryAll.js b/test/CUBRIDConnection.queryAll.js new file mode 100644 index 0000000..49d45b3 --- /dev/null +++ b/test/CUBRIDConnection.queryAll.js @@ -0,0 +1,224 @@ +'use strict'; + +const expect = require('chai').expect; +const testSetup = require('./testSetup'); + +describe('CUBRIDConnection', function () { + describe('queryAll', function () { + function validateFetchResults(result) { + expect(result) + .to.be.an('object') + .to.not.have.property('queryHandle'); + + const TOTAL_ROWS = 8653; + + expect(result) + .to.have.property('RowsCount') + .to.be.a('number') + .to.equal(TOTAL_ROWS); + + const COLUMNS_COUNT = 7; + const COLUMN_NAMES = ['host_year', 'event_code', 'athlete_code', 'stadium_code', 'nation_code', 'medal', 'game_date']; + const COLUMN_TYPES = ['Int', 'Int', 'Int', 'Int', 'Char', 'Char', 'Date']; + + expect(result) + .to.have.property('ColumnNames') + .to.be.an('array') + .with.length(COLUMNS_COUNT); + + expect(result.ColumnNames) + .to.deep.equal(COLUMN_NAMES); + + expect(result) + .to.have.property('ColumnDataTypes') + .to.be.an('array') + .with.length(COLUMNS_COUNT); + + expect(result.ColumnDataTypes) + .to.deep.equal(COLUMN_TYPES); + + expect(result) + .to.have.property('ColumnValues') + .to.be.an('array') + .with.length(TOTAL_ROWS); + + // Validate the first row. + expect(result.ColumnValues[0]).to.satisfy(columns => { + expect(columns) + .to.be.an('array') + .with.length(COLUMNS_COUNT); + + expect(columns[0]) + .to.be.a('number') + .to.equal(2004); + + expect(columns[1]) + .to.be.a('number') + .to.equal(20021); + + expect(columns[2]) + .to.be.a('number') + .to.equal(14345); + + expect(columns[3]) + .to.be.a('number') + .to.equal(30116); + + expect(columns[4]) + .to.be.a('string') + .to.equal('NGR'); + + expect(columns[5]) + .to.be.a('string') + .to.equal('B'); + + expect(columns[6]) + .to.be.an.instanceOf(Date) + .to.deep.equal(new Date('2004-08-28T09:00:00+0900')); + + return true; + }); + + // Validate the last row. + expect(result.ColumnValues[result.ColumnValues.length - 1]).to.satisfy(columns => { + expect(columns) + .to.be.an('array') + .with.length(COLUMNS_COUNT); + + expect(columns[0]) + .to.be.a('number') + .to.equal(1988); + + expect(columns[1]) + .to.be.a('number') + .to.equal(20084); + + expect(columns[2]) + .to.be.a('number') + .to.equal(16631); + + expect(columns[3]) + .to.be.a('number') + .to.equal(30060); + + expect(columns[4]) + .to.be.a('string') + .to.equal('AUS'); + + expect(columns[5]) + .to.be.a('string') + .to.equal('S'); + + expect(columns[6]) + .to.be.an.instanceOf(Date) + .to.deep.equal(new Date('1988-09-20T10:00:00+1000')); + + return true; + }); + } + + describe('when using the new protocol', function () { + it('should succeed to execute queryAll(sql)', function () { + let client = testSetup.createDefaultCUBRIDDemodbConnection(); + + return client + .queryAll('SELECT * FROM game') + .then(result => { + validateFetchResults(result); + + // The query should be closed automatically. + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.be.empty; + + return client.close(); + }); + }); + + it('should succeed to execute queryAll(sql, callback)', function () { + let client = testSetup.createDefaultCUBRIDDemodbConnection(); + + this.timeout(3000); + + return new Promise((resolve, reject) => { + client.queryAll('SELECT * FROM game', function (err, result) { + if (err) { + return reject(err); + } + + resolve(result); + }) + }) + .then(result => { + validateFetchResults(result); + + // The query should be closed automatically. + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.be.empty; + + return client.close(); + }); + }); + }); + + describe('when using the old protocol', function () { + it('should succeed to execute queryAll(sql)', function () { + let client = testSetup.createDefaultCUBRIDDemodbConnection(); + + client.setEnforceOldQueryProtocol(true); + + this.timeout(3000); + + return client + .queryAll('SELECT * FROM game') + .then(result => { + validateFetchResults(result); + + // The query should be closed automatically. + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.be.empty; + + return client.close(); + }); + }); + + it('should succeed to execute queryAll(sql, callback)', function () { + let client = testSetup.createDefaultCUBRIDDemodbConnection(); + + client.setEnforceOldQueryProtocol(true); + + this.timeout(3000); + + return new Promise((resolve, reject) => { + client.queryAll('SELECT * FROM game', function (err, result) { + if (err) { + return reject(err); + } + + resolve(result); + }) + }) + .then(result => { + validateFetchResults(result); + + // The query should be closed automatically. + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.be.empty; + + return client.close(); + }); + }); + }); + }); +}); diff --git a/test/CUBRIDConnection.rollback.js b/test/CUBRIDConnection.rollback.js new file mode 100644 index 0000000..8f8aae5 --- /dev/null +++ b/test/CUBRIDConnection.rollback.js @@ -0,0 +1,257 @@ +'use strict'; + +const expect = require('chai').expect; +const testSetup = require('./testSetup'); +const ErrorMessages = require('../src/constants/ErrorMessages'); + +describe('CUBRIDConnection', function () { + describe('rollback', function () { + const TABLE_NAME = 'test_tran'; + + beforeEach(testSetup.cleanup(TABLE_NAME)); + after(testSetup.cleanup(TABLE_NAME)); + + it('should succeed to rollback()', function () { + const client = require('./testSetup').createDefaultCUBRIDDemodbConnection(); + + return client + .connect() + .then(() => { + return client.execute(`CREATE TABLE ${TABLE_NAME}(id INT)`); + }) + .then(() => { + return client.setAutoCommitMode(false); + }) + .then(() => { + return client.batchExecuteNoQuery([`INSERT INTO ${TABLE_NAME} VALUES(1)`]); + }) + .then(() => { + return client.query(`SELECT * FROM ${TABLE_NAME}`); + }) + .then(response => { + expect(response) + .to.be.an('object') + .to.have.property('queryHandle') + .to.be.a('number') + .to.be.above(0); + + expect(response) + .to.have.property('result') + .to.be.an('object'); + + let result = response.result; + + expect(result) + .to.be.an('object') + .to.have.property('RowsCount') + .to.be.a('number') + .to.equal(1); + + expect(result) + .to.have.property('ColumnValues') + .to.be.an('array') + .with.length(1); + + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.have.all.keys(['' + response.queryHandle]); + + expect(result.ColumnValues[0]) + .to.be.an('array') + .with.length(1); + + expect(result.ColumnValues[0][0]) + .to.be.a('number') + .to.equal(1); + + return client.rollback(); + }) + .then(() => { + // After rollback the autocommit mode stay the same, i.e. OFF. + // If necessary, the user has to explicitly set it to `true` + // in order to enable the autocommit mode. + expect(client.getAutoCommitMode()).to.be.false; + + return client.query(`SELECT * FROM ${TABLE_NAME}`); + }) + .then(response => { + expect(response) + .to.be.an('object') + .to.have.property('queryHandle') + .to.be.a('number') + .to.be.above(0); + + expect(response) + .to.have.property('result') + .to.be.an('object'); + + let result = response.result; + + expect(result) + .to.be.an('object') + .to.have.property('RowsCount') + .to.be.a('number') + .to.equal(0); + + expect(result) + .to.have.property('ColumnValues') + .to.be.an('array') + .with.length(0); + + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.contain.keys(['' + response.queryHandle]); + + expect(Object.keys(client._queryResultSets)) + .to.have.length(2); + + return client.setAutoCommitMode(true); + }) + .then(() => { + return client.close(); + }); + }); + + it('should succeed to rollback(callback)', function () { + const client = require('./testSetup').createDefaultCUBRIDDemodbConnection(); + + return client + .connect() + .then(() => { + return client.execute(`CREATE TABLE ${TABLE_NAME}(id INT)`); + }) + .then(() => { + return client.setAutoCommitMode(false); + }) + .then(() => { + return client.batchExecuteNoQuery([`INSERT INTO ${TABLE_NAME} VALUES(1)`]); + }) + .then(() => { + return client.query(`SELECT * FROM ${TABLE_NAME}`); + }) + .then(response => { + expect(response) + .to.be.an('object') + .to.have.property('queryHandle') + .to.be.a('number') + .to.be.above(0); + + expect(response) + .to.have.property('result') + .to.be.an('object'); + + let result = response.result; + + expect(result) + .to.be.an('object') + .to.have.property('RowsCount') + .to.be.a('number') + .to.equal(1); + + expect(result) + .to.have.property('ColumnValues') + .to.be.an('array') + .with.length(1); + + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.have.all.keys(['' + response.queryHandle]); + + expect(result.ColumnValues[0]) + .to.be.an('array') + .with.length(1); + + expect(result.ColumnValues[0][0]) + .to.be.a('number') + .to.equal(1); + + return new Promise((resolve, reject) => { + client.rollback(function (err) { + if (err) { + return reject(err); + } + + resolve(); + }); + }); + }) + .then(() => { + // After rollback the autocommit mode stay the same, i.e. OFF. + // If necessary, the user has to explicitly set it to `true` + // in order to enable the autocommit mode. + expect(client.getAutoCommitMode()).to.be.false; + + return client.query(`SELECT * FROM ${TABLE_NAME}`); + }) + .then(response => { + expect(response) + .to.be.an('object') + .to.have.property('queryHandle') + .to.be.a('number') + .to.be.above(0); + + expect(response) + .to.have.property('result') + .to.be.an('object'); + + let result = response.result; + + expect(result) + .to.be.an('object') + .to.have.property('RowsCount') + .to.be.a('number') + .to.equal(0); + + expect(result) + .to.have.property('ColumnValues') + .to.be.an('array') + .with.length(0); + + expect(client) + .to.be.an('object') + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.contain.keys(['' + response.queryHandle]); + + expect(Object.keys(client._queryResultSets)) + .to.have.length(2); + + return client.setAutoCommitMode(true); + }) + .then(() => { + return client.close(); + }); + }); + + it('should fail to rollback() when the connection is in AUTO_COMMIT_ON mode', function () { + const client = require('./testSetup').createDefaultCUBRIDDemodbConnection(); + + return client + .rollback() + .then(() => { + throw new Error('Should have failed to rollback() when the connection is in AUTO_COMMIT_ON mode.') + }) + .catch(err => { + expect(err).to.be.an.instanceOf(Error); + expect(err.message).to.equal(ErrorMessages.ERROR_NO_ROLLBACK); + }); + }); + + it('should fail to rollback(callback) when the connection is in AUTO_COMMIT_ON mode', function (done) { + const client = require('./testSetup').createDefaultCUBRIDDemodbConnection(); + + client.rollback(function (err) { + expect(err).to.be.an.instanceOf(Error); + expect(err.message).to.equal(ErrorMessages.ERROR_NO_ROLLBACK); + + done(); + }); + }); + }); +}); diff --git a/test/CUBRIDConnection.setAutoCommitMode.js b/test/CUBRIDConnection.setAutoCommitMode.js new file mode 100644 index 0000000..b8bbac1 --- /dev/null +++ b/test/CUBRIDConnection.setAutoCommitMode.js @@ -0,0 +1,193 @@ +'use strict'; + +const expect = require('chai').expect; +const testSetup = require('./testSetup'); + +describe('CUBRIDConnection', function () { + describe('setAutoCommitMode', function () { + const TABLE_NAME = 'tbl_test'; + + before(testSetup.cleanup(TABLE_NAME)); + after(testSetup.cleanup(TABLE_NAME)); + + it('should succeed to disable the auto commit mode and commit manually', function (done) { + const client = testSetup.createDefaultCUBRIDDemodbConnection(); + + client + .connect() + .then(() => { + return client.execute(`CREATE TABLE ${TABLE_NAME}(id INT)`); + }) + .then(() => { + return client.setAutoCommitMode(false); + }) + .then(() => { + expect(client.getAutoCommitMode()).to.be.false; + + return client.execute(`INSERT INTO ${TABLE_NAME} VALUES(1)`); + }) + .then(() => { + return client.commit(); + }) + .then(() => { + return client.query(`SELECT * FROM ${TABLE_NAME}`); + }) + .then(response => { + expect(response) + .to.be.an('object') + .to.have.property('queryHandle') + .to.be.a('number') + .to.be.above(0); + + expect(response) + .to.have.property('result') + .to.be.an('object'); + + let result = response.result; + + expect(result) + .to.be.an('object') + .to.have.property('RowsCount') + .to.be.a('number') + .to.equal(1); + + expect(client) + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.contain.keys(['' + response.queryHandle]); + + return client.setAutoCommitMode(true); + }) + .then(() => { + expect(client.getAutoCommitMode()).to.be.true; + + return client.batchExecuteNoQuery([`DROP TABLE ${TABLE_NAME}`]); + }) + .then(() => { + return client.close(); + }) + .then(done) + .catch(done); + }); + + it('should succeed to disable the auto commit mode and commit manually by providing a falsy parameter 0', function (done) { + const client = testSetup.createDefaultCUBRIDDemodbConnection(); + + client + .connect() + .then(() => { + return client.execute(`CREATE TABLE ${TABLE_NAME}(id INT)`); + }) + .then(() => { + return client.setAutoCommitMode(0); + }) + .then(() => { + expect(client.getAutoCommitMode()).to.be.false; + + return client.execute(`INSERT INTO ${TABLE_NAME} VALUES(1)`); + }) + .then(() => { + return client.commit(); + }) + .then(() => { + return client.query(`SELECT * FROM ${TABLE_NAME}`); + }) + .then(response => { + expect(response) + .to.be.an('object') + .to.have.property('queryHandle') + .to.be.a('number') + .to.be.above(0); + + expect(response) + .to.have.property('result') + .to.be.an('object'); + + let result = response.result; + + expect(result) + .to.be.an('object') + .to.have.property('RowsCount') + .to.be.a('number') + .to.equal(1); + + expect(client) + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.contain.keys(['' + response.queryHandle]); + + return client.setAutoCommitMode(true); + }) + .then(() => { + expect(client.getAutoCommitMode()).to.be.true; + + return client.batchExecuteNoQuery([`DROP TABLE ${TABLE_NAME}`]); + }) + .then(() => { + return client.close(); + }) + .then(done) + .catch(done); + }); + + it('should succeed to disable the auto commit mode and commit manually by providing a falsy parameter "" (empty string)', function (done) { + const client = testSetup.createDefaultCUBRIDDemodbConnection(); + + client + .connect() + .then(() => { + return client.execute(`CREATE TABLE ${TABLE_NAME}(id INT)`); + }) + .then(() => { + return client.setAutoCommitMode(""); + }) + .then(() => { + expect(client.getAutoCommitMode()).to.be.false; + + return client.execute(`INSERT INTO ${TABLE_NAME} VALUES(1)`); + }) + .then(() => { + return client.commit(); + }) + .then(() => { + return client.query(`SELECT * FROM ${TABLE_NAME}`); + }) + .then(response => { + expect(response) + .to.be.an('object') + .to.have.property('queryHandle') + .to.be.a('number') + .to.be.above(0); + + expect(response) + .to.have.property('result') + .to.be.an('object'); + + let result = response.result; + + expect(result) + .to.be.an('object') + .to.have.property('RowsCount') + .to.be.a('number') + .to.equal(1); + + expect(client) + .to.have.property('_queryResultSets') + .to.be.an('object') + .to.contain.keys(['' + response.queryHandle]); + + return client.setAutoCommitMode(true); + }) + .then(() => { + expect(client.getAutoCommitMode()).to.be.true; + + return client.batchExecuteNoQuery([`DROP TABLE ${TABLE_NAME}`]); + }) + .then(() => { + return client.close(); + }) + .then(done) + .catch(done); + }); + }); +}); diff --git a/test/CUBRIDConnection.setConnectionTimeout.js b/test/CUBRIDConnection.setConnectionTimeout.js new file mode 100644 index 0000000..94629c8 --- /dev/null +++ b/test/CUBRIDConnection.setConnectionTimeout.js @@ -0,0 +1,46 @@ +'use strict'; + +const expect = require('chai').expect; + +describe('CUBRIDConnection', function () { + describe('setConnectionTimeout', function () { + it('should succeed to set the connection timeout value', function () { + const CUBRID = require('../'); + const ErrorMessages = require('../src' + (process.env.CODE_COV ? '-cov' : '') + '/constants/ErrorMessages'); + const client = new CUBRID.createCUBRIDConnection('www.google.com', 33000, 'public', '', 'demodb'); + const newTimeoutValue = 1500; + + expect(client.getConnectionTimeout()).to.equal(0); + + client.setConnectionTimeout(newTimeoutValue); + expect(client.getConnectionTimeout()).to.equal(newTimeoutValue); + + client.setConnectionTimeout(0); + expect(client.getConnectionTimeout()).to.equal(0); + + client.setConnectionTimeout(-3000); + expect(client.getConnectionTimeout()).to.equal(0); + + client.setConnectionTimeout(newTimeoutValue); + expect(client.getConnectionTimeout()).to.equal(newTimeoutValue); + + client.setConnectionTimeout(newTimeoutValue); + expect(client.getConnectionTimeout()).to.equal(newTimeoutValue); + + // By default the client will retry the connection one more time + // if it failed, so the timeout should be increased. + this.timeout(newTimeoutValue * 3); + + return client + .connect() + .then(() => { + throw new Error('Connection should have failed.'); + }) + .catch(err => { + expect(err).to.be.an.instanceOf(Error); + expect(err.message).to.equal(ErrorMessages.ERROR_CONNECTION_TIMEOUT); + expect(client.connectionOpened).to.be.false; + }); + }); + }); +}); diff --git a/test/CUBRIDConnection.setDatabaseParameter.js b/test/CUBRIDConnection.setDatabaseParameter.js new file mode 100644 index 0000000..1d4bd28 --- /dev/null +++ b/test/CUBRIDConnection.setDatabaseParameter.js @@ -0,0 +1,41 @@ +'use strict'; + +const expect = require('chai').expect; +const testSetup = require('./testSetup'); +const CAS = require('../src/constants/CASConstants'); +const ErrorMessages = require('../src/constants/ErrorMessages'); + +describe('CUBRIDConnection', function () { + describe('setDatabaseParameter', function () { + it(`should fail to set the database parameter`, function () { + let client = testSetup.createDefaultCUBRIDDemodbConnection(); + + const paramName = CAS.CCIDbParam.CCI_PARAM_MAX_STRING_LENGTH; + + return client + .setDatabaseParameter(paramName, 0) + .then(() => { + return new Error('Should have failed to set the database parameter.'); + }) + .catch(err => { + expect(err).to.be.an.instanceOf(Error); + expect(err.code).to.equal(-1011); + expect(err.message).to.equal(ErrorMessages.resolveErrorCode(err.code)); + + return client.close(); + }); + }); + + it(`should succeed to set the isolation level parameter`, function () { + let client = testSetup.createDefaultCUBRIDDemodbConnection(); + + const paramName = CAS.CCIDbParam.CCI_PARAM_ISOLATION_LEVEL; + + return client + .setDatabaseParameter(paramName, CAS.CUBRIDIsolationLevel.TRAN_REP_CLASS_COMMIT_INSTANCE) + .then(() => { + return client.close(); + }); + }); + }); +}); diff --git a/test/Helpers.js b/test/Helpers.js new file mode 100644 index 0000000..f30c472 --- /dev/null +++ b/test/Helpers.js @@ -0,0 +1,92 @@ +'use strict'; + +let expect = require('chai').expect; + +const codeCoveragePath = process.env.CODE_COV ? '-cov' : ''; +const Helpers = require('../src' + codeCoveragePath + '/utils/Helpers'); + +it('should succeed to validate the input', function () { + let sql = 'INSERT INTO a VALUES(?, ?, ?)'; + let newSQL = Helpers._sqlFormat(sql, ['1', 2, null], ["'", '', '']); + + expect(newSQL).to.equal("INSERT INTO a VALUES('1', 2, NULL)"); + + expect(Helpers._escapeString('INSERT INTO "a VALUES(\b)')).to.equal('INSERT INTO ""a VALUES(\\b)'); + + sql = 'stringWithDouble"Quote'; + + // Should not escape the double quote if the delimiter is a single quote. + expect(Helpers._escapeString(sql, "'")).to.equal(sql); + + sql = "stringWithSingle'Quote"; + + // Should not escape the single quote if the delimiter is a double quote. + expect(Helpers._escapeString(sql, '"')).to.equal(sql); + + sql = 'INSERT INTO a VALUES(?, ?, ?)'; + newSQL = Helpers._sqlFormat(sql, ['stringWithDouble"Quote', 2, null]); + + expect(newSQL).to.equal("INSERT INTO a VALUES('stringWithDouble\"Quote', 2, NULL)"); + + // Test Input validation functions + expect(Helpers._validateInputBoolean(null)).to.be.false; + expect(Helpers._validateInputBoolean(4)).to.be.false; + expect(Helpers._validateInputBoolean(3.14)).to.be.false; + expect(Helpers._validateInputBoolean('qwerty')).to.be.false; + expect(Helpers._validateInputBoolean(true)).to.be.true; + expect(Helpers._validateInputBoolean(1)).to.be.true; + + expect(Helpers._validateInputPositive(null)).to.be.false; + expect(Helpers._validateInputPositive(3.14)).to.be.true; + expect(Helpers._validateInputPositive(-1)).to.be.false; + expect(Helpers._validateInputPositive(0)).to.be.true; + expect(Helpers._validateInputPositive(14)).to.be.true; + + expect(Helpers._validateInputTimeout(null)).to.be.false; + expect(Helpers._validateInputTimeout(3.14)).to.be.false; + expect(Helpers._validateInputTimeout(-1)).to.be.false; + expect(Helpers._validateInputTimeout(0)).to.be.true; + expect(Helpers._validateInputTimeout(14)).to.be.true; + + expect(Helpers._validateInputString(null)).to.be.false; + expect(Helpers._validateInputString(3)).to.be.false; + expect(Helpers._validateInputString(true)).to.be.false; + expect(Helpers._validateInputString('')).to.be.false; + expect(Helpers._validateInputString('querty')).to.be.true; + + expect(Helpers._validateInputSQLString(null)).to.be.false; + expect(Helpers._validateInputSQLString(3)).to.be.false; + expect(Helpers._validateInputSQLString(true)).to.be.false; + expect(Helpers._validateInputSQLString('')).to.be.false; + expect(Helpers._validateInputSQLString('a')).to.be.false; + expect(Helpers._validateInputSQLString('qwerty')).to.be.true; +}); + +//exports['_sqlFormat()'] = function (test) { +// var arr = [ +// { +// sql: 'INSERT INTO project (projectname, team, creator, description, log_limit, esm_code, sink_config, createtime, lastmodified) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)', +// values: ['qqqesen', 'qa', 60136, '1234123412', 20000000, '123456', JSON.stringify({ +// type: "hdfs", +// server: [ +// { +// ip: "1.1.1.1", +// port: 2222 +// } +// ], +// user: "hadoop", +// path:"/data" +// }), '2013-09-25 17:00:52', '2013-09-25 17:00:52'], +// outputSQL: "INSERT INTO project (projectname, team, creator, description, log_limit, esm_code, sink_config, createtime, lastmodified) VALUES ('qqqesen', 'qa', 60136, '1234123412', 20000000, '123456', '{\"type\":\"hdfs\",\"server\":[{\"ip\":\"1.1.1.1\",\"port\":2222}],\"user\":\"hadoop\",\"path\":\"/data\"}', '2013-09-25 17:00:52', '2013-09-25 17:00:52')" +// } +// ]; +// +// test.expect(arr.length); +// +// async.each(arr, function(obj, done) { +// Helpers._sqlFormat(obj.sql, obj.values); +// }, function (err) { +// +// }); +// +//}; diff --git a/test/old_tests/packets/test_BatchExecuteNoQueryPacket.js b/test/old_tests/packets/test_BatchExecuteNoQueryPacket.js deleted file mode 100644 index 20c9cde..0000000 --- a/test/old_tests/packets/test_BatchExecuteNoQueryPacket.js +++ /dev/null @@ -1,46 +0,0 @@ -var PacketReader = require('../PacketReader'), - PacketWriter = require('../PacketWriter'), - BatchExecuteNoQueryPacket = require('../BatchExecuteNoQueryPacket'), - CAS = require('../../constants/CASConstants'), - assert = require('assert'); - -function testBatchExecuteNoQueryPacket_01() { - var packetReader = new PacketReader(); - var packetWriter = new PacketWriter(); - var options = {SQLs : ['create table t1(id int)', 'drop table t1'], - casInfo : [0, 255, 255, 255], autoCommitMode : 1, dbVersion : '8.4.1'}; - var batchExecuteNoQueryPacket = new BatchExecuteNoQueryPacket(options); - - batchExecuteNoQueryPacket.write(packetWriter); - assert.equal(packetWriter._toBuffer()[3], 52); // Total length - - assert.equal(packetWriter._toBuffer()[4], 0); // CasInfo - assert.equal(packetWriter._toBuffer()[5], 255); // CasInfo - assert.equal(packetWriter._toBuffer()[6], 255); // CasInfo - assert.equal(packetWriter._toBuffer()[7], 255); // CasInfo - - assert.equal(packetWriter._toBuffer()[8], CAS.CASFunctionCode.CAS_FC_EXECUTE_BATCH); - assert.equal(packetWriter._toBuffer()[13], 1); - assert.equal(packetWriter._toBuffer().slice(18, 41).toString(), 'create table t1(id int)'); - assert.equal(packetWriter._toBuffer().slice(41 + 1 + 4, 59).toString(), 'drop table t1'); - - packetReader.write(new Buffer([0, 0, 0, 0, 0, 255, 255, 255, 0, 0, 0, 0])); - batchExecuteNoQueryPacket.parse(packetReader); - - assert.equal(batchExecuteNoQueryPacket.casInfo[0], 0); // CasInfo - assert.equal(batchExecuteNoQueryPacket.casInfo[1], 255); // CasInfo - assert.equal(batchExecuteNoQueryPacket.casInfo[2], 255); // CasInfo - assert.equal(batchExecuteNoQueryPacket.casInfo[3], 255); // CasInfo - - assert.equal(batchExecuteNoQueryPacket.responseCode, 0); - - assert.equal(batchExecuteNoQueryPacket.errorCode, 0); - assert.equal(batchExecuteNoQueryPacket.errorMsg, ''); -} - -console.log('Unit test ' + module.filename.toString() + ' started...'); - -testBatchExecuteNoQueryPacket_01(); - -console.log('Unit test ended OK.'); - diff --git a/test/old_tests/packets/test_ClientInfoExchangePacket.js b/test/old_tests/packets/test_ClientInfoExchangePacket.js deleted file mode 100644 index 24264a8..0000000 --- a/test/old_tests/packets/test_ClientInfoExchangePacket.js +++ /dev/null @@ -1,25 +0,0 @@ -var PacketReader = require('../PacketReader'), - PacketWriter = require('../PacketWriter'), - ClientInfoExchange = require('../ClientInfoExchangePacket'), - assert = require('assert'); - -function testClientInfoExchangePacket_01() { - var packetReader = new PacketReader(); - var packetWriter = new PacketWriter(); - var clientInfoExchange = new ClientInfoExchange(); - - clientInfoExchange.write(packetWriter); - assert.equal(packetWriter._toBuffer().slice(0, 5), 'CUBRK'); - assert.equal(packetWriter._toBuffer()[5], 3); - - packetReader.write(new Buffer([0, 0, 1, 2])); //=258 - clientInfoExchange.parse(packetReader); - assert.equal(clientInfoExchange.newConnectionPort, 258); -} - -console.log('Unit test ' + module.filename.toString() + ' started...'); - -testClientInfoExchangePacket_01(); - -console.log('Unit test ended OK.'); - diff --git a/test/old_tests/packets/test_CloseDatabasePacket.js b/test/old_tests/packets/test_CloseDatabasePacket.js deleted file mode 100644 index b7bfe7b..0000000 --- a/test/old_tests/packets/test_CloseDatabasePacket.js +++ /dev/null @@ -1,45 +0,0 @@ -var PacketReader = require('../PacketReader'), - PacketWriter = require('../PacketWriter'), - CloseDatabasePacket = require('../CloseDatabasePacket'), - CAS = require('../../constants/CASConstants'), - assert = require('assert'); - -function testCloseConnectionPacket_01() { - var packetReader = new PacketReader(); - var packetWriter = new PacketWriter(); - var options = {casInfo : [0, 255, 255, 255]}; - var closeDatabasePacket = new CloseDatabasePacket(options); - - closeDatabasePacket.write(packetWriter); - assert.equal(packetWriter._toBuffer()[3], 1); // Total length - - assert.equal(packetWriter._toBuffer()[4], 0); // CasInfo - assert.equal(packetWriter._toBuffer()[5], 255); // CasInfo - assert.equal(packetWriter._toBuffer()[6], 255); // CasInfo - assert.equal(packetWriter._toBuffer()[7], 255); // CasInfo - - assert.equal(packetWriter._toBuffer()[8], CAS.CASFunctionCode.CAS_FC_CON_CLOSE); - - packetReader.write(new Buffer([0, 0, 0, 0, 0, 255, 255, 255, 0, 0, 0, 0])); - - assert.equal(packetReader._packetLength(), 12); - - closeDatabasePacket.parse(packetReader); - - assert.equal(closeDatabasePacket.casInfo[0], 0); // CasInfo - assert.equal(closeDatabasePacket.casInfo[1], 255); // CasInfo - assert.equal(closeDatabasePacket.casInfo[2], 255); // CasInfo - assert.equal(closeDatabasePacket.casInfo[3], 255); // CasInfo - - assert.equal(closeDatabasePacket.responseCode, 0); - - assert.equal(closeDatabasePacket.errorCode, 0); - assert.equal(closeDatabasePacket.errorMsg, ''); -} - -console.log('Unit test ' + module.filename.toString() + ' started...'); - -testCloseConnectionPacket_01(); - -console.log('Unit test ended OK.'); - diff --git a/test/old_tests/packets/test_CloseQueryPacket.js b/test/old_tests/packets/test_CloseQueryPacket.js deleted file mode 100644 index b5955ea..0000000 --- a/test/old_tests/packets/test_CloseQueryPacket.js +++ /dev/null @@ -1,49 +0,0 @@ -var PacketReader = require('../PacketReader'), - PacketWriter = require('../PacketWriter'), - CloseQueryPacket = require('../CloseQueryPacket'), - CAS = require('../../constants/CASConstants'), - assert = require('assert'); - -function testCloseQueryPacket_01() { - var packetReader = new PacketReader(); - var packetWriter = new PacketWriter(); - var options = {casInfo : [0, 255, 255, 255], dbVersion : '8.4.1'}; - var closeQueryPacket = new CloseQueryPacket(options); - - closeQueryPacket.write(packetWriter); - assert.equal(packetWriter._toBuffer()[3], 14); // Total length - - assert.equal(packetWriter._toBuffer()[4], 0); // CasInfo - assert.equal(packetWriter._toBuffer()[5], 255); // CasInfo - assert.equal(packetWriter._toBuffer()[6], 255); // CasInfo - assert.equal(packetWriter._toBuffer()[7], 255); // CasInfo - - assert.equal(packetWriter._toBuffer()[8], CAS.CASFunctionCode.CAS_FC_CLOSE_REQ_HANDLE); - assert.equal(packetWriter._toBuffer()[12], 4); - assert.equal(packetWriter._toBuffer()[16], 0); - assert.equal(packetWriter._toBuffer()[20], 1); - assert.equal(packetWriter._toBuffer()[21], 0); - - packetReader.write(new Buffer([0, 0, 0, 0, 0, 255, 255, 255, 0, 0, 0, 0])); - - assert.equal(packetReader._packetLength(), 12); - - closeQueryPacket.parse(packetReader); - - assert.equal(closeQueryPacket.casInfo[0], 0); // CasInfo - assert.equal(closeQueryPacket.casInfo[1], 255); // CasInfo - assert.equal(closeQueryPacket.casInfo[2], 255); // CasInfo - assert.equal(closeQueryPacket.casInfo[3], 255); // CasInfo - - assert.equal(closeQueryPacket.responseCode, 0); - - assert.equal(closeQueryPacket.errorCode, 0); - assert.equal(closeQueryPacket.errorMsg, ''); -} - -console.log('Unit test ' + module.filename.toString() + ' started...'); - -testCloseQueryPacket_01(); - -console.log('Unit test ended OK.'); - diff --git a/test/old_tests/packets/test_CommitPacket.js b/test/old_tests/packets/test_CommitPacket.js deleted file mode 100644 index abfdeb0..0000000 --- a/test/old_tests/packets/test_CommitPacket.js +++ /dev/null @@ -1,47 +0,0 @@ -var PacketReader = require('../PacketReader'), - PacketWriter = require('../PacketWriter'), - CommitPacket = require('../CommitPacket'), - CAS = require('../../constants/CASConstants'), - assert = require('assert'); - -function testCommitPacket_01() { - var packetReader = new PacketReader(); - var packetWriter = new PacketWriter(); - var options = {casInfo : [0, 255, 255, 255], dbVersion : '8.4.1'}; - var commitPacket = new CommitPacket(options); - - commitPacket.write(packetWriter); - assert.equal(packetWriter._toBuffer()[3], 6); // Total length - - assert.equal(packetWriter._toBuffer()[4], 0); // CasInfo - assert.equal(packetWriter._toBuffer()[5], 255); // CasInfo - assert.equal(packetWriter._toBuffer()[6], 255); // CasInfo - assert.equal(packetWriter._toBuffer()[7], 255); // CasInfo - - assert.equal(packetWriter._toBuffer()[8], CAS.CASFunctionCode.CAS_FC_END_TRAN); - assert.equal(packetWriter._toBuffer()[12], 1); - assert.equal(packetWriter._toBuffer()[13], CAS.CCITransactionType.CCI_TRAN_COMMIT); - - packetReader.write(new Buffer([0, 0, 0, 0, 0, 255, 255, 255, 0, 0, 0, 0])); - - assert.equal(packetReader._packetLength(), 12); - - commitPacket.parse(packetReader); - - assert.equal(commitPacket.casInfo[0], 0); // CasInfo - assert.equal(commitPacket.casInfo[1], 255); // CasInfo - assert.equal(commitPacket.casInfo[2], 255); // CasInfo - assert.equal(commitPacket.casInfo[3], 255); // CasInfo - - assert.equal(commitPacket.responseCode, 0); - - assert.equal(commitPacket.errorCode, 0); - assert.equal(commitPacket.errorMsg, ''); -} - -console.log('Unit test ' + module.filename.toString() + ' started...'); - -testCommitPacket_01(); - -console.log('Unit test ended OK.'); - diff --git a/test/old_tests/packets/test_ExecuteQueryPacket.js b/test/old_tests/packets/test_ExecuteQueryPacket.js deleted file mode 100644 index 8a6c1f8..0000000 --- a/test/old_tests/packets/test_ExecuteQueryPacket.js +++ /dev/null @@ -1,52 +0,0 @@ -var PacketReader = require('../PacketReader'), - PacketWriter = require('../PacketWriter'), - ExecuteQueryPacket = require('../ExecuteQueryPacket'), - CAS = require('../../constants/CASConstants'), - assert = require('assert'); - -function testExecuteQueryPacket_01() { - var packetReader = new PacketReader(); - var packetWriter = new PacketWriter(); - var options = {sql : 'select * from code', casInfo : [0, 255, 255, 255], autoCommitMode : 1, dbVersion : '8.4.1'}; - var executeQueryPacket = new ExecuteQueryPacket(options); - - executeQueryPacket.write(packetWriter); - assert.equal(packetWriter._toBuffer()[3], 87); // Total length - - assert.equal(packetWriter._toBuffer()[4], 0); // CasInfo - assert.equal(packetWriter._toBuffer()[5], 255); // CasInfo - assert.equal(packetWriter._toBuffer()[6], 255); // CasInfo - assert.equal(packetWriter._toBuffer()[7], 255); // CasInfo - - assert.equal(packetWriter._toBuffer()[8], CAS.CASFunctionCode.CAS_FC_PREPARE_AND_EXECUTE); - assert.equal(packetWriter._toBuffer()[16], 3); - assert.equal(packetWriter._toBuffer().slice(21, 39).toString(), 'select * from code'); - assert.equal(packetWriter._toBuffer()[44], 0); - assert.equal(packetWriter._toBuffer()[49], 1); - assert.equal(packetWriter._toBuffer()[54], CAS.CCIExecutionOption.CCI_EXEC_QUERY_ALL); - assert.equal(packetWriter._toBuffer()[62], 0); - assert.equal(packetWriter._toBuffer()[70], 0); - assert.equal(packetWriter._toBuffer()[82], 0); - assert.equal(packetWriter._toBuffer()[86], 0); - assert.equal(packetWriter._toBuffer()[94], 0); - - packetReader.write(new Buffer([0, 0, 1, 57, 0, 255, 255, 255, 0, 0, 0, 4, 255, 255, 255, 255, 21, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 7, 115, 95, 110, 97, 109, 101, 0, - 0, 0, 0, 1, 0, 0, 0, 0, 5, 99, 111, 100, 101, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 6, 0, 0, 0, 7, 102, - 95, 110, 97, 109, 101, 0, 0, 0, 0, 1, 0, 0, 0, 0, 5, 99, 111, 100, 101, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, - 0, 0, 0, 0, 1, 21, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 1, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 2, 88, 0, 0, 0, 0, 6, 77, 105, 120, 101, 100, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 87, 0, 0, - 0, 0, 6, 87, 111, 109, 97, 110, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 77, 0, 0, 0, 0, 4, 77, 97, 110, 0, 0, 0, 0, - 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 66, 0, 0, 0, 0, 7, 66, 114, 111, 110, 122, 101, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2, 83, 0, 0, 0, 0, 7, 83, 105, 108, 118, 101, 114, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 71, 0, 0, 0, 0, 5, - 71, 111, 108, 100, 0])); - - var resultSet = executeQueryPacket.parse(packetReader).resultSet; - assert.equal(resultSet, '{"ColumnNames":["s_name","f_name"],"ColumnDataTypes":["Char","String"],"RowsCount":6,"ColumnValues":[["X","Mixed"],["W","Woman"],["M","Man"],["B","Bronze"],["S","Silver"],["G","Gold"]]}'); -} - -console.log('Unit test ' + module.filename.toString() + ' started...'); - -testExecuteQueryPacket_01(); - -console.log('Unit test ended OK.'); - diff --git a/test/old_tests/packets/test_FetchPacket.js b/test/old_tests/packets/test_FetchPacket.js deleted file mode 100644 index 39f3100..0000000 --- a/test/old_tests/packets/test_FetchPacket.js +++ /dev/null @@ -1,66 +0,0 @@ -var PacketReader = require('../PacketReader'), - PacketWriter = require('../PacketWriter'), - ExecuteQueryPacket = require('../ExecuteQueryPacket'), - FetchPacket = require('../FetchPacket'), - CAS = require('../../constants/CASConstants'), - assert = require('assert'); - -function testFetchPacket() { - var packetReader = new PacketReader(); - var packetWriter = new PacketWriter(); - var options = - { - casInfo : [0, 255, 255, 255], - dbVersion : '8.4.1' - }; - - packetReader = new PacketReader(); - packetWriter = new PacketWriter(); - options = {sql : 'select * from code', casInfo : [0, 255, 255, 255], autoCommitMode : 1, dbVersion : '8.4.1'}; - var executeQueryPacket = new ExecuteQueryPacket(options); - executeQueryPacket.write(packetWriter); - packetReader.write(new Buffer([0, 0, 1, 57, 0, 255, 255, 255, 0, 0, 0, 4, 255, 255, 255, 255, 21, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 7, 115, 95, 110, 97, 109, 101, 0, - 0, 0, 0, 1, 0, 0, 0, 0, 5, 99, 111, 100, 101, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 6, 0, 0, 0, 7, 102, - 95, 110, 97, 109, 101, 0, 0, 0, 0, 1, 0, 0, 0, 0, 5, 99, 111, 100, 101, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, - 0, 0, 0, 0, 1, 21, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 1, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 2, 88, 0, 0, 0, 0, 6, 77, 105, 120, 101, 100, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 87, 0, 0, - 0, 0, 6, 87, 111, 109, 97, 110, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 77, 0, 0, 0, 0, 4, 77, 97, 110, 0, 0, 0, 0, - 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 66, 0, 0, 0, 0, 7, 66, 114, 111, 110, 122, 101, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2, 83, 0, 0, 0, 0, 7, 83, 105, 108, 118, 101, 114, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 71, 0, 0, 0, 0, 5, - 71, 111, 108, 100, 0])); - var resultSet = executeQueryPacket.parse(packetReader).resultSet; - assert.equal(resultSet, '{"ColumnNames":["s_name","f_name"],"ColumnDataTypes":["Char","String"],"RowsCount":6,"ColumnValues":[["X","Mixed"],["W","Woman"],["M","Man"],["B","Bronze"],["S","Silver"],["G","Gold"]]}'); - - packetReader = new PacketReader(); - packetWriter = new PacketWriter(); - var fetchPacket = new FetchPacket(options); - fetchPacket.write(packetWriter, executeQueryPacket); - assert.equal(packetWriter._toBuffer()[3], 38); // Total length - assert.equal(packetWriter._toBuffer()[8], CAS.CASFunctionCode.CAS_FC_FETCH); - assert.equal(packetWriter._toBuffer()[16], 4); - assert.equal(packetWriter._toBuffer()[24], 7); - assert.equal(packetWriter._toBuffer()[32], 100); - assert.equal(packetWriter._toBuffer()[37], 0); - assert.equal(packetWriter._toBuffer()[45], 0); - - packetReader.write(new Buffer([0, 0, 0, 0, - 0, 255, 255, 255, - 0, 0, 0, 0, - 0, 0, 0, 0])); - fetchPacket.parse(packetReader, executeQueryPacket); - - assert.equal(fetchPacket.casInfo[0], 0); // CasInfo - assert.equal(fetchPacket.casInfo[1], 255); // CasInfo - assert.equal(fetchPacket.casInfo[2], 255); // CasInfo - assert.equal(fetchPacket.casInfo[3], 255); // CasInfo - - assert.equal(fetchPacket.responseCode, 0); - assert.equal(fetchPacket.errorCode, 0); - assert.equal(fetchPacket.errorMsg, ''); - - assert.equal(fetchPacket.tupleCount, 0); -} - -console.log('Unit test ' + module.filename.toString() + ' started...'); -testFetchPacket(); -console.log('Unit test ended OK.'); diff --git a/test/old_tests/packets/test_GetDbParameterPacket.js b/test/old_tests/packets/test_GetDbParameterPacket.js deleted file mode 100644 index e36e0a9..0000000 --- a/test/old_tests/packets/test_GetDbParameterPacket.js +++ /dev/null @@ -1,43 +0,0 @@ -var PacketReader = require('../PacketReader'), - PacketWriter = require('../PacketWriter'), - GetDbParameterPacket = require('../GetDbParameterPacket'), - CAS = require('../../constants/CASConstants'), - assert = require('assert'); - -function testGetDbParameter() { - var packetReader = new PacketReader(); - var packetWriter = new PacketWriter(); - var options = - { - casInfo : [0, 255, 255, 255], - parameter : CAS.CCIDbParam.CCI_PARAM_MAX_STRING_LENGTH - }; - var getDbParameterPacket = new GetDbParameterPacket(options); - - getDbParameterPacket.write(packetWriter); - assert.equal(packetWriter._toBuffer()[3], 9); // Total length - assert.equal(packetWriter._toBuffer()[8], 4); - assert.equal(packetWriter._toBuffer()[12], CAS.CASFunctionCode.CAS_FC_GET_DB_PARAMETER); - assert.equal(packetWriter._toBuffer()[16], CAS.CCIDbParam.CCI_PARAM_MAX_STRING_LENGTH); - - packetReader.write(new Buffer([0, 0, 0, 0, - 0, 255, 255, 255, - 0, 0, 0, 0, - 0, 0, 0, 99])); - getDbParameterPacket.parse(packetReader); - - assert.equal(getDbParameterPacket.casInfo[0], 0); // CasInfo - assert.equal(getDbParameterPacket.casInfo[1], 255); // CasInfo - assert.equal(getDbParameterPacket.casInfo[2], 255); // CasInfo - assert.equal(getDbParameterPacket.casInfo[3], 255); // CasInfo - - assert.equal(getDbParameterPacket.responseCode, 0); - assert.equal(getDbParameterPacket.errorCode, 0); - assert.equal(getDbParameterPacket.errorMsg, ''); - - assert.equal(getDbParameterPacket.value, 99); -} - -console.log('Unit test ' + module.filename.toString() + ' started...'); -testGetDbParameter(); -console.log('Unit test ended OK.'); diff --git a/test/old_tests/packets/test_GetEngineVersionPacket.js b/test/old_tests/packets/test_GetEngineVersionPacket.js deleted file mode 100644 index 5ae8b76..0000000 --- a/test/old_tests/packets/test_GetEngineVersionPacket.js +++ /dev/null @@ -1,50 +0,0 @@ -var PacketReader = require('../PacketReader'), - PacketWriter = require('../PacketWriter'), - GetEngineVersionPacket = require('../GetEngineVersionPacket'), - CAS = require('../../constants/CASConstants'), - assert = require('assert'); - -function testGetEngineVersionPacket_01() { - var packetReader = new PacketReader(); - var packetWriter = new PacketWriter(); - var options = {casInfo : [0, 255, 255, 255]}; - var getEngineVersionPacket = new GetEngineVersionPacket(options); - - getEngineVersionPacket.write(packetWriter); - assert.equal(packetWriter._toBuffer()[3], 6); // Total length - - assert.equal(packetWriter._toBuffer()[4], 0); // CasInfo - assert.equal(packetWriter._toBuffer()[5], 255); // CasInfo - assert.equal(packetWriter._toBuffer()[6], 255); // CasInfo - assert.equal(packetWriter._toBuffer()[7], 255); // CasInfo - - assert.equal(packetWriter._toBuffer()[8], CAS.CASFunctionCode.CAS_FC_GET_DB_VERSION); - assert.equal(packetWriter._toBuffer()[12], 1); - assert.equal(packetWriter._toBuffer()[13], 1); - - packetReader.write(new Buffer([0, 0, 0, 15, - 0, 255, 255, 255, - 0, 0, 0, 0])); - packetReader._append(new Buffer('8.4.1.0056')); - packetReader._append(new Buffer([0])); - getEngineVersionPacket.parse(packetReader); - - assert.equal(getEngineVersionPacket.casInfo[0], 0); // CasInfo - assert.equal(getEngineVersionPacket.casInfo[1], 255); // CasInfo - assert.equal(getEngineVersionPacket.casInfo[2], 255); // CasInfo - assert.equal(getEngineVersionPacket.casInfo[3], 255); // CasInfo - - assert.equal(getEngineVersionPacket.responseCode, 0); - - assert.equal(getEngineVersionPacket.errorCode, 0); - assert.equal(getEngineVersionPacket.errorMsg, ''); - - assert.equal(getEngineVersionPacket.engineVersion, '8.4.1.0056'); -} - -console.log('Unit test ' + module.filename.toString() + ' started...'); - -testGetEngineVersionPacket_01(); - -console.log('Unit test ended OK.'); - diff --git a/test/old_tests/packets/test_GetSchemaPacket.js b/test/old_tests/packets/test_GetSchemaPacket.js deleted file mode 100644 index 483de76..0000000 --- a/test/old_tests/packets/test_GetSchemaPacket.js +++ /dev/null @@ -1,68 +0,0 @@ -var PacketReader = require('../PacketReader'), - PacketWriter = require('../PacketWriter'), - GetSchemaPacket = require('../GetSchemaPacket.js'), - CAS = require('../../constants/CASConstants'), - assert = require('assert'); - -function test_GetSchemaPacket_01() { - var packetReader = new PacketReader(); - var packetWriter = new PacketWriter(); - var options = { - casInfo : [0, 255, 255, 255], - tableNamePattern : null, - schemaType : CAS.CUBRIDSchemaType.CCI_SCH_CLASS, - dbVersion : '8.4.1'}; - var getSchemaPacket = new GetSchemaPacket(options); - - getSchemaPacket.writeRequestSchema(packetWriter); - assert.equal(packetWriter._toBuffer()[3], 1 + 5 * 4 + 1); // Total length - - assert.equal(packetWriter._toBuffer()[4], 0); // CasInfo - assert.equal(packetWriter._toBuffer()[5], 255); // CasInfo - assert.equal(packetWriter._toBuffer()[6], 255); // CasInfo - assert.equal(packetWriter._toBuffer()[7], 255); // CasInfo - - assert.equal(packetWriter._toBuffer()[8], CAS.CASFunctionCode.CAS_FC_SCHEMA_INFO); - assert.equal(packetWriter._toBuffer()[16], CAS.CUBRIDSchemaType.CCI_SCH_CLASS); - assert.equal(packetWriter._toBuffer()[21], 0); - assert.equal(packetWriter._toBuffer()[28], 1); - assert.equal(packetWriter._toBuffer()[29], 3); - - packetReader.write(new Buffer([0, 0, 0, 0, 0, 255, 255, 255, 0, 0, 0, 1])); - - assert.equal(packetReader._packetLength(), 12); - - getSchemaPacket.parseRequestSchema(packetReader); - - assert.equal(getSchemaPacket.casInfo[0], 0); // CasInfo - assert.equal(getSchemaPacket.casInfo[1], 255); // CasInfo - assert.equal(getSchemaPacket.casInfo[2], 255); // CasInfo - assert.equal(getSchemaPacket.casInfo[3], 255); // CasInfo - - assert.equal(getSchemaPacket.responseCode, 1); - - assert.equal(getSchemaPacket.errorCode, 0); - assert.equal(getSchemaPacket.errorMsg, ''); - - packetWriter = new PacketWriter(); - getSchemaPacket.writeFetchSchema(packetWriter); - assert.equal(packetWriter._toBuffer()[3], 38); // Total length - - assert.equal(packetWriter._toBuffer()[4], 0); // CasInfo - assert.equal(packetWriter._toBuffer()[5], 255); // CasInfo - assert.equal(packetWriter._toBuffer()[6], 255); // CasInfo - assert.equal(packetWriter._toBuffer()[7], 255); // CasInfo - - assert.equal(packetWriter._toBuffer()[8], CAS.CASFunctionCode.CAS_FC_FETCH); - assert.equal(packetWriter._toBuffer()[16], 1); - assert.equal(packetWriter._toBuffer()[24], 1); - assert.equal(packetWriter._toBuffer()[32], 0); - assert.equal(packetWriter._toBuffer()[37], 0); - assert.equal(packetWriter._toBuffer()[45], 0); -} - -console.log('Unit test ' + module.filename.toString() + ' started...'); - -test_GetSchemaPacket_01(); - -console.log('Unit test ended OK.'); diff --git a/test/old_tests/packets/test_LOBNewPacket.js b/test/old_tests/packets/test_LOBNewPacket.js deleted file mode 100644 index f57cdb5..0000000 --- a/test/old_tests/packets/test_LOBNewPacket.js +++ /dev/null @@ -1,52 +0,0 @@ -var PacketReader = require('../PacketReader'), - PacketWriter = require('../PacketWriter'), - LOBNewPacket = require('../LOBNewPacket'), - CAS = require('../../constants/CASConstants'), - assert = require('assert'); - -function testLOBReadPacket_01() { - var packetReader = new PacketReader(); - var packetWriter = new PacketWriter(); - var options = {casInfo : [0, 255, 255, 255], lobType : CAS.CUBRIDDataType.CCI_U_TYPE_BLOB, dbVersion : '8.4.1'}; - var lobnewPacket = new LOBNewPacket(options); - - lobnewPacket.write(packetWriter); - assert.equal(packetWriter._toBuffer()[3], 9); // Total length - - assert.equal(packetWriter._toBuffer()[4], 0); // CasInfo - assert.equal(packetWriter._toBuffer()[5], 255); // CasInfo - assert.equal(packetWriter._toBuffer()[6], 255); // CasInfo - assert.equal(packetWriter._toBuffer()[7], 255); // CasInfo - - assert.equal(packetWriter._toBuffer()[8], CAS.CASFunctionCode.CAS_FC_LOB_NEW); - assert.equal(packetWriter._toBuffer()[12], 4); - assert.equal(packetWriter._toBuffer()[16], CAS.CUBRIDDataType.CCI_U_TYPE_BLOB); - - packetReader.write(new Buffer([0, 0, 0, 99, 1, 255, 255, 255, 0, 0, 0, 95, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 79, 102, 105, 108, 101, 58, 67, 58, 92, 67, 85, 66, 82, 73, 68, 92, 100, 97, 116, - 97, 98, 97, 115, 101, 115, 92, 100, 101, 109, 111, 100, 98, 47, 108, 111, 98, 47, 99, - 101, 115, 95, 50, 49, 50, 47, 99, 101, 115, 95, 116, 101, 109, 112, 46, 48, 48, 48, 48, - 49, 51, 54, 50, 49, 51, 54, 54, 49, 51, 53, 52, 54, 48, 48, 48, 95, 48, 48, 52, 49, 0, - 0, 0, 0, 30, 0, 255, 255, 255, 0, 0, 0, 1, 0, 0, 0, 0, 1, 20, 0, 0, 0, 1, 0, 0, 22, 128, - 11, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])); - var lobHandle = lobnewPacket.parse(packetReader).result; - - assert.equal(lobnewPacket.casInfo[0], 1); // CasInfo - assert.equal(lobnewPacket.casInfo[1], 255); // CasInfo - assert.equal(lobnewPacket.casInfo[2], 255); // CasInfo - assert.equal(lobnewPacket.casInfo[3], 255); // CasInfo - - assert.equal(lobnewPacket.responseCode, 95); - assert.equal(lobnewPacket.errorCode, 0); - assert.equal(lobnewPacket.errorMsg, ''); - assert.equal(lobHandle.lobType, CAS.CUBRIDDataType.CCI_U_TYPE_BLOB); - assert.equal(lobHandle.fileLocator, "file:C:\\CUBRID\\databases\\demodb/lob/ces_212/ces_temp.00001362136613546000_0041"); - assert.equal(lobHandle.lobLength, 0); -} - -console.log('Unit test ' + module.filename.toString() + ' started...'); - -testLOBReadPacket_01(); - -console.log('Unit test ended OK.'); - diff --git a/test/old_tests/packets/test_LOBReadPacket.js b/test/old_tests/packets/test_LOBReadPacket.js deleted file mode 100644 index 6f36066..0000000 --- a/test/old_tests/packets/test_LOBReadPacket.js +++ /dev/null @@ -1,75 +0,0 @@ -var PacketReader = require('../PacketReader'), - PacketWriter = require('../PacketWriter'), - LOBReadPacket = require('../LOBReadPacket'), - CAS = require('../../constants/CASConstants'), - assert = require('assert'); - -function testLOBReadPacket_01() { - var packetReader = new PacketReader(); - var packetWriter = new PacketWriter(); - - var packedLobHandle = new Buffer([0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 79, 102, 105, 108, 101, 58, - 67, 58, 92, 67, 85, 66, 82, 73, 68, 92, 100, 97, 116, 97, 98, 97, 115, 101, 115, 92, 100, 101, 109, 111, 100, - 98, 47, 108, 111, 98, 47, 99, 101, 115, 95, 48, 56, 50, 47, 116, 101, 115, 116, 95, 108, 111, 98, 46, 48, 48, - 48, 48, 49, 51, 54, 49, 57, 55, 54, 53, 52, 50, 48, 48, 48, 48, 48, 48, 95, 56, 49, 52, 53, 0 - ]); - var lobHandle = - { - lobType : CAS.CUBRIDDataType.CCI_U_TYPE_BLOB, // BLOB type - packedLobHandle : packedLobHandle, - fileLocator : 'file:C:\\CUBRID\\databases\\demodb/lob/ces_670/test_lob.00001361976357078000_1538', - lobLength : 4 - }; - var options = { - casInfo : [0, 255, 255, 255], - lobObject : lobHandle, - position : 0, - lengthToRead : 4, - dbVersion : '8.4.1' - }; - var lobReadPacket = new LOBReadPacket(options); - lobReadPacket.write(packetWriter); - assert.equal(packetWriter._toBuffer()[3], 120); // Total length - - assert.equal(packetWriter._toBuffer()[4], 0); // CasInfo - assert.equal(packetWriter._toBuffer()[5], 255); // CasInfo - assert.equal(packetWriter._toBuffer()[6], 255); // CasInfo - assert.equal(packetWriter._toBuffer()[7], 255); // CasInfo - - assert.equal(packetWriter._toBuffer()[8], CAS.CASFunctionCode.CAS_FC_LOB_READ); - assert.equal(packetWriter._toBuffer()[12], 95); - for (var i = 0; i < packedLobHandle.length; i++) { - assert.equal(packetWriter._toBuffer().slice(13, 110)[i], packedLobHandle[i]); - } - assert.equal(packetWriter._toBuffer()[111], 8); - assert.equal(packetWriter._toBuffer()[119], 0); - assert.equal(packetWriter._toBuffer()[127], 4); - - packetReader.write(new Buffer([0, 0, 0, 15, - 0, 255, 255, 255, - 0, 0, 0, 4, - 1, 2, 3, 4])); - lobReadPacket.parse(packetReader); - - assert.equal(lobReadPacket.casInfo[0], 0); // CasInfo - assert.equal(lobReadPacket.casInfo[1], 255); // CasInfo - assert.equal(lobReadPacket.casInfo[2], 255); // CasInfo - assert.equal(lobReadPacket.casInfo[3], 255); // CasInfo - - assert.equal(lobReadPacket.responseCode, 4); - - assert.equal(lobReadPacket.errorCode, 0); - assert.equal(lobReadPacket.errorMsg, ''); - - assert.equal(lobReadPacket.lobBuffer[0], 1); - assert.equal(lobReadPacket.lobBuffer[1], 2); - assert.equal(lobReadPacket.lobBuffer[2], 3); - assert.equal(lobReadPacket.lobBuffer[3], 4); -} - -console.log('Unit test ' + module.filename.toString() + ' started...'); - -testLOBReadPacket_01(); - -console.log('Unit test ended OK.'); - diff --git a/test/old_tests/packets/test_LOBWritePacket.js b/test/old_tests/packets/test_LOBWritePacket.js deleted file mode 100644 index cec92b7..0000000 --- a/test/old_tests/packets/test_LOBWritePacket.js +++ /dev/null @@ -1,77 +0,0 @@ -var PacketReader = require('../PacketReader'), - PacketWriter = require('../PacketWriter'), - LOBWritePacket = require('../LOBWritePacket'), - CAS = require('../../constants/CASConstants'), - assert = require('assert'); - -function testLOBReadPacket_01() { - var packetReader = new PacketReader(); - var packetWriter = new PacketWriter(); - var packedLobHandle = new Buffer([0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 79, 102, 105, 108, 101, 58, - 67, 58, 92, 67, 85, 66, 82, 73, 68, 92, 100, 97, 116, 97, 98, 97, 115, 101, 115, 92, 100, 101, 109, 111, 100, - 98, 47, 108, 111, 98, 47, 99, 101, 115, 95, 48, 56, 50, 47, 116, 101, 115, 116, 95, 108, 111, 98, 46, 48, 48, - 48, 48, 49, 51, 54, 49, 57, 55, 54, 53, 52, 50, 48, 48, 48, 48, 48, 48, 95, 56, 49, 52, 53, 0 - ]); - var lobHandle = - { - lobType : CAS.CUBRIDDataType.CCI_U_TYPE_BLOB, // BLOB type - packedLobHandle : packedLobHandle, - fileLocator : 'file:C:\\CUBRID\\databases\\demodb/lob/ces_670/test_lob.00001361976357078000_1538', - lobLength : 4 - }; - var value = new Buffer([1, 2, 3, 4]); - - var options = { - casInfo : [0, 255, 255, 255], - lobObject : lobHandle, - position : 0, - data : value, - writeLen : 4, - dbVersion : '8.4.1' - }; - var lobWritePacket = new LOBWritePacket(options); - - lobWritePacket.write(packetWriter); - assert.equal(packetWriter._toBuffer()[3], 120); // Total length - - assert.equal(packetWriter._toBuffer()[4], 0); // CasInfo - assert.equal(packetWriter._toBuffer()[5], 255); // CasInfo - assert.equal(packetWriter._toBuffer()[6], 255); // CasInfo - assert.equal(packetWriter._toBuffer()[7], 255); // CasInfo - - assert.equal(packetWriter._toBuffer()[8], CAS.CASFunctionCode.CAS_FC_LOB_WRITE); - assert.equal(packetWriter._toBuffer()[12], 95); - for (var i = 0; i < packedLobHandle.length; i++) { - assert.equal(packetWriter._toBuffer().slice(13, 110)[i], packedLobHandle[i]); - } - assert.equal(packetWriter._toBuffer()[111], 8); - assert.equal(packetWriter._toBuffer()[119], 0); - assert.equal(packetWriter._toBuffer()[123], 4); - assert.equal(packetWriter._toBuffer()[124], 1); - assert.equal(packetWriter._toBuffer()[125], 2); - assert.equal(packetWriter._toBuffer()[126], 3); - assert.equal(packetWriter._toBuffer()[127], 4); - - packetReader.write(new Buffer([0, 0, 0, 4, - 0, 255, 255, 255, - 0, 0, 0, 4, - 1, 2, 3, 4])); - lobWritePacket.parse(packetReader); - - assert.equal(lobWritePacket.casInfo[0], 0); // CasInfo - assert.equal(lobWritePacket.casInfo[1], 255); // CasInfo - assert.equal(lobWritePacket.casInfo[2], 255); // CasInfo - assert.equal(lobWritePacket.casInfo[3], 255); // CasInfo - - assert.equal(lobWritePacket.responseCode, 4); - - assert.equal(lobWritePacket.errorCode, 0); - assert.equal(lobWritePacket.errorMsg, ''); -} - -console.log('Unit test ' + module.filename.toString() + ' started...'); - -testLOBReadPacket_01(); - -console.log('Unit test ended OK.'); - diff --git a/test/old_tests/packets/test_OpenDatabasePacket.js b/test/old_tests/packets/test_OpenDatabasePacket.js deleted file mode 100644 index 50ed2a6..0000000 --- a/test/old_tests/packets/test_OpenDatabasePacket.js +++ /dev/null @@ -1,44 +0,0 @@ -var PacketReader = require('../PacketReader'), - PacketWriter = require('../PacketWriter'), - OpenDatabasePacket = require('../OpenDatabasePacket'), - CAS = require('../../constants/CASConstants'), - assert = require('assert'); - -function testLoginToDatabasePacket_01() { - var packetReader = new PacketReader(); - var packetWriter = new PacketWriter(); - var options = {database : 'demodb', user : 'public', password : ''}; - var openDatabasePacket = new OpenDatabasePacket(options); - - openDatabasePacket.write(packetWriter); - assert.equal(packetWriter._toBuffer().slice(0, 6).toString(), options.database); - assert.equal(packetWriter._toBuffer().slice(32, 38).toString(), options.user); - assert.equal(packetWriter._toBuffer().slice(64, 65)[0], 0); - - packetReader.write(new Buffer([0, 0, 0, 15, - 0, 255, 255, 255, - 0, 0, 0, 0, - 5, 5, 5, 5, 5, 5, 5, 5, - 0, 0, 0, 3])); - openDatabasePacket.parse(packetReader); - - assert.equal(openDatabasePacket.casInfo[0], 0); // CasInfo - assert.equal(openDatabasePacket.casInfo[1], 255); // CasInfo - assert.equal(openDatabasePacket.casInfo[2], 255); // CasInfo - assert.equal(openDatabasePacket.casInfo[3], 255); // CasInfo - - assert.equal(openDatabasePacket.responseCode, 0); - - assert.equal(openDatabasePacket.errorCode, 0); - assert.equal(openDatabasePacket.errorMsg, ''); - - assert.equal(openDatabasePacket.brokerInfo[0], 5); - assert.equal(openDatabasePacket.sessionId, 3); -} - -console.log('Unit test ' + module.filename.toString() + ' started...'); - -testLoginToDatabasePacket_01(); - -console.log('Unit test ended OK.'); - diff --git a/test/old_tests/packets/test_PacketWriter_PacketReader.js b/test/old_tests/packets/test_PacketWriter_PacketReader.js deleted file mode 100644 index bbd4db0..0000000 --- a/test/old_tests/packets/test_PacketWriter_PacketReader.js +++ /dev/null @@ -1,301 +0,0 @@ -var PacketReader = require('../PacketReader'), - PacketWriter = require('../PacketWriter'), - assert = require('assert'); - -var bValue = 0xEF; //=239 -var cValue = 'x'; -var shortValue = 0x70; -var iValue = 0x7ABC; -var shortValueSigned = 0x8001; -var iValueSigned = 0x80000001; -var sValue = '0987654321'; -var dValue = new Date(2012, 1, 2, 0, 0, 0, 0); - -function createPacketReader(bytes) { - var buffer = new Buffer(bytes); - var parser = new PacketReader(); - - parser._append(buffer); - - return parser; -} - -function testByte(value) { - var packetWriter = new PacketWriter(); - packetWriter._writeByte(value); - var packetReader = new PacketReader(); - packetReader.write(packetWriter._toBuffer()); - - var newValue = packetReader._parseByte(); - assert.equal(newValue, value); -} - -function testChar(value) { - var packetWriter = new PacketWriter(); - packetWriter._writeChar(value); - var packetReader = new PacketReader(); - packetReader.write(packetWriter._toBuffer()); - - var newValue = packetReader._parseChar(); - assert.equal(newValue, value); -} - -function testShort(value) { - var packetWriter = new PacketWriter(); - packetWriter._writeShort(value); - var packetReader = new PacketReader(); - packetReader.write(packetWriter._toBuffer()); - - var newValue = packetReader._parseShort(); - assert.equal(newValue, value); -} - -function testShortSigned(value, expectedValue) { - var packetWriter = new PacketWriter(); - packetWriter._writeShort(value); - var packetReader = new PacketReader(); - packetReader.write(packetWriter._toBuffer()); - - var newValue = packetReader._parseShort(); - assert.equal(newValue, expectedValue); -} - -function testInt(value) { - var packetWriter = new PacketWriter(); - packetWriter._writeInt(value); - var packetReader = new PacketReader(); - packetReader.write(packetWriter._toBuffer()); - - var newValue = packetReader._parseInt(); - assert.equal(newValue, value); -} - -function testIntSigned(value, expectedValue) { - var packetWriter = new PacketWriter(); - packetWriter._writeInt(value); - var packetReader = new PacketReader(); - packetReader.write(packetWriter._toBuffer()); - - var newValue = packetReader._parseInt(); - assert.equal(newValue, expectedValue); -} - -function testDate(year, month, day) { - var packetWriter = new PacketWriter(); - packetWriter._writeDate(year, month, day); - var packetReader = new PacketReader(); - packetReader.write(packetWriter._toBuffer()); - - var newValue = packetReader._parseDate(); - assert.equal(newValue.getUTCFullYear(), year); - assert.equal(newValue.getUTCMonth(), month - 1); - assert.equal(newValue.getUTCDate(), day); -} - -function testTime(hour, min, sec) { - var packetWriter = new PacketWriter(); - packetWriter._writeTime(hour, min, sec); - var packetReader = new PacketReader(); - packetReader.write(packetWriter._toBuffer()); - - var newValue = packetReader._parseTime(); - assert.equal(newValue.getUTCHours(), hour); - assert.equal(newValue.getUTCMinutes(), min); - assert.equal(newValue.getUTCSeconds(), sec); -} - -function testDateTime(year, month, day, hour, min, sec, msec) { - var packetWriter = new PacketWriter(); - packetWriter._writeDateTime(year, month, day, hour, min, sec, msec); - var packetReader = new PacketReader(); - packetReader.write(packetWriter._toBuffer()); - - var newValue = packetReader._parseDateTime(); - assert.equal(newValue.getUTCFullYear(), year); - assert.equal(newValue.getUTCMonth(), month - 1); - assert.equal(newValue.getUTCDate(), day); - assert.equal(newValue.getUTCHours(), hour); - assert.equal(newValue.getUTCMinutes(), min); - assert.equal(newValue.getUTCSeconds(), sec); - assert.equal(newValue.getUTCMilliseconds(), msec); -} - -function testTimestamp(year, month, day, hour, min, sec) { - var packetWriter = new PacketWriter(); - packetWriter._writeTimestamp(year, month, day, hour, min, sec); - var packetReader = new PacketReader(); - packetReader.write(packetWriter._toBuffer()); - - var newValue = packetReader._parseTimeStamp(); - assert.equal(newValue.getUTCFullYear(), year); - assert.equal(newValue.getUTCMonth(), month - 1); - assert.equal(newValue.getUTCDate(), day); - assert.equal(newValue.getUTCHours(), hour); - assert.equal(newValue.getUTCMinutes(), min); - assert.equal(newValue.getUTCSeconds(), sec); -} - -function testString(value) { - var packetWriter = new PacketWriter(); - packetWriter._writeNullTerminatedString(value); - var packetReader = new PacketReader(); - packetReader.write(packetWriter._toBuffer()); - - var len = packetReader._parseInt(); - var newValue = packetReader._parseNullTerminatedString(len); - assert.equal(newValue, value); -} - -function testFixedLengthString(value) { - var packetWriter = new PacketWriter(); - packetWriter._writeFixedLengthString(value, 'x', 15); - var packetReader = new PacketReader(); - packetReader.write(packetWriter._toBuffer()); - - var newValue = packetReader._parseString(15); - assert.equal(newValue, value + 'xxxxx'); -} - -function testFiller() { - var packetWriter = new PacketWriter(); - packetWriter._writeFiller(5, 'x'); - var packetReader = new PacketReader(); - packetReader.write(packetWriter._toBuffer()); - - var newValue = packetReader._parseString(5); - assert.equal(newValue, 'xxxxx'); - - packetWriter = new PacketWriter(); - packetWriter._writeFiller(5, 120); - packetReader = new PacketReader(); - packetReader.write(packetWriter._toBuffer()); - - newValue = packetReader._parseString(5); - assert.equal(newValue, 'xxxxx'); -} - -function testAllTypes(value1, value2, value3) { - var packetWriter = new PacketWriter(); - packetWriter._writeByte(value1); - packetWriter._writeInt(value2); - packetWriter._writeNullTerminatedString(value3); - var packetReader = new PacketReader(); - packetReader.write(packetWriter._toBuffer()); - - var newValue1 = packetReader._parseByte(); - assert.equal(newValue1, value1); - - var newValue2 = packetReader._parseInt(); - assert.equal(newValue2, value2); - - var len = packetReader._parseInt(); - var newValue3 = packetReader._parseNullTerminatedString(len); - assert.equal(newValue3, value3); -} - -function testPacketReaderBytes() { - var packetReader = createPacketReader([1, 2]); - - var newValue = packetReader._parseBytes(2); - assert.equal(newValue[0], 1); - assert.equal(newValue[1], 2); -} - -function testPacketReaderBuffer() { - var packetWriter = new PacketWriter(); - packetWriter._writeBuffer(new Buffer([1, 2])); - - var packetReader = new PacketReader(); - packetReader.write(packetWriter._toBuffer()); - var newValue = packetReader._parseBuffer(2); - assert.equal(newValue[0], 1); - assert.equal(newValue[1], 2); -} - -function testLong(value) { - var packetWriter = new PacketWriter(); - packetWriter._writeLong(value); - var packetReader = new PacketReader(); - packetReader.write(packetWriter._toBuffer()); - var newValue = packetReader._parseLong(); - assert.equal(newValue, value); -} - -function testFloat(value) { - var packetWriter = new PacketWriter(); - packetWriter._writeFloat(value); - var packetReader = new PacketReader(); - packetReader.write(packetWriter._toBuffer()); - var newValue = packetReader._parseFloat(); - assert.equal(newValue, value); -} - -function testDouble(value) { - var packetWriter = new PacketWriter(); - packetWriter._writeDouble(value); - var packetReader = new PacketReader(); - packetReader.write(packetWriter._toBuffer()); - var newValue = packetReader._parseDouble(); - assert.equal(newValue, value); -} - -function testNumeric(value) { - var packetWriter = new PacketWriter(); - packetWriter._writeNumeric(value); - var packetReader = new PacketReader(); - packetReader.write(packetWriter._toBuffer()); - var length = packetReader._parseInt(); - var newValue = packetReader._parseNumeric(length); - assert.equal(newValue, value); -} - -function testObject() { - var packetWriter = new PacketWriter(); - packetWriter._writeBuffer(new Buffer([0, 0, 0, 0, 0, 1, 0, 2])); - var packetReader = new PacketReader(); - packetReader.write(packetWriter._toBuffer()); - var newValue = packetReader._parseObject(); - assert.equal(newValue, 'OID:@0|1|2'); -} -///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -console.log('Unit test ' + module.filename.toString() + ' started...'); - -// Test integer-types -testByte(bValue); -testShort(shortValue); -testInt(iValue); - -// Test signed integer-types -testShortSigned(shortValueSigned, -32767); -//testShortSigned(shortValueSigned, -1); -testIntSigned(iValueSigned, -2147483647); -//testIntSigned(iValueSigned, -1); - -// Test strings -testChar(cValue); -testString(sValue); -testFixedLengthString(sValue); - -// Test dates -testDate(dValue.getFullYear(), dValue.getMonth(), dValue.getDate()); -testTime(dValue.getHours(), dValue.getMinutes(), dValue.getSeconds()); -testDateTime(dValue.getFullYear(), dValue.getMonth(), dValue.getDate(), - dValue.getHours(), dValue.getMinutes(), dValue.getSeconds(), dValue.getMilliseconds()); -testTimestamp(dValue.getFullYear(), dValue.getMonth(), dValue.getDate(), - dValue.getHours(), dValue.getMinutes(), dValue.getSeconds()); - -// Other tests -testAllTypes(bValue, iValue, sValue); -testPacketReaderBytes(); -testPacketReaderBuffer(); -testFiller(); - -testLong(Math.pow(2, 53) - 152156); -testLong(Math.pow(2, 53) + 100); // Overflow -testFloat(4.5); -testDouble(3.14); -testNumeric(1.5); -testObject(); - -console.log('Unit test ended OK.'); diff --git a/test/old_tests/packets/test_PrepareExecuteOldProtocolPacket.js b/test/old_tests/packets/test_PrepareExecuteOldProtocolPacket.js deleted file mode 100644 index 57d762a..0000000 --- a/test/old_tests/packets/test_PrepareExecuteOldProtocolPacket.js +++ /dev/null @@ -1,103 +0,0 @@ -var PacketReader = require('../PacketReader'), - PacketWriter = require('../PacketWriter'), - PrepareExecuteOldProtocolPacket = require('../PrepareExecuteOldProtocolPacket'), - CAS = require('../../constants/CASConstants'), - assert = require('assert'); - -function testExecuteQueryPacket_01() { - var packetReader = new PacketReader(); - var packetWriter = new PacketWriter(); - var options = {sql : 'select * from code', - casInfo : [0, 255, 255, 255], - autoCommitMode : 1, - dbVersion : '8.4.1', - paramValues : {}, - paramTypes : {} - }; - var prepareExecuteOldProtocolPacket = new PrepareExecuteOldProtocolPacket(options); - - prepareExecuteOldProtocolPacket.writePrepare(packetWriter); - assert.equal(packetWriter._toBuffer()[3], 34); // Total length - - assert.equal(packetWriter._toBuffer()[4], 0); // CasInfo - assert.equal(packetWriter._toBuffer()[5], 255); // CasInfo - assert.equal(packetWriter._toBuffer()[6], 255); // CasInfo - assert.equal(packetWriter._toBuffer()[7], 255); // CasInfo - - assert.equal(packetWriter._toBuffer()[8], CAS.CASFunctionCode.CAS_FC_PREPARE); - assert.equal(packetWriter._toBuffer()[12], 19); - assert.equal(packetWriter._toBuffer().slice(13, 31).toString(), 'select * from code'); - assert.equal(packetWriter._toBuffer()[35], 1); - assert.equal(packetWriter._toBuffer()[36], CAS.CCIPrepareOption.CCI_PREPARE_NORMAL); - assert.equal(packetWriter._toBuffer()[40], 1); - assert.equal(packetWriter._toBuffer()[41], 1); - - packetReader.write(new Buffer([0, 0, 0, 108, 1, 255, 255, 255, 0, 0, 0, 1, 255, 255, 255, 255, 21, 0, 0, 0, 0, 0, 0, 0, - 0, 2, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 7, 115, 95, 110, 97, 109, 101, 0, 0, 0, 0, 1, 0, 0, - 0, 0, 5, 99, 111, 100, 101, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, - 6, 0, 0, 0, 7, 102, 95, 110, 97, 109, 101, 0, 0, 0, 0, 1, 0, 0, 0, 0, 5, 99, 111, 100, - 101, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0])); - - prepareExecuteOldProtocolPacket.parsePrepare(packetReader); - assert.equal(prepareExecuteOldProtocolPacket.queryHandle, 1); - assert.equal(prepareExecuteOldProtocolPacket.resultCacheLifetime, -1); - assert.equal(prepareExecuteOldProtocolPacket.statementType, 21); - assert.equal(prepareExecuteOldProtocolPacket.bindCount, 0); - assert.equal(prepareExecuteOldProtocolPacket.isUpdatable, false); - assert.equal(prepareExecuteOldProtocolPacket.infoArray[0].ColumnType, 1); - assert.equal(prepareExecuteOldProtocolPacket.infoArray[0].Scale, -1); - assert.equal(prepareExecuteOldProtocolPacket.infoArray[0].Name, "s_name"); - assert.equal(prepareExecuteOldProtocolPacket.infoArray[0].RealName, ""); - assert.equal(prepareExecuteOldProtocolPacket.infoArray[0].TableName, "code"); - assert.equal(prepareExecuteOldProtocolPacket.infoArray[0].IsNullable, false); - assert.equal(prepareExecuteOldProtocolPacket.infoArray[0].DafaultValue, ""); - assert.equal(prepareExecuteOldProtocolPacket.infoArray[0].IsAutoIncrement, false); - assert.equal(prepareExecuteOldProtocolPacket.infoArray[0].IsUniqueKey, false); - assert.equal(prepareExecuteOldProtocolPacket.infoArray[0].IsPrimaryKey, false); - assert.equal(prepareExecuteOldProtocolPacket.infoArray[0].IsReverseIndex, false); - assert.equal(prepareExecuteOldProtocolPacket.infoArray[0].IsReverseUnique, false); - assert.equal(prepareExecuteOldProtocolPacket.infoArray[0].IsForeignKey, false); - assert.equal(prepareExecuteOldProtocolPacket.infoArray[0].IsShared, false); - - packetReader = new PacketReader(); - packetWriter = new PacketWriter(prepareExecuteOldProtocolPacket.getExecuteBufferLength()); - prepareExecuteOldProtocolPacket.writeExecute(packetWriter); - assert.equal(packetWriter._toBuffer()[3], 69); // Total length - - assert.equal(packetWriter._toBuffer()[4], 1); // CasInfo - assert.equal(packetWriter._toBuffer()[5], 255); // CasInfo - assert.equal(packetWriter._toBuffer()[6], 255); // CasInfo - assert.equal(packetWriter._toBuffer()[7], 255); // CasInfo - - assert.equal(packetWriter._toBuffer()[8], CAS.CASFunctionCode.CAS_FC_EXECUTE); - assert.equal(packetWriter._toBuffer()[16], 1); - assert.equal(packetWriter._toBuffer()[21], CAS.CCIExecutionOption.CCI_EXEC_NORMAL); - assert.equal(packetWriter._toBuffer()[29], 0); - assert.equal(packetWriter._toBuffer()[37], 0); - assert.equal(packetWriter._toBuffer()[41], 0); - assert.equal(packetWriter._toBuffer()[46], 1); - assert.equal(packetWriter._toBuffer()[51], 1); - assert.equal(packetWriter._toBuffer()[56], 1); - assert.equal(packetWriter._toBuffer()[68], 0); - assert.equal(packetWriter._toBuffer()[76], 0); - - packetReader.write(new Buffer([0, 0, 0, 205, 0, 255, 255, 255, 0, 0, 0, 6, 0, 0, 0, 0, 1, 21, 0, 0, 0, 6, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2, 88, 0, 0, 0, 0, 6, 77, 105, 120, 101, 100, 0, 0, 0, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 2, 87, 0, 0, 0, 0, 6, 87, 111, 109, 97, 110, 0, 0, 0, 0, 3, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 77, 0, 0, 0, 0, 4, 77, 97, 110, 0, 0, 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 2, 66, 0, 0, 0, 0, 7, 66, 114, 111, 110, 122, 101, 0, 0, 0, 0, - 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 83, 0, 0, 0, 0, 7, 83, 105, 108, 118, 101, 114, - 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 71, 0, 0, 0, 0, 5, 71, 111, 108, 100, 0])); - - var resultSet = prepareExecuteOldProtocolPacket.parseExecute(packetReader).resultSet; - - assert.equal(resultSet, '{"ColumnNames":["s_name","f_name"],"ColumnDataTypes":["Char","String"],"RowsCount":6,"ColumnValues":[["X","Mixed"],["W","Woman"],["M","Man"],["B","Bronze"],["S","Silver"],["G","Gold"]]}'); -} - -console.log('Unit test ' + module.filename.toString() + ' started...'); - -testExecuteQueryPacket_01(); - -console.log('Unit test ended OK.'); - diff --git a/test/old_tests/packets/test_RollbackPacket.js b/test/old_tests/packets/test_RollbackPacket.js deleted file mode 100644 index 344964e..0000000 --- a/test/old_tests/packets/test_RollbackPacket.js +++ /dev/null @@ -1,47 +0,0 @@ -var PacketReader = require('../PacketReader'), - PacketWriter = require('../PacketWriter'), - RollbackPacket = require('../RollbackPacket'), - CAS = require('../../constants/CASConstants'), - assert = require('assert'); - -function testRollbackPacket_01() { - var packetReader = new PacketReader(); - var packetWriter = new PacketWriter(); - var options = {casInfo : [0, 255, 255, 255]}; - var rollbackPacket = new RollbackPacket(options); - - rollbackPacket.write(packetWriter); - assert.equal(packetWriter._toBuffer()[3], 6); // Total length - - assert.equal(packetWriter._toBuffer()[4], 0); // CasInfo - assert.equal(packetWriter._toBuffer()[5], 255); // CasInfo - assert.equal(packetWriter._toBuffer()[6], 255); // CasInfo - assert.equal(packetWriter._toBuffer()[7], 255); // CasInfo - - assert.equal(packetWriter._toBuffer()[8], CAS.CASFunctionCode.CAS_FC_END_TRAN); - assert.equal(packetWriter._toBuffer()[12], 1); - assert.equal(packetWriter._toBuffer()[13], CAS.CCITransactionType.CCI_TRAN_ROLLBACK); - - packetReader.write(new Buffer([0, 0, 0, 0, 0, 255, 255, 255, 0, 0, 0, 0])); - - assert.equal(packetReader._packetLength(), 12); - - rollbackPacket.parse(packetReader); - - assert.equal(rollbackPacket.casInfo[0], 0); // CasInfo - assert.equal(rollbackPacket.casInfo[1], 255); // CasInfo - assert.equal(rollbackPacket.casInfo[2], 255); // CasInfo - assert.equal(rollbackPacket.casInfo[3], 255); // CasInfo - - assert.equal(rollbackPacket.responseCode, 0); - - assert.equal(rollbackPacket.errorCode, 0); - assert.equal(rollbackPacket.errorMsg, ''); -} - -console.log('Unit test ' + module.filename.toString() + ' started...'); - -testRollbackPacket_01(); - -console.log('Unit test ended OK.'); - diff --git a/test/old_tests/packets/test_SetAutoCommitMode.js b/test/old_tests/packets/test_SetAutoCommitMode.js deleted file mode 100644 index 20437ee..0000000 --- a/test/old_tests/packets/test_SetAutoCommitMode.js +++ /dev/null @@ -1,48 +0,0 @@ -var PacketReader = require('../PacketReader'), - PacketWriter = require('../PacketWriter'), - SetAutoCommitModePacket = require('../SetAutoCommitModePacket'), - CAS = require('../../constants/CASConstants'), - assert = require('assert'); - -function testSetAutoCommitModePacket_01() { - var packetReader = new PacketReader(); - var packetWriter = new PacketWriter(); - var options = {casInfo : [0, 255, 255, 255], autoCommitMode : 1, dbVersion : '8.4.1'}; - var setAutoCommitModePacket = new SetAutoCommitModePacket(options); - - setAutoCommitModePacket.write(packetWriter); - assert.equal(packetWriter._toBuffer()[3], 1 + 4 * 4); // Total length - - assert.equal(packetWriter._toBuffer()[4], 0); // CasInfo - assert.equal(packetWriter._toBuffer()[5], 255); // CasInfo - assert.equal(packetWriter._toBuffer()[6], 255); // CasInfo - assert.equal(packetWriter._toBuffer()[7], 255); // CasInfo - - assert.equal(packetWriter._toBuffer()[8], CAS.CASFunctionCode.CAS_FC_SET_DB_PARAMETER); - assert.equal(packetWriter._toBuffer()[16], CAS.CCIDbParam.CCI_PARAM_AUTO_COMMIT); - assert.equal(packetWriter._toBuffer()[20], 4); - assert.equal(packetWriter._toBuffer()[24], 1); - - packetReader.write(new Buffer([0, 0, 0, 0, 0, 255, 255, 255, 0, 0, 0, 0])); - - assert.equal(packetReader._packetLength(), 12); - - setAutoCommitModePacket.parse(packetReader); - - assert.equal(setAutoCommitModePacket.casInfo[0], 0); // CasInfo - assert.equal(setAutoCommitModePacket.casInfo[1], 255); // CasInfo - assert.equal(setAutoCommitModePacket.casInfo[2], 255); // CasInfo - assert.equal(setAutoCommitModePacket.casInfo[3], 255); // CasInfo - - assert.equal(setAutoCommitModePacket.responseCode, 0); - - assert.equal(setAutoCommitModePacket.errorCode, 0); - assert.equal(setAutoCommitModePacket.errorMsg, ''); -} - -console.log('Unit test ' + module.filename.toString() + ' started...'); - -testSetAutoCommitModePacket_01(); - -console.log('Unit test ended OK.'); - diff --git a/test/old_tests/packets/test_SetAutoCommitModePacket.js b/test/old_tests/packets/test_SetAutoCommitModePacket.js deleted file mode 100644 index 21dfd54..0000000 --- a/test/old_tests/packets/test_SetAutoCommitModePacket.js +++ /dev/null @@ -1,45 +0,0 @@ -var PacketReader = require('../PacketReader'), - PacketWriter = require('../PacketWriter'), - SetAutoCommitModePacket = require('../SetAutoCommitModePacket'), - CAS = require('../../constants/CASConstants'); - -exports['test_SetAutoCommitModePacket'] = function (test) { - test.expect(17); - console.log('Unit test ' + module.filename.toString() + ' started...'); - var packetReader = new PacketReader(); - var packetWriter = new PacketWriter(); - var options = {casInfo : [0, 255, 255, 255], autoCommitMode : 1}; - var setAutoCommitModePacket = new SetAutoCommitModePacket(options); - - setAutoCommitModePacket.write(packetWriter); - test.equal(packetWriter._toBuffer()[3], 1 + 4 * 4); //total length - - test.equal(packetWriter._toBuffer()[4], 0); //casInfo - test.equal(packetWriter._toBuffer()[5], 255); //casInfo - test.equal(packetWriter._toBuffer()[6], 255); //casInfo - test.equal(packetWriter._toBuffer()[7], 255); //casInfo - - test.equal(packetWriter._toBuffer()[8], CAS.CASFunctionCode.CAS_FC_SET_DB_PARAMETER); - test.equal(packetWriter._toBuffer()[16], CAS.CCIDbParam.CCI_PARAM_AUTO_COMMIT); - test.equal(packetWriter._toBuffer()[20], 4); - test.equal(packetWriter._toBuffer()[24], 1); - - packetReader.write(new Buffer([0, 0, 0, 0, 0, 255, 255, 255, 0, 0, 0, 0])); - - test.equal(packetReader._packetLength(), 12); - - setAutoCommitModePacket.parse(packetReader); - - test.equal(setAutoCommitModePacket.casInfo[0], 0); //casInfo - test.equal(setAutoCommitModePacket.casInfo[1], 255); //casInfo - test.equal(setAutoCommitModePacket.casInfo[2], 255); //casInfo - test.equal(setAutoCommitModePacket.casInfo[3], 255); //casInfo - - test.equal(setAutoCommitModePacket.responseCode, 0); - - test.equal(setAutoCommitModePacket.errorCode, 0); - test.equal(setAutoCommitModePacket.errorMsg, ''); - console.log('Unit test ended OK.'); - test.done(); -}; - diff --git a/test/old_tests/packets/test_SetDbParameterPacket.js b/test/old_tests/packets/test_SetDbParameterPacket.js deleted file mode 100644 index 7d9a2be..0000000 --- a/test/old_tests/packets/test_SetDbParameterPacket.js +++ /dev/null @@ -1,43 +0,0 @@ -var PacketReader = require('../PacketReader'), - PacketWriter = require('../PacketWriter'), - SetDbParameterPacket = require('../SetDbParameterPacket'), - CAS = require('../../constants/CASConstants'), - assert = require('assert'); - -function testSetDbParameter() { - var packetReader = new PacketReader(); - var packetWriter = new PacketWriter(); - var options = - { - casInfo : [0, 255, 255, 255], - parameter : CAS.CCIDbParam.CCI_PARAM_MAX_STRING_LENGTH, - value : 99 - }; - var setDbParameterPacket = new SetDbParameterPacket(options); - - setDbParameterPacket.write(packetWriter); - assert.equal(packetWriter._toBuffer()[3], 17); // Total length - assert.equal(packetWriter._toBuffer()[8], CAS.CASFunctionCode.CAS_FC_SET_DB_PARAMETER); - assert.equal(packetWriter._toBuffer()[12], 4); - assert.equal(packetWriter._toBuffer()[16], CAS.CCIDbParam.CCI_PARAM_MAX_STRING_LENGTH); - assert.equal(packetWriter._toBuffer()[20], 4); - assert.equal(packetWriter._toBuffer()[24], 99); - - packetReader.write(new Buffer([0, 0, 0, 0, - 0, 255, 255, 255, - 0, 0, 0, 0])); - setDbParameterPacket.parse(packetReader); - - assert.equal(setDbParameterPacket.casInfo[0], 0); // CasInfo - assert.equal(setDbParameterPacket.casInfo[1], 255); // CasInfo - assert.equal(setDbParameterPacket.casInfo[2], 255); // CasInfo - assert.equal(setDbParameterPacket.casInfo[3], 255); // CasInfo - - assert.equal(setDbParameterPacket.responseCode, 0); - assert.equal(setDbParameterPacket.errorCode, 0); - assert.equal(setDbParameterPacket.errorMsg, ''); -} - -console.log('Unit test ' + module.filename.toString() + ' started...'); -testSetDbParameter(); -console.log('Unit test ended OK.'); diff --git a/test/old_tests/test_Async.js b/test/old_tests/test_Async.js deleted file mode 100644 index ffde6ff..0000000 --- a/test/old_tests/test_Async.js +++ /dev/null @@ -1,94 +0,0 @@ -var CUBRIDClient = require('./test_Setup').createDefaultCUBRIDDemodbConnection, -//TODO Update this with your own async installation path - Async = require('c:/Program Files (x86)/nodejs/node_modules/async/index.js'), -//Async = require('C:/Documents and Settings/Ovidiu/node_modules/async/index.js'), - Helpers = require('../../src/utils/Helpers'), - Result2Array = require('../../src/resultset/Result2Array'), - assert = require('assert'); - -var returnedQueryHandle; -var fetchResult; - -Helpers.logInfo(module.filename.toString() + ' started...'); - -Async.waterfall( - [ - function (cb) { - CUBRIDClient.connect(cb); - }, - - function (cb) { - CUBRIDClient.getEngineVersion(cb); - }, - - function (engineVersion, cb) { - Helpers.logInfo('Engine version is: ' + engineVersion); - CUBRIDClient.query('select * from game', cb); - }, - - function (result, queryHandle, cb) { - assert(Result2Array.RowsArray(result).length === 235); - Helpers.logInfo('Query result rows count: ' + Result2Array.TotalRowsCount(result)); - assert(Result2Array.ColumnNamesArray(result).toString() === 'host_year,event_code,athlete_code,stadium_code,nation_code,medal,game_date'); - Helpers.logInfo('Query result column names: ' + Result2Array.ColumnNamesArray(result)); - assert(Result2Array.ColumnTypesArray(result).toString() === 'Int,Int,Int,Int,Char,Char,Date'); - Helpers.logInfo('Query result column data types: ' + Result2Array.ColumnTypesArray(result)); - Helpers.logInfo('Query results:'); - var arr = Result2Array.RowsArray(result); - assert(arr.length === 235); - assert(arr[0].toString().startsWith('2004,20021,14345,30116,NGR,B,2004-08-28T') === true); - assert(arr[arr.length - 1].toString().startsWith('2004,20317,14457,30124,ITA,G,2004-08-26T') === true); - for (var j = 0; j < 1; j++) { - Helpers.logInfo(arr[j].toString()); - } - returnedQueryHandle = queryHandle; - Async.whilst( - function () { - return fetchResult !== null; - }, - - function (callback) { - CUBRIDClient.fetch(returnedQueryHandle, function (err, result) { - if (result !== null) { - Helpers.logInfo('Fetch results:'); - var arr = Result2Array.RowsArray(result); - assert(arr.length === 241 || arr.length === 224); - for (var k = 0; k < 1; k++) { - Helpers.logInfo(arr[k].toString()); - } - } else { - Helpers.logInfo('There is no more data to fetch.'); - } - fetchResult = result; - callback.call(err); - } - ); - }, - - function (err) { - if (err) { - throw err.message; - } else { - cb.call(err); - } - } - ); - }, - - function (cb) { - CUBRIDClient.closeQuery(returnedQueryHandle, cb); - }, - - function (queryHandle, cb) { - CUBRIDClient.close(cb); - } - ], - - function (err) { - if (err === null) { - Helpers.logInfo('Test passed.'); - } else { - throw 'Error executing test!'; - } - } -); diff --git a/test/old_tests/test_AutoCommitMode.js b/test/old_tests/test_AutoCommitMode.js deleted file mode 100644 index 26597f4..0000000 --- a/test/old_tests/test_AutoCommitMode.js +++ /dev/null @@ -1,70 +0,0 @@ -var CUBRIDClient = require('./test_Setup').createDefaultCUBRIDDemodbConnection, - Helpers = require('../../src/utils/Helpers'), - Result2Array = require('../../src/resultset/Result2Array'), - assert = require('assert'); - -function errorHandler(err) { - throw err.message; -} - -Helpers.logInfo(module.filename.toString() + ' started...'); - -CUBRIDClient.connect(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connected.'); - CUBRIDClient.batchExecuteNoQuery(['drop table if exists node_test', 'create table node_test(id int)'], function (err) { - if (err) { - errorHandler(err); - } else { - CUBRIDClient.setAutoCommitMode(false, function (err) { - if (err) { - errorHandler(err); - } else { - CUBRIDClient.batchExecuteNoQuery(['insert into node_test values(1)'], function (err) { - if (err) { - errorHandler(err); - } else { - CUBRIDClient.commit(function (err) { - if (err) { - errorHandler(err); - } else { - CUBRIDClient.query('select * from node_test', function (err, result) { - if (err) { - errorHandler(err); - } else { - assert(Result2Array.TotalRowsCount(result) === 1, 'Didn\'t commit!!!'); - CUBRIDClient.setAutoCommitMode(true, function (err) { - if (err) { - errorHandler(err); - } else { - CUBRIDClient.batchExecuteNoQuery(['drop table node_test'], function (err) { - if (err) { - errorHandler(err); - } else { - CUBRIDClient.close(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - } - }); - } - }); - } - }); - } - }); - } - }); - } - }); - } - }); - } - }); - } -}); - diff --git a/test/old_tests/test_BadConnect.js b/test/old_tests/test_BadConnect.js deleted file mode 100644 index 3c12583..0000000 --- a/test/old_tests/test_BadConnect.js +++ /dev/null @@ -1,17 +0,0 @@ -var assert = require('assert'), - CUBRIDConnection = require('../../src/CUBRIDConnection'), - Helpers = require('../../src/utils/Helpers'); - -var client = new CUBRIDConnection('localhost', 33000, 'public', 'xyz', 'demodb_xyz'); - -Helpers.logInfo(module.filename.toString() + ' started...'); - -client.connect(function (err) { - if (err) { - assert(err.message === '-677:Failed to connect to database server, \'demodb_xyz\', on the following host(s): localhost:localhost'); - Helpers.logInfo('Test passed.'); - } else { - throw 'We should not get here!'; - } -}); - diff --git a/test/old_tests/test_BadPort.js b/test/old_tests/test_BadPort.js deleted file mode 100644 index 68cbb81..0000000 --- a/test/old_tests/test_BadPort.js +++ /dev/null @@ -1,18 +0,0 @@ -var assert = require('assert'), - CUBRIDConnection = require('../../src/CUBRIDConnection'), - Helpers = require('../../src/utils/Helpers'); - -var client = new CUBRIDConnection('localhost', 80, 'public', '', 'demodb'); - -Helpers.logInfo(module.filename.toString() + ' started...'); - -client.connect(function (err) { - if (err) { - - assert(err.message === 'connect ECONNREFUSED'); - Helpers.logInfo('Test passed.'); - } else { - throw 'We should not get here!'; - } -}); - diff --git a/test/old_tests/test_BadSQLSyntax.js b/test/old_tests/test_BadSQLSyntax.js deleted file mode 100644 index 2dc5510..0000000 --- a/test/old_tests/test_BadSQLSyntax.js +++ /dev/null @@ -1,34 +0,0 @@ -var CUBRIDClient = require('./test_Setup').createDefaultCUBRIDDemodbConnection, - Helpers = require('../../src/utils/Helpers'), - assert = require('assert'); - -function errorHandler(err) { - Helpers.logError(err.message); -} - -Helpers.logInfo(module.filename.toString() + ' started...'); - -CUBRIDClient.connect(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connected.'); - Helpers.logInfo('Querying: select * from game_xyz'); - CUBRIDClient.query('select * from game_xyz', function (err) { - if (err) { - errorHandler(err); - assert(err.message === '-493:Syntax: Unknown class "game_xyz". select * from game_xyz'); - CUBRIDClient.close(function (err) { - if (err) { - errorHandler(err); - } - }); - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - } else { - throw 'We should never get here!'; - } - }); - } -}); - diff --git a/test/old_tests/test_BasicBatchExecute.js b/test/old_tests/test_BasicBatchExecute.js deleted file mode 100644 index 99fee6d..0000000 --- a/test/old_tests/test_BasicBatchExecute.js +++ /dev/null @@ -1,45 +0,0 @@ -var CUBRIDClient = require('./test_Setup').createDefaultCUBRIDDemodbConnection, - Helpers = require('../../src/utils/Helpers'), - assert = require('assert'); - -function errorHandler(err) { - throw err.message; -} - -Helpers.logInfo(module.filename.toString() + ' started...'); - -CUBRIDClient.connect(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connected.'); - CUBRIDClient.batchExecuteNoQuery(['drop table if exists node_test', 'create table node_test(id int)'], function (err) { - if (err) { - errorHandler(err); - } else { - CUBRIDClient.batchExecuteNoQuery(['insert into node_test values(1)'], function (err) { - if (err) { - errorHandler(err); - } else { - CUBRIDClient.batchExecuteNoQuery(['drop table node_test'], function (err) { - if (err) { - errorHandler(err); - } else { - CUBRIDClient.close(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - } - }); - } - }); - } - }); - } - }); - } -}); - - diff --git a/test/old_tests/test_BasicBatchExecute_ImplicitConnect.js b/test/old_tests/test_BasicBatchExecute_ImplicitConnect.js deleted file mode 100644 index 05b88ae..0000000 --- a/test/old_tests/test_BasicBatchExecute_ImplicitConnect.js +++ /dev/null @@ -1,39 +0,0 @@ -var CUBRIDClient = require('./test_Setup').createDefaultCUBRIDDemodbConnection, - Helpers = require('../../src/utils/Helpers'), - assert = require('assert'); - -function errorHandler(err) { - throw err.message; -} - -Helpers.logInfo(module.filename.toString() + ' started...'); - -Helpers.logInfo('Connected.'); -CUBRIDClient.batchExecuteNoQuery(['drop table if exists node_test', 'create table node_test(id int)'], function (err) { - if (err) { - errorHandler(err); - } else { - CUBRIDClient.batchExecuteNoQuery(['insert into node_test values(1)'], function (err) { - if (err) { - errorHandler(err); - } else { - CUBRIDClient.batchExecuteNoQuery(['drop table node_test'], function (err) { - if (err) { - errorHandler(err); - } else { - CUBRIDClient.close(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - } - }); - } - }); - } - }); - } -}); - - diff --git a/test/old_tests/test_BasicConnect.js b/test/old_tests/test_BasicConnect.js deleted file mode 100644 index 0d85957..0000000 --- a/test/old_tests/test_BasicConnect.js +++ /dev/null @@ -1,34 +0,0 @@ -var CUBRIDClient = require('../../index.js').createCUBRIDConnection('127.0.0.1', 33000, 'public', '', 'demodb'), - Helpers = require('../../src/utils/Helpers'), - assert = require('assert'); - -function errorHandler(err) { - throw err.message; -} - -Helpers.logInfo(module.filename.toString() + ' started...'); - -CUBRIDClient.connect(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connected OK.'); - CUBRIDClient.getEngineVersion(function (err, result) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('CUBRID engine version: ' + result); - CUBRIDClient.close(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - } - }); - } - }); - } -}); - - diff --git a/test/old_tests/test_BasicEvents.js b/test/old_tests/test_BasicEvents.js deleted file mode 100644 index 8fc312b..0000000 --- a/test/old_tests/test_BasicEvents.js +++ /dev/null @@ -1,26 +0,0 @@ -var CUBRIDClient = require('./test_Setup').createDefaultCUBRIDDemodbConnection, - Helpers = require('../../src/utils/Helpers'), - Result2Array = require('../../src/resultset/Result2Array'), - assert = require('assert'); - -Helpers.logInfo(module.filename.toString() + ' started...'); - -CUBRIDClient.connect(function () { - CUBRIDClient.close(function () { - }); -}); - -CUBRIDClient.on(CUBRIDClient.EVENT_ERROR, function (err) { - Helpers.logInfo('Error: ' + err.message); - throw 'We should not get here!'; -}); - -CUBRIDClient.on(CUBRIDClient.EVENT_CONNECTED, function () { - Helpers.logInfo('Connected.'); -}); - -CUBRIDClient.on(CUBRIDClient.EVENT_CONNECTION_CLOSED, function () { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); -}); - diff --git a/test/old_tests/test_BasicEvents_Error.js b/test/old_tests/test_BasicEvents_Error.js deleted file mode 100644 index 0f33ff6..0000000 --- a/test/old_tests/test_BasicEvents_Error.js +++ /dev/null @@ -1,29 +0,0 @@ -var CUBRIDClient = require('./test_Setup').createDefaultCUBRIDDemodbConnection, - Helpers = require('../../src/utils/Helpers'), - assert = require('assert'); - -Helpers.logInfo(module.filename.toString() + ' started...'); - -CUBRIDClient.user = 'unknown_user'; - -CUBRIDClient.connect(function (err) { - if (!err) { - CUBRIDClient.close(function () { - }); - } -}); - -CUBRIDClient.on(CUBRIDClient.EVENT_ERROR, function (err) { - Helpers.logInfo('Error: ' + err.message); - assert(err.message === '-165:User "unknown_user" is invalid.'); - Helpers.logInfo('Test passed.'); -}); - -CUBRIDClient.on(CUBRIDClient.EVENT_CONNECTED, function () { - throw 'We should not get here!'; -}); - -CUBRIDClient.on(CUBRIDClient.EVENT_CONNECTION_CLOSED, function () { - throw 'We should not get here!'; -}); - diff --git a/test/old_tests/test_BasicEvents_Error_2.js b/test/old_tests/test_BasicEvents_Error_2.js deleted file mode 100644 index 168d615..0000000 --- a/test/old_tests/test_BasicEvents_Error_2.js +++ /dev/null @@ -1,25 +0,0 @@ -var CUBRIDClient = require('./test_Setup').createDefaultCUBRIDDemodbConnection, - Helpers = require('../../src/utils/Helpers'), - Result2Array = require('../../src/resultset/Result2Array'), - assert = require('assert'); - -Helpers.logInfo(module.filename.toString() + ' started...'); - -CUBRIDClient.user = 'unknown_user'; - -CUBRIDClient.connect(null); - -CUBRIDClient.on(CUBRIDClient.EVENT_ERROR, function (err) { - Helpers.logInfo('Error: ' + err.message); - assert(err.message === '-165:User "unknown_user" is invalid.'); - Helpers.logInfo('Test passed.'); -}); - -CUBRIDClient.on(CUBRIDClient.EVENT_CONNECTED, function () { - throw 'We should not get here!'; -}); - -CUBRIDClient.on(CUBRIDClient.EVENT_CONNECTION_CLOSED, function () { - throw 'We should not get here!'; -}); - diff --git a/test/old_tests/test_BasicExecute.js b/test/old_tests/test_BasicExecute.js deleted file mode 100644 index 28e1758..0000000 --- a/test/old_tests/test_BasicExecute.js +++ /dev/null @@ -1,51 +0,0 @@ -var CUBRIDClient = require('./test_Setup').createDefaultCUBRIDDemodbConnection, - Helpers = require('../../src/utils/Helpers'), - assert = require('assert'); - -function errorHandler(err) { - throw err.message; -} - -Helpers.logInfo(module.filename.toString() + ' started...'); - -CUBRIDClient.connect(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connected.'); - CUBRIDClient.execute('drop table if exists node_test', function (err) { - if (err) { - errorHandler(err); - } else { - CUBRIDClient.execute('create table node_test(id int)', function (err) { - if (err) { - errorHandler(err); - } else { - CUBRIDClient.execute('insert into node_test values(1)', function (err) { - if (err) { - errorHandler(err); - } else { - CUBRIDClient.execute('drop table node_test', function (err) { - if (err) { - errorHandler(err); - } else { - CUBRIDClient.close(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - } - }); - } - }); - } - }); - } - }); - } - }); - } -}); - - diff --git a/test/old_tests/test_BasicExecute_2.js b/test/old_tests/test_BasicExecute_2.js deleted file mode 100644 index 5eb3e10..0000000 --- a/test/old_tests/test_BasicExecute_2.js +++ /dev/null @@ -1,38 +0,0 @@ -var CUBRIDClient = require('./test_Setup').createDefaultCUBRIDDemodbConnection, - Helpers = require('../../src/utils/Helpers'), - assert = require('assert'); - -function errorHandler(err) { - throw err.message; -} - -Helpers.logInfo(module.filename.toString() + ' started...'); - -CUBRIDClient.connect(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connected.'); - var sqlsArr = []; - sqlsArr.push('drop table if exists node_test'); - sqlsArr.push('create table node_test(id int)'); - sqlsArr.push('insert into node_test values(2)'); - sqlsArr.push('drop table if exists node_test'); - CUBRIDClient.batchExecuteNoQuery(sqlsArr, function (err) { - if (err) { - errorHandler(err); - } else { - CUBRIDClient.close(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - } - }); - } - }); - } -}); - - diff --git a/test/old_tests/test_BasicExtendedSelect.js b/test/old_tests/test_BasicExtendedSelect.js deleted file mode 100644 index aa9ef48..0000000 --- a/test/old_tests/test_BasicExtendedSelect.js +++ /dev/null @@ -1,81 +0,0 @@ -var CUBRIDClient = require('./test_Setup').createDefaultCUBRIDDemodbConnection, - Helpers = require('../../src/utils/Helpers'), - Result2Array = require('../../src/resultset/Result2Array'), - assert = require('assert'); - -function errorHandler(err) { - throw err.message; -} - -Helpers.logInfo(module.filename.toString() + ' started...'); - -CUBRIDClient.connect(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connected.'); - CUBRIDClient.getEngineVersion(function (err, result) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('CUBRID engine version: ' + result); - Helpers.logInfo('Querying: select * from game'); - CUBRIDClient.query('select * from game', function (err, result, queryHandle) { - if (err) { - errorHandler(err); - } else { - assert(Result2Array.TotalRowsCount(result) === 8653); - Helpers.logInfo('Query result rows count: ' + Result2Array.TotalRowsCount(result)); - assert(Result2Array.ColumnNamesArray(result).toString() === 'host_year,event_code,athlete_code,stadium_code,nation_code,medal,game_date'); - Helpers.logInfo('Query result column names: ' + Result2Array.ColumnNamesArray(result)); - assert(Result2Array.ColumnTypesArray(result).toString() === 'Int,Int,Int,Int,Char,Char,Date'); - Helpers.logInfo('Query result column data types: ' + Result2Array.ColumnTypesArray(result)); - Helpers.logInfo('Query results:'); - var arr = Result2Array.RowsArray(result); - assert(arr.length === 235); - assert(arr[0].toString().startsWith('2004,20021,14345,30116,NGR,B,2004-08-28T') === true); - assert(arr[arr.length - 1].toString().startsWith('2004,20317,14457,30124,ITA,G,2004-08-26T') === true); - for (var j = 0; j < 1; j++) { - Helpers.logInfo(arr[j].toString()); - } - CUBRIDClient.fetch(queryHandle, function (err, result) { - if (err) { - errorHandler(err); - } else { - if (result) { - Helpers.logInfo('Fetch results:'); - var arr = Result2Array.RowsArray(result); - assert(arr.length === 241); - assert(arr[0].toString().startsWith('2004,20317,14375,30124,GRE,S,2004-08-26T') === true); - assert(arr[arr.length - 1].toString().startsWith('2004,20060,14340,30125,JPN,B,2004-08-25T') === true); - for (var k = 0; k < 1; k++) { - Helpers.logInfo(arr[k].toString()); - } - } else { - Helpers.logInfo('There is no more data to fetch.'); - } - CUBRIDClient.closeQuery(queryHandle, function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Query closed.'); - CUBRIDClient.close(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - } - }); - } - }); - } - }); - } - }); - } - }); - } -}); - - diff --git a/test/old_tests/test_BasicExtendedSelect_Sequence.js b/test/old_tests/test_BasicExtendedSelect_Sequence.js deleted file mode 100644 index 4b934dc..0000000 --- a/test/old_tests/test_BasicExtendedSelect_Sequence.js +++ /dev/null @@ -1,56 +0,0 @@ -var CUBRIDClient = require('./test_Setup').createDefaultCUBRIDDemodbConnection, - ActionQueue = require('../../src/utils/ActionQueue'), - Helpers = require('../../src/utils/Helpers'), - Result2Array = require('../../src/resultset/Result2Array'), - assert = require('assert'); - -Helpers.logInfo(module.filename.toString() + ' started...'); - -ActionQueue.enqueue( - [ - function (cb) { - CUBRIDClient.connect(cb); - }, - - function (cb) { - CUBRIDClient.getEngineVersion(cb); - }, - - function (engineVersion, cb) { - Helpers.logInfo('Engine version is: ' + engineVersion); - CUBRIDClient.query('select * from code', cb); - }, - - function (result, queryHandle, cb) { - assert(Result2Array.TotalRowsCount(result) === 6); - Helpers.logInfo('Query result rows count: ' + Result2Array.TotalRowsCount(result)); - Helpers.logInfo('Query results:'); - var arr = Result2Array.RowsArray(result); - assert(arr.length === 6); - assert(arr[0].toString() === 'X,Mixed'); - assert(arr[1].toString() === 'W,Woman'); - assert(arr[2].toString() === 'M,Man'); - assert(arr[3].toString() === 'B,Bronze'); - assert(arr[4].toString() === 'S,Silver'); - assert(arr[5].toString() === 'G,Gold'); - for (var k = 0; k < arr.length; k++) { - Helpers.logInfo(arr[k].toString()); - } - CUBRIDClient.closeQuery(queryHandle, cb); - Helpers.logInfo('Query closed.'); - }, - - function (queryHandle,cb) { - CUBRIDClient.close(cb); - Helpers.logInfo('Connection closed.'); - } - ], - - function (err) { - if (err === null) { - Helpers.logInfo('Test passed.'); - } else { - throw err.message; - } - } -); diff --git a/test/old_tests/test_BasicMultiFetch.js b/test/old_tests/test_BasicMultiFetch.js deleted file mode 100644 index 631c1dc..0000000 --- a/test/old_tests/test_BasicMultiFetch.js +++ /dev/null @@ -1,100 +0,0 @@ -var CUBRIDClient = require('./test_Setup').createDefaultCUBRIDDemodbConnection, - Helpers = require('../../src/utils/Helpers'), - ActionQueue = require('../../src/utils/ActionQueue'), - Result2Array = require('../../src/resultset/Result2Array'), - assert = require('assert'); - -var fetchResult; - -Helpers.logInfo(module.filename.toString() + ' started...'); - -CUBRIDClient.connect(function (err) { - var errHandler = function (err) { - Helpers.logInfo('Error - ' + err.message); - throw err.message; - }; - - if (err) { - errHandler(err); - } else { - Helpers.logInfo('Connected.'); - CUBRIDClient.getEngineVersion(function (err, result) { - if (err) { - errHandler(err); - } else { - Helpers.logInfo('CUBRID engine version: ' + result); - CUBRIDClient.query('select * from game', function (err, result, queryHandle) { - if (err) { - errHandler(err); - } else { - assert(Result2Array.TotalRowsCount(result) === 8653); - Helpers.logInfo('Query result rows count: ' + Result2Array.TotalRowsCount(result)); - assert(Result2Array.ColumnNamesArray(result).toString() === 'host_year,event_code,athlete_code,stadium_code,nation_code,medal,game_date'); - Helpers.logInfo('Query result column names: ' + Result2Array.ColumnNamesArray(result)); - assert(Result2Array.ColumnTypesArray(result).toString() === 'Int,Int,Int,Int,Char,Char,Date'); - Helpers.logInfo('Query result column data types: ' + Result2Array.ColumnTypesArray(result)); - Helpers.logInfo('Query results:'); - var arr = Result2Array.RowsArray(result); - assert(arr.length === 235); - assert(arr[0].toString().startsWith('2004,20021,14345,30116,NGR,B,2004-08-28T') === true); - assert(arr[arr.length - 1].toString().startsWith('2004,20317,14457,30124,ITA,G,2004-08-26T') === true); - for (var j = 0; j < 1; j++) { - Helpers.logInfo(arr[j].toString()); - } - - ActionQueue.while( - function () { - return fetchResult !== null; - }, - - function (callback) { - CUBRIDClient.fetch(queryHandle, function (err, result) { - if (err) { - errHandler(err); - } else { - if (result !== null) { - Helpers.logInfo('Fetch results:'); - var arr = Result2Array.RowsArray(result); - assert(arr.length === 241 || arr.length === 224); - for (var k = 0; k < 1; k++) { - Helpers.logInfo(arr[k].toString()); - } - } else { - Helpers.logInfo('There is no more data to fetch.'); - } - fetchResult = result; - callback.call(err); - } - }); - }, - - function (err) { - if (err) { - errHandler(err); - } else { - CUBRIDClient.closeQuery(queryHandle, function (err) { - if (err) { - errHandler(err); - } else { - Helpers.logInfo('Query closed.'); - CUBRIDClient.close(function (err) { - if (err) { - errHandler(err); - } else { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - } - }); - } - }); - } - } - ); - } - }); - } - }); - } -}); - - diff --git a/test/old_tests/test_BasicMultiFetch_Sequence.js b/test/old_tests/test_BasicMultiFetch_Sequence.js deleted file mode 100644 index 066d36b..0000000 --- a/test/old_tests/test_BasicMultiFetch_Sequence.js +++ /dev/null @@ -1,92 +0,0 @@ -var CUBRIDClient = require('./test_Setup').createDefaultCUBRIDDemodbConnection, - ActionQueue = require('../../src/utils/ActionQueue'), - Helpers = require('../../src/utils/Helpers'), - Result2Array = require('../../src/resultset/Result2Array'), - assert = require('assert'); - -var returnedQueryHandle; -var fetchResult; - -Helpers.logInfo(module.filename.toString() + ' started...'); - -ActionQueue.enqueue( - [ - function (cb) { - CUBRIDClient.connect(cb); - }, - - function (cb) { - CUBRIDClient.getEngineVersion(cb); - }, - - function (engineVersion, cb) { - Helpers.logInfo('EngineVersion is: ' + engineVersion); - CUBRIDClient.query('select * from game', cb); - }, - - function (result, queryHandle, cb) { - assert(Result2Array.RowsArray(result).length === 235); - Helpers.logInfo('Query result rows count: ' + Result2Array.TotalRowsCount(result)); - assert(Result2Array.ColumnNamesArray(result).toString() === 'host_year,event_code,athlete_code,stadium_code,nation_code,medal,game_date'); - Helpers.logInfo('Query result column names: ' + Result2Array.ColumnNamesArray(result)); - assert(Result2Array.ColumnTypesArray(result).toString() === 'Int,Int,Int,Int,Char,Char,Date'); - Helpers.logInfo('Query result column data types: ' + Result2Array.ColumnTypesArray(result)); - Helpers.logInfo('Query results:'); - var arr = Result2Array.RowsArray(result); - assert(arr.length === 235); - assert(arr[0].toString().startsWith('2004,20021,14345,30116,NGR,B,2004-08-28T') === true); - assert(arr[arr.length - 1].toString().startsWith('2004,20317,14457,30124,ITA,G,2004-08-26T') === true); - for (var j = 0; j < 1; j++) { - Helpers.logInfo(arr[j].toString()); - } - returnedQueryHandle = queryHandle; - ActionQueue.while( - function () { - return fetchResult !== null; - }, - - function (callback) { - CUBRIDClient.fetch(returnedQueryHandle, function (err, result) { - if (result !== null) { - Helpers.logInfo('Fetch results:'); - var arr = Result2Array.RowsArray(result); - assert(arr.length === 241 || arr.length === 224); - for (var k = 0; k < 1; k++) { - Helpers.logInfo(arr[k].toString()); - } - } else { - Helpers.logInfo('There is no more data to fetch.'); - } - fetchResult = result; - callback.call(err); - } - ); - }, - - function (err) { - if (err) { - throw err.message; - } else { - cb.call(err); - } - } - ); - }, - - function (cb) { - CUBRIDClient.closeQuery(returnedQueryHandle, cb); - }, - - function (queryHandle,cb) { - CUBRIDClient.close(cb); - } - ], - - function (err) { - if (err === null) { - Helpers.logInfo('Test passed.'); - } else { - throw 'Error executing test!'; - } - } -); diff --git a/test/old_tests/test_BasicMultifetchOldProtocol.js b/test/old_tests/test_BasicMultifetchOldProtocol.js deleted file mode 100644 index e9785c1..0000000 --- a/test/old_tests/test_BasicMultifetchOldProtocol.js +++ /dev/null @@ -1,101 +0,0 @@ -var CUBRIDClient = require('./test_Setup').createDefaultCUBRIDDemodbConnection, - Helpers = require('../../src/utils/Helpers'), - ActionQueue = require('../../src/utils/ActionQueue'), - Result2Array = require('../../src/resultset/Result2Array'), - assert = require('assert'); - -var fetchResult; - -Helpers.logInfo(module.filename.toString() + ' started...'); - -CUBRIDClient.connect(function (err) { - var errHandler = function (err) { - Helpers.logInfo('Error - ' + err.message); - throw err.message; - }; - - if (err) { - errHandler(err); - } else { - Helpers.logInfo('Connected.'); - CUBRIDClient.getEngineVersion(function (err, result) { - if (err) { - errHandler(err); - } else { - CUBRIDClient.setEnforceOldQueryProtocol(true); - Helpers.logInfo('CUBRID engine version: ' + result); - CUBRIDClient.query('select * from game', function (err, result, queryHandle) { - if (err) { - errHandler(err); - } else { - assert(Result2Array.TotalRowsCount(result) === 8653); - Helpers.logInfo('Query result rows count: ' + Result2Array.TotalRowsCount(result)); - assert(Result2Array.ColumnNamesArray(result).toString() === 'host_year,event_code,athlete_code,stadium_code,nation_code,medal,game_date'); - Helpers.logInfo('Query result column names: ' + Result2Array.ColumnNamesArray(result)); - assert(Result2Array.ColumnTypesArray(result).toString() === 'Int,Int,Int,Int,Char,Char,Date'); - Helpers.logInfo('Query result column data types: ' + Result2Array.ColumnTypesArray(result)); - Helpers.logInfo('Query results:'); - var arr = Result2Array.RowsArray(result); - assert(arr.length === 241); - assert(arr[0].toString().startsWith('2004,20021,14345,30116,NGR,B,2004-08-28T') === true); - assert(arr[arr.length - 1].toString().startsWith('2004,20317,12906,30124,USA,B,2004-08-26T') === true); - for (var j = 0; j < 1; j++) { - Helpers.logInfo(arr[j].toString()); - } - - ActionQueue.while( - function () { - return fetchResult !== null; - }, - - function (callback) { - CUBRIDClient.fetch(queryHandle, function (err, result) { - if (err) { - errHandler(err); - } else { - if (result !== null) { - Helpers.logInfo('Fetch results:'); - var arr = Result2Array.RowsArray(result); - assert(arr.length === 241 || arr.length === 218); - for (var k = 0; k < 1; k++) { - Helpers.logInfo(arr[k].toString()); - } - } else { - Helpers.logInfo('There is no more data to fetch.'); - } - fetchResult = result; - callback.call(err); - } - }); - }, - - function (err) { - if (err) { - errHandler(err); - } else { - CUBRIDClient.closeQuery(queryHandle, function (err) { - if (err) { - errHandler(err); - } else { - Helpers.logInfo('Query closed.'); - CUBRIDClient.close(function (err) { - if (err) { - errHandler(err); - } else { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - } - }); - } - }); - } - } - ); - } - }); - } - }); - } -}); - - diff --git a/test/old_tests/test_BasicQueriesQueue.js b/test/old_tests/test_BasicQueriesQueue.js deleted file mode 100644 index f88e130..0000000 --- a/test/old_tests/test_BasicQueriesQueue.js +++ /dev/null @@ -1,52 +0,0 @@ -var CUBRIDClient = require('./test_Setup').createDefaultCUBRIDDemodbConnection, - Helpers = require('../../src/utils/Helpers'), - Result2Array = require('../../src/resultset/Result2Array'), - assert = require('assert'); - -var SQL_1 = 'SELECT COUNT(*) FROM [code]'; -var SQL_2 = 'SELECT * FROM [code] WHERE s_name = \'X\''; -var SQL_3 = 'SELECT COUNT(*) FROM [code] WHERE f_name LIKE \'M%\''; - -CUBRIDClient.connect(function () { - Helpers.logInfo('Connection opened...'); - - Helpers.logInfo('Executing: ' + SQL_1); - CUBRIDClient.addQuery(SQL_1, function (err, result) { - if (err) { - throw err; - } else { - var arr = Result2Array.RowsArray(result); - Helpers.logInfo('Result: ' + arr); - assert(arr[0][0].toString() === '6'); - } - }); - - Helpers.logInfo('Executing: ' + SQL_2); - CUBRIDClient.addQuery(SQL_2, function (err, result) { - if (err) { - throw err; - } else { - Helpers.logInfo('Result: ' + Result2Array.RowsArray(result)); - assert(Result2Array.RowsArray(result).toString() === 'X,Mixed'); - } - }); - - Helpers.logInfo('Executing: ' + SQL_3); - CUBRIDClient.addQuery(SQL_3, function (err, result) { - if (err) { - throw err; - } else { - var arr = Result2Array.RowsArray(result); - Helpers.logInfo('Result: ' + Result2Array.RowsArray(result)); - assert(arr[0][0].toString() === '2'); - CUBRIDClient.close(function (err) { - if (err) { - throw err; - } else { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - } - }); - } - }); -}); diff --git a/test/old_tests/test_BasicQueriesQueue_ImplicitConnect.js b/test/old_tests/test_BasicQueriesQueue_ImplicitConnect.js deleted file mode 100644 index 53439c5..0000000 --- a/test/old_tests/test_BasicQueriesQueue_ImplicitConnect.js +++ /dev/null @@ -1,52 +0,0 @@ -var CUBRIDClient = require('./test_Setup').createDefaultCUBRIDDemodbConnection, - Helpers = require('../../src/utils/Helpers'), - Result2Array = require('../../src/resultset/Result2Array'), - assert = require('assert'); - -var SQL_1 = 'SELECT COUNT(*) FROM [code]'; -var SQL_2 = 'SELECT * FROM [code] WHERE s_name = \'X\''; -var SQL_3 = 'SELECT COUNT(*) FROM [code] WHERE f_name LIKE \'M%\''; - -function errorHandler(err) { - throw err.message; -} - -Helpers.logInfo('Executing [1]: ' + SQL_1); -CUBRIDClient.addQuery(SQL_1, function (err, result) { - if (err) { - errorHandler(err); - } else { - var arr = Result2Array.RowsArray(result); - Helpers.logInfo('Result [1]: ' + Result2Array.RowsArray(result)); - assert(arr[0][0].toString() === '6'); - } -}); - -Helpers.logInfo('Executing [2]: ' + SQL_2); -CUBRIDClient.addQuery(SQL_2, function (err, result) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Result [2]: ' + Result2Array.RowsArray(result)); - assert(Result2Array.RowsArray(result).toString() === 'X,Mixed'); - } -}); - -Helpers.logInfo('Executing [3]: ' + SQL_3); -CUBRIDClient.addQuery(SQL_3, function (err, result) { - if (err) { - errorHandler(err); - } else { - var arr = Result2Array.RowsArray(result); - Helpers.logInfo('Result [3]: ' + Result2Array.RowsArray(result)); - assert(arr[0][0].toString() === '2'); - CUBRIDClient.close(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - } - }); - } -}); diff --git a/test/old_tests/test_BasicSelect.js b/test/old_tests/test_BasicSelect.js deleted file mode 100644 index 2a3c0a6..0000000 --- a/test/old_tests/test_BasicSelect.js +++ /dev/null @@ -1,51 +0,0 @@ -var CUBRIDClient = require('./test_Setup').createDefaultCUBRIDDemodbConnection, - Helpers = require('../../src/utils/Helpers'), - Result2Array = require('../../src/resultset/Result2Array'), - assert = require('assert'); - -function errorHandler(err) { - throw err.message; -} - -Helpers.logInfo(module.filename.toString() + ' started...'); - -CUBRIDClient.connect(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connected.'); - Helpers.logInfo('Querying: select * from nation'); - CUBRIDClient.query('select * from nation', function (err, result, queryHandle) { - if (err) { - errorHandler(err); - } else { - assert(Result2Array.TotalRowsCount(result) === 215); - Helpers.logInfo('Query result rows count: ' + Result2Array.TotalRowsCount(result)); - var arr = Result2Array.RowsArray(result); - assert(arr.length === 215); - assert(arr[0].toString() === 'SRB,Serbia,Europe,Beograd'); - assert(arr[arr.length - 1].toString() === 'AFG,Afghanistan,Asia,Kabul'); - for (var j = 0; j < 1; j++) { - Helpers.logInfo(arr[j].toString()); - } - CUBRIDClient.closeQuery(queryHandle, function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Query closed.'); - CUBRIDClient.close(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - } - }); - } - }); - } - }); - } -}); - - diff --git a/test/old_tests/test_BasicSelect_Cache.js b/test/old_tests/test_BasicSelect_Cache.js deleted file mode 100644 index ed0bb0a..0000000 --- a/test/old_tests/test_BasicSelect_Cache.js +++ /dev/null @@ -1,66 +0,0 @@ -var CUBRIDClient = require('./test_Setup').createDefaultCUBRIDDemodbConnection, - Helpers = require('../../src/utils/Helpers'), - Result2Array = require('../../src/resultset/Result2Array'), - assert = require('assert'); - -function errorHandler(err) { - throw err.message; -} - -Helpers.logInfo(module.filename.toString() + ' started...'); - -CUBRIDClient.connect(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connected.'); - Helpers.logInfo('Querying: select * from game'); - var startTime1 = (new Date()).getTime(); - CUBRIDClient.query('select * from game', function (err, result, queryHandle) { - if (err) { - errorHandler(err); - } else { - var endTime1 = (new Date()).getTime(); - Helpers.logInfo('[First] query execution time (ms): ' + (endTime1 - startTime1).toString()); - assert(Result2Array.TotalRowsCount(result) === 8653); - CUBRIDClient.closeQuery(queryHandle, function (err) { - if (err) { - errorHandler(err); - } else { - // Repeat query - results expected to come from cache this time - var startTime2 = (new Date()).getTime(); - CUBRIDClient.query('select * from game', function (err, result, queryHandle) { - if (err) { - errorHandler(err); - } else { - var endTime2 = (new Date()).getTime(); - Helpers.logInfo('[Second] query execution time (ms): ' + (endTime2 - startTime2).toString()); - assert(endTime2 - startTime2 <= endTime1 - startTime1); - - assert(Result2Array.TotalRowsCount(result) === 8653); - - CUBRIDClient.closeQuery(queryHandle, function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Query closed.'); - CUBRIDClient.close(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - } - }); - } - }); - } - }); - } - }); - } - }); - } -}); - - diff --git a/test/old_tests/test_BasicSelect_Events.js b/test/old_tests/test_BasicSelect_Events.js deleted file mode 100644 index 5be6f2e..0000000 --- a/test/old_tests/test_BasicSelect_Events.js +++ /dev/null @@ -1,67 +0,0 @@ -var CUBRIDClient = require('./test_Setup').createDefaultCUBRIDDemodbConnection, - Helpers = require('../../src/utils/Helpers'), - Result2Array = require('../../src/resultset/Result2Array'); - -Helpers.logInfo(module.filename.toString() + ' started...'); - -CUBRIDClient.connect(function () { -}); - -CUBRIDClient.on(CUBRIDClient.EVENT_ERROR, function (err) { - Helpers.logError('Error!: ' + err.message); - throw 'We should not get here!'; -}); - -CUBRIDClient.on(CUBRIDClient.EVENT_CONNECTED, function () { - Helpers.logInfo('Connected.'); - Helpers.logInfo('Querying: select * from game'); - CUBRIDClient.query('select * from game', function () { - }); -}); - -CUBRIDClient.on(CUBRIDClient.EVENT_QUERY_DATA_AVAILABLE, function (result, queryHandle) { - Helpers.logInfo('Data received.'); - Helpers.logInfo('Returned active query handle: ' + queryHandle); - Helpers.logInfo('Total query result rows count: ' + Result2Array.TotalRowsCount(result)); - Helpers.logInfo('First "batch" of data returned rows count: ' + Result2Array.RowsArray(result).length); - Helpers.logInfo('Fetching more rows...'); - CUBRIDClient.fetch(queryHandle, function () { - }); -}); - -CUBRIDClient.on(CUBRIDClient.EVENT_FETCH_DATA_AVAILABLE, function (result, queryHandle) { - Helpers.logInfo('*** Fetch data received for query: ' + queryHandle); - Helpers.logInfo('*** Current fetch of data returned rows count: ' + Result2Array.RowsArray(result).length); - Helpers.logInfo('*** First row: ' + Result2Array.RowsArray(result)[0].toString()); - // Continue to fetch... - Helpers.logInfo('...'); - Helpers.logInfo('...fetching more rows...'); - Helpers.logInfo('...'); - setTimeout(function () { - CUBRIDClient.fetch(queryHandle, function () { - }); - }, Math.random() * 500); // Simulate different responses time for each fetch -}); - -CUBRIDClient.on(CUBRIDClient.EVENT_FETCH_NO_MORE_DATA_AVAILABLE, function (queryHandle) { - Helpers.logInfo('No more data to fetch.'); - Helpers.logInfo('Closing query: ' + queryHandle); - CUBRIDClient.closeQuery(queryHandle, function () { - }); -}); - -CUBRIDClient.on(CUBRIDClient.EVENT_QUERY_CLOSED, function (queryHandle) { - Helpers.logInfo('Query closed: ' + queryHandle); - Helpers.logInfo('Closing connection...'); - - // We had only one query opened - we can now close the connection - CUBRIDClient.close(function () { - }); -}); - -CUBRIDClient.on(CUBRIDClient.EVENT_CONNECTION_CLOSED, function () { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); -}); - - diff --git a/test/old_tests/test_BasicSelect_ImplicitConnect.js b/test/old_tests/test_BasicSelect_ImplicitConnect.js deleted file mode 100644 index d3fd740..0000000 --- a/test/old_tests/test_BasicSelect_ImplicitConnect.js +++ /dev/null @@ -1,46 +0,0 @@ -var CUBRIDClient = require('./test_Setup').createDefaultCUBRIDDemodbConnection, - Helpers = require('../../src/utils/Helpers'), - Result2Array = require('../../src/resultset/Result2Array'), - assert = require('assert'); - -Helpers.logInfo(module.filename.toString() + ' started...'); - -function errorHandler(err) { - throw err.message; -} - -Helpers.logInfo('Connected.'); -Helpers.logInfo('Querying: select * from nation'); -CUBRIDClient.query('select * from nation', function (err, result, queryHandle) { - if (err) { - errorHandler(err); - } else { - assert(Result2Array.TotalRowsCount(result) === 215); - Helpers.logInfo('Query result rows count: ' + Result2Array.TotalRowsCount(result)); - var arr = Result2Array.RowsArray(result); - assert(arr.length === 215); - assert(arr[0].toString() === 'SRB,Serbia,Europe,Beograd'); - assert(arr[arr.length - 1].toString() === 'AFG,Afghanistan,Asia,Kabul'); - for (var j = 0; j < 1; j++) { - Helpers.logInfo(arr[j].toString()); - } - CUBRIDClient.closeQuery(queryHandle, function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Query closed.'); - CUBRIDClient.close(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - } - }); - } - }); - } -}); - - - diff --git a/test/old_tests/test_Basic_QueriesQueue_Events.js b/test/old_tests/test_Basic_QueriesQueue_Events.js deleted file mode 100644 index ea9bd5e..0000000 --- a/test/old_tests/test_Basic_QueriesQueue_Events.js +++ /dev/null @@ -1,63 +0,0 @@ -var CUBRIDClient = require('./test_Setup').createDefaultCUBRIDDemodbConnection, - Helpers = require('../../src/utils/Helpers'), - Result2Array = require('../../src/resultset/Result2Array'), - assert = require('assert'); - -var SQL_A = 'SELECT * FROM event'; -var SQL_B = 'SELECT * FROM record'; - -CUBRIDClient.connect(); - -CUBRIDClient.on(CUBRIDClient.EVENT_ERROR, function (err) { - Helpers.logError('Error!: ' + err.message); - throw err; -}); - -CUBRIDClient.on(CUBRIDClient.EVENT_CONNECTED, function () { - Helpers.logInfo('Connected.'); - CUBRIDClient.addQuery(SQL_A, null); - CUBRIDClient.addQuery(SQL_B, null); -}); - -CUBRIDClient.on(CUBRIDClient.EVENT_QUERY_DATA_AVAILABLE, function (result, queryHandle, sql) { - Helpers.logInfo('[' + sql + '] executed - query handle is: ' + queryHandle); - var arr = Result2Array.RowsArray(result); - Helpers.logInfo('Query result first row: ' + arr[0]); - switch (sql) { - case SQL_A: - assert(Result2Array.TotalRowsCount(result) === 422); - assert(arr[0].toString() === '20421,Wrestling,Greco-Roman 97kg,M,1'); - break; - case SQL_B: - assert(Result2Array.TotalRowsCount(result) === 2000); - assert(arr[0].toString() === '2000,20243,14214,G,681.1,Score'); - } - Helpers.logInfo('...let\'s fetch more data...'); - CUBRIDClient.fetch(queryHandle); -}); - -CUBRIDClient.on(CUBRIDClient.EVENT_FETCH_DATA_AVAILABLE, function (result, queryHandle) { - Helpers.logInfo('Fetch executed for queryHandle: ' + queryHandle); - var arr = Result2Array.RowsArray(result); - Helpers.logInfo('Fetch results - first row: ' + queryHandle + ': ' + arr[0]); - CUBRIDClient.closeQuery(queryHandle, null); -}); - -CUBRIDClient.on(CUBRIDClient.EVENT_FETCH_NO_MORE_DATA_AVAILABLE, function (queryHandle) { - Helpers.logInfo('There is no more data to fetch for query with handle: ' + queryHandle); - CUBRIDClient.closeQuery(queryHandle, null); -}); - -CUBRIDClient.on(CUBRIDClient.EVENT_QUERY_CLOSED, function (queryHandle) { - Helpers.logInfo('Query with handle: ' + queryHandle + ' was closed!'); - if (CUBRIDClient.queriesQueueIsEmpty()) { - CUBRIDClient.close(); - } else { - Helpers.logInfo('(...it\'s not the right time to close the connection! - there are some queries still pending execution...)'); - } -}); - -CUBRIDClient.on(CUBRIDClient.EVENT_CONNECTION_CLOSED, function () { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); -}); diff --git a/test/old_tests/test_Basic_QueriesQueue_Events_Error.js b/test/old_tests/test_Basic_QueriesQueue_Events_Error.js deleted file mode 100644 index 46dc5a1..0000000 --- a/test/old_tests/test_Basic_QueriesQueue_Events_Error.js +++ /dev/null @@ -1,28 +0,0 @@ -var CUBRIDClient = require('./test_Setup').createDefaultCUBRIDDemodbConnection, - Helpers = require('../../src/utils/Helpers'), - Result2Array = require('../../src/resultset/Result2Array'), - assert = require('assert'); - -var SQL_A = 'SELECT * from x_code'; - -CUBRIDClient.connect(function () { -}); - -CUBRIDClient.on(CUBRIDClient.EVENT_ERROR, function (err) { - Helpers.logError('Error!: ' + err.message); - assert(err.message === '-493:Syntax: Unknown class "x_code". select * from x_code'); - CUBRIDClient.close(); -}); - -CUBRIDClient.on(CUBRIDClient.EVENT_CONNECTED, function () { - Helpers.logInfo('Connected.'); - CUBRIDClient.addQuery(SQL_A, null); -}); - -CUBRIDClient.on(CUBRIDClient.EVENT_CONNECTION_CLOSED, function () { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - setTimeout(function () { - process.exit(); - }, 1000); -}); diff --git a/test/old_tests/test_BatchExecuteVariant.js b/test/old_tests/test_BatchExecuteVariant.js deleted file mode 100644 index 59603ff..0000000 --- a/test/old_tests/test_BatchExecuteVariant.js +++ /dev/null @@ -1,51 +0,0 @@ -var CUBRIDClient = require('./test_Setup').createDefaultCUBRIDDemodbConnection, - Helpers = require('../../src/utils/Helpers'), - assert = require('assert'); - -function errorHandler(err) { - throw err.message; -} - -Helpers.logInfo(module.filename.toString() + ' started...'); - -CUBRIDClient.connect(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connected.'); - CUBRIDClient.batchExecuteNoQuery('drop table if exists node_test', function (err) { - if (err) { - errorHandler(err); - } else { - CUBRIDClient.batchExecuteNoQuery('create table node_test(id int)', function (err) { - if (err) { - errorHandler(err); - } else { - CUBRIDClient.batchExecuteNoQuery('insert into node_test values(1)', function (err) { - if (err) { - errorHandler(err); - } else { - CUBRIDClient.batchExecuteNoQuery('drop table node_test', function (err) { - if (err) { - errorHandler(err); - } else { - CUBRIDClient.close(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - } - }); - } - }); - } - }); - } - }); - } - }); - } -}); - - diff --git a/test/old_tests/test_BatchExecute_Error.js b/test/old_tests/test_BatchExecute_Error.js deleted file mode 100644 index b1dfba2..0000000 --- a/test/old_tests/test_BatchExecute_Error.js +++ /dev/null @@ -1,43 +0,0 @@ -var CUBRIDClient = require('./test_Setup').createDefaultCUBRIDDemodbConnection, - Helpers = require('../../src/utils/Helpers'), - assert = require('assert'); - -function errorHandler(err) { - throw err.message; -} - -Helpers.logInfo(module.filename.toString() + ' started...'); - -CUBRIDClient.connect(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connected.'); - var sqlsArr = []; - sqlsArr.push('drop table if exists node_test'); - sqlsArr.push('create table node_test(id xyz)'); - sqlsArr.push('create table node_test(id abc)'); - CUBRIDClient.batchExecuteNoQuery(sqlsArr, function (err) { - if (err instanceof Array) { // Driver version in 8.4.3 - assert(err[0].message === '-494:Semantic: before \' xyz)\'\nxyz is not defined. create class node_test ( id xyz ) '); - assert(err[1].message === '-494:Semantic: before \' abc)\'\nabc is not defined. create class node_test ( id abc ) '); - } else { - if (CUBRIDClient._DB_ENGINE_VER.startsWith('9.1')) { - assert(err.message === '-494:Semantic: before \' xyz)\'\nxyz is not defined. create class node_test ( id xyz ) '); - } else { - assert(err.message === '-494:Semantic: xyz is not defined. create class node_test ( id xyz ) '); - } - } - CUBRIDClient.close(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - } - }); - }); - } -}); - - diff --git a/test/old_tests/test_BigString.js b/test/old_tests/test_BigString.js deleted file mode 100644 index 6b42f7a..0000000 --- a/test/old_tests/test_BigString.js +++ /dev/null @@ -1,69 +0,0 @@ -var CUBRIDClient = require('./test_Setup').createDefaultCUBRIDDemodbConnection, - Helpers = require('../../src/utils/Helpers'), - Result2Array = require('../../src/resultset/Result2Array'), - assert = require('assert'); - -function errorHandler(err) { - throw err.message; -} - -Helpers.logInfo(module.filename.toString() + ' started...'); - -CUBRIDClient.connect(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connected.'); - Helpers.logInfo('Creating the test table...'); - CUBRIDClient.batchExecuteNoQuery( - [ - 'drop table if exists test_big_string', - 'CREATE TABLE test_big_string(str char(1000000))', - 'INSERT INTO test_big_string VALUES(\'QWERTY\')' - ], - function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Querying: select * from test_big_string'); - CUBRIDClient.query('select * from test_big_string', function (err, result, queryHandle) { - if (err) { - errorHandler(err); - } else { - assert(Result2Array.TotalRowsCount(result) === 1); - Helpers.logInfo('Query result rows count: ' + Result2Array.TotalRowsCount(result)); - var arr = Result2Array.RowsArray(result); - assert(arr.length === 1); - assert(arr[0][0].startsWith('QWERTY') === true); - assert(arr[0][0].length === 1000000); - - CUBRIDClient.closeQuery(queryHandle, function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Query closed.'); - CUBRIDClient.batchExecuteNoQuery('drop table test_big_string', function (err) { - if (err) { - errorHandler(err); - } else { - CUBRIDClient.close(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - } - }); - } - }); - } - }); - } - }); - } - } - ); - } -}); - - diff --git a/test/old_tests/test_Blob.js b/test/old_tests/test_Blob.js deleted file mode 100644 index 1791f3e..0000000 --- a/test/old_tests/test_Blob.js +++ /dev/null @@ -1,60 +0,0 @@ -var CUBRIDClient = require('./test_Setup').createDefaultCUBRIDDemodbConnection, - ActionQueue = require('../../src/utils/ActionQueue'), - Helpers = require('../../src/utils/Helpers'), - Result2Array = require('../../src/resultset/Result2Array'), - assert = require('assert'); - -Helpers.logInfo(module.filename.toString() + ' started...'); - -ActionQueue.enqueue( - [ - function (cb) { - CUBRIDClient.connect(cb); - }, - - function (cb) { - var data = ''; - for (var i = 0; i < 5120; i++) { - data += '11111111'; - } - CUBRIDClient.batchExecuteNoQuery(['drop table if exists test_lob', - 'create table test_lob(bl BLOB)', - 'insert into test_lob values(BIT_TO_BLOB(B\'' + data + '\'))'], cb); - }, - - function (cb) { - Helpers.logInfo('Create table and insert done.'); - CUBRIDClient.query('select * from test_lob', cb); - }, - - function (result, queryHandle, cb) { - Helpers.logInfo('Query executed.'); - var arr = Result2Array.RowsArray(result); - var lobObject = arr[0][0]; - CUBRIDClient.lobRead(lobObject, 1, lobObject.lobLength, cb); - }, - - function (buff, read_length, cb) { - Helpers.logInfo('LOB Read done.'); - assert(read_length === 5120); - assert(buff.length === 5120); - for (var i = 0; i < read_length; i++) { - assert(buff[i] === 255); - } - CUBRIDClient.batchExecuteNoQuery(['DROP TABLE test_lob'], cb); - }, - - function (cb) { - Helpers.logInfo('Drop table done.'); - CUBRIDClient.close(cb); - } - ], - - function (err) { - if (err === null) { - Helpers.logInfo('Test passed.'); - } else { - throw err.message; - } - } -); diff --git a/test/old_tests/test_Blob_Insert.js b/test/old_tests/test_Blob_Insert.js deleted file mode 100644 index 0bc0fa7..0000000 --- a/test/old_tests/test_Blob_Insert.js +++ /dev/null @@ -1,75 +0,0 @@ -var CUBRIDClient = require('./test_Setup').createDefaultCUBRIDDemodbConnection, - ActionQueue = require('../../src/utils/ActionQueue'), - Helpers = require('../../src/utils/Helpers'), - Result2Array = require('../../src/resultset/Result2Array'), - assert = require('assert'); - -Helpers.logInfo(module.filename.toString() + ' started...'); - -ActionQueue.enqueue( - [ - function (cb) { - CUBRIDClient.connect(cb); - }, - - function (cb) { - CUBRIDClient.batchExecuteNoQuery(['drop table if exists test_blob', - 'create table test_blob(id int, bl blob)'], cb); - }, - - function (cb) { - Helpers.logInfo('Create table done.'); - CUBRIDClient.lobNew(CUBRIDClient.LOB_TYPE_BLOB, cb); - }, - - function (lobObject, cb) { - Helpers.logInfo('LobNew done.'); - Helpers.logInfo('Number of bytes to write: ' + 2 * CUBRIDClient._LOB_MAX_IO_LENGTH); - var data = new Buffer(2 * CUBRIDClient._LOB_MAX_IO_LENGTH); - for (var i = 0; i < 2 * CUBRIDClient._LOB_MAX_IO_LENGTH; i++) { - data[i] = i; - } - CUBRIDClient.lobWrite(lobObject, 1, data, cb); - }, - - function (lobObject, written_length, cb) { - Helpers.logInfo('LobWrite done.'); - CUBRIDClient.executeWithTypedParams('insert into test_blob values(1, ?)', [lobObject], ['blob'], cb); - }, - - function (cb) { - Helpers.logInfo('Querying: select bl test_blob.'); - CUBRIDClient.query('select bl from test_blob', cb); - }, - - function (result, queryhandle, cb) { - Helpers.logInfo("Query executed."); - var arr = Result2Array.RowsArray(result); - var lobObject = arr[0][0]; - CUBRIDClient.lobRead(lobObject, 1, lobObject.lobLength, cb); - }, - - function (buf, readLength, cb) { - Helpers.logInfo("LobRead done.."); - Helpers.logInfo('Number of bytes read: ' + readLength); - assert(readLength === 2 * CUBRIDClient._LOB_MAX_IO_LENGTH); - for (var i = 0; i < buf.length; i++) { - assert(buf[i] === i % 256); - } - CUBRIDClient.batchExecuteNoQuery(['DROP TABLE test_blob'], cb); - }, - - function (cb) { - Helpers.logInfo('Drop table done.'); - CUBRIDClient.close(cb); - } - ], - - function (err) { - if (err === null) { - Helpers.logInfo('Test passed.'); - } else { - throw err.message; - } - } -); diff --git a/test/old_tests/test_Clob.js b/test/old_tests/test_Clob.js deleted file mode 100644 index 3edfd62..0000000 --- a/test/old_tests/test_Clob.js +++ /dev/null @@ -1,54 +0,0 @@ -var CUBRIDClient = require('./test_Setup').createDefaultCUBRIDDemodbConnection, - ActionQueue = require('../../src/utils/ActionQueue'), - Helpers = require('../../src/utils/Helpers'), - Result2Array = require('../../src/resultset/Result2Array'), - assert = require('assert'); - -Helpers.logInfo(module.filename.toString() + ' started...'); - -ActionQueue.enqueue( - [ - function (cb) { - CUBRIDClient.connect(cb); - }, - - function (cb) { - CUBRIDClient.batchExecuteNoQuery(['drop table if exists test_lob', - 'create table test_lob(cl CLOB)', - 'insert into test_lob values(CHAR_TO_CLOB(\'Clob test\'))'], cb); - }, - - function (cb) { - Helpers.logInfo('Batch execute done.'); - CUBRIDClient.query('select * from test_lob', cb); - }, - - function (result, queryHandle, cb) { - Helpers.logInfo('Query executed.'); - var arr = Result2Array.RowsArray(result); - var lobObject = arr[0][0]; - CUBRIDClient.lobRead(lobObject, 1, lobObject.lobLength, cb); - }, - - function (str, read_length, cb) { - Helpers.logInfo('LOB Read done.'); - assert(read_length === 9); - assert(str === 'Clob test'); - - CUBRIDClient.batchExecuteNoQuery(['DROP TABLE test_lob'], cb); - }, - - function (cb) { - Helpers.logInfo('Drop table done.'); - CUBRIDClient.close(cb); - } - ], - - function (err) { - if (err === null) { - Helpers.logInfo('Test passed.'); - } else { - throw err.message; - } - } -); diff --git a/test/old_tests/test_Clob_Insert.js b/test/old_tests/test_Clob_Insert.js deleted file mode 100644 index 3065173..0000000 --- a/test/old_tests/test_Clob_Insert.js +++ /dev/null @@ -1,69 +0,0 @@ -var CUBRIDClient = require('./test_Setup').createDefaultCUBRIDDemodbConnection, - ActionQueue = require('../../src/utils/ActionQueue'), - Helpers = require('../../src/utils/Helpers'), - Result2Array = require('../../src/resultset/Result2Array'), - assert = require('assert'); - -Helpers.logInfo(module.filename.toString() + ' started...'); - -ActionQueue.enqueue( - [ - function (cb) { - CUBRIDClient.connect(cb); - }, - - function (cb) { - CUBRIDClient.batchExecuteNoQuery(['drop table if exists test_clob', - 'create table test_clob(id int, cl clob)'], cb); - }, - - function (cb) { - Helpers.logInfo('Create table done.'); - CUBRIDClient.lobNew(CUBRIDClient.LOB_TYPE_CLOB, cb); - }, - - function (lobObject, cb) { - Helpers.logInfo('LobNew done.'); - var data = 'Test CLOB content.'; - CUBRIDClient.lobWrite(lobObject, 1, data, cb); - }, - - function (lobObject, written_length, cb) { - Helpers.logInfo('LobWrite done.'); - CUBRIDClient.executeWithTypedParams('insert into test_clob values(1, ?)', [lobObject], ['clob'], cb); - }, - - function (cb) { - Helpers.logInfo('Querying: select cl test_clob.'); - CUBRIDClient.query('select cl from test_clob', cb); - }, - - function (result, queryhandle, cb) { - Helpers.logInfo("Query executed."); - var arr = Result2Array.RowsArray(result); - var lobObject = arr[0][0]; - CUBRIDClient.lobRead(lobObject, 1, lobObject.lobLength, cb); - }, - - function (string, readLength, cb) { - Helpers.logInfo("LobRead done.."); - Helpers.logInfo('Number of bytes read: ' + readLength); - assert(readLength === 'Test CLOB content.'.length); - assert(string === 'Test CLOB content.'); - CUBRIDClient.batchExecuteNoQuery(['DROP TABLE test_clob'], cb); - }, - - function(cb) { - Helpers.logInfo('Drop table done.'); - CUBRIDClient.close(cb); - } - ], - - function (err) { - if (err === null) { - Helpers.logInfo('Test passed.'); - } else { - throw err.message; - } - } -); diff --git a/test/old_tests/test_CloseDefault.js b/test/old_tests/test_CloseDefault.js deleted file mode 100644 index 7d3a481..0000000 --- a/test/old_tests/test_CloseDefault.js +++ /dev/null @@ -1,48 +0,0 @@ -var CUBRIDClient = require('./test_Setup').createDefaultCUBRIDDemodbConnection, - Helpers = require('../../src/utils/Helpers'), - assert = require('assert'); - -function errorHandler(err) { - throw err.message; -} - -Helpers.logInfo(module.filename.toString() + ' started...'); - -CUBRIDClient.connect(function () { - Helpers.logInfo('Connected.'); - Helpers.logInfo('Executing query...'); - CUBRIDClient.query('select * from nation', function (err, result, queryHandle) { - if (err) { - errorHandler(err); - } else { - var foundQueryHandle = false; - for (var i = 0; i < CUBRIDClient._queriesPacketList.length; i++) { - if (CUBRIDClient._queriesPacketList[i].queryHandle === queryHandle) { - foundQueryHandle = true; - break; - } - } - - assert(foundQueryHandle === true); - - CUBRIDClient.close(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connection closed.'); - foundQueryHandle = false; - for (var i = 0; i < CUBRIDClient._queriesPacketList.length; i++) { - if (CUBRIDClient._queriesPacketList[i].handle === queryHandle) { - foundQueryHandle = true; - break; - } - } - - assert(foundQueryHandle === false); - - Helpers.logInfo('Test passed.'); - } - }); - } - }); -}); diff --git a/test/old_tests/test_ConcurrentFetch_Events.js b/test/old_tests/test_ConcurrentFetch_Events.js deleted file mode 100644 index ccda9bc..0000000 --- a/test/old_tests/test_ConcurrentFetch_Events.js +++ /dev/null @@ -1,80 +0,0 @@ -var CUBRIDClient = require('./test_Setup').createDefaultCUBRIDDemodbConnection, - Helpers = require('../../src/utils/Helpers'), - Result2Array = require('../../src/resultset/Result2Array'); - -Helpers.logInfo(module.filename.toString() + ' started...'); - -var queriesOpened = 0; -var queriesClosed = 0; - -CUBRIDClient.connect(); - -CUBRIDClient.on(CUBRIDClient.EVENT_ERROR, function (err) { - throw err.message; -}); - -CUBRIDClient.on(CUBRIDClient.EVENT_CONNECTED, function () { - Helpers.logInfo('Connected.'); - - setTimeout(function(){ - Helpers.logInfo('Querying 1: select * from game'); - CUBRIDClient.query('select * from game', function () { - queriesOpened++; - }); - }, 0); - - setTimeout(function(){ - Helpers.logInfo('Querying 2: select * from game'); - CUBRIDClient.query('select * from game', function () { - queriesOpened++; - }); - }, 1000); -}); - -CUBRIDClient.on(CUBRIDClient.EVENT_QUERY_DATA_AVAILABLE, function (result, queryHandle) { - Helpers.logInfo('Data received for query handle: ' + queryHandle); - Helpers.logInfo('Total query result rows count: ' + Result2Array.TotalRowsCount(result)); - Helpers.logInfo('First "batch" of data returned rows count: ' + Result2Array.RowsArray(result).length); - - Helpers.logInfo('Fetching more rows...'); - CUBRIDClient.fetch(queryHandle); -}); - -CUBRIDClient.on(CUBRIDClient.EVENT_FETCH_DATA_AVAILABLE, function (result, queryHandle) { - Helpers.logInfo('*** Fetch data received for query: ' + queryHandle + '[' + Result2Array.RowsArray(result).length + ' rows]'); - Helpers.logInfo('*** First row: ' + Result2Array.RowsArray(result)[0].toString()); - - // Continue to fetch... - Helpers.logInfo('*** fetching more rows...'); - CUBRIDClient.fetch(queryHandle); -}); - -CUBRIDClient.on(CUBRIDClient.EVENT_FETCH_NO_MORE_DATA_AVAILABLE, function (queryHandle) { - Helpers.logInfo('No more data to fetch for query handle: ' + queryHandle); - - Helpers.logInfo('Closing query: ' + queryHandle); - CUBRIDClient.closeQuery(queryHandle, null); -}); - -CUBRIDClient.on(CUBRIDClient.EVENT_QUERY_CLOSED, function (queryHandle) { - Helpers.logInfo('Query closed: ' + queryHandle); - Helpers.logInfo('Closing connection...'); - - queriesClosed++; - if (queriesOpened === queriesClosed) { - setTimeout(function () { - if (CUBRIDClient.connectionOpened) { - CUBRIDClient.close(); - } else { - Helpers.logInfo('Connection already closed.'); - } - }, 1000); - } -}); - -CUBRIDClient.on(CUBRIDClient.EVENT_CONNECTION_CLOSED, function () { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); -}); - - diff --git a/test/old_tests/test_ConcurrentSelect_Events.js b/test/old_tests/test_ConcurrentSelect_Events.js deleted file mode 100644 index d7b9d31..0000000 --- a/test/old_tests/test_ConcurrentSelect_Events.js +++ /dev/null @@ -1,76 +0,0 @@ -var CUBRIDClient = require('./test_Setup').createDefaultCUBRIDDemodbConnection, - Helpers = require('../../src/utils/Helpers'), - Result2Array = require('../../src/resultset/Result2Array'); - -global.queriesOpened = 0; -global.queriesClosed = 0; - -Helpers.logInfo(module.filename.toString() + ' started...'); - -CUBRIDClient.connect(); - -CUBRIDClient.on(CUBRIDClient.EVENT_ERROR, function (err) { - throw err.message; -}); - -CUBRIDClient.on(CUBRIDClient.EVENT_CONNECTED, function () { - Helpers.logInfo('Connected.'); - - setTimeout(function () { - Helpers.logInfo('[1] Querying: select * from game'); - global.queriesOpened++; - CUBRIDClient.query('select * from game'); - }, 0); - - setTimeout(function () { - Helpers.logInfo('[2] Querying: select * from game'); - global.queriesOpened++; - CUBRIDClient.query('select * from game'); - }, 2000); -}); - -CUBRIDClient.on(CUBRIDClient.EVENT_QUERY_DATA_AVAILABLE, function (result, queryHandle) { - Helpers.logInfo('Data received for query handle: ' + queryHandle); - Helpers.logInfo('Total query result rows count: ' + Result2Array.TotalRowsCount(result)); - Helpers.logInfo('First "batch" of data returned rows count: ' + Result2Array.RowsArray(result).length); - - Helpers.logInfo('Fetching more rows...'); - CUBRIDClient.fetch(queryHandle); -}); - -CUBRIDClient.on(CUBRIDClient.EVENT_FETCH_DATA_AVAILABLE, function (result, queryHandle) { - Helpers.logInfo('*** Fetch data received for query: ' + queryHandle + '[' + Result2Array.RowsArray(result).length + ' rows]'); - // Continue to fetch... - Helpers.logInfo('*** fetching more rows...'); - CUBRIDClient.fetch(queryHandle); -}); - -CUBRIDClient.on(CUBRIDClient.EVENT_FETCH_NO_MORE_DATA_AVAILABLE, function (queryHandle) { - Helpers.logInfo('No more data to fetch for query handle: ' + queryHandle); - - Helpers.logInfo('Closing query: ' + queryHandle); - CUBRIDClient.closeQuery(queryHandle); -}); - -CUBRIDClient.on(CUBRIDClient.EVENT_QUERY_CLOSED, function (queryHandle) { - Helpers.logInfo('Query closed: ' + queryHandle); - Helpers.logInfo('Closing connection...'); - - global.queriesClosed++; - if (global.queriesOpened === global.queriesClosed) { - setTimeout(function () { - if (CUBRIDClient.connectionOpened) { - CUBRIDClient.close(); - } else { - Helpers.logInfo('Connection already closed.'); - } - }, 5000); - } -}); - -CUBRIDClient.on(CUBRIDClient.EVENT_CONNECTION_CLOSED, function () { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); -}); - - diff --git a/test/old_tests/test_Connect.js b/test/old_tests/test_Connect.js deleted file mode 100644 index 7a70c36..0000000 --- a/test/old_tests/test_Connect.js +++ /dev/null @@ -1,34 +0,0 @@ -var CUBRIDClient = require('./test_Setup').createDefaultCUBRIDDemodbConnection, - Helpers = require('../../src/utils/Helpers'), - assert = require('assert'); - -function errorHandler(err) { - throw err.message; -} - -Helpers.logInfo(module.filename.toString() + ' started...'); - -CUBRIDClient.connect(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connected OK.'); - CUBRIDClient.getEngineVersion(function (err, result) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('CUBRID engine version: ' + result); - CUBRIDClient.close(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - } - }); - } - }); - } -}); - - diff --git a/test/old_tests/test_ConnectCollision.js b/test/old_tests/test_ConnectCollision.js deleted file mode 100644 index c4fb2bf..0000000 --- a/test/old_tests/test_ConnectCollision.js +++ /dev/null @@ -1,35 +0,0 @@ -var CUBRIDClient = require('./test_Setup').createDefaultCUBRIDDemodbConnection, - Helpers = require('../../src/utils/Helpers'), - ErrorMessages = require('../../src/constants/ErrorMessages'), - assert = require('assert'); - -Helpers.logInfo(module.filename.toString() + ' started...'); - -CUBRIDClient.connect(function () { - Helpers.logInfo('Connected the first time.'); - Helpers.logInfo('Connecting the second time...'); - CUBRIDClient.connect(function (err) { - if (err !== null) { - Helpers.logInfo('Error: ' + err.message); - assert(err.message === ErrorMessages.ERROR_CONNECTION_ALREADY_OPENED); - } else { - throw 'We should not get here!'; - } - - Helpers.logInfo('Closing first connection...'); - CUBRIDClient.close(function () { - Helpers.logInfo('First connection closed.'); - Helpers.logInfo('Trying to close connection the second time...'); - CUBRIDClient.close(function (err) { - if (err !== null) { - Helpers.logInfo('Error: ' + err.message); - assert(err.message === ErrorMessages.ERROR_CONNECTION_ALREADY_CLOSED); - } else { - throw 'We should not get here!'; - } - }); - Helpers.logInfo('Test passed.'); - }); - }); -}); - diff --git a/test/old_tests/test_ConnectTimeout.js b/test/old_tests/test_ConnectTimeout.js deleted file mode 100644 index e266002..0000000 --- a/test/old_tests/test_ConnectTimeout.js +++ /dev/null @@ -1,20 +0,0 @@ -var assert = require('assert'), - CUBRIDConnection = require('../../src/CUBRIDConnection'), - ErrorMessages = require('../../src/constants/ErrorMessages'), - Helpers = require('../../src/utils/Helpers'); - -//var client = new CUBRIDConnection('www.google.com', 81, 'public', '', 'demodb'); -var client = new CUBRIDConnection('10.255.255.1', 33000, 'public', '', 'demodb'); - -Helpers.logInfo(module.filename.toString() + ' started...'); - -client.setConnectionTimeout(2000); -client.connect(function (err) { - if (err) { - assert(err.message === ErrorMessages.ERROR_CONNECTION_TIMEOUT); - Helpers.logInfo('Test passed.'); - } else { - throw 'We should not get here!'; - } -}); - diff --git a/test/old_tests/test_Connect_Events.js b/test/old_tests/test_Connect_Events.js deleted file mode 100644 index 6ac7390..0000000 --- a/test/old_tests/test_Connect_Events.js +++ /dev/null @@ -1,31 +0,0 @@ -var CUBRIDClient = require('./test_Setup').createDefaultCUBRIDDemodbConnection, - Helpers = require('../../src/utils/Helpers'); - -Helpers.logInfo(module.filename.toString() + ' started...'); - -CUBRIDClient.connect(); - -CUBRIDClient.on(CUBRIDClient.EVENT_ERROR, function (err) { - throw err.message; -}); - -CUBRIDClient.on(CUBRIDClient.EVENT_CONNECTED, function () { - Helpers.logInfo('Connection opened.'); - CUBRIDClient.query('select * from game'); -}); - -CUBRIDClient.on(CUBRIDClient.EVENT_QUERY_DATA_AVAILABLE, function (result, queryHandle) { - CUBRIDClient.closeQuery(queryHandle, function () { - }); -}); - -CUBRIDClient.on(CUBRIDClient.EVENT_QUERY_CLOSED, function () { - CUBRIDClient.close(); -}); - -CUBRIDClient.on(CUBRIDClient.EVENT_CONNECTION_CLOSED, function () { - Helpers.logInfo('Connection closed'); - Helpers.logInfo('Test passed'); -}); - - diff --git a/test/old_tests/test_Connect_Sequence.js b/test/old_tests/test_Connect_Sequence.js deleted file mode 100644 index 1c9390e..0000000 --- a/test/old_tests/test_Connect_Sequence.js +++ /dev/null @@ -1,31 +0,0 @@ -var CUBRIDClient = require('./test_Setup').createDefaultCUBRIDDemodbConnection, - ActionQueue = require('../../src/utils/ActionQueue'), - Helpers = require('../../src/utils/Helpers'); - -Helpers.logInfo(module.filename.toString() + ' started...'); - -ActionQueue.enqueue( - [ - function (callback) { - CUBRIDClient.connect(callback); - }, - - function (callback) { - CUBRIDClient.getEngineVersion(callback); - }, - - function (version, callback) { - Helpers.logInfo('Engine version: ' + version); - CUBRIDClient.close(callback); - } - ], - - function (err) { - if (err) { - throw err.message; - } else { - Helpers.logInfo('Test passed.'); - } - } -); - diff --git a/test/old_tests/test_ConnectionPool.js b/test/old_tests/test_ConnectionPool.js deleted file mode 100644 index 067f437..0000000 --- a/test/old_tests/test_ConnectionPool.js +++ /dev/null @@ -1,135 +0,0 @@ -var Helpers = require('../../src/utils/Helpers'), - EventEmitter = require('events').EventEmitter, -//pooling = require('connection_pool'), - pooling = require('c:/Program Files (x86)/nodejs/node_modules/pooling'), - CUBRIDConnection = require('../../src/CUBRIDConnection'), - Result2Array = require('../../src/resultset/Result2Array'), - assert = require('assert'); - -var conn_idx = 1; -var pool = pooling.createPool({ - checkInterval : 1 * 1000, - max : 2, - maxIdleTime : 30 * 1000, - name : 'my pool', - create : function create(callback) { - var client = new EventEmitter(); - client.id = conn_idx++; - Helpers.logInfo('Creating pool client id: ' + client.id); - return callback(null, client); - }, - destroy : function destroy(client) { - Helpers.logInfo('Destroyed pool client id: ' + client.id); - client.was = client.id; - client.id = -1; - } -}); - -pool.acquire(function (err, client) { - var CUBRIDClient = new CUBRIDConnection('localhost', 33000, 'public', '', 'demodb'); - CUBRIDClient.connect(function (err) { - if (err === null) { - Helpers.logInfo('Database connection acquired for pool client id: ' + client.id); - Helpers.logInfo('Executing query: select * from code'); - CUBRIDClient.query("select * from code", function (err, result, queryHandle) { - if (err) { - Helpers.logError(err); - } else { - Helpers.logInfo('Query results rows count for pool client id: ' + client.id + ' is: ' + Result2Array.TotalRowsCount(result)); - CUBRIDClient.closeQuery(queryHandle, function (err) { - if (err) { - Helpers.logError(err); - } else { - Helpers.logInfo('Query closed for pool client id: ' + client.id); - CUBRIDClient.close(function (err) { - if (err) { - Helpers.logError(err); - } else { - Helpers.logInfo('Connection closed for pool client id: ' + client.id); - Helpers.logInfo('Waiting some time before releasing the pool client id: ' + client.id + '...'); - setTimeout(function () { - Helpers.logInfo('Releasing pool client id: ' + client.id); - pool.release(client); - }, 10 * 1000); - } - }); - } - }); - } - }); - } - }); -}); - -pool.acquire(function (err, client) { - var CUBRIDClient = new CUBRIDConnection('localhost', 33000, 'public', '', 'demodb'); - CUBRIDClient.connect(function (err) { - if (err === null) { - Helpers.logInfo('Database connection acquired for pool client id: ' + client.id); - Helpers.logInfo('Executing query: select * from game'); - CUBRIDClient.query("select * from game", function (err, result, queryHandle) { - if (err) { - Helpers.logError(err); - } else { - Helpers.logInfo('Query results rows count for pool client id: ' + client.id + ' is: ' + Result2Array.TotalRowsCount(result)); - CUBRIDClient.closeQuery(queryHandle, function (err) { - if (err) { - Helpers.logError(err); - } else { - Helpers.logInfo('Query closed for pool client id: ' + client.id); - CUBRIDClient.close(function (err) { - if (err) { - Helpers.logError(err); - } else { - Helpers.logInfo('Connection closed for pool client id: ' + client.id); - Helpers.logInfo('Waiting some time before releasing the pool client id: ' + client.id + '...'); - setTimeout(function () { - Helpers.logInfo('Releasing pool client id: ' + client.id); - pool.release(client); - }, 10 * 1000); - } - }); - } - }); - } - }); - } - }); -}); - -pool.acquire(function (err, client) { - var CUBRIDClient = new CUBRIDConnection('localhost', 33000, 'public', '', 'demodb'); - CUBRIDClient.connect(function (err) { - if (err === null) { - Helpers.logInfo('Database connection acquired for pool client id: ' + client.id); - Helpers.logInfo('Executing query: select * from nation'); - CUBRIDClient.query("select * from nation", function (err, result, queryHandle) { - if (err) { - Helpers.logError(err); - } else { - Helpers.logInfo('Query results rows count for pool client id: ' + client.id + ' is: ' + Result2Array.TotalRowsCount(result)); - CUBRIDClient.closeQuery(queryHandle, function (err) { - if (err) { - Helpers.logError(err); - } else { - Helpers.logInfo('Query closed for pool client id: ' + client.id); - CUBRIDClient.close(function (err) { - if (err) { - Helpers.logError(err); - } else { - Helpers.logInfo('Connection closed for pool client id: ' + client.id); - Helpers.logInfo('Waiting some time before releasing the pool client id: ' + client.id + '...'); - setTimeout(function () { - Helpers.logInfo('Releasing pool client id: ' + client.id); - pool.release(client); - }, 10 * 1000); - } - }); - } - }); - } - }); - } - }); -}); - diff --git a/test/old_tests/test_DataTypes.js b/test/old_tests/test_DataTypes.js deleted file mode 100644 index d4dd9ad..0000000 --- a/test/old_tests/test_DataTypes.js +++ /dev/null @@ -1,111 +0,0 @@ -var CUBRIDClient = require('./test_Setup').createDefaultCUBRIDDemodbConnection, - Helpers = require('../../src/utils/Helpers'), - Result2Array = require('../../src/resultset/Result2Array'), - assert = require('assert'); - -function errorHandler(err) { - throw err.message; -} - -Helpers.logInfo(module.filename.toString() + ' started...'); - -CUBRIDClient.connect(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connected.'); - Helpers.logInfo('Creating the test table...'); - CUBRIDClient.batchExecuteNoQuery( - [ - 'drop table if exists test_data_types', - 'CREATE TABLE test_data_types(' + - 'a bigint,' + - 'b bit(1),' + - 'c bit varying(1),' + - 'd blob,' + - 'e character(1),' + - 'f clob,' + - 'g date,' + - 'h datetime,' + - 'i double,' + - 'j float,' + - 'k integer,' + - 'l monetary,' + - 'm national character(1),' + - 'o national character varying(100),' + - 'p numeric(15,0),' + - 'r character varying(100),' + - 's time,' + - 't timestamp,' + - 'u character varying(4096))', - 'insert into test_data_types values(15, B\'0\',B\'0\', \'qwerty\', \'a\', \'qwerty\', \'2012-10-02\',' + - '\'2012-10-02 13:25:45\', 1.5, 2.5, 14, 3.14, N\'9\', N\'95\', 16, \'varchar\', \'1899-12-31 13:25:45\',' + - '\'2012-10-02 13:25:45\', \'varchar\')' - ], - function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connected.'); - Helpers.logInfo('Querying: select * from test_data_types'); - CUBRIDClient.query('select * from test_data_types', function (err, result, queryHandle) { - if (err) { - errorHandler(err); - } else { - assert(Result2Array.TotalRowsCount(result) === 1); - Helpers.logInfo('Query result rows count: ' + Result2Array.TotalRowsCount(result)); - var arr = Result2Array.RowsArray(result); - assert(arr.length === 1); - assert(arr[0][0] === 15); - assert(arr[0][1][0] === 0); - assert(arr[0][2][0] === 0); - assert(typeof(arr[0][3]) === 'object'); - assert(arr[0][4] === 'a'); - assert(typeof(arr[0][5]) === 'object'); - assert(arr[0][6].toString() === '2012-10-02T00:00:00.000Z'); - assert(arr[0][7].toString() === '2012-10-02T13:25:45.000Z'); - assert(arr[0][8] === 1.5); - assert(arr[0][9] === 2.5); - assert(arr[0][10] === 14); - assert(arr[0][11] === 3.14); - assert(arr[0][12] === '9'); - assert(arr[0][13] === '95'); - assert(arr[0][14] === 16); - assert(arr[0][15] === 'varchar'); - assert(arr[0][16].toString() === '1899-12-31T13:25:45.000Z'); - assert(arr[0][17].toString() === '2012-10-02T13:25:45.000Z'); - assert(arr[0][18] === 'varchar'); - - for (var j = 0; j < arr.length; j++) { - Helpers.logInfo(arr[j].toString()); - } - CUBRIDClient.closeQuery(queryHandle, function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Query closed.'); - CUBRIDClient.batchExecuteNoQuery('drop table test_data_types', function (err) { - if (err) { - errorHandler(err); - } else { - CUBRIDClient.close(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - } - }); - } - }); - } - }); - } - }); - } - } - ); - } -}); - - diff --git a/test/old_tests/test_DataTypesEvents.js b/test/old_tests/test_DataTypesEvents.js deleted file mode 100644 index 49a9fd4..0000000 --- a/test/old_tests/test_DataTypesEvents.js +++ /dev/null @@ -1,107 +0,0 @@ -var CUBRIDClient = require('./test_Setup').createDefaultCUBRIDDemodbConnection, - Helpers = require('../../src/utils/Helpers'), - Result2Array = require('../../src/resultset/Result2Array'), - assert = require('assert'); - -global.savedQueryHandle = null; -global.batchExecuteNo = 0; - -Helpers.logInfo(module.filename.toString() + ' started...'); - -CUBRIDClient.connect(null); - -CUBRIDClient.on(CUBRIDClient.EVENT_ERROR, function (err) { - Helpers.logError('Error: ' + err.message); - throw 'We should not get here!'; -}); - -CUBRIDClient.on(CUBRIDClient.EVENT_CONNECTED, function () { - Helpers.logInfo('Connected.'); - Helpers.logInfo('Batch execute: create table and insert.'); - CUBRIDClient.batchExecuteNoQuery( - [ - 'drop table if exists test_data_types', - 'CREATE TABLE test_data_types(' + - 'a bigint,' + - 'b bit(1),' + - 'c bit varying(1),' + - 'd blob,' + - 'e character(1),' + - 'f clob,' + - 'g date,' + - 'h datetime,' + - 'i double,' + - 'j float,' + - 'k integer,' + - 'l monetary,' + - 'm national character(1),' + - 'o national character varying(100),' + - 'p numeric(15,0),' + - 'r character varying(100),' + - 's time,' + - 't timestamp,' + - 'u character varying(4096))', - 'insert into test_data_types values(15, B\'0\',B\'0\', \'qwerty\', \'a\', \'qwerty\', \'2012-10-02\',' + - '\'2012-10-02 13:25:45\', 1.5, 2.5, 14, 3.14, N\'9\', N\'95\', 16, \'varchar\', \'1899-12-31 13:25:45\',' + - '\'2012-10-02 13:25:45\', \'varchar\')' - ], - null); -}); - -CUBRIDClient.on(CUBRIDClient.EVENT_BATCH_COMMANDS_COMPLETED, function () { - if (global.batchExecuteNo === 0) { - Helpers.logInfo('Batch execute done.'); - Helpers.logInfo('Querying: select * from test_data_types'); - global.batchExecuteNo = 1; - CUBRIDClient.query('select * from test_data_types', null); - } else { - Helpers.logInfo('Batch execute done.'); - Helpers.logInfo('Closing query...'); - CUBRIDClient.closeQuery(global.savedQueryHandle, null); - } -}); - -CUBRIDClient.on(CUBRIDClient.EVENT_QUERY_DATA_AVAILABLE, function (result, queryHandle) { - Helpers.logInfo('Data received.'); - Helpers.logInfo('Returned active query handle: ' + queryHandle); - global.savedQueryHandle = queryHandle; // Save handle - needed for further fetch operations - Helpers.logInfo('Total query result rows count: ' + Result2Array.TotalRowsCount(result)); - Helpers.logInfo('Returned rows count: ' + Result2Array.RowsArray(result).length); - var arr = Result2Array.RowsArray(result); - assert(arr.length === 1); - assert(arr[0][0] === 15); - assert(arr[0][1][0] === 0); - assert(arr[0][2][0] === 0); - assert(typeof(arr[0][3]) === 'object'); - assert(arr[0][4] === 'a'); - assert(typeof(arr[0][5]) === 'object'); - assert(arr[0][6].toString() === '2012-10-02T00:00:00.000Z'); - assert(arr[0][7].toString() === '2012-10-02T13:25:45.000Z'); - assert(arr[0][8] === 1.5); - assert(arr[0][9] === 2.5); - assert(arr[0][10] === 14); - assert(arr[0][11] === 3.14); - assert(arr[0][12] === '9'); - assert(arr[0][13] === '95'); - assert(arr[0][14] === 16); - assert(arr[0][15] === 'varchar'); - assert(arr[0][16].toString() === '1899-12-31T13:25:45.000Z'); - assert(arr[0][17].toString() === '2012-10-02T13:25:45.000Z'); - assert(arr[0][18] === 'varchar'); - - CUBRIDClient.batchExecuteNoQuery('drop table test_data_types', null); -}); - -CUBRIDClient.on(CUBRIDClient.EVENT_QUERY_CLOSED, function () { - Helpers.logInfo('Query closed.'); - global.savedQueryHandle = null; - Helpers.logInfo('Closing connection...'); - CUBRIDClient.close(null); -}); - -CUBRIDClient.on(CUBRIDClient.EVENT_QUERY_CLOSED, function () { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); -}); - - diff --git a/test/old_tests/test_Encoding_Korean.js b/test/old_tests/test_Encoding_Korean.js deleted file mode 100644 index 2fde14d..0000000 --- a/test/old_tests/test_Encoding_Korean.js +++ /dev/null @@ -1,53 +0,0 @@ -var CUBRIDClient = require('./test_Setup').createDefaultCUBRIDDemodbConnection, - ActionQueue = require('../../src/utils/ActionQueue'), - Helpers = require('../../src/utils/Helpers'), - Result2Array = require('../../src/resultset/Result2Array'), - assert = require('assert'); - -var testData = '이 소포를 부치고 싶은데요.'; // KO: 'I would like to send off this package.' - -Helpers.logInfo(module.filename.toString() + ' started...'); - -ActionQueue.enqueue( - [ - function (cb) { - CUBRIDClient.connect(cb); - }, - - function (cb) { - Helpers.logInfo('Connected...'); - CUBRIDClient.batchExecuteNoQuery(['drop table if exists test_encoding', 'create table test_encoding(str varchar(256))'], cb); - }, - - function (cb) { - CUBRIDClient.batchExecuteNoQuery('insert into test_encoding values(\'' + testData + '\')', cb); - }, - - function (cb) { - CUBRIDClient.query('select * from test_encoding where str = \'' + testData + '\'', cb); - }, - - function (result, queryHandle, cb) { - var arr = Result2Array.RowsArray(result); - assert(arr[0][0] === testData); - CUBRIDClient.closeQuery(queryHandle, cb); - }, - - function (queryHandle, cb) { - CUBRIDClient.batchExecuteNoQuery('drop table test_encoding', cb); - }, - - function (cb) { - CUBRIDClient.close(cb); - } - ], - - function (err) { - if (err === null) { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - } else { - throw err.message; - } - } -); diff --git a/test/old_tests/test_Encoding_Russian.js b/test/old_tests/test_Encoding_Russian.js deleted file mode 100644 index 104cb00..0000000 --- a/test/old_tests/test_Encoding_Russian.js +++ /dev/null @@ -1,53 +0,0 @@ -var CUBRIDClient = require('./test_Setup').createDefaultCUBRIDDemodbConnection, - ActionQueue = require('../../src/utils/ActionQueue'), - Helpers = require('../../src/utils/Helpers'), - Result2Array = require('../../src/resultset/Result2Array'), - assert = require('assert'); - -var testData = 'Я хотел бы отослать этот пакет.'; // Russian: 'I would like to send off this package.' - -Helpers.logInfo(module.filename.toString() + ' started...'); - -ActionQueue.enqueue( - [ - function (cb) { - CUBRIDClient.connect(cb); - }, - - function (cb) { - Helpers.logInfo('Connected...'); - CUBRIDClient.batchExecuteNoQuery(['drop table if exists test_encoding', 'create table test_encoding(str varchar(256))'], cb); - }, - - function (cb) { - CUBRIDClient.batchExecuteNoQuery('insert into test_encoding values(\'' + testData + '\')', cb); - }, - - function (cb) { - CUBRIDClient.query('select * from test_encoding where str = \'' + testData + '\'', cb); - }, - - function (result, queryHandle, cb) { - var arr = Result2Array.RowsArray(result); - assert(arr[0][0] === testData); - CUBRIDClient.closeQuery(queryHandle, cb); - }, - - function (queryHandle, cb) { - CUBRIDClient.batchExecuteNoQuery('drop table test_encoding', cb); - }, - - function (cb) { - CUBRIDClient.close(cb); - } - ], - - function (err) { - if (err === null) { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - } else { - throw err.message; - } - } -); diff --git a/test/old_tests/test_ExecuteWithParams.js b/test/old_tests/test_ExecuteWithParams.js deleted file mode 100644 index c623d40..0000000 --- a/test/old_tests/test_ExecuteWithParams.js +++ /dev/null @@ -1,56 +0,0 @@ -var CUBRIDClient = require('./test_Setup').createDefaultCUBRIDDemodbConnection, - Helpers = require('../../src/utils/Helpers'), - assert = require('assert'); - -var sqlDrop = 'drop table if exists ?'; -var sqlCreate = 'create table ?(id int)'; -var sqlInsert = 'insert into ? values(1)'; -var arrValues = ['node_test']; - -function errorHandler(err) { - throw err.message; -} - -Helpers.logInfo(module.filename.toString() + ' started...'); - -CUBRIDClient.connect(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connected.'); - CUBRIDClient.executeWithParams(sqlDrop, arrValues, ['"'], function (err) { - if (err) { - errorHandler(err); - } else { - CUBRIDClient.executeWithParams(sqlCreate, arrValues, ['"'], function (err) { - if (err) { - errorHandler(err); - } else { - CUBRIDClient.executeWithParams(sqlInsert, arrValues, ['"'], function (err) { - if (err) { - errorHandler(err); - } else { - CUBRIDClient.executeWithParams(sqlDrop, arrValues, ['"'], function (err) { - if (err) { - errorHandler(err); - } else { - CUBRIDClient.close(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - } - }); - } - }); - } - }); - } - }); - } - }); - } -}); - - diff --git a/test/old_tests/test_ExecuteWithTypedParams.js b/test/old_tests/test_ExecuteWithTypedParams.js deleted file mode 100644 index 62e11ee..0000000 --- a/test/old_tests/test_ExecuteWithTypedParams.js +++ /dev/null @@ -1,121 +0,0 @@ -var CUBRIDClient = require('./test_Setup').createDefaultCUBRIDDemodbConnection, - Helpers = require('../../src/utils/Helpers'), - Result2Array = require('../../src/resultset/Result2Array'), - assert = require('assert'); - -function errorHandler(err) { - throw err.message; -} - -Helpers.logInfo(module.filename.toString() + ' started...'); - -CUBRIDClient.connect(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connected.'); - CUBRIDClient.batchExecuteNoQuery( - [ - 'drop table if exists test_params', - 'CREATE TABLE test_params(' + - 'a bigint,' + - 'b bit(8),' + - 'c bit varying(8),' + - 'd character(1),' + - 'e date,' + - 'f datetime,' + - 'g double,' + - 'h float,' + - 'i integer,' + - 'j monetary,' + - 'k national character(1),' + - 'l national character varying(100),' + - 'm numeric(15,0),' + - 'n character varying(100),' + - 'o time,' + - 'p timestamp,' + - 'q character varying(4096))' - ], - function (err) { - if (err) { - errorHandler(err); - } else { - var bitValue = new Buffer(1), - date = new Date(), - varBitValue = new Buffer(1), - values; - - bitValue[0] = 0; - varBitValue[0] = 128; - - date.setUTCFullYear(2012, 10, 2); - date.setUTCHours(13); - date.setUTCMinutes(25); - date.setUTCSeconds(45); - date.setUTCMilliseconds(0); - - values = [15, bitValue, varBitValue, 'a', date, date, 1.5, 2.5, 14, 3.14, '9' , '95', 16, 'varnchar', date, date, 'varcharWithDouble"Quote']; - - CUBRIDClient.executeWithTypedParams( - 'INSERT INTO test_params VALUES( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', - values, - ['bigint', 'bit', 'varbit', 'char', 'date', 'datetime', 'double', 'float', 'int', 'monetary', - 'nchar', 'varnchar', 'numeric', 'varchar', 'time', 'timestamp', 'varchar'], - function (err) { - if (err) { - errorHandler(err); - } else { - CUBRIDClient.query('SELECT * FROM test_params', function (err, result, queryHandle) { - if (err) { - errorHandler(err); - } else { - var arr = Result2Array.RowsArray(result); - - assert(Result2Array.TotalRowsCount(result) === 1); - - Helpers.logInfo('Query result rows count: ' + arr.length); - - assert(arr.length === 1); - - arr = arr[0]; - - assert(arr[0] === values[0]); - assert(arr[1][0] === values[1][0]); - assert(arr[2][0] === values[2][0]); - assert(arr[3] === values[3]); - assert(arr[4].toString() === '2012-10-02T00:00:00.000Z'); - assert(arr[5].toString() === '2012-10-02T13:25:45.000Z'); - assert(arr[6] === values[6]); - assert(arr[7] === values[7]); - assert(arr[8] === values[8]); - assert(arr[9] === values[9]); - assert(arr[10] === values[10]); - assert(arr[11] === values[11]); - assert(arr[12] === values[12]); - assert(arr[13] === values[13]); - assert(arr[14].toString() === '1899-12-31T13:25:45.000Z'); - assert(arr[15].toString() === '2012-10-02T13:25:45.000Z'); - assert(arr[16] === values[16]); - - CUBRIDClient.execute('DROP TABLE test_params', function (err) { - if (err) { - errorHandler(err); - } else { - CUBRIDClient.close(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - } - }); - } - }); - } - }); - } - }); - } - }); - } -}); diff --git a/test/old_tests/test_GetDbParameter.js b/test/old_tests/test_GetDbParameter.js deleted file mode 100644 index ed28a00..0000000 --- a/test/old_tests/test_GetDbParameter.js +++ /dev/null @@ -1,40 +0,0 @@ -var CUBRIDClient = require('./test_Setup').createDefaultCUBRIDDemodbConnection, - Helpers = require('../../src/utils/Helpers'), - CAS = require('../../src/constants/CASConstants'), - assert = require('assert'); - -function errorHandler(err) { - throw err.message; -} - -Helpers.logInfo(module.filename.toString() + ' started...'); - -CUBRIDClient.connect(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connected OK.'); - CUBRIDClient.setDatabaseParameter(CAS.CCIDbParam.CCI_PARAM_ISOLATION_LEVEL, - CAS.CUBRIDIsolationLevel.TRAN_REP_CLASS_COMMIT_INSTANCE, function (err) { - if (err) { - errorHandler(err); - } else { - CUBRIDClient.getDatabaseParameter(CAS.CCIDbParam.CCI_PARAM_ISOLATION_LEVEL, function (err, value) { - if (err) { - errorHandler(err); - } else { - assert(value === CAS.CUBRIDIsolationLevel.TRAN_REP_CLASS_COMMIT_INSTANCE); - CUBRIDClient.close(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - } - }); - } - }); - } - }); - } -}); diff --git a/test/old_tests/test_GetDbParameterError.js b/test/old_tests/test_GetDbParameterError.js deleted file mode 100644 index 322f35a..0000000 --- a/test/old_tests/test_GetDbParameterError.js +++ /dev/null @@ -1,34 +0,0 @@ -var CUBRIDClient = require('./test_Setup').createDefaultCUBRIDDemodbConnection, - Helpers = require('../../src/utils/Helpers'), - CAS = require('../../src/constants/CASConstants'), - assert = require('assert'); - -function errorHandler(err) { - Helpers.logInfo(err.message); - assert(err.message === '-1011:CAS_ER_PARAM_NAME'); - CUBRIDClient.close(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - } - }); -} - -Helpers.logInfo(module.filename.toString() + ' started...'); - -CUBRIDClient.connect(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connected OK.'); - CUBRIDClient.getDatabaseParameter(CAS.CCIDbParam.CCI_PARAM_MAX_STRING_LENGTH, function (err, value) { - if (err) { - errorHandler(err); - } else { - throw 'We should not get here'; - } - }); - } -}); diff --git a/test/old_tests/test_GetDbParameter_Events.js b/test/old_tests/test_GetDbParameter_Events.js deleted file mode 100644 index 9083ef9..0000000 --- a/test/old_tests/test_GetDbParameter_Events.js +++ /dev/null @@ -1,65 +0,0 @@ -var CUBRIDClient = require('./test_Setup').createDefaultCUBRIDDemodbConnection, - Helpers = require('../../src/utils/Helpers'), - Result2Array = require('../../src/resultset/Result2Array'), - CAS = require('../../src/constants/CASConstants'), - assert = require('assert'); - -Helpers.logInfo(module.filename.toString() + ' started...'); - -CUBRIDClient.connect(); - -CUBRIDClient.on(CUBRIDClient.EVENT_ERROR, function (err) { - Helpers.logInfo('Error: ' + err.message); - throw 'We should not get here!'; -}); - -CUBRIDClient.on(CUBRIDClient.EVENT_CONNECTED, function () { - Helpers.logInfo('Connected.'); - CUBRIDClient.getDatabaseParameter(CAS.CCIDbParam.CCI_PARAM_ISOLATION_LEVEL, null); -}); - -CUBRIDClient.on(CUBRIDClient.EVENT_GET_DB_PARAMETER_COMPLETED, function (value) { - var isolationLevel = ''; - - if (typeof value === 'undefined') { - throw "Db parameter retrieved unsuccessfully!"; - } - - switch (value) { - case CAS.CUBRIDIsolationLevel.TRAN_UNKNOWN_ISOLATION: - isolationLevel = 'TRAN_UNKNOWN_ISOLATION'; - break; - case CAS.CUBRIDIsolationLevel.TRAN_COMMIT_CLASS_UNCOMMIT_INSTANCE: - isolationLevel = 'TRAN_COMMIT_CLASS_UNCOMMIT_INSTANCE'; - break; - case CAS.CUBRIDIsolationLevel.TRAN_COMMIT_CLASS_COMMIT_INSTANCE: - isolationLevel = 'TRAN_COMMIT_CLASS_COMMIT_INSTANCE'; - break; - case CAS.CUBRIDIsolationLevel.TRAN_REP_CLASS_UNCOMMIT_INSTANCE: - isolationLevel = 'TRAN_REP_CLASS_UNCOMMIT_INSTANCE'; - break; - case CAS.CUBRIDIsolationLevel.TRAN_REP_CLASS_COMMIT_INSTANCE: - isolationLevel = 'TRAN_REP_CLASS_COMMIT_INSTANCE'; - break; - case CAS.CUBRIDIsolationLevel.TRAN_REP_CLASS_REP_INSTANCE: - isolationLevel = 'TRAN_REP_CLASS_REP_INSTANCE'; - break; - case CAS.CUBRIDIsolationLevel.TRAN_SERIALIZABLE: - isolationLevel = 'TRAN_SERIALIZABLE'; - break; - } - - if (isolationLevel === '') { - throw "Db parameter value is not recognized!"; - } - - Helpers.logInfo('Get Db parameter completed: ' + isolationLevel); - CUBRIDClient.close(); -}) -; - -CUBRIDClient.on(CUBRIDClient.EVENT_CONNECTION_CLOSED, function () { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); -}); - diff --git a/test/old_tests/test_Helpers.js b/test/old_tests/test_Helpers.js deleted file mode 100644 index ecc57e2..0000000 --- a/test/old_tests/test_Helpers.js +++ /dev/null @@ -1,70 +0,0 @@ -var assert = require('assert'), - Helpers = require('../../src/utils/Helpers'); - -console.log('Unit test ' + module.filename.toString() + ' started...'); - -var buffer = new Buffer(5); -buffer.write('12345'); -var value1 = ['6', '7', '8']; -var comb1 = Helpers._combineData(buffer, value1); - -assert(comb1.toString(), '12345678'); - -var value2 = new Buffer('678'); -var comb2 = Helpers._combineData(buffer, value2); - -assert(comb2.toString(), '12345678'); - -var value3 = new Buffer(3); -value3[0] = '6'.charCodeAt(0); -value3[1] = '7'.charCodeAt(0); -value3[2] = '8'.charCodeAt(0); - -var comb3 = Helpers._combineData(buffer, value3); - -assert(comb3.toString(), '12345678'); - -var sql = 'insert into a values(?, ?, ?)'; -var newsql = Helpers._sqlFormat(sql, ['1', 2, null], ['\'', '', '']); - -assert(newsql, "insert into a values('1', 2, NULL)"); - -var unescaped = 'insert into "a values(\b)'; -var escaped = Helpers._escapeString(unescaped); -assert(escaped, "insert into \"\"a values(\\b)"); - -//Test Input validation functions -assert(Helpers._validateInputBoolean(null) === false); -assert(Helpers._validateInputBoolean(4) === false); -assert(Helpers._validateInputBoolean(3.14) === false); -assert(Helpers._validateInputBoolean('qwerty') === false); -assert(Helpers._validateInputBoolean(true) === true); -assert(Helpers._validateInputBoolean(1) === true); - -assert(Helpers._validateInputPositive(null) === false); -assert(Helpers._validateInputPositive(3.14) === true); -assert(Helpers._validateInputPositive(-1) === false); -assert(Helpers._validateInputPositive(0) === false); -assert(Helpers._validateInputPositive(14) === true); - -assert(Helpers._validateInputTimeout(null) === false); -assert(Helpers._validateInputTimeout(3.14) === false); -assert(Helpers._validateInputTimeout(-1) === false); -assert(Helpers._validateInputTimeout(0) === true); -assert(Helpers._validateInputTimeout(14) === true); - -assert(Helpers._validateInputString(null) === false); -assert(Helpers._validateInputString(3) === false); -assert(Helpers._validateInputString(true) === false); -assert(Helpers._validateInputString('') === false); -assert(Helpers._validateInputString('querty') === true); - -assert(Helpers._validateInputSQLString(null) === false); -assert(Helpers._validateInputSQLString(3) === false); -assert(Helpers._validateInputSQLString(true) === false); -assert(Helpers._validateInputSQLString('') === false); -assert(Helpers._validateInputSQLString('a') === false); -assert(Helpers._validateInputSQLString('qwerty') === true); - -console.log('Unit test ended OK.'); - diff --git a/test/old_tests/test_IndexExports.js b/test/old_tests/test_IndexExports.js deleted file mode 100644 index b700e15..0000000 --- a/test/old_tests/test_IndexExports.js +++ /dev/null @@ -1,51 +0,0 @@ -var CUBRIDClient = require('./test_Setup').createDefaultCUBRIDDemodbConnection, - Helpers = require('../../index').Helpers, - Result2Array = require('../../index').Result2Array, - assert = require('assert'); - -function errorHandler(err) { - throw err.message; -} - -Helpers.logInfo(module.filename.toString() + ' started...'); - -CUBRIDClient.connect(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connected.'); - Helpers.logInfo('Querying: select * from nation'); - CUBRIDClient.query('select * from nation', function (err, result, queryHandle) { - if (err) { - errorHandler(err); - } else { - assert(Result2Array.TotalRowsCount(result) === 215); - Helpers.logInfo('Query result rows count: ' + Result2Array.TotalRowsCount(result)); - var arr = Result2Array.RowsArray(result); - assert(arr.length === 215); - assert(arr[0].toString() === 'SRB,Serbia,Europe,Beograd'); - assert(arr[arr.length - 1].toString() === 'AFG,Afghanistan,Asia,Kabul'); - for (var j = 0; j < 1; j++) { - Helpers.logInfo(arr[j].toString()); - } - CUBRIDClient.closeQuery(queryHandle, function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Query closed.'); - CUBRIDClient.close(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - } - }); - } - }); - } - }); - } -}); - - diff --git a/test/old_tests/test_LastInsertID.js b/test/old_tests/test_LastInsertID.js deleted file mode 100644 index 9e0e992..0000000 --- a/test/old_tests/test_LastInsertID.js +++ /dev/null @@ -1,62 +0,0 @@ -var CUBRIDClient = require('./test_Setup').createDefaultCUBRIDDemodbConnection, - Helpers = require('../../src/utils/Helpers'), - Result2Array = require('../../src/resultset/Result2Array'), - assert = require('assert'); - -function errorHandler(err) { - throw err.message; -} - -Helpers.logInfo(module.filename.toString() + ' started...'); - -CUBRIDClient.connect(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connected.'); - CUBRIDClient.batchExecuteNoQuery(['drop table if exists node_test', 'create table node_test(id INT AUTO_INCREMENT NOT NULL PRIMARY KEY, text VARCHAR(32))'], function (err) { - if (err) { - errorHandler(err); - } else { - CUBRIDClient.batchExecuteNoQuery(['insert into node_test values(NULL, \'database\'),(NULL, \'manager\')'], function (err) { - if (err) { - errorHandler(err); - } else { - CUBRIDClient.query('select LAST_INSERT_ID()', function (err, result, queryHandle) { - if (err) { - errorHandler(err); - } else { - assert(Result2Array.TotalRowsCount(result) === 1); - var arr = Result2Array.RowsArray(result); - assert(arr[0].toString() === '1'); - CUBRIDClient.closeQuery(queryHandle, function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Query closed.'); - CUBRIDClient.batchExecuteNoQuery(['drop table node_test'], function (err) { - if (err) { - errorHandler(err); - } else { - CUBRIDClient.close(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - } - }); - } - }); - } - }); - } - }); - } - }); - } - }); - } -}); - - diff --git a/test/old_tests/test_Named_Functions.js b/test/old_tests/test_Named_Functions.js deleted file mode 100644 index 5c2b704..0000000 --- a/test/old_tests/test_Named_Functions.js +++ /dev/null @@ -1,53 +0,0 @@ -var CUBRIDClient = require('./test_Setup').createDefaultCUBRIDDemodbConnection, - Helpers = require('../../src/utils/Helpers'), - Result2Array = require('../../src/resultset/Result2Array'), - assert = require('assert'); - -function errorHandler(err) { - throw err.message; -} - -CUBRIDClient.connect(connect_callback); - -function connect_callback(err) { - if (err) { - errorHandler(err); - } else { - CUBRIDClient.query('select * from game', query_callback); - } -} - -function query_callback(err, result, queryHandle) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Query results:'); - Helpers.logInfo('Returned active query handle: ' + queryHandle); - Helpers.logInfo('Total query result rows count: ' + Result2Array.TotalRowsCount(result)); - Helpers.logInfo('First "batch" of data returned rows count: ' + Result2Array.RowsArray(result).length); - Helpers.logInfo('*** First row: ' + Result2Array.RowsArray(result)[0].toString()); - Helpers.logInfo('Fetching more rows...'); - CUBRIDClient.fetch(queryHandle, fetch_callback); - } -} - -function fetch_callback(err, result){ - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Fetch results:'); - Helpers.logInfo('*** Fetch data received.'); - Helpers.logInfo('*** Current fetch of data returned rows count: ' + Result2Array.RowsArray(result).length); - Helpers.logInfo('*** First row: ' + Result2Array.RowsArray(result)[0].toString()); - CUBRIDClient.close(close_callback); - } -} - -function close_callback(err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - } -} diff --git a/test/old_tests/test_NodePool.js b/test/old_tests/test_NodePool.js deleted file mode 100644 index 92c27d3..0000000 --- a/test/old_tests/test_NodePool.js +++ /dev/null @@ -1,152 +0,0 @@ -var Helpers = require('../../src/utils/Helpers'), - generic_pool = require('generic-pool'), - //generic_pool = require('c:/Program Files (x86)/nodejs/node_modules/generic-pool'), - CUBRIDConnection = require('../../src/CUBRIDConnection'), - Result2Array = require('../../src/resultset/Result2Array'), - assert = require('assert'); - -var pool = generic_pool.Pool({ - name : 'cubrid-node-pool', - max : 2, - create : function (callback) { - var CUBRIDClient = new CUBRIDConnection('localhost', 33000, 'public', '', 'demodb'); - CUBRIDClient.connect(function (err) { - if (err === null) { - Helpers.logInfo('Connection opened.'); - } - callback(err, CUBRIDClient); - }); - }, - destroy : function (db) { - db.close(function (err) { - if (err) { - Helpers.logError(err); - } else { - Helpers.logInfo('Connection closed.'); - } - }); - }, - idleTimeoutMillis : 30000, - priorityRange : 3, - log : false -}); - -pool.acquire(function (err, client) { - if (err) { - Helpers.logError(err); - } - else { - client.query("select * from code", function (err, result, queryHandle) { - if (err) { - Helpers.logError(err); - } else { - Helpers.logInfo('[1] Query results:'); - assert(Result2Array.TotalRowsCount(result) === 6); - Helpers.logInfo('[1] Query results rows count: ' + Result2Array.TotalRowsCount(result)); - Helpers.logInfo('[1] Query results:'); - var arr = Result2Array.RowsArray(result); - assert(arr.length === 6); - client.closeQuery(queryHandle, function (err) { - if (err) { - Helpers.logError(err); - } else { - Helpers.logInfo('[1] Query closed.'); - // Return object back to pool - pool.release(client); - } - }); - } - }); - } -}, 1); - -pool.acquire(function (err, client) { - if (err) { - Helpers.logError(err); - } - else { - client.query("select * from code", function (err, result, queryHandle) { - if (err) { - Helpers.logError(err); - } else { - Helpers.logInfo('[2] Query results:'); - assert(Result2Array.TotalRowsCount(result) === 6); - Helpers.logInfo('[2] Query results rows count: ' + Result2Array.TotalRowsCount(result)); - Helpers.logInfo('[2] Query results:'); - var arr = Result2Array.RowsArray(result); - assert(arr.length === 6); - client.closeQuery(queryHandle, function (err) { - if (err) { - Helpers.logError(err); - } else { - Helpers.logInfo('[2] Query closed.'); - // Return object back to pool - pool.release(client); - } - }); - } - }); - } -}, 1); - -pool.acquire(function (err, client) { - if (err) { - Helpers.logError(err); - } - else { - client.query("select * from code", function (err, result, queryHandle) { - if (err) { - Helpers.logError(err); - } else { - Helpers.logInfo('[3] Query results:'); - assert(Result2Array.TotalRowsCount(result) === 6); - Helpers.logInfo('[3] Query results rows count: ' + Result2Array.TotalRowsCount(result)); - Helpers.logInfo('[3] Query results:'); - var arr = Result2Array.RowsArray(result); - assert(arr.length === 6); - client.closeQuery(queryHandle, function (err) { - if (err) { - Helpers.logError(err); - } else { - Helpers.logInfo('[3] Query closed.'); - // Return object back to pool - pool.release(client); - } - }); - } - }); - } -}, 2); - -pool.acquire(function (err, client) { - if (err) { - Helpers.logError(err); - } - else { - client.query("select * from code", function (err, result, queryHandle) { - if (err) { - Helpers.logError(err); - } else { - Helpers.logInfo('[4] Query results:'); - assert(Result2Array.TotalRowsCount(result) === 6); - Helpers.logInfo('[4] Query results rows count: ' + Result2Array.TotalRowsCount(result)); - Helpers.logInfo('[4] Query results:'); - var arr = Result2Array.RowsArray(result); - assert(arr.length === 6); - client.closeQuery(queryHandle, function (err) { - if (err) { - Helpers.logError(err); - } else { - Helpers.logInfo('[4] Query closed.'); - // return object back to pool - pool.release(client); - } - }); - } - }); - } -}, 1); - -pool.drain(function () { - pool.destroyAllNow(null); -}); diff --git a/test/old_tests/test_ObjectsArray.js b/test/old_tests/test_ObjectsArray.js deleted file mode 100644 index 4225f7c..0000000 --- a/test/old_tests/test_ObjectsArray.js +++ /dev/null @@ -1,51 +0,0 @@ -var CUBRIDClient = require('./test_Setup').createDefaultCUBRIDDemodbConnection, - Helpers = require('../../src/utils/Helpers'), - Result2Array = require('../../src/resultset/Result2Array'), - assert = require('assert'); - -function errorHandler(err) { - throw err.message; -} - -Helpers.logInfo(module.filename.toString() + ' started...'); - -CUBRIDClient.connect(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connected.'); - Helpers.logInfo('Querying: select * from nation'); - CUBRIDClient.query('select * from nation', function (err, result, queryHandle) { - if (err) { - errorHandler(err); - } else { - assert(Result2Array.TotalRowsCount(result) === 215); - Helpers.logInfo('Query result rows count: ' + Result2Array.TotalRowsCount(result)); - var arr = Result2Array.ObjectsArray(result); - assert(arr.length === 215); - assert(arr[arr.length - 1].code === 'AFG'); - assert(arr[arr.length - 1].name === 'Afghanistan'); - assert(arr[arr.length - 1].continent === 'Asia'); - assert(arr[arr.length - 1].capital === 'Kabul'); - for (var j = 0; j < 1; j++) { - Helpers.logInfo(arr[j].code + "," + arr[j].name + "," + arr[j].continent + "," + arr[j].capital); - } - CUBRIDClient.closeQuery(queryHandle, function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Query closed.'); - CUBRIDClient.close(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - } - }); - } - }); - } - }); - } -}); diff --git a/test/old_tests/test_ParallelQueries.js b/test/old_tests/test_ParallelQueries.js deleted file mode 100644 index b1851ff..0000000 --- a/test/old_tests/test_ParallelQueries.js +++ /dev/null @@ -1,96 +0,0 @@ -var CUBRIDConnection = require('../../src/CUBRIDConnection'); -var Helpers = require('../../src/utils/Helpers'), - Result2Array = require('../../src/resultset/Result2Array'); - -Helpers.logInfo(module.filename.toString() + ' started...'); - -function errorHandler(err) { - throw err.message; -} - -function fork(async_calls) { - for (var i = 0; i < async_calls.length; i++) { - async_calls[i](); - } - - setTimeout(function () { - Helpers.logInfo('Test passed.'); - }, 3000); -} - -function A() { - Helpers.logInfo('Function A called.'); - Helpers.logInfo('Connecting... [A].'); - var CUBRIDClient = new CUBRIDConnection('localhost', 33000, 'public', '', 'demodb'); - CUBRIDClient.connect(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connected [A], on port: ' + CUBRIDClient.connectionBrokerPort); - setTimeout(CUBRIDClient.query('select * from nation', function (err, result, queryHandle) { - Helpers.logInfo('Querying [A]: select * from nation'); - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Query result rows count [A]: ' + Result2Array.TotalRowsCount(result)); - CUBRIDClient.closeQuery(queryHandle, function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Query closed [A].'); - CUBRIDClient.close(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connection closed [A].'); - } - }); - } - }); - } - }), 3000); - } - }); -} - -function B() { - Helpers.logInfo('Function B called.'); - var CUBRIDClient2 = new CUBRIDConnection('localhost', 33000, 'public', '', 'demodb'); - Helpers.logInfo('Connecting... [B].'); - CUBRIDClient2.connect(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connected [B], on port: ' + CUBRIDClient2.connectionBrokerPort); - CUBRIDClient2.query('select * from game', function (err, result, queryHandle) { - Helpers.logInfo('Querying [B]: select * from game'); - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Query result rows count [B]: ' + Result2Array.TotalRowsCount(result)); - CUBRIDClient2.closeQuery(queryHandle, function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Query closed [B].'); - CUBRIDClient2.close(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connection closed [B].'); - } - }); - } - }); - } - }); - } - }); -} - -function C() { - Helpers.logInfo('Function C called.'); -} - -fork([A, B, C]); - diff --git a/test/old_tests/test_ParallelQueries_2.js b/test/old_tests/test_ParallelQueries_2.js deleted file mode 100644 index 3f1999b..0000000 --- a/test/old_tests/test_ParallelQueries_2.js +++ /dev/null @@ -1,92 +0,0 @@ -var CUBRIDConnection = require('../../src/CUBRIDConnection'); - -// First connection -var CUBRIDClient = new CUBRIDConnection('localhost', 33000, 'public', '', 'demodb'); -// Second connection -var CUBRIDClient2 = new CUBRIDConnection('localhost', 33000, 'public', '', 'demodb'); - -var Helpers = require('../../src/utils/Helpers'), - Result2Array = require('../../src/resultset/Result2Array'); - -Helpers.logInfo(module.filename.toString() + ' started...'); - -function errorHandler(err) { - throw err.message; -} - -function A() { - Helpers.logInfo('Function A called.'); - Helpers.logInfo('Connecting... [A].'); - CUBRIDClient.connect(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connected [A], on port: ' + CUBRIDClient.connectionBrokerPort); - setTimeout(CUBRIDClient.query('select * from nation', function (err, result, queryHandle) { - Helpers.logInfo('Querying [A]: select * from nation'); - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Query result rows count [A]: ' + Result2Array.TotalRowsCount(result)); - CUBRIDClient.closeQuery(queryHandle, function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Query closed [A].'); - CUBRIDClient.close(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connection closed [A].'); - } - }); - } - }); - } - }), 3000); - } - }); -} - -function B() { - Helpers.logInfo('Function B called.'); - Helpers.logInfo('Connecting... [B].'); - CUBRIDClient2.connect(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connected [B], on port: ' + CUBRIDClient2.connectionBrokerPort); - CUBRIDClient2.query('select * from game', function (err, result, queryHandle) { - Helpers.logInfo('Querying [B]: select * from game'); - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Query result rows count [B]: ' + Result2Array.TotalRowsCount(result)); - CUBRIDClient2.closeQuery(queryHandle, function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Query closed [B].'); - CUBRIDClient2.close(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connection closed [B].'); - } - }); - } - }); - } - }); - } - }); -} - -A(); -B(); - -setTimeout(function () { - Helpers.logInfo('Test passed.'); -}, 5000); - - diff --git a/test/old_tests/test_ParallelQueries_3.js b/test/old_tests/test_ParallelQueries_3.js deleted file mode 100644 index a2ee3be..0000000 --- a/test/old_tests/test_ParallelQueries_3.js +++ /dev/null @@ -1,61 +0,0 @@ -var CUBRIDConnection = require('../../src/CUBRIDConnection'); - -var Helpers = require('../../src/utils/Helpers'), - Result2Array = require('../../src/resultset/Result2Array'); - -Helpers.logInfo(module.filename.toString() + ' started...'); - -var executed = 0; - -function errorHandler(err) { - throw err.message; -} - -function RunQueryInSeparateConnection(i) { - setTimeout(function () { - Helpers.logInfo('Opening connecting no. ' + i + '...'); - var CUBRIDClient = new CUBRIDConnection('localhost', 33000, 'public', '', 'demodb'); - CUBRIDClient.connect(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connection no. ' + i + ' was opened on port: ' + CUBRIDClient.connectionBrokerPort); - CUBRIDClient.query('select * from nation', function (err, result, queryHandle) { - Helpers.logInfo('On connection no. ' + i + ' we are executing query: select * from nation'); - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('On connection no. ' + i + ' we got query result rows count: ' + Result2Array.TotalRowsCount(result)); - CUBRIDClient.closeQuery(queryHandle, function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Query closed for connection no. ' + i + '.'); - CUBRIDClient.close(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connection no. ' + i + ' was closed.'); - executed++; - Helpers.logInfo('Functions completed: ' + executed + ' out of 10 scheduled.'); - } - }); - } - }); - } - }); - } - }); - }, Math.random() * 1000); -} - -Helpers.logInfo('Please wait 10 sec. for the test to complete...'); -setTimeout(function () { - Helpers.logInfo('Test passed.'); -}, 10000); - -// Open 10 connections and for each, execute a query -for (var i = 1; i <= 10; i++) { - RunQueryInSeparateConnection(i); -} - diff --git a/test/old_tests/test_QueriesQueue.js b/test/old_tests/test_QueriesQueue.js deleted file mode 100644 index d8c18b0..0000000 --- a/test/old_tests/test_QueriesQueue.js +++ /dev/null @@ -1,119 +0,0 @@ -var CUBRIDClient = require('./test_Setup').createDefaultCUBRIDDemodbConnection, - Helpers = require('../../src/utils/Helpers'), - Result2Array = require('../../src/resultset/Result2Array'), - assert = require('assert'); - -var SQL_A = 'SELECT * from nation'; -var SQL_B = 'SELECT * from code'; -var SQL_C = 'SELECT * from game'; - -CUBRIDClient.connect(function (err) { - if (err) { - throw err; - } else { - Helpers.logInfo('Connection opened...'); - CUBRIDClient.addQuery(SQL_A, function (err, result, queryHandle) { - if (err) { - throw err; - } else { - Helpers.logInfo(SQL_A + ' executed! - handle: ' + queryHandle); - var arr = Result2Array.RowsArray(result); - assert(arr.length === 215); - assert(arr[0].toString() === 'SRB,Serbia,Europe,Beograd'); - CUBRIDClient.fetch(queryHandle, function (err, result, handle) { - if (err) { - throw err; - } else { - Helpers.logInfo('Fetch executed for queryHandle ' + queryHandle); - if (result !== null) { - Helpers.logInfo('Fetch result: ' + result); - } else { - Helpers.logInfo('There was no data to fetch.'); - } - CUBRIDClient.closeQuery(handle, function (err) { - if (err) { - throw err; - } else { - Helpers.logInfo(SQL_A + ' closed!'); - } - }); - } - }); - } - }); - - CUBRIDClient.addQuery(SQL_B, function (err, result, queryHandle) { - if (err) { - throw err; - } else { - Helpers.logInfo(SQL_B + ' executed! - handle: ' + queryHandle); - var arr = Result2Array.RowsArray(result); - assert(arr.length === 6); - assert(arr[0].toString() === 'X,Mixed'); - CUBRIDClient.fetch(queryHandle, function (err, result, handle) { - if (err) { - throw err; - } else { - Helpers.logInfo('Fetch executed for queryHandle ' + queryHandle); - if (result !== null) { - Helpers.logInfo('Fetch result: ' + result); - } else { - Helpers.logInfo('There was no data to fetch.'); - } - CUBRIDClient.closeQuery(handle, function (err) { - if (err) { - throw err; - } else { - Helpers.logInfo(SQL_B + ' closed!'); - } - }); - } - }); - } - }); - - CUBRIDClient.addQuery(SQL_C, function (err, result, queryHandle) { - if (err) { - throw err; - } else { - Helpers.logInfo(SQL_C + ' executed! - handle: ' + queryHandle); - var arr = Result2Array.RowsArray(result); - assert(arr.length === 235); - assert(arr[0].toString() === '2004,20021,14345,30116,NGR,B,2004-08-28T00:00:00.000Z'); - CUBRIDClient.fetch(queryHandle, function (err, result, handle) { - if (err) { - throw err; - } else { - Helpers.logInfo('Fetch executed for queryHandle ' + queryHandle); - if (result !== null) { - var arr = Result2Array.RowsArray(result); - Helpers.logInfo('Fetch results - first row: ' + queryHandle + ': ' + arr[0]); - assert(arr.length === 241); - assert(arr[0].toString() === '2004,20317,14375,30124,GRE,S,2004-08-26T00:00:00.000Z'); - } else { - Helpers.logInfo('There was no data to fetch.'); - } - CUBRIDClient.closeQuery(handle, function (err) { - if (err) { - throw err; - } else { - Helpers.logInfo(SQL_C + ' closed!'); - } - }); - } - }); - } - }); - - setTimeout(function () { - CUBRIDClient.close(function (err) { - if (err) { - throw err; - } else { - Helpers.logInfo('Connection closed...'); - Helpers.logInfo('Test passed.'); - } - }); - }, 5000); - } -}); diff --git a/test/old_tests/test_QueriesQueue_Events.js b/test/old_tests/test_QueriesQueue_Events.js deleted file mode 100644 index 7f0c1ad..0000000 --- a/test/old_tests/test_QueriesQueue_Events.js +++ /dev/null @@ -1,69 +0,0 @@ -var CUBRIDClient = require('./test_Setup').createDefaultCUBRIDDemodbConnection, - Helpers = require('../../src/utils/Helpers'), - Result2Array = require('../../src/resultset/Result2Array'), - assert = require('assert'); - -var SQL_A = 'SELECT * from nation'; -var SQL_B = 'SELECT * from code'; -var SQL_C = 'SELECT * from game'; - -CUBRIDClient.connect(function () { -}); - -CUBRIDClient.on(CUBRIDClient.EVENT_ERROR, function (err) { - Helpers.logError('Error!: ' + err.message); - throw err; -}); - -CUBRIDClient.on(CUBRIDClient.EVENT_CONNECTED, function () { - Helpers.logInfo('Connected.'); - CUBRIDClient.addQuery(SQL_A, null); - CUBRIDClient.addQuery(SQL_B, null); - CUBRIDClient.addQuery(SQL_C, null); -}); - -CUBRIDClient.on(CUBRIDClient.EVENT_QUERY_DATA_AVAILABLE, function (result, queryHandle, sql) { - Helpers.logInfo('Executed! - handle: ' + queryHandle); - Helpers.logInfo('Query result for handle: ' + queryHandle + ': ' + result); - var arr = Result2Array.RowsArray(result); - switch (sql) { - case SQL_A: - assert(arr.length === 215); - assert(arr[0].toString() === 'SRB,Serbia,Europe,Beograd'); - break; - case SQL_B: - assert(Result2Array.TotalRowsCount(result) === 6); - assert(arr[0].toString() === 'X,Mixed'); - break; - case SQL_C: - assert(arr.length === 235); - assert(arr[0].toString() === '2004,20021,14345,30116,NGR,B,2004-08-28T00:00:00.000Z'); - } - CUBRIDClient.fetch(queryHandle, null); -}); - -CUBRIDClient.on(CUBRIDClient.EVENT_FETCH_DATA_AVAILABLE, function (result, queryHandle) { - Helpers.logInfo('Fetch executed for queryHandle: ' + queryHandle); - Helpers.logInfo('Fetch results for handle: ' + queryHandle + ': ' + result); - CUBRIDClient.closeQuery(queryHandle, null); -}); - -CUBRIDClient.on(CUBRIDClient.EVENT_FETCH_NO_MORE_DATA_AVAILABLE, function (queryHandle) { - Helpers.logInfo('Fetch executed for queryHandle: ' + queryHandle); - Helpers.logInfo('There is no more data to fetch.'); - CUBRIDClient.closeQuery(queryHandle, null); -}); - -CUBRIDClient.on(CUBRIDClient.EVENT_QUERY_CLOSED, function (queryHandle) { - Helpers.logInfo(queryHandle + ' was closed!'); - if (CUBRIDClient._queriesQueue.length === 0) { - setTimeout(function () { - CUBRIDClient.close(); - }, 1000); - } -}); - -CUBRIDClient.on(CUBRIDClient.EVENT_CONNECTION_CLOSED, function () { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); -}); diff --git a/test/old_tests/test_QueriesQueue_Mixed.js b/test/old_tests/test_QueriesQueue_Mixed.js deleted file mode 100644 index b67d73b..0000000 --- a/test/old_tests/test_QueriesQueue_Mixed.js +++ /dev/null @@ -1,62 +0,0 @@ -var CUBRIDClient = require('./test_Setup').createDefaultCUBRIDDemodbConnection, - Helpers = require('../../src/utils/Helpers'), - Result2Array = require('../../src/resultset/Result2Array'), - assert = require('assert'); - -var SQL_DELETE = 'DELETE FROM [code] WHERE s_name = \'A\''; -var SQL_INSERT = 'INSERT INTO [code] VALUES(\'A\', \'ABC\')'; -var SQL_COUNT = 'SELECT COUNT(*) from [code]'; - -CUBRIDClient.connect(function (err) { - if (err) { - throw err; - } else { - Helpers.logInfo('Connection opened...'); - - Helpers.logInfo('Queue-ing: ' + SQL_DELETE); - CUBRIDClient.addNonQuery(SQL_DELETE, function (err) { - if (err) { - throw err; - } else { - Helpers.logInfo(SQL_DELETE + ' executed.'); - } - }); - - Helpers.logInfo('Queue-ing: ' + SQL_INSERT); - CUBRIDClient.addNonQuery(SQL_INSERT, function (err) { - if (err) { - throw err; - } else { - Helpers.logInfo(SQL_INSERT + ' executed.'); - } - }); - - Helpers.logInfo('Queue-ing: ' + SQL_COUNT); - CUBRIDClient.addQuery(SQL_COUNT, function (err, result) { - if (err) { - throw err; - } else { - Helpers.logInfo(SQL_COUNT + ' executed.'); - Helpers.logInfo('Table rows count: ' + Result2Array.TotalRowsCount(result)); - var arr = Result2Array.RowsArray(result); - assert(arr.length === 1); - assert(arr[0][0] === 7); - } - }); - - Helpers.logInfo('Executing: ' + SQL_DELETE); - CUBRIDClient.addNonQuery(SQL_DELETE, null); - CUBRIDClient.addQuery(SQL_COUNT, function (err, result) { - if (err) { - throw err; - } else { - var arr = Result2Array.RowsArray(result); - assert(arr[0][0] === 6); - CUBRIDClient.close(function () { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - }); - } - }); - } -}); diff --git a/test/old_tests/test_QueriesQueue_MultiFetch.js b/test/old_tests/test_QueriesQueue_MultiFetch.js deleted file mode 100644 index 5bbced6..0000000 --- a/test/old_tests/test_QueriesQueue_MultiFetch.js +++ /dev/null @@ -1,171 +0,0 @@ -var CUBRIDClient = require('./test_Setup').createDefaultCUBRIDDemodbConnection, - Helpers = require('../../src/utils/Helpers'), - ActionQueue = require('../../src/utils/ActionQueue'), - Result2Array = require('../../src/resultset/Result2Array'), - assert = require('assert'); - -var SQL_A = 'SELECT * from event'; -var SQL_B = 'SELECT * from game'; -var SQL_C = 'SELECT * from participant'; -var SQL_A_fetchResult; -var SQL_B_fetchResult; -var SQL_C_fetchResult; - -CUBRIDClient.connect(function (err) { - if (err) { - throw err; - } else { - Helpers.logInfo('Connection opened...'); - CUBRIDClient.addQuery(SQL_A, function (err, result, queryHandle) { - if (err) { - throw err; - } else { - Helpers.logInfo(SQL_A + ' executed! - handle: ' + queryHandle); - var arr = Result2Array.RowsArray(result); - assert(Result2Array.TotalRowsCount(result) === 422); - assert(arr[0].toString() === '20421,Wrestling,Greco-Roman 97kg,M,1'); - ActionQueue.while( - function () { - return SQL_A_fetchResult !== null; - }, - - function (callback) { - CUBRIDClient.fetch(queryHandle, function (err, result) { - if (err) { - throw err; - } else { - if (result !== null) { - Helpers.logInfo('Fetch executed for queryHandle ' + queryHandle); - Helpers.logInfo('Fetch result for handle ' + queryHandle + ': ' + result); - } else { - Helpers.logInfo('There is no more data to fetch.'); - } - SQL_A_fetchResult = result; - callback.call(err); - } - }); - }, - - function (err) { - if (err) { - throw err; - } else { - CUBRIDClient.closeQuery(queryHandle, function (err) { - if (err) { - throw err; - } else { - Helpers.logInfo('Query closed.'); - } - }); - } - } - ); - } - }); - - CUBRIDClient.addQuery(SQL_B, function (err, result, queryHandle) { - if (err) { - throw err; - } else { - Helpers.logInfo(SQL_B + ' executed! - handle: ' + queryHandle); - var arr = Result2Array.RowsArray(result); - assert(arr.length === 235); - assert(arr[0].toString() === '2004,20021,14345,30116,NGR,B,2004-08-28T00:00:00.000Z'); - ActionQueue.while( - function () { - return SQL_B_fetchResult !== null; - }, - - function (callback) { - CUBRIDClient.fetch(queryHandle, function (err, result) { - if (err) { - throw err; - } else { - if (result !== null) { - Helpers.logInfo('Fetch executed for queryHandle ' + queryHandle); - Helpers.logInfo('Fetch result for handle ' + queryHandle + ': ' + result); - } else { - Helpers.logInfo('There is no more data to fetch.'); - } - SQL_B_fetchResult = result; - callback.call(err); - } - }); - }, - - function (err) { - if (err) { - throw err; - } else { - CUBRIDClient.closeQuery(queryHandle, function (err) { - if (err) { - throw err; - } else { - Helpers.logInfo('Query closed.'); - } - }); - } - } - ); - } - }); - - CUBRIDClient.addQuery(SQL_C, function (err, result, queryHandle) { - if (err) { - throw err; - } else { - Helpers.logInfo(SQL_C + ' executed! - handle: ' + queryHandle); - var arr = Result2Array.RowsArray(result); - assert(arr.length === 309); - assert(arr[0].toString() === '2004,ZAM,0,0,0'); - ActionQueue.while( - function () { - return SQL_C_fetchResult !== null; - }, - - function (callback) { - CUBRIDClient.fetch(queryHandle, function (err, result) { - if (err) { - throw err; - } else { - if (result !== null) { - Helpers.logInfo('Fetch executed for queryHandle ' + queryHandle); - Helpers.logInfo('Fetch result for handle ' + queryHandle + ': ' + result); - } else { - Helpers.logInfo('There is no more data to fetch.'); - } - SQL_C_fetchResult = result; - callback.call(err); - } - }); - }, - - function (err) { - if (err) { - throw err; - } else { - CUBRIDClient.closeQuery(queryHandle, function (err) { - if (err) { - throw err; - } else { - Helpers.logInfo('Query closed.'); - } - }); - } - } - ); - } - }); - - setTimeout(function () { - CUBRIDClient.close(function (err) { - if (err) { - throw err; - } else { - Helpers.logInfo('Connection closed...'); - Helpers.logInfo('Test passed.'); - } - }); - }, 5000); - } -}); diff --git a/test/old_tests/test_QueryCollision.js b/test/old_tests/test_QueryCollision.js deleted file mode 100644 index ae0f598..0000000 --- a/test/old_tests/test_QueryCollision.js +++ /dev/null @@ -1,62 +0,0 @@ -var CUBRIDClient = require('./test_Setup').createDefaultCUBRIDDemodbConnection, - Helpers = require('../../src/utils/Helpers'), - assert = require('assert'); - -Helpers.logInfo(module.filename.toString() + ' started...'); - -var errorOcurred = false; - -assert(CUBRIDClient.connectionPending === false); -assert(CUBRIDClient.connectionOpened === false); -assert(CUBRIDClient.queryPending === false); - -CUBRIDClient.connect(function () { - assert(CUBRIDClient.connectionPending === false); - assert(CUBRIDClient.connectionOpened === true); - assert(CUBRIDClient.queryPending === false); - - Helpers.logInfo('Executing first query...'); - CUBRIDClient.query('select * from event', function () { - }); - - assert(CUBRIDClient.connectionPending === false); - assert(CUBRIDClient.connectionOpened === true); - - Helpers.logInfo('Executing second query...'); - CUBRIDClient.query('select * from event', function () { - }); -}); - -// Close the connection; this will close also the active query status -setTimeout(function () { - assert(CUBRIDClient.connectionPending === false); - assert(CUBRIDClient.connectionOpened === true); - assert(CUBRIDClient.queryPending === false); - - CUBRIDClient.close(function () { - assert(CUBRIDClient.connectionPending === false); - assert(CUBRIDClient.connectionOpened === false); - assert(CUBRIDClient.queryPending === false); - }); -}, 3000); - -CUBRIDClient.on(CUBRIDClient.EVENT_ERROR, function (err) { - Helpers.logInfo('Error: ' + err.message); - assert(err.message === 'Another query is already in progress! - denying current query request.'); - errorOcurred = true; -}); - -CUBRIDClient.on(CUBRIDClient.EVENT_CONNECTED, function () { - Helpers.logInfo('Connected.'); -}); - -CUBRIDClient.on(CUBRIDClient.EVENT_CONNECTION_CLOSED, function () { - Helpers.logInfo('Connection closed.'); - if (errorOcurred) { - Helpers.logInfo('Test passed.'); - } else { - Helpers.logError('Test failed.'); - } -}); - - diff --git a/test/old_tests/test_QueryCollision_2.js b/test/old_tests/test_QueryCollision_2.js deleted file mode 100644 index 96b35a3..0000000 --- a/test/old_tests/test_QueryCollision_2.js +++ /dev/null @@ -1,65 +0,0 @@ -var Result2Array = require('../../src/resultset/Result2Array'), - events = require('events'), - Helpers = require('../../src/utils/Helpers'), - assert = require('assert'), - CUBRIDclient = require('./test_Setup.js').createDefaultCUBRIDDemodbConnection; - -Helpers.logInfo(module.filename.toString() + ' started...'); - -var getSingleValue = function (sql, client) { - var ret = null; - var self = this; - - client.query(sql, function (err, result, queryHandle) { - if (err) { - self.emit('error', err); - } else { - ret = Result2Array.RowsArray(result)[0][0]; - client.closeQuery(queryHandle, function (err) { - if (err) { - self.emit('error', err); - } else { - self.emit('done'); - } - }); - self.emit('return', ret); - } - }); -}; - -getSingleValue.prototype = new events.EventEmitter(); - -try { - var getMyValue = new getSingleValue('select count(*) from game', CUBRIDclient); -} catch (ex) { - Helpers.logInfo(ex.message); - throw 'We should not get here!'; -} - -getMyValue.on('return', function (result) { - assert(result === 8653); - setTimeout(function(){ - CUBRIDclient.close(function () { - }); - }, 100); -}); - -getMyValue.on('error', function (err) { - Helpers.logInfo(err.message); - throw err; -}); - -getMyValue.on('done', function () { - Helpers.logInfo('Test 1 passed.'); -}); - -try { - var getMyValue2 = new getSingleValue('select wrong_count(*) from game', CUBRIDclient); - - getMyValue2.on('return', function () { - throw 'We should not get here!'; - }); -} catch (ex) { - assert(ex.message === "Another query is already in progress! - denying current query request."); - Helpers.logInfo('Test 2 passed.'); -} diff --git a/test/old_tests/test_QueryOldProtocol.js b/test/old_tests/test_QueryOldProtocol.js deleted file mode 100644 index 9e04686..0000000 --- a/test/old_tests/test_QueryOldProtocol.js +++ /dev/null @@ -1,50 +0,0 @@ -var CUBRIDClient = require('./test_Setup').createDefaultCUBRIDDemodbConnection, - Helpers = require('../../src/utils/Helpers'), - Result2Array = require('../../src/resultset/Result2Array'), - assert = require('assert'); - -function errorHandler(err) { - throw err.message; -} - -Helpers.logInfo(module.filename.toString() + ' started...'); - -CUBRIDClient.connect(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connected.'); - CUBRIDClient.setEnforceOldQueryProtocol(true); - Helpers.logInfo('Querying: select * from nation'); - CUBRIDClient.query('select * from nation', function (err, result, queryHandle) { - if (err) { - errorHandler(err); - } else { - assert(Result2Array.TotalRowsCount(result) === 215); - Helpers.logInfo('Query result rows count: ' + Result2Array.TotalRowsCount(result)); - var arr = Result2Array.RowsArray(result); - assert(arr.length === 215); - assert(arr[0].toString() === 'SRB,Serbia,Europe,Beograd'); - assert(arr[arr.length - 1].toString() === 'AFG,Afghanistan,Asia,Kabul'); - for (var j = 0; j < 1; j++) { - Helpers.logInfo(arr[j].toString()); - } - CUBRIDClient.closeQuery(queryHandle, function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Query closed.'); - CUBRIDClient.close(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - } - }); - } - }); - } - }); - } -}); diff --git a/test/old_tests/test_QueryWithParams.js b/test/old_tests/test_QueryWithParams.js deleted file mode 100644 index 75da87c..0000000 --- a/test/old_tests/test_QueryWithParams.js +++ /dev/null @@ -1,49 +0,0 @@ -var CUBRIDClient = require('./test_Setup').createDefaultCUBRIDDemodbConnection, - Helpers = require('../../src/utils/Helpers'), - Result2Array = require('../../src/resultset/Result2Array'), - assert = require('assert'); - -var sql = 'select * from nation where continent = ?'; -var arrValues = ['Oceania']; - -function errorHandler(err) { - throw err.message; -} - -Helpers.logInfo(module.filename.toString() + ' started...'); - -CUBRIDClient.connect(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connected.'); - Helpers.logInfo('Querying: ' + sql); - CUBRIDClient.queryWithParams(sql, arrValues, ["'"], function (err, result, queryHandle) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Query result rows count: ' + Result2Array.TotalRowsCount(result)); - assert(Result2Array.TotalRowsCount(result) === 15); - var arr = Result2Array.RowsArray(result); - assert(arr[0].toString() === 'KIR,Kiribati,Oceania,Tarawa'); - CUBRIDClient.closeQuery(queryHandle, function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Query closed.'); - CUBRIDClient.close(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - } - }); - } - }); - } - }); - } -}); - - diff --git a/test/old_tests/test_QueryWithParams_2.js b/test/old_tests/test_QueryWithParams_2.js deleted file mode 100644 index 8258789..0000000 --- a/test/old_tests/test_QueryWithParams_2.js +++ /dev/null @@ -1,48 +0,0 @@ -var CUBRIDClient = require('./test_Setup').createDefaultCUBRIDDemodbConnection, - Helpers = require('../../src/utils/Helpers'), - Result2Array = require('../../src/resultset/Result2Array'), - assert = require('assert'); - -var sql = 'SELECT * FROM ? WHERE ? LIKE ? AND LENGTH(?) > ?'; -var arrValues = ['nation', 'code', 'A%', 'capital', '5']; -var arrDelimiters = ['`', '', '\'', '', '']; - -function errorHandler(err) { - throw err.message; -} - -Helpers.logInfo(module.filename.toString() + ' started...'); - -CUBRIDClient.connect(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connected.'); - Helpers.logInfo('Querying: ' + sql); - CUBRIDClient.queryWithParams(sql, arrValues, arrDelimiters, function (err, result, queryHandle) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Query result rows count: ' + Result2Array.TotalRowsCount(result)); - assert(Result2Array.TotalRowsCount(result) === 12); - CUBRIDClient.closeQuery(queryHandle, function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Query closed.'); - CUBRIDClient.close(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - } - }); - } - }); - } - }); - } -}); - - diff --git a/test/old_tests/test_QueryWithTypedParams.js b/test/old_tests/test_QueryWithTypedParams.js deleted file mode 100644 index 091ad8a..0000000 --- a/test/old_tests/test_QueryWithTypedParams.js +++ /dev/null @@ -1,49 +0,0 @@ -var CUBRIDClient = require('./test_Setup').createDefaultCUBRIDDemodbConnection, - Helpers = require('../../src/utils/Helpers'), - Result2Array = require('../../src/resultset/Result2Array'), - assert = require('assert'); - -var sql = 'select * from nation where continent = ?'; -var arrValues = ['Oceania']; - -function errorHandler(err) { - throw err.message; -} - -Helpers.logInfo(module.filename.toString() + ' started...'); - -CUBRIDClient.connect(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connected.'); - Helpers.logInfo('Querying: ' + sql); - CUBRIDClient.queryWithTypedParams(sql, arrValues, ['varchar'], function (err, result, queryHandle) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Query result rows count: ' + Result2Array.TotalRowsCount(result)); - assert(Result2Array.TotalRowsCount(result) === 15); - var arr = Result2Array.RowsArray(result); - assert(arr[0].toString() === 'KIR,Kiribati,Oceania,Tarawa'); - CUBRIDClient.closeQuery(queryHandle, function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Query closed.'); - CUBRIDClient.close(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - } - }); - } - }); - } - }); - } -}); - - diff --git a/test/old_tests/test_Rollback.js b/test/old_tests/test_Rollback.js deleted file mode 100644 index 49c63b2..0000000 --- a/test/old_tests/test_Rollback.js +++ /dev/null @@ -1,70 +0,0 @@ -var CUBRIDClient = require('./test_Setup').createDefaultCUBRIDDemodbConnection, - Helpers = require('../../src/utils/Helpers'), - Result2Array = require('../../src/resultset/Result2Array'), - assert = require('assert'); - -function errorHandler(err) { - throw err.message; -} - -Helpers.logInfo(module.filename.toString() + ' started...'); - -CUBRIDClient.connect(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connected.'); - CUBRIDClient.batchExecuteNoQuery(['drop table if exists node_test', 'create table node_test(id int)'], function (err) { - if (err) { - errorHandler(err); - } else { - CUBRIDClient.setAutoCommitMode(false, function (err) { - if (err) { - errorHandler(err); - } else { - CUBRIDClient.batchExecuteNoQuery(['insert into node_test values(1)'], function (err) { - if (err) { - errorHandler(err); - } else { - CUBRIDClient.rollback(function (err) { - if (err) { - errorHandler(err); - } else { - CUBRIDClient.query('select * from node_test', function (err, result) { - if (err) { - errorHandler(err); - } else { - assert(Result2Array.TotalRowsCount(result) !== 1, 'Didn\'t rollback!!!'); - CUBRIDClient.setAutoCommitMode(true, function (err) { - if (err) { - errorHandler(err); - } else { - CUBRIDClient.batchExecuteNoQuery(['drop table node_test'], function (err) { - if (err) { - errorHandler(err); - } else { - CUBRIDClient.close(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - } - }); - } - }); - } - }); - } - }); - } - }); - } - }); - } - }); - } - }); - } -}); - diff --git a/test/old_tests/test_Schema.js b/test/old_tests/test_Schema.js deleted file mode 100644 index a418f9d..0000000 --- a/test/old_tests/test_Schema.js +++ /dev/null @@ -1,66 +0,0 @@ -var CUBRIDClient = require('./test_Setup').createDefaultCUBRIDDemodbConnection, - ActionQueue = require('../../src/utils/ActionQueue'), - Helpers = require('../../src/utils/Helpers'), - assert = require('assert'); - -Helpers.logInfo(module.filename.toString() + ' started...'); - -ActionQueue.enqueue( - [ - function (callback) { - CUBRIDClient.connect(callback); - }, - - function (callback) { - CUBRIDClient.getSchema(CUBRIDClient.SCHEMA_TABLE, null, callback); - }, - - function (result, callback) { - Helpers.logInfo('Schema tables results:'); - for (var i = 0; i < result.length; i++) { - Helpers.logInfo(result[i]); - } - if (CUBRIDClient._DB_ENGINE_VER.startsWith('8.4')) { - assert(result.length === 32); - } - else { - if (CUBRIDClient._DB_ENGINE_VER.startsWith('9.1')) { - assert(result.length === 33); - } - } - callback(); - }, - - function (callback) { - CUBRIDClient.getSchema(CUBRIDClient.SCHEMA_VIEW, null, callback); - }, - - function (result, callback) { - Helpers.logInfo('Schema views results:'); - for (var i = 0; i < result.length; i++) { - Helpers.logInfo(result[i]); - } - if (CUBRIDClient._DB_ENGINE_VER.startsWith('8.4')) { - assert(result.length === 16); - } - else { - if (CUBRIDClient._DB_ENGINE_VER.startsWith('9.1')) { - assert(result.length === 17); - } - } - callback(); - }, - - function (callback) { - CUBRIDClient.close(callback); - } - ], - - function (err) { - if (err) { - throw err.message; - } else { - Helpers.logInfo('Test passed.'); - } - } -); diff --git a/test/old_tests/test_SchemaAttribute.js b/test/old_tests/test_SchemaAttribute.js deleted file mode 100644 index 0f0b9ca..0000000 --- a/test/old_tests/test_SchemaAttribute.js +++ /dev/null @@ -1,58 +0,0 @@ -var CUBRIDClient = require('./test_Setup').createDefaultCUBRIDDemodbConnection, - ActionQueue = require('../../src/utils/ActionQueue'), - Helpers = require('../../src/utils/Helpers'), - Result2Array = require('../../src/resultset/Result2Array'), - assert = require('assert'); - -Helpers.logInfo(module.filename.toString() + ' started...'); - -ActionQueue.enqueue( - [ - function (callback) { - CUBRIDClient.connect(callback); - }, - - function (callback) { - CUBRIDClient.getSchema(CUBRIDClient.SCHEMA_ATTRIBUTE, null, callback); - }, - - function (result, callback) { - for (var i = 0; i < result.length; i++) { - Helpers.logInfo(result[i]); - } - - if (CUBRIDClient._DB_ENGINE_VER.startsWith('8.4')) { - assert(result.length === 191); - } - else { - if (CUBRIDClient._DB_ENGINE_VER.startsWith('9.1')) { - assert(result.length === 212); - } - } - assert(result[0].Name === 'code'); - assert(result[0].Scale === 0); - if (CUBRIDClient._DB_ENGINE_VER.startsWith('8.4')) { - assert(result[0].Precision === 0); - } - else { - if (CUBRIDClient._DB_ENGINE_VER.startsWith('9.1')) { - assert(result[0].Precision === 10); - } - } - assert(result[0].NonNull === true); - assert(result[0].Unique === true); - assert(result[0].ClassName === 'athlete'); - assert(result[0].SourceClass === 'athlete'); - assert(result[0].IsKey === true); - CUBRIDClient.close(callback); - } - ], - - function (err) { - if (err) { - throw err.message; - } else { - Helpers.logInfo('Test passed.'); - } - } -); diff --git a/test/old_tests/test_SchemaClassPrivilege.js b/test/old_tests/test_SchemaClassPrivilege.js deleted file mode 100644 index 5942dc1..0000000 --- a/test/old_tests/test_SchemaClassPrivilege.js +++ /dev/null @@ -1,46 +0,0 @@ -var CUBRIDClient = require('./test_Setup').createDefaultCUBRIDDemodbConnection, - ActionQueue = require('../../src/utils/ActionQueue'), - Helpers = require('../../src/utils/Helpers'), - Result2Array = require('../../src/resultset/Result2Array'), - assert = require('assert'); - -Helpers.logInfo(module.filename.toString() + ' started...'); - -ActionQueue.enqueue( - [ - function (callback) { - CUBRIDClient.connect(callback); - }, - - function (callback) { - CUBRIDClient.getSchema(CUBRIDClient.SCHEMA_CLASS_PRIVILEGE, null, callback); - }, - - function (result, callback) { - for (var i = 0; i < result.length; i++) { - Helpers.logInfo(result[i]); - } - - if (CUBRIDClient._DB_ENGINE_VER.startsWith('8.4')) { - assert(result.length === 96); - } - else { - if (CUBRIDClient._DB_ENGINE_VER.startsWith('9.1')) { - assert(result.length === 97); - } - } - assert(result[0].TableName === 'db_root'); - assert(result[0].Privilege === 'SELECT'); - assert(result[0].Grantable === false); - CUBRIDClient.close(callback); - } - ], - - function (err) { - if (err) { - throw err.message; - } else { - Helpers.logInfo('Test passed.'); - } - } -); diff --git a/test/old_tests/test_SchemaConstraint.js b/test/old_tests/test_SchemaConstraint.js deleted file mode 100644 index 4b3d10f..0000000 --- a/test/old_tests/test_SchemaConstraint.js +++ /dev/null @@ -1,35 +0,0 @@ -var CUBRIDClient = require('./test_Setup').createDefaultCUBRIDDemodbConnection, - ActionQueue = require('../../src/utils/ActionQueue'), - Helpers = require('../../src/utils/Helpers'), - Result2Array = require('../../src/resultset/Result2Array'), - assert = require('assert'); - -Helpers.logInfo(module.filename.toString() + ' started...'); - -ActionQueue.enqueue( - [ - function (callback) { - CUBRIDClient.connect(callback); - }, - - function (callback) { - CUBRIDClient.getSchema(CUBRIDClient.SCHEMA_CONSTRAINT, 'event', callback); - }, - - function (result, callback) { - for (var i = 0; i < result.length; i++) { - Helpers.logInfo(result[i]); - } - assert(result.length === 0); - CUBRIDClient.close(callback); - } - ], - - function (err) { - if (err) { - throw err.message; - } else { - Helpers.logInfo('Test passed.'); - } - } -); diff --git a/test/old_tests/test_SchemaExportedKeys.js b/test/old_tests/test_SchemaExportedKeys.js deleted file mode 100644 index f705229..0000000 --- a/test/old_tests/test_SchemaExportedKeys.js +++ /dev/null @@ -1,43 +0,0 @@ -var CUBRIDClient = require('./test_Setup').createDefaultCUBRIDDemodbConnection, - ActionQueue = require('../../src/utils/ActionQueue'), - Helpers = require('../../src/utils/Helpers'), - Result2Array = require('../../src/resultset/Result2Array'), - assert = require('assert'); - -Helpers.logInfo(module.filename.toString() + ' started...'); - -ActionQueue.enqueue( - [ - function (callback) { - CUBRIDClient.connect(callback); - }, - - function (callback) { - CUBRIDClient.getSchema(CUBRIDClient.SCHEMA_EXPORTED_KEYS, 'athlete', callback); - }, - - function (result, callback) { - for (var i = 0; i < result.length; i++) { - Helpers.logInfo(result[i]); - } - assert(result.length === 1); - assert(result[0].FkName === 'fk_game_athlete_code'); - assert(result[0].PkName === 'pk_athlete_code'); - assert(result[0].FkTableName === 'game'); - assert(result[0].PkTableName === 'athlete'); - assert(result[0].FkColumnName === 'athlete_code'); - assert(result[0].PkColumnName === 'code'); - assert(result[0].UpdateAction === 1); - assert(result[0].DeleteAction === 1); - CUBRIDClient.close(callback); - } - ], - - function (err) { - if (err) { - throw err.message; - } else { - Helpers.logInfo('Test passed.'); - } - } -); diff --git a/test/old_tests/test_SchemaImportedKeys.js b/test/old_tests/test_SchemaImportedKeys.js deleted file mode 100644 index b1c23f9..0000000 --- a/test/old_tests/test_SchemaImportedKeys.js +++ /dev/null @@ -1,73 +0,0 @@ -var CUBRIDClient = require('./test_Setup').createDefaultCUBRIDDemodbConnection, - ActionQueue = require('../../src/utils/ActionQueue'), - Helpers = require('../../src/utils/Helpers'), - Result2Array = require('../../src/resultset/Result2Array'), - assert = require('assert'); - -Helpers.logInfo(module.filename.toString() + ' started...'); - -ActionQueue.enqueue( - [ - function (callback) { - CUBRIDClient.connect(callback); - }, - - function (callback) { - CUBRIDClient.getSchema(CUBRIDClient.SCHEMA_IMPORTED_KEYS, 'game', callback); - }, - - function (result, callback) { - for (var i = 0; i < result.length; i++) { - Helpers.logInfo(result[i]); - } - assert(result.length === 2); - if (CUBRIDClient._DB_ENGINE_VER.startsWith('8.4')) { - assert(result[0].FkName === 'fk_game_athlete_code'); - assert(result[0].PkName === 'pk_athlete_code'); - assert(result[0].FkTableName === 'game'); - assert(result[0].PkTableName === 'athlete'); - assert(result[0].FkColumnName === 'athlete_code'); - assert(result[0].PkColumnName === 'code'); - assert(result[0].UpdateAction === 1); - assert(result[0].DeleteAction === 1); - assert(result[1].FkName === 'fk_game_event_code'); - assert(result[1].PkName === 'pk_event_code'); - assert(result[1].FkTableName === 'game'); - assert(result[1].PkTableName === 'event'); - assert(result[1].FkColumnName === 'event_code'); - assert(result[1].PkColumnName === 'code'); - assert(result[1].UpdateAction === 1); - assert(result[1].DeleteAction === 1); - } - else { - if (CUBRIDClient._DB_ENGINE_VER.startsWith('9.1')) { - assert(result[0].FkName === 'fk_game_event_code'); - assert(result[0].PkName === 'pk_event_code'); - assert(result[0].FkTableName === 'game'); - assert(result[0].PkTableName === 'event'); - assert(result[0].FkColumnName === 'event_code'); - assert(result[0].PkColumnName === 'code'); - assert(result[0].UpdateAction === 1); - assert(result[0].DeleteAction === 1); - assert(result[1].FkName === 'fk_game_athlete_code'); - assert(result[1].PkName === 'pk_athlete_code'); - assert(result[1].FkTableName === 'game'); - assert(result[1].PkTableName === 'athlete'); - assert(result[1].FkColumnName === 'athlete_code'); - assert(result[1].PkColumnName === 'code'); - assert(result[1].UpdateAction === 1); - assert(result[1].DeleteAction === 1); - } - } - CUBRIDClient.close(callback); - } - ], - - function (err) { - if (err) { - throw err.message; - } else { - Helpers.logInfo('Test passed.'); - } - } -); diff --git a/test/old_tests/test_SchemaPrimaryKeys.js b/test/old_tests/test_SchemaPrimaryKeys.js deleted file mode 100644 index 04a323c..0000000 --- a/test/old_tests/test_SchemaPrimaryKeys.js +++ /dev/null @@ -1,38 +0,0 @@ -var CUBRIDClient = require('./test_Setup').createDefaultCUBRIDDemodbConnection, - ActionQueue = require('../../src/utils/ActionQueue'), - Helpers = require('../../src/utils/Helpers'), - Result2Array = require('../../src/resultset/Result2Array'), - assert = require('assert'); - -Helpers.logInfo(module.filename.toString() + ' started...'); - -ActionQueue.enqueue( - [ - function (callback) { - CUBRIDClient.connect(callback); - }, - - function (callback) { - CUBRIDClient.getSchema(CUBRIDClient.SCHEMA_PRIMARY_KEY, 'athlete', callback); - }, - - function (result, callback) { - for (var i = 0; i < result.length; i++) { - Helpers.logInfo(result[i]); - } - assert(result.length === 1); - assert(result[0].TableName === 'athlete'); - assert(result[0].ColumnName === 'code'); - assert(result[0].KeyName === 'pk_athlete_code'); - CUBRIDClient.close(callback); - } - ], - - function (err) { - if (err) { - throw err.message; - } else { - Helpers.logInfo('Test passed.'); - } - } -); diff --git a/test/old_tests/test_SchemaUsers.js b/test/old_tests/test_SchemaUsers.js deleted file mode 100644 index b2600a4..0000000 --- a/test/old_tests/test_SchemaUsers.js +++ /dev/null @@ -1,42 +0,0 @@ -var CUBRIDClient = require('./test_Setup').createDefaultCUBRIDDemodbConnection, - ActionQueue = require('../../src/utils/ActionQueue'), - Helpers = require('../../src/utils/Helpers'), - Result2Array = require('../../src/resultset/Result2Array'), - assert = require('assert'); - -Helpers.logInfo(module.filename.toString() + ' started...'); - -ActionQueue.enqueue( - [ - function (callback) { - CUBRIDClient.connect(callback); - }, - - function (callback) { - CUBRIDClient.query('select [name] from db_user', callback); - }, - - function (result, queryHandle, callback) { - Helpers.logInfo(Result2Array.ColumnNamesArray(result).toString()); - var arr = Result2Array.RowsArray(result); - assert(arr.length === 2); - for (var i = 0; i < arr.length; i++) { - Helpers.logInfo(arr[i].toString()); - } - - callback(); - }, - - function (callback) { - CUBRIDClient.close(callback); - } - ], - - function (err) { - if (err) { - throw err.message; - } else { - Helpers.logInfo('Test passed.'); - } - } -); diff --git a/test/old_tests/test_Schema_Columns.js b/test/old_tests/test_Schema_Columns.js deleted file mode 100644 index 2ca2b4e..0000000 --- a/test/old_tests/test_Schema_Columns.js +++ /dev/null @@ -1,48 +0,0 @@ -var CUBRIDClient = require('./test_Setup').createDefaultCUBRIDDemodbConnection, - ActionQueue = require('../../src/utils/ActionQueue'), - Helpers = require('../../src/utils/Helpers'), - Result2Array = require('../../src/resultset/Result2Array'), - assert = require('assert'); - -Helpers.logInfo(module.filename.toString() + ' started...'); - -ActionQueue.enqueue( - [ - function (callback) { - CUBRIDClient.connect(callback); - }, - - function (callback) { - CUBRIDClient.getSchema(CUBRIDClient.SCHEMA_ATTRIBUTE, callback); - }, - - function (result, callback) { - for (var i = 0; i < result.length; i++) { - Helpers.logInfo(result[i]); - } - - if (CUBRIDClient._DB_ENGINE_VER.startsWith('8.4')) { - assert(result.length === 32); - } - else { - if (CUBRIDClient._DB_ENGINE_VER.startsWith('9.0')) { - assert(result.length === 33); - } - } - - callback(); - }, - - function (callback) { - CUBRIDClient.close(callback); - } - ], - - function (err) { - if (err) { - throw err.message; - } else { - Helpers.logInfo('Test passed.'); - } - } -); diff --git a/test/old_tests/test_Schema_Events.js b/test/old_tests/test_Schema_Events.js deleted file mode 100644 index c227919..0000000 --- a/test/old_tests/test_Schema_Events.js +++ /dev/null @@ -1,59 +0,0 @@ -var CUBRIDClient = require('./test_Setup').createDefaultCUBRIDDemodbConnection, - Helpers = require('../../src/utils/Helpers'), - Result2Array = require('../../src/resultset/Result2Array'), - assert = require('assert'); - -Helpers.logInfo(module.filename.toString() + ' started...'); - -var currentSchemaToReceive = 0; -CUBRIDClient.connect(); - -CUBRIDClient.on(CUBRIDClient.EVENT_ERROR, function (err) { - Helpers.logError('Error!: ' + err.message); - throw 'We should not get here!'; -}); - -CUBRIDClient.on(CUBRIDClient.EVENT_CONNECTED, function () { - Helpers.logInfo('Connected.'); - CUBRIDClient.getSchema(CUBRIDClient.SCHEMA_TABLE, null, null); - currentSchemaToReceive = CUBRIDClient.SCHEMA_TABLE; -}); - -CUBRIDClient.on(CUBRIDClient.EVENT_SCHEMA_DATA_AVAILABLE, function (result) { - Helpers.logInfo('Schema data received.'); - for (var i = 0; i < result.length; i++) { - Helpers.logInfo(result[i]); - } - if (CUBRIDClient._DB_ENGINE_VER.startsWith('8.4')) { - if (currentSchemaToReceive === CUBRIDClient.SCHEMA_TABLE) { - assert(result.length === 32); - } else { - if (currentSchemaToReceive === CUBRIDClient.SCHEMA_VIEW) { - assert(result.length === 16); - } - } - } else { - if (CUBRIDClient._DB_ENGINE_VER.startsWith('9.1')) { - if (currentSchemaToReceive === CUBRIDClient.SCHEMA_TABLE) { - assert(result.length === 33); - } else { - if (currentSchemaToReceive === CUBRIDClient.SCHEMA_VIEW) { - assert(result.length === 17); - } - } - } - } - if (currentSchemaToReceive === CUBRIDClient.SCHEMA_TABLE) { - CUBRIDClient.getSchema(CUBRIDClient.SCHEMA_VIEW, null, null); - currentSchemaToReceive = CUBRIDClient.SCHEMA_VIEW; - } else { - CUBRIDClient.close(); - } -}); - -CUBRIDClient.on(CUBRIDClient.EVENT_CONNECTION_CLOSED, function () { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); -}); - - diff --git a/test/old_tests/test_Schema_Tables.js b/test/old_tests/test_Schema_Tables.js deleted file mode 100644 index 1931477..0000000 --- a/test/old_tests/test_Schema_Tables.js +++ /dev/null @@ -1,48 +0,0 @@ -var CUBRIDClient = require('./test_Setup').createDefaultCUBRIDDemodbConnection, - ActionQueue = require('../../src/utils/ActionQueue'), - Helpers = require('../../src/utils/Helpers'), - Result2Array = require('../../src/resultset/Result2Array'), - assert = require('assert'); - -Helpers.logInfo(module.filename.toString() + ' started...'); - -ActionQueue.enqueue( - [ - function (callback) { - CUBRIDClient.connect(callback); - }, - - function (callback) { - CUBRIDClient.getSchema(CUBRIDClient.SCHEMA_TABLE, null, callback); - }, - - function (result, callback) { - for (var i = 0; i < result.length; i++) { - Helpers.logInfo(result[i]); - } - - if (CUBRIDClient._DB_ENGINE_VER.startsWith('8.4')) { - assert(result.length === 32); - } - else { - if (CUBRIDClient._DB_ENGINE_VER.startsWith('9.1')) { - assert(result.length === 33); - } - } - - callback(); - }, - - function (callback) { - CUBRIDClient.close(callback); - } - ], - - function (err) { - if (err) { - throw err.message; - } else { - Helpers.logInfo('Test passed.'); - } - } -); diff --git a/test/old_tests/test_Schema_Views.js b/test/old_tests/test_Schema_Views.js deleted file mode 100644 index 2d20004..0000000 --- a/test/old_tests/test_Schema_Views.js +++ /dev/null @@ -1,48 +0,0 @@ -var CUBRIDClient = require('./test_Setup').createDefaultCUBRIDDemodbConnection, - ActionQueue = require('../../src/utils/ActionQueue'), - Helpers = require('../../src/utils/Helpers'), - Result2Array = require('../../src/resultset/Result2Array'), - assert = require('assert'); - -Helpers.logInfo(module.filename.toString() + ' started...'); - -ActionQueue.enqueue( - [ - function (callback) { - CUBRIDClient.connect(callback); - }, - - function (callback) { - CUBRIDClient.getSchema(CUBRIDClient.SCHEMA_VIEW, null, callback); - }, - - function (result, callback) { - for (var i = 0; i < result.length; i++) { - Helpers.logInfo(result[i]); - } - - if (CUBRIDClient._DB_ENGINE_VER.startsWith('8.4')) { - assert(result.length === 16); - } - else { - if (CUBRIDClient._DB_ENGINE_VER.startsWith('9.1')) { - assert(result.length === 17); - } - } - - callback(); - }, - - function (callback) { - CUBRIDClient.close(callback); - } - ], - - function (err) { - if (err) { - throw err.message; - } else { - Helpers.logInfo('Test passed.'); - } - } -); diff --git a/test/old_tests/test_SelectConstant.js b/test/old_tests/test_SelectConstant.js deleted file mode 100644 index 2e60e28..0000000 --- a/test/old_tests/test_SelectConstant.js +++ /dev/null @@ -1,51 +0,0 @@ -var CUBRIDClient = require('./test_Setup').createDefaultCUBRIDDemodbConnection, - Helpers = require('../../src/utils/Helpers'), - Result2Array = require('../../src/resultset/Result2Array'), - assert = require('assert'); - -function errorHandler(err) { - throw err.message; -} - -Helpers.logInfo(module.filename.toString() + ' started...'); - -CUBRIDClient.connect(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connected.'); - Helpers.logInfo('Querying: select 1'); - CUBRIDClient.query('select 1', function (err, result, queryHandle) { - if (err) { - errorHandler(err); - } else { - assert(Result2Array.TotalRowsCount(result) === 1); - Helpers.logInfo('Query result rows count: ' + Result2Array.TotalRowsCount(result)); - Helpers.logInfo('Query results:'); - var arr = Result2Array.RowsArray(result); - assert(arr.length === 1); - assert(arr[0].toString() === '1'); - for (var j = 0; j < arr.length; j++) { - Helpers.logInfo(arr[j].toString()); - } - } - CUBRIDClient.closeQuery(queryHandle, function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Query closed.'); - CUBRIDClient.close(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - } - }); - } - }); - }); - } -}); - - diff --git a/test/old_tests/test_SelectConstant_2.js b/test/old_tests/test_SelectConstant_2.js deleted file mode 100644 index 2656ae9..0000000 --- a/test/old_tests/test_SelectConstant_2.js +++ /dev/null @@ -1,52 +0,0 @@ -var CUBRIDClient = require('./test_Setup').createDefaultCUBRIDDemodbConnection, - Helpers = require('../../src/utils/Helpers'), - Result2Array = require('../../src/resultset/Result2Array'), - assert = require('assert'); - -function errorHandler(err) { - throw err.message; -} - -Helpers.logInfo(module.filename.toString() + ' started...'); - -CUBRIDClient.connect(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connected.'); - Helpers.logInfo('Querying: select null from nation where rownum < 3'); - CUBRIDClient.query('select null from nation where rownum < 3', function (err, result, queryHandle) { - if (err) { - errorHandler(err); - } else { - assert(Result2Array.TotalRowsCount(result) === 2); - Helpers.logInfo('Query result rows count: ' + Result2Array.TotalRowsCount(result)); - Helpers.logInfo('Query results:'); - var arr = Result2Array.RowsArray(result); - assert(arr.length === 2); - assert(arr[0].toString() === ''); - assert(arr[1].toString() === ''); - for (var j = 0; j < arr.length; j++) { - Helpers.logInfo('Value returned: [' + arr[j].toString() + ']'); - } - CUBRIDClient.closeQuery(queryHandle, function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Query closed.'); - CUBRIDClient.close(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - } - }); - } - }); - } - }); - } -}); - - diff --git a/test/old_tests/test_SetAutoCommit.js b/test/old_tests/test_SetAutoCommit.js deleted file mode 100644 index c181a8a..0000000 --- a/test/old_tests/test_SetAutoCommit.js +++ /dev/null @@ -1,41 +0,0 @@ -var CUBRIDClient = require('./test_Setup').createDefaultCUBRIDDemodbConnection, - Helpers = require('../../src/utils/Helpers'), - assert = require('assert'); - -function errorHandler(err) { - throw err.message; -} - -Helpers.logInfo(module.filename.toString() + ' started...'); - -CUBRIDClient.connect(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connected...'); - CUBRIDClient.setAutoCommitMode(false, function (err) { - if (err) { - errorHandler(err); - } else { - assert(CUBRIDClient.autoCommitMode === false, 'AutoCommitMode not set correctly!'); - CUBRIDClient.setAutoCommitMode(true, function (err) { - if (err) { - errorHandler(err); - } else { - assert(CUBRIDClient.autoCommitMode === true, 'AutoCommitMode not set correctly!'); - CUBRIDClient.close(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connection closed...'); - Helpers.logInfo('Test passed.'); - } - }); - } - }); - } - }); - } -}); - - diff --git a/test/old_tests/test_SetDbParameter.js b/test/old_tests/test_SetDbParameter.js deleted file mode 100644 index c88ed27..0000000 --- a/test/old_tests/test_SetDbParameter.js +++ /dev/null @@ -1,33 +0,0 @@ -var CUBRIDClient = require('./test_Setup').createDefaultCUBRIDDemodbConnection, - Helpers = require('../../src/utils/Helpers'), - CAS = require('../../src/constants/CASConstants'), - assert = require('assert'); - -function errorHandler(err) { - throw err.message; -} - -Helpers.logInfo(module.filename.toString() + ' started...'); - -CUBRIDClient.connect(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connected OK.'); - CUBRIDClient.setDatabaseParameter(CAS.CCIDbParam.CCI_PARAM_ISOLATION_LEVEL, - CAS.CUBRIDIsolationLevel.TRAN_REP_CLASS_COMMIT_INSTANCE, function (err) { - if (err) { - errorHandler(err); - } else { - CUBRIDClient.close(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - } - }); - } - }); - } -}); diff --git a/test/old_tests/test_SetDbParameterError.js b/test/old_tests/test_SetDbParameterError.js deleted file mode 100644 index cf8f7bd..0000000 --- a/test/old_tests/test_SetDbParameterError.js +++ /dev/null @@ -1,34 +0,0 @@ -var CUBRIDClient = require('./test_Setup').createDefaultCUBRIDDemodbConnection, - Helpers = require('../../src/utils/Helpers'), - CAS = require('../../src/constants/CASConstants'), - assert = require('assert'); - -function errorHandler(err) { - Helpers.logInfo(err.message); - assert(err.message === '-1011:CAS_ER_PARAM_NAME'); - CUBRIDClient.close(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - } - }); -} - -Helpers.logInfo(module.filename.toString() + ' started...'); - -CUBRIDClient.connect(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connected OK.'); - CUBRIDClient.setDatabaseParameter(CAS.CCIDbParam.CCI_PARAM_MAX_STRING_LENGTH, 99, function (err) { - if (err) { - errorHandler(err); - } else { - throw 'We should not get here'; - } - }); - } -}); diff --git a/test/old_tests/test_SetDbParameter_Events.js b/test/old_tests/test_SetDbParameter_Events.js deleted file mode 100644 index b29e6b9..0000000 --- a/test/old_tests/test_SetDbParameter_Events.js +++ /dev/null @@ -1,32 +0,0 @@ -var CUBRIDClient = require('./test_Setup').createDefaultCUBRIDDemodbConnection, - Helpers = require('../../src/utils/Helpers'), - Result2Array = require('../../src/resultset/Result2Array'), - CAS = require('../../src/constants/CASConstants'), - assert = require('assert'); - -Helpers.logInfo(module.filename.toString() + ' started...'); - -CUBRIDClient.connect(); - -CUBRIDClient.on(CUBRIDClient.EVENT_ERROR, function (err) { - Helpers.logInfo('Error: ' + err.message); - throw 'We should not get here!'; -}); - -CUBRIDClient.on(CUBRIDClient.EVENT_CONNECTED, function () { - Helpers.logInfo('Connected.'); - CUBRIDClient.setDatabaseParameter(CAS.CCIDbParam.CCI_PARAM_ISOLATION_LEVEL, - CAS.CUBRIDIsolationLevel.TRAN_REP_CLASS_COMMIT_INSTANCE, - null); -}); - -CUBRIDClient.on(CUBRIDClient.EVENT_SET_DB_PARAMETER_COMPLETED, function () { - Helpers.logInfo('Set Db parameter completed.'); - CUBRIDClient.close(); -}); - -CUBRIDClient.on(CUBRIDClient.EVENT_CONNECTION_CLOSED, function () { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); -}); - diff --git a/test/old_tests/test_Setup.js b/test/old_tests/test_Setup.js deleted file mode 100644 index 80c0179..0000000 --- a/test/old_tests/test_Setup.js +++ /dev/null @@ -1,2 +0,0 @@ -var CUBRIDConnection = require('../../src/CUBRIDConnection'); -exports.createDefaultCUBRIDDemodbConnection = new CUBRIDConnection('localhost', 33000, 'public', '', 'demodb'); diff --git a/test/old_tests/test_SocketError.js b/test/old_tests/test_SocketError.js deleted file mode 100644 index a6f3878..0000000 --- a/test/old_tests/test_SocketError.js +++ /dev/null @@ -1,29 +0,0 @@ -var CUBRIDClient = require('./test_Setup').createDefaultCUBRIDDemodbConnection, - Helpers = require('../../src/utils/Helpers'), - assert = require('assert'); - -function errorHandler(err) { - Helpers.logInfo(err.message); - assert(err.message === 'This socket is closed.'); - Helpers.logInfo('Test passed.'); -} - -Helpers.logInfo(module.filename.toString() + ' started...'); - -CUBRIDClient.connect(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connected.'); - Helpers.logInfo('Querying: select * from nation'); - CUBRIDClient._socket.destroy(); - CUBRIDClient.query('select * from nation', function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('We should not get here!'); - CUBRIDClient.close(null); - } - }); - } -}); diff --git a/test/old_tests/test_Transaction.js b/test/old_tests/test_Transaction.js deleted file mode 100644 index 0c6ca04..0000000 --- a/test/old_tests/test_Transaction.js +++ /dev/null @@ -1,76 +0,0 @@ -var CUBRIDClient = require('./test_Setup').createDefaultCUBRIDDemodbConnection, - ActionQueue = require('../../src/utils/ActionQueue'), - Helpers = require('../../src/utils/Helpers'), - Result2Array = require('../../src/resultset/Result2Array'), - assert = require('assert'); - -Helpers.logInfo(module.filename.toString() + ' started...'); - -ActionQueue.enqueue( - [ - function (cb) { - CUBRIDClient.connect(cb); - }, - - function (cb) { - Helpers.logInfo('Connected...'); - CUBRIDClient.batchExecuteNoQuery(['drop table if exists test_tran', 'create table test_tran(id int)'], cb); - }, - - function (cb) { - CUBRIDClient.beginTransaction(cb); - }, - - function (cb) { - CUBRIDClient.batchExecuteNoQuery('insert into test_tran values(1)', cb); - }, - - function (cb) { - CUBRIDClient.query('select * from test_tran', cb); - }, - - function (result, queryHandle, cb) { - assert(Result2Array.TotalRowsCount(result) === 1); - CUBRIDClient.closeQuery(queryHandle, cb); - }, - - function (queryHandle,cb) { - CUBRIDClient.rollback(cb); - }, - - function (cb) { - CUBRIDClient.query('select * from test_tran', cb); - }, - - function (result, queryHandle, cb) { - assert(Result2Array.TotalRowsCount(result) === 0); - CUBRIDClient.closeQuery(queryHandle, cb); - }, - - function (queryHandle,cb) { - CUBRIDClient.batchExecuteNoQuery('drop table test_tran', cb); - }, - - function (cb) { - CUBRIDClient.commit(cb); - }, - - function (cb) { - CUBRIDClient.query('select count(*) from db_class where class_name = \'test_tran\'', cb); - }, - - function (result, queryHandle, cb) { - assert(Result2Array.RowsArray(result)[0][0] === 0); - CUBRIDClient.close(cb); - } - ], - - function (err) { - if (err === null) { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - } else { - throw err.message; - } - } -); diff --git a/test/old_tests/test_Transaction_Commit_Error.js b/test/old_tests/test_Transaction_Commit_Error.js deleted file mode 100644 index fbd3467..0000000 --- a/test/old_tests/test_Transaction_Commit_Error.js +++ /dev/null @@ -1,66 +0,0 @@ -var CUBRIDConnection = require('../../src/CUBRIDConnection'), - ActionQueue = require('../../src/utils/ActionQueue'), - Result2Array = require('../../src/resultset/Result2Array'), - Helpers = require('../../src/utils/Helpers'), - async = require('async'), - assert = require('assert'), - dbConf = { - host: 'localhost', - port: 33000, - user: 'public', - password: '', - database: 'demodb' - }, - client = new CUBRIDConnection(dbConf.host, dbConf.port, dbConf.user, dbConf.password, dbConf.database); - -var shards = [0, 1]; - -client.connect(function (err) { - if (err) { - Helpers.logError(err); - } - else { - Helpers.logInfo('Connected'); - - client.setAutoCommitMode(true); - client.setEnforceOldQueryProtocol(true); - - // Simulate the execution on two shards - async.eachSeries(shards, selectAll, function (err) { - if (err) { - Helpers.logInfo(err); - } - - client.close(); - }); - } -}); - -client.on(client.EVENT_CONNECTION_CLOSED, function () { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); -}); - -function selectAll(shardId, done) { - var sql = 'SELECT * FROM code'; - - Helpers.logInfo(sql); - - client.addQuery(sql, function (err, result, queryHandle) { - if (err) { - done(err); - } - else { - Helpers.logInfo('Shard(' + shardId + ') holds ' + Result2Array.TotalRowsCount(result) + ' records'); - client.closeQuery(queryHandle, function (err) { - client.commit(function (err) { - if (err) { - Helpers.logError(err); - assert(err.message === 'AutoCommitMode is enabled! - denying commit request.'); - } - done(); - }); - }); - } - }); -}; diff --git a/test/old_tests/test_Transaction_Events.js b/test/old_tests/test_Transaction_Events.js deleted file mode 100644 index 1d0189f..0000000 --- a/test/old_tests/test_Transaction_Events.js +++ /dev/null @@ -1,104 +0,0 @@ -var CUBRIDClient = require('./test_Setup').createDefaultCUBRIDDemodbConnection, - Helpers = require('../../src/utils/Helpers'), - Result2Array = require('../../src/resultset/Result2Array'), - assert = require('assert'); - -global.savedQueryHandle = null; -global.batchExecuteNo = 1; -global.queryNo = 1; - -Helpers.logInfo(module.filename.toString() + ' started...'); - -CUBRIDClient.connect(); - -CUBRIDClient.on(CUBRIDClient.EVENT_ERROR, function (err) { - Helpers.logError('Error!: ' + err.message); - throw 'We should not get here!'; -}); - -CUBRIDClient.on(CUBRIDClient.EVENT_CONNECTED, function () { - Helpers.logInfo('Connected.'); - Helpers.logInfo('Execute: create test table'); - CUBRIDClient.batchExecuteNoQuery(['drop table if exists test_tran', 'create table test_tran(id int)'], null); -}); - -CUBRIDClient.on(CUBRIDClient.EVENT_BATCH_COMMANDS_COMPLETED, function () { - Helpers.logInfo('Batch executeDone'); - if (global.batchExecuteNo === 1) { - CUBRIDClient.beginTransaction(null); - global.batchExecuteNo++; - } else { - if (global.batchExecuteNo === 2) { - Helpers.logInfo('Querying: select * from test_tran'); - CUBRIDClient.query('select * from test_tran'); - global.batchExecuteNo++; - } - else { - Helpers.logInfo('Commiting transaction.'); - CUBRIDClient.commit(null); - } - } -}); - -CUBRIDClient.on(CUBRIDClient.EVENT_BEGIN_TRANSACTION, function () { - Helpers.logInfo('Begin transaction.'); - Helpers.logInfo('Execute: insert into test_tran values(1)'); - CUBRIDClient.batchExecuteNoQuery('insert into test_tran values(1)', null); -}); - -CUBRIDClient.on(CUBRIDClient.EVENT_ROLLBACK_COMPLETED, function () { - Helpers.logInfo('Transaction rollback completed.'); - Helpers.logInfo('Querying: select * from test_tran'); - CUBRIDClient.query('select * from test_tran'); -}); - -CUBRIDClient.on(CUBRIDClient.EVENT_COMMIT_COMPLETED, function () { - Helpers.logInfo('Transaction commit completed.'); - Helpers.logInfo('select count(*) from db_class where class_name = \'test_tran\''); - CUBRIDClient.query('select count(*) from db_class where class_name = \'test_tran\''); -}); - -CUBRIDClient.on(CUBRIDClient.EVENT_QUERY_DATA_AVAILABLE, function (result, queryHandle) { - Helpers.logInfo('Data received.'); - Helpers.logInfo('Returned active query handle: ' + queryHandle); - global.savedQueryHandle = queryHandle; // Save handle - needed for further fetch operations - if (global.queryNo === 1) { - assert(Result2Array.TotalRowsCount(result) === 1); - CUBRIDClient.closeQuery(global.savedQueryHandle, null); - global.queryNo++; - } else { - if (global.queryNo === 2) { - assert(Result2Array.TotalRowsCount(result) === 0); - CUBRIDClient.closeQuery(global.savedQueryHandle, null); - } else { - assert(Result2Array.RowsArray(result)[0][0] === 0); - CUBRIDClient.closeQuery(global.savedQueryHandle, null); - } - } -}); - -CUBRIDClient.on(CUBRIDClient.EVENT_QUERY_CLOSED, function () { - Helpers.logInfo('Query closed.'); - global.savedQueryHandle = null; - if (global.queryNo === 1) { - Helpers.logInfo('Transaction do rollback.'); - CUBRIDClient.rollback(null); - global.queryNo++; - } else { - if (global.queryNo === 2) { - Helpers.logInfo('Execute: drop table test_tran'); - CUBRIDClient.batchExecuteNoQuery('drop table test_tran', null); - global.queryNo++; - } else { - Helpers.logInfo('Closing connection...'); - CUBRIDClient.close(); - } - } -}); - -CUBRIDClient.on(CUBRIDClient.EVENT_CONNECTION_CLOSED, function () { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); -}); - - diff --git a/test/old_tests/test_scratch.js b/test/old_tests/test_scratch.js deleted file mode 100644 index 849fa00..0000000 --- a/test/old_tests/test_scratch.js +++ /dev/null @@ -1,21 +0,0 @@ -var startTime = new Date(); - -function wait(timeout) { - console.log('Iterating...'); - - var currTime = new Date(); - if (currTime - startTime < timeout) { - wait(timeout); - } -} - -function sleep(milliseconds) { - var start = new Date().getTime(); - while ((new Date().getTime() - start) < milliseconds) { - console.log('Iterating...'); - } -} - -sleep(1000); -console.log('After wait...'); - diff --git a/test/old_tests/utils/test_ActionQueue.js b/test/old_tests/utils/test_ActionQueue.js deleted file mode 100644 index 3536631..0000000 --- a/test/old_tests/utils/test_ActionQueue.js +++ /dev/null @@ -1,49 +0,0 @@ -var assert = require('assert'), - ActionQueue = require('../ActionQueue'); - -var count = 0; -var startTime = (new Date()).getTime(); - -console.log('Unit test ' + module.filename.toString() + ' started...'); - -ActionQueue.enqueue( - [ - function (callback) { - callback(null, '1'); - }, - function (data, callback) { - setTimeout(callback(null, data + ',2'), 5000); - }, - function (data, callback) { - setTimeout(callback(null, data + ',3'), 1000); - }, - function (data, callback) { - callback(null, data + ',4'); - } - ], - function (err, results) { - assert.equal(results, '1,2,3,4'); - console.log('Unit test ended OK.'); - } -); - -ActionQueue.while( - function () { - return count < 5; - }, - function (callback) { - count++; - setTimeout(callback, 1000); - }, - function (err) { - if (err) { - throw err.toString(); - } else { - var endTime = (new Date()).getTime(); - // 5 seconds have passed? - assert(endTime - startTime > 5 * 1000); - console.log('Unit test ended OK.'); - } - } -); - diff --git a/test/old_tests/utils/test_Cache.js b/test/old_tests/utils/test_Cache.js deleted file mode 100644 index 2787cd7..0000000 --- a/test/old_tests/utils/test_Cache.js +++ /dev/null @@ -1,36 +0,0 @@ -var assert = require('assert'), - Cache = require('../Cache'); - -console.log('Unit test ' + module.filename.toString() + ' started...'); - -var cache = new Cache(); - -cache.getSet(1, '1'); -cache.getSet(2, '22'); -cache.getSet(3, '333'); - -assert.equal(cache.contains(1), true); -assert.equal(cache.contains(2), true); -assert.equal(cache.contains(3), true); -assert.equal(cache.get(1), '1'); -assert.equal(cache.get(2), '22'); -assert.equal(cache.get(3), '333'); -assert.equal(cache.contains(9), false); - -cache.clear(); - -assert.equal(cache.contains(1), false); - -var cache2 = new Cache(3); - -cache2.getSet(1, '1'); - -setTimeout(function () { - assert.equal(cache2.contains(1), false); - console.log('Unit test ended OK.'); - }, - 4000 -); - - - diff --git a/test/old_tests/utils/test_Helpers.js b/test/old_tests/utils/test_Helpers.js deleted file mode 100644 index 129786d..0000000 --- a/test/old_tests/utils/test_Helpers.js +++ /dev/null @@ -1,72 +0,0 @@ -var assert = require('assert'), - Helpers = require('../Helpers'); - -console.log('Unit test ' + module.filename.toString() + ' started...'); - -var buffer = new Buffer(5); -buffer.write('12345'); -var value1 = ['6', '7', '8']; -var comb1 = Helpers._combineData(buffer, value1); - -assert.equal(comb1.toString(), '12345678'); - -var value2 = new Buffer('678'); -var comb2 = Helpers._combineData(buffer, value2); - -assert.equal(comb2.toString(), '12345678'); - -var value3 = new Buffer(3); -value3[0] = '6'.charCodeAt(0); -value3[1] = '7'.charCodeAt(0); -value3[2] = '8'.charCodeAt(0); - -var comb3 = Helpers._combineData(buffer, value3); - -assert.equal(comb3.toString(), '12345678'); - -var sql = 'insert into a values(?, ?, ?)'; -var newsql = Helpers._sqlFormat(sql, ['1', 2, null], ['\'', '', '']); - -assert.equal(newsql, "insert into a values('1', 2, NULL)"); - -var unescaped = 'insert into "a values(\b)'; -var escaped = Helpers._escapeString(unescaped); - -assert.equal(escaped, "insert into \"\"a values(\\b)"); - -// Test Input validation functions -assert(Helpers._validateInputBoolean(null) === false); -assert(Helpers._validateInputBoolean(4) === false); -assert(Helpers._validateInputBoolean(3.14) === false); -assert(Helpers._validateInputBoolean('qwerty') === false); -assert(Helpers._validateInputBoolean(true) === true); -assert(Helpers._validateInputBoolean(1) === true); - -assert(Helpers._validateInputPositive(null) === false); -assert(Helpers._validateInputPositive(3.14) === true); -assert(Helpers._validateInputPositive(-1) === false); -assert(Helpers._validateInputPositive(0) === true); -assert(Helpers._validateInputPositive(14) === true); - -assert(Helpers._validateInputTimeout(null) === false); -assert(Helpers._validateInputTimeout(3.14) === false); -assert(Helpers._validateInputTimeout(-1) === false); -assert(Helpers._validateInputTimeout(0) === true); -assert(Helpers._validateInputTimeout(14) === true); - -assert(Helpers._validateInputString(null) === false); -assert(Helpers._validateInputString(3) === false); -assert(Helpers._validateInputString(true) === false); -assert(Helpers._validateInputString('') === false); -assert(Helpers._validateInputString('querty') === true); - -assert(Helpers._validateInputSQLString(null) === false); -assert(Helpers._validateInputSQLString(3) === false); -assert(Helpers._validateInputSQLString(true) === false); -assert(Helpers._validateInputSQLString('') === false); -assert(Helpers._validateInputSQLString('a') === false); -assert(Helpers._validateInputSQLString('qwerty') === true); - -console.log('Unit test ended OK.'); - - diff --git a/test/old_tests/utils/test_Utils.js b/test/old_tests/utils/test_Utils.js deleted file mode 100644 index 62af670..0000000 --- a/test/old_tests/utils/test_Utils.js +++ /dev/null @@ -1,29 +0,0 @@ -var assert = require('assert'), - GetResultsArray = require('./../../resultset/Result2Array').RowsArray, - GetResultsColumnNamesArray = require('./../../resultset/Result2Array').ColumnNamesArray, - GetResultsColumnTypesArray = require('./../../resultset/Result2Array').ColumnTypesArray, - GetResultsCount = require('./../../resultset/Result2Array').TotalRowsCount, - GetResultsObjectsArrays = require('./../../resultset/Result2Array').ObjectsArray; - - -var json_str = '{"ColumnNames":["s_name","f_name"],' + - '"ColumnDataTypes":["char","string"],' + - '"RowsCount":99,' + - '"ColumnValues":[["X","Mixed"],["W","Woman"],["M","Man"]]}'; - -console.log('Unit test ' + module.filename.toString() + ' started...'); - -assert.equal(GetResultsArray(json_str).toString(), 'X,Mixed,W,Woman,M,Man'); -assert.equal(GetResultsColumnNamesArray(json_str).toString(), 's_name,f_name'); -assert.equal(GetResultsColumnTypesArray(json_str).toString(), 'char,string'); -assert.equal(GetResultsCount(json_str), 99); - -var objectsArray = GetResultsObjectsArrays(json_str); -assert.equal(objectsArray[0].s_name, 'X'); -assert.equal(objectsArray[0].f_name, 'Mixed'); -assert.equal(objectsArray[1].s_name, 'W'); -assert.equal(objectsArray[1].f_name, 'Woman'); -assert.equal(objectsArray[2].s_name, 'M'); -assert.equal(objectsArray[2].f_name, 'Man'); - -console.log('Unit test ended OK.'); diff --git a/test/packets.BatchExecuteNoQueryPacket.js b/test/packets.BatchExecuteNoQueryPacket.js new file mode 100644 index 0000000..cf1f6d1 --- /dev/null +++ b/test/packets.BatchExecuteNoQueryPacket.js @@ -0,0 +1,81 @@ +'use strict'; + +const expect = require('chai').expect; + +const BatchExecuteNoQueryPacket = require('../src/packets/BatchExecuteNoQueryPacket'); +const PacketReader = require('../src/packets/PacketReader'); +const PacketWriter = require('../src/packets/PacketWriter'); +const CAS = require('../src/constants/CASConstants'); +const ConsoleLogger = require('../src/ConsoleLogger'); +const DATA_TYPES = require('../src/constants/DataTypes'); + +describe('BatchExecuteNoQueryPacket', function () { + it('should succeed to verify the return value of write() and parse()', function () { + const packetReader = new PacketReader(); + const autoCommit = 1; + const protocolVersion = 5; + const sqls = ['create table t1(id int)', 'drop table t1']; + const timeout = 0; + const batchExecuteNoQueryPacket = new BatchExecuteNoQueryPacket({ + autoCommit, + casInfo: new Buffer([0, 255, 255, 255]), + logger: new ConsoleLogger, + protocolVersion, + sqls, + timeout, + }); + const packetLength = batchExecuteNoQueryPacket.getBufferLength(); + const packetWriter = new PacketWriter(packetLength); + + batchExecuteNoQueryPacket.write(packetWriter); + + const packetWriterBuffer = packetWriter._toBuffer(); + + expect(packetWriterBuffer) + .to.have.length(packetLength); + + // The content length except the header size. + expect(packetWriterBuffer[3]).to.equal(packetLength - DATA_TYPES.DATA_LENGTH_SIZEOF - DATA_TYPES.CAS_INFO_SIZE); + + // CasInfo + expect(packetWriterBuffer[4]).equal(0); + expect(packetWriterBuffer[5]).equal(255); + expect(packetWriterBuffer[6]).equal(255); + expect(packetWriterBuffer[7]).equal(255); + + expect(packetWriterBuffer[8]).equal(CAS.CASFunctionCode.CAS_FC_EXECUTE_BATCH); + expect(packetWriterBuffer[13]).equal(autoCommit ? 1 : 0); + + let queryStartIndex = 18; + + if (protocolVersion > 4) { + expect(packetWriterBuffer[14]).to.equal(timeout); + queryStartIndex += DATA_TYPES.INT_SIZEOF * 2; + } + + let queryEndIndex = queryStartIndex + sqls[0].length; + + expect(packetWriterBuffer.toString('utf8', queryStartIndex, queryEndIndex)).equal(sqls[0]); + + queryStartIndex = + queryEndIndex + + /* null */1 + + /* the integer length representing the length of the first query */4; + queryEndIndex = queryStartIndex + sqls[1].length; + + expect(packetWriterBuffer.toString('utf8', queryStartIndex, queryEndIndex)).equal(sqls[1]); + + packetReader.write(new Buffer([0, 0, 0, 0, 0, 255, 255, 255, 0, 0, 0, 0])); + batchExecuteNoQueryPacket.parse(packetReader); + + const casInfo = batchExecuteNoQueryPacket.casInfo; + + // CasInfo + expect(casInfo[0]).to.equal(0); + expect(casInfo[1]).to.equal(255); + expect(casInfo[2]).to.equal(255); + expect(casInfo[3]).to.equal(255); + + expect(batchExecuteNoQueryPacket.responseCode).to.equal(0); + }); +}); diff --git a/test/packets.ClientInfoExchangePacket.js b/test/packets.ClientInfoExchangePacket.js new file mode 100644 index 0000000..4ce0a6a --- /dev/null +++ b/test/packets.ClientInfoExchangePacket.js @@ -0,0 +1,33 @@ +'use strict'; + +const expect = require('chai').expect; + +const PacketReader = require('../src/packets/PacketReader'); +const PacketWriter = require('../src/packets/PacketWriter'); +const ClientInfoExchange = require('../src/packets/ClientInfoExchangePacket'); + +describe('ClientInfoExchangePacket', function () { + it('should succeed to verify the return value of write() and parse()', function () { + const packetReader = new PacketReader(); + const clientInfoExchange = new ClientInfoExchange(); + const packetWriter = new PacketWriter(clientInfoExchange.getBufferLength()); + + clientInfoExchange.write(packetWriter); + + expect(packetWriter + ._toBuffer() + .toString('utf8', 0, 5) + ) + .to.equal('CUBRK'); + + expect(packetWriter._toBuffer()[5]) + .to.equal(3); + + packetReader.write(new Buffer([0, 0, 1, 2])); //=258 + clientInfoExchange.parse(packetReader); + + expect(clientInfoExchange) + .to.have.property('newConnectionPort') + .to.equal(258); + }); +}); diff --git a/test/packets.CloseDatabasePacket.js b/test/packets.CloseDatabasePacket.js new file mode 100644 index 0000000..0b1e818 --- /dev/null +++ b/test/packets.CloseDatabasePacket.js @@ -0,0 +1,45 @@ +'use strict'; + +const expect = require('chai').expect; + +const PacketReader = require('../src/packets/PacketReader'); +const PacketWriter = require('../src/packets/PacketWriter'); +const CloseDatabasePacket = require('../src/packets/CloseDatabasePacket'); +const CAS = require('../src/constants/CASConstants'); + +describe('CloseDatabasePacket', function () { + it('should succeed to verify the return value of write() and parse()', function () { + const packetReader = new PacketReader(); + const closeDatabasePacket = new CloseDatabasePacket({casInfo: new Buffer([0, 255, 255, 255])}); + const packetWriter = new PacketWriter(closeDatabasePacket.getBufferLength()); + + closeDatabasePacket.write(packetWriter); + + const packetWriteBuffer = packetWriter._toBuffer(); + + // Total length + expect(packetWriteBuffer[3]).to.equal(1); + // CasInfo + expect(packetWriteBuffer[4]).to.equal(0); + expect(packetWriteBuffer[5]).to.equal(255); + expect(packetWriteBuffer[6]).to.equal(255); + expect(packetWriteBuffer[7]).to.equal(255); + + expect(packetWriteBuffer[8]).to.equal(CAS.CASFunctionCode.CAS_FC_CON_CLOSE); + + packetReader.write(new Buffer([0, 0, 0, 0, 0, 255, 255, 255, 0, 0, 0, 0])); + + expect(packetReader._packetLength()).to.equal(12); + + closeDatabasePacket.parse(packetReader); + + const casInfo = closeDatabasePacket.casInfo; + // CasInfo + expect(casInfo[0]).to.equal(0); + expect(casInfo[1]).to.equal(255); + expect(casInfo[2]).to.equal(255); + expect(casInfo[3]).to.equal(255); + + expect(closeDatabasePacket.responseCode).to.equal(0); + }); +}); diff --git a/test/perf/.DS_Store b/test/perf/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/test/perf/.DS_Store differ diff --git a/test/perf/execute-perf-results-cubrid-9.2.3.0005-node-v4.5.0-node-cubrid-3.0.0-Wed-Sep-28-2016-20-33-16-GMT+0900--KST-.csv b/test/perf/execute-perf-results-cubrid-9.2.3.0005-node-v4.5.0-node-cubrid-3.0.0-Wed-Sep-28-2016-20-33-16-GMT+0900--KST-.csv new file mode 100644 index 0000000..6334b16 --- /dev/null +++ b/test/perf/execute-perf-results-cubrid-9.2.3.0005-node-v4.5.0-node-cubrid-3.0.0-Wed-Sep-28-2016-20-33-16-GMT+0900--KST-.csv @@ -0,0 +1,299 @@ +1.47506E+12,529,21954560,11536480,6847112 +1.47506E+12,566,23658496,15664224,9743520 +1.47506E+12,568,26779648,15664224,8421832 +1.47506E+12,584,27103232,16696160,7308376 +1.47506E+12,573,27299840,16696160,10014496 +1.47506E+12,563,27561984,16696160,8609640 +1.47506E+12,578,27758592,16696160,11374584 +1.47506E+12,583,28065792,17716064,10230080 +1.47506E+12,573,28344320,18748000,8944304 +1.47506E+12,575,28549120,18748000,11673352 +1.47506E+12,563,28717056,18748000,7756912 +1.47506E+12,577,28737536,18748000,10319272 +1.47506E+12,576,28790784,18748000,8881816 +1.47506E+12,560,28844032,18748000,7260592 +1.47506E+12,583,28893184,18748000,9887160 +1.47506E+12,570,28950528,18748000,8392824 +1.47506E+12,574,29003776,18748000,10915400 +1.47506E+12,575,29179904,18748000,9461528 +1.47506E+12,582,29331456,18748000,12075096 +1.47506E+12,585,29556736,18748000,10735048 +1.47506E+12,568,29769728,18748000,9201256 +1.47506E+12,574,29958144,19779936,11749072 +1.47506E+12,579,31395840,28035424,14334568 +1.47506E+12,578,34598912,28035424,12846304 +1.47506E+12,576,38912000,28035424,11401160 +1.47506E+12,581,39129088,28035424,10011336 +1.47506E+12,579,39211008,28035424,16579176 +1.47506E+12,586,39477248,30099296,15243928 +1.47506E+12,572,39743488,30099296,13753072 +1.47506E+12,567,40005632,30099296,12204968 +1.47506E+12,577,40140800,30099296,18750224 +1.47506E+12,594,40415232,30099296,17507248 +1.47506E+12,580,40701952,31131232,16106184 +1.47506E+12,596,40980480,31131232,14888104 +1.47506E+12,585,41246720,31131232,13542632 +1.47506E+12,591,41385984,31131232,20246864 +1.47506E+12,569,41652224,31131232,18719944 +1.47506E+12,573,41934848,32163168,17237424 +1.47506E+12,575,42205184,32163168,15780208 +1.47506E+12,579,42471424,32163168,14368176 +1.47506E+12,588,42610688,32163168,21038408 +1.47506E+12,583,42876928,32163168,19669240 +1.47506E+12,571,43147264,32163168,18166256 +1.47506E+12,583,43433984,33195104,16800264 +1.47506E+12,586,43704320,33195104,15469040 +1.47506E+12,570,43835392,33195104,21934584 +1.47506E+12,578,44101632,33195104,20511952 +1.47506E+12,574,44376064,33195104,19042944 +1.47506E+12,573,44679168,35258976,17562328 +1.47506E+12,578,44945408,35258976,16137688 +1.47506E+12,577,45080576,35258976,22683032 +1.47506E+12,575,45346816,35258976,21225488 +1.47506E+12,573,45617152,35258976,19744600 +1.47506E+12,576,45883392,35258976,18298680 +1.47506E+12,583,46034944,36290912,24912088 +1.47506E+12,581,46305280,36290912,23522512 +1.47506E+12,577,46571520,36290912,22087368 +1.47506E+12,598,46845952,36290912,20889720 +1.47506E+12,577,47116288,36290912,19456248 +1.47506E+12,576,47267840,37322848,25990224 +1.47506E+12,590,47538176,37322848,24701320 +1.47506E+12,581,47804416,37322848,23311488 +1.47506E+12,573,48484352,53833824,22105808 +1.47506E+12,562,49836032,53833824,28496592 +1.47506E+12,550,56107008,53833824,10063664 +1.47506E+12,572,56107008,53833824,16554712 +1.47506E+12,579,61083648,53833824,23122840 +1.47506E+12,572,64335872,53833824,13387392 +1.47506E+12,583,64389120,53833824,20000256 +1.47506E+12,587,65380352,53833824,26659336 +1.47506E+12,588,65548288,53833824,17362200 +1.47506E+12,579,65560576,53833824,23931000 +1.47506E+12,580,65560576,53833824,14543344 +1.47506E+12,559,65560576,53833824,20884872 +1.47506E+12,575,65560576,53833824,27407464 +1.47506E+12,576,65560576,53833824,17974512 +1.47506E+12,568,65560576,53833824,24417904 +1.47506E+12,595,65560576,53833824,15199096 +1.47506E+12,586,65560576,53833824,21846920 +1.47506E+12,573,65560576,53833824,28346768 +1.47506E+12,574,65593344,53833824,18892184 +1.47506E+12,579,65679360,53833824,25460440 +1.47506E+12,583,65757184,53833824,16106480 +1.47506E+12,590,65757184,53833824,22799008 +1.47506E+12,575,65757184,53833824,29321624 +1.47506E+12,585,65757184,53833824,19991248 +1.47506E+12,577,65757184,53833824,26536456 +1.47506E+12,582,65757184,53833824,17169896 +1.47506E+12,577,65757184,53833824,23715424 +1.47506E+12,578,65757184,53833824,30284448 +1.47506E+12,579,65757184,53833824,20886304 +1.47506E+12,570,65757184,53833824,27352328 +1.47506E+12,578,65757184,53833824,17942328 +1.47506E+12,573,65757184,53833824,24441952 +1.47506E+12,582,65757184,53833824,31043600 +1.47506E+12,578,65757184,53833824,21634784 +1.47506E+12,580,65757184,53833824,28213592 +1.47506E+12,594,65757184,53833824,18985032 +1.47506E+12,588,65757184,53833824,25654896 +1.47506E+12,570,65757184,53833824,32121224 +1.47506E+12,577,65814528,54865760,22696976 +1.47506E+12,586,65896448,54865760,29344896 +1.47506E+12,579,66252800,54865760,20495496 +1.47506E+12,570,66338816,54865760,26969496 +1.47506E+12,557,66433024,54865760,33311816 +1.47506E+12,571,66445312,54865760,13860504 +1.47506E+12,581,66445312,54865760,20453488 +1.47506E+12,580,66445312,54865760,10810400 +1.47506E+12,587,66445312,54865760,17469080 +1.47506E+12,578,66445312,54865760,24025736 +1.47506E+12,572,66445312,54865760,14547896 +1.47506E+12,582,66445312,54865760,21149248 +1.47506E+12,573,66445312,54865760,11682768 +1.47506E+12,576,66445312,54865760,18217680 +1.47506E+12,583,66445312,54865760,24830736 +1.47506E+12,576,66445312,54865760,15395624 +1.47506E+12,577,66445312,54865760,21941728 +1.47506E+12,579,66449408,54865760,12542224 +1.47506E+12,579,66531328,54865760,19109816 +1.47506E+12,586,66617344,54865760,25757592 +1.47506E+12,572,66805760,54865760,16279736 +1.47506E+12,588,66805760,54865760,22950192 +1.47506E+12,573,66805760,54865760,13482712 +1.47506E+12,555,66805760,54865760,19779160 +1.47506E+12,574,66805760,54865760,26290312 +1.47506E+12,584,66805760,54865760,16945344 +1.47506E+12,564,66805760,54865760,23343896 +1.47506E+12,571,66805760,54865760,29820448 +1.47506E+12,570,66805760,54865760,20319856 +1.47506E+12,583,66805760,54865760,26933792 +1.47506E+12,574,66805760,54865760,17478976 +1.47506E+12,569,66805760,54865760,23940816 +1.47506E+12,590,66809856,54865760,30660480 +1.47506E+12,579,66809856,54865760,21261576 +1.47506E+12,564,66809856,54865760,27659248 +1.47506E+12,580,66809856,54865760,18272288 +1.47506E+12,583,66809856,54865760,24885072 +1.47506E+12,595,66809856,54865760,31635304 +1.47506E+12,592,66809856,54865760,22381072 +1.47506E+12,576,66809856,54865760,28915160 +1.47506E+12,574,66809856,54865760,19459440 +1.47506E+12,588,66813952,54865760,26430416 +1.47506E+12,568,66818048,54865760,32896000 +1.47506E+12,564,64724992,52801888,10805400 +1.47506E+12,562,64724992,52801888,17182880 +1.47506E+12,573,64724992,52801888,23683264 +1.47506E+12,578,64724992,52801888,14010408 +1.47506E+12,594,64724992,52801888,20749048 +1.47506E+12,575,64724992,52801888,11307824 +1.47506E+12,565,64724992,52801888,17716704 +1.47506E+12,572,64724992,52801888,24205648 +1.47506E+12,571,64724992,52801888,14717168 +1.47506E+12,574,64724992,52801888,21228400 +1.47506E+12,576,64724992,52801888,11795928 +1.47506E+12,568,64724992,52801888,18239160 +1.47506E+12,578,64724992,52801888,24795808 +1.47506E+12,593,64724992,52801888,15555488 +1.47506E+12,580,64724992,52801888,22135488 +1.47506E+12,588,64724992,52801888,12836152 +1.47506E+12,566,64724992,52801888,19256360 +1.47506E+12,572,64724992,52801888,25745208 +1.47506E+12,595,64724992,52801888,16527624 +1.47506E+12,584,64724992,52801888,23152704 +1.47506E+12,579,64724992,52801888,13753136 +1.47506E+12,573,64724992,52801888,20253552 +1.47506E+12,566,64724992,52801888,26674448 +1.47506E+12,574,64724992,52801888,17219528 +1.47506E+12,589,64724992,52801888,23900976 +1.47506E+12,567,64724992,52801888,14362656 +1.47506E+12,574,64724992,52801888,20874128 +1.47506E+12,572,64724992,52801888,27362656 +1.47506E+12,592,64724992,52801888,18112976 +1.47506E+12,590,64724992,52801888,24805304 +1.47506E+12,578,64724992,52801888,31362280 +1.47506E+12,593,64724992,52801888,22121672 +1.47506E+12,570,64724992,52801888,28587960 +1.47506E+12,581,64724992,52801888,19212104 +1.47506E+12,556,64724992,52801888,25518904 +1.47506E+12,571,64724992,52801888,31996104 +1.47506E+12,576,64724992,52801888,22560824 +1.47506E+12,586,64724992,52801888,29208088 +1.47506E+12,577,64856064,53833824,20031904 +1.47506E+12,569,64954368,53833824,26512296 +1.47506E+12,575,64962560,53833824,13431208 +1.47506E+12,590,64962560,53833824,20126296 +1.47506E+12,589,64962560,53833824,10583344 +1.47506E+12,582,64962560,53833824,17185920 +1.47506E+12,572,64962560,53833824,23674936 +1.47506E+12,576,64962560,53833824,14242848 +1.47506E+12,585,64962560,53833824,20879320 +1.47506E+12,572,64962560,53833824,11400008 +1.47506E+12,579,64962560,53833824,17968872 +1.47506E+12,575,64962560,53833824,24491384 +1.47506E+12,572,64962560,53833824,15013712 +1.47506E+12,575,64962560,53833824,21536232 +1.47506E+12,572,65282048,53833824,12055528 +1.47506E+12,589,65368064,53833824,18737136 +1.47506E+12,581,65454080,53833824,25327184 +1.47506E+12,571,65773568,53833824,15839064 +1.47506E+12,578,65773568,53833824,22395208 +1.47506E+12,581,65773568,53833824,13019976 +1.47506E+12,578,65773568,53833824,19576152 +1.47506E+12,571,65773568,53833824,26054040 +1.47506E+12,585,65773568,53833824,16724312 +1.47506E+12,573,65773568,53833824,23223952 +1.47506E+12,573,65773568,53833824,13756968 +1.47506E+12,584,65773568,53833824,20381584 +1.47506E+12,578,65773568,53833824,26938152 +1.47506E+12,589,65773568,53833824,17650968 +1.47506E+12,597,65773568,53833824,24422784 +1.47506E+12,573,65773568,53833824,30922824 +1.47506E+12,573,65773568,53833824,21456968 +1.47506E+12,566,65773568,53833824,27877312 +1.47506E+12,577,65773568,53833824,18456576 +1.47506E+12,569,65773568,53833824,24910864 +1.47506E+12,574,65773568,53833824,31421808 +1.47506E+12,576,65773568,53833824,21989264 +1.47506E+12,583,65773568,53833824,28603296 +1.47506E+12,587,65773568,53833824,19292784 +1.47506E+12,592,65773568,53833824,26007752 +1.47506E+12,572,65773568,53833824,32820240 +1.47506E+12,563,65777664,53833824,23245920 +1.47506E+12,563,65785856,53833824,29658176 +1.47506E+12,566,65773568,53833824,13461616 +1.47506E+12,580,65773568,53833824,20043072 +1.47506E+12,580,65773568,53833824,10399552 +1.47506E+12,581,65773568,53833824,16989952 +1.47506E+12,585,65773568,53833824,23626336 +1.47506E+12,584,65773568,53833824,14284800 +1.47506E+12,583,65773568,53833824,20898792 +1.47506E+12,576,65773568,53833824,11462944 +1.47506E+12,589,65773568,53833824,18144544 +1.47506E+12,582,65773568,53833824,24745880 +1.47506E+12,571,65773568,53833824,15256984 +1.47506E+12,578,65773568,53833824,21813688 +1.47506E+12,570,65773568,53833824,12313688 +1.47506E+12,567,65773568,53833824,18746184 +1.47506E+12,574,65773568,53833824,25257424 +1.47506E+12,571,65773568,53833824,15767992 +1.47506E+12,579,65773568,53833824,22336400 +1.47506E+12,578,65773568,53833824,12925880 +1.47506E+12,585,65773568,53833824,19561928 +1.47506E+12,580,65773568,53833824,26141152 +1.47506E+12,564,65773568,53833824,16570440 +1.47506E+12,594,65773568,53833824,23308168 +1.47506E+12,574,65773568,53833824,13853320 +1.47506E+12,587,65773568,53833824,20511760 +1.47506E+12,578,65773568,53833824,27068320 +1.47506E+12,572,65773568,53833824,17590392 +1.47506E+12,574,65773568,53833824,24101800 +1.47506E+12,590,65773568,53833824,30794704 +1.47506E+12,573,65773568,53833824,21327048 +1.47506E+12,594,65773568,53833824,28065696 +1.47506E+12,585,65773568,53833824,18732024 +1.47506E+12,578,65773568,53833824,25289480 +1.47506E+12,579,65773568,53833824,31857192 +1.47506E+12,570,65773568,53833824,22356440 +1.47506E+12,573,65773568,53833824,28857216 +1.47506E+12,574,65773568,53833824,19402392 +1.47506E+12,578,65773568,53833824,25959080 +1.47506E+12,577,65777664,53833824,32827120 +1.47506E+12,569,65781760,53833824,23339568 +1.47506E+12,584,65773568,53833824,12249632 +1.47506E+12,587,65773568,53833824,18910840 +1.47506E+12,592,65773568,53833824,9403488 +1.47506E+12,581,65773568,53833824,15994016 +1.47506E+12,569,65773568,53833824,22448928 +1.47506E+12,590,65773568,53833824,13175776 +1.47506E+12,581,65773568,53833824,19770656 +1.47506E+12,569,65773568,53833824,10258960 +1.47506E+12,585,65773568,53833824,16894960 +1.47506E+12,583,65773568,53833824,23508816 +1.47506E+12,576,65773568,53833824,14076120 +1.47506E+12,583,65773568,53833824,20689192 +1.47506E+12,583,65773568,53833824,11335392 +1.47506E+12,572,65773568,53833824,17824384 +1.47506E+12,560,65773568,53833824,24176960 +1.47506E+12,579,65773568,53833824,14775576 +1.47506E+12,582,65773568,53833824,21378208 +1.47506E+12,583,65773568,53833824,27990800 +1.47506E+12,563,65773568,53833824,18411192 +1.47506E+12,571,65773568,53833824,24887504 +1.47506E+12,571,65773568,53833824,15399080 +1.47506E+12,578,65773568,53833824,21955304 +1.47506E+12,587,65773568,53833824,28614320 +1.47506E+12,570,65773568,53833824,19113544 +1.47506E+12,574,65773568,53833824,25624456 +1.47506E+12,570,65773568,53833824,16121560 +1.47506E+12,579,65773568,53833824,22689224 +1.47506E+12,566,65773568,53833824,29110448 +1.47506E+12,573,65773568,53833824,19643328 +1.47506E+12,571,65773568,53833824,26121000 +1.47506E+12,576,65773568,53833824,16688592 +1.47506E+12,573,65773568,53833824,23188656 +1.47506E+12,583,65773568,53833824,29802168 +1.47506E+12,580,65773568,53833824,20414456 +1.47506E+12,579,65773568,53833824,26983032 +1.47506E+12,572,65773568,53833824,17502928 +1.47506E+12,571,65773568,53833824,23979784 \ No newline at end of file diff --git a/test/perf/execute-perf.js b/test/perf/execute-perf.js new file mode 100644 index 0000000..c653378 --- /dev/null +++ b/test/perf/execute-perf.js @@ -0,0 +1,87 @@ +'use strict'; + +/* +* curl -O http://10.99.214.76:8990/execute-perf-results-cubrid-9.2.3.0005-node-v4.5.0-node-cubrid-3.0.0-Wed-Sep-28-2016-20-33-16-GMT+0900--KST-.csv +* +* CUBRID_VERSION=9.2.3.0005 node execute-perf.js +* */ + +const fs = require('fs'); +const path = require('path'); + +if (!process.env.CUBRID_VERSION) { + console.error('"CUBRID_VERSION" environment variable must be defined to proceed.'); + process.exit(1); +} + +const CUBRID = require('../../'); +const version = require('../../package.json').version; +const date = (new Date).toString().replace(/[\s:\(\))]/g, '-'); + +const fd = fs.openSync(path.join(__dirname, + `execute-perf-results-cubrid-${process.env.CUBRID_VERSION}-node-${process.version}-node-cubrid-${version}-${date}.csv` +), 'a'); + +const config = { + host: '10.99.214.76', + port: 33000, + user: 'public', + password: '', + database: 'demodb', +}; + +const client = new CUBRID.createCUBRIDConnection(config); +const testTime = 5 * 60 * 1000; +let counter = 0; +let lastCounter = 0; +let stop = false; + +function query(cb) { + if (stop) { + return cb(); + } + + process.stdout.write(`${++counter}\r`); + + client.execute(`INSERT INTO tbl_test VALUES(${counter}, 'apple')`, function (err) { + if (err) { + return cb(err); + } + + query(cb); + }); +} + +client.batchExecuteNoQuery([ + 'DROP TABLE IF EXISTS tbl_test', + 'CREATE TABLE tbl_test (id INT, text VARCHAR)' +], function (err) { + if (err) { + throw err; + } + + const timer = setInterval(() => { + const memoryUsage = process.memoryUsage(); + const QPS = counter - lastCounter; + + lastCounter = counter; + + fs.write(fd, `${Date.now()},${QPS},${memoryUsage.rss},${memoryUsage.heapTotal},${memoryUsage.heapUsed}\r\n`, function () {}); + }, 1000); + + setTimeout(function () { + stop = true; + }, testTime); + + query(function (err) { + if (err) { + throw err; + } + + clearInterval(timer); + + fs.closeSync(fd); + + client.close(); + }); +}); diff --git a/test/perf/perf-results-by-version.xls b/test/perf/perf-results-by-version.xls new file mode 100644 index 0000000..eca9694 Binary files /dev/null and b/test/perf/perf-results-by-version.xls differ diff --git a/test/perf/query-perf.js b/test/perf/query-perf.js new file mode 100644 index 0000000..287f0d0 --- /dev/null +++ b/test/perf/query-perf.js @@ -0,0 +1,84 @@ +'use strict'; + +/* +* curl -O http://10.99.214.76:8990/perf-results-cubrid-9.2.3.0005-node-v4.5.0-node-cubrid-3.0.0-Wed-Sep-28-2016-19-42-38-GMT+0900--KST-.csv +* +* CUBRID_VERSION=9.2.3.0005 node memory-leak-check.js +* */ + +const fs = require('fs'); +const path = require('path'); + +if (!process.env.CUBRID_VERSION) { + console.error('"CUBRID_VERSION" environment variable must be defined to proceed.'); + process.exit(1); +} + +const CUBRID = require('../../'); +const version = require('../../package.json').version; +const date = (new Date).toString().replace(/[\s:\(\))]/g, '-'); + +const fd = fs.openSync(path.join(__dirname, + `perf-results-cubrid-${process.env.CUBRID_VERSION}-node-${process.version}-node-cubrid-${version}-${date}.csv` +), 'a'); + +const config = { + host: '10.99.214.76', + port: 33000, + user: 'public', + password: '', + database: 'demodb', +}; + +const client = new CUBRID.createCUBRIDConnection(config); +const testTime = 5 * 60 * 1000; +let counter = 0; +let lastCounter = 0; +let stop = false; + +function query(cb) { + if (stop) { + return cb(); + } + + process.stdout.write(`${++counter}\r`); + + client.query('SELECT * FROM game LIMIT 100', function (err, result, queryHandle) { + if (err) { + return cb(err); + } + + client.closeQuery(queryHandle, function (err) { + if (err) { + return cb(err); + } + + query(cb); + }); + }); +} + +const timer = setInterval(() => { + const memoryUsage = process.memoryUsage(); + const QPS = counter - lastCounter; + + lastCounter = counter; + + fs.write(fd, `${Date.now()},${QPS},${memoryUsage.rss},${memoryUsage.heapTotal},${memoryUsage.heapUsed}\r\n`, function () {}); +}, 1000); + +setTimeout(function () { + stop = true; +}, testTime); + +query(function (err) { + if (err) { + throw err; + } + + clearInterval(timer); + + fs.closeSync(fd); + + client.close(); +}); diff --git a/test/test.CUBRIDConnection.query.js b/test/test.CUBRIDConnection.query.js deleted file mode 100644 index 305ae1e..0000000 --- a/test/test.CUBRIDConnection.query.js +++ /dev/null @@ -1,409 +0,0 @@ -var async = require('async'), - test_Setup = require('./testSetup/test_Setup'); - -exports['single query(sql, callback)'] = function (test) { - var client = test_Setup.createDefaultCUBRIDDemodbConnection(); - - test.expect(4); - - async.waterfall([ - function (cb) { - client.connect(cb); - }, - function (cb) { - client.query('SHOW TABLES', cb); - }, - function (result, queryHandle, cb) { - test.ok(result); - test.ok(queryHandle > 0); - result = JSON.parse(result); - test.ok(result.RowsCount == 10); - - client.closeQuery(queryHandle, cb); - } - ], function (err) { - if (err) { - throw err; - } else { - test.ok(client._queriesPacketList.length == 0); - - client.close(function (err) { - test.done(err); - }); - } - }); -}; - -exports['multiple query(sql, callback) in the queue with closeQuery()'] = function (test) { - var client = test_Setup.createDefaultCUBRIDDemodbConnection(); - - var arr = [1, 2, 3, 4, 5]; - - test.expect(arr.length * 4 + 1); - - async.each(arr, function (ix, done) { - client.query('SHOW TABLES', function (err, result, queryHandle) { - test.ok(!err); - test.ok(result); - test.ok(queryHandle > 0); - result = JSON.parse(result); - test.ok(result.RowsCount == 10); - - client.closeQuery(queryHandle, done); - }); - }, function (err) { - if (err) { - throw err; - } else { - test.ok(client._queriesPacketList.length == 0); - - client.close(function (err) { - test.done(err); - }); - } - }); -}; - -exports['multiple query(sql, callback) in the queue without closeQuery()'] = function (test) { - var client = test_Setup.createDefaultCUBRIDDemodbConnection(); - - var arr = [1, 2, 3, 4, 5]; - - test.expect(arr.length * 4 + 1); - - async.each(arr, function (ix, done) { - client.query('SHOW TABLES', function (err, result, queryHandle) { - test.ok(!err); - test.ok(result); - test.ok(queryHandle > 0); - result = JSON.parse(result); - test.ok(result.RowsCount == 10); - - done(); - }); - }, function (err) { - if (err) { - throw err; - } else { - test.ok(client._queriesPacketList.length > 0); - - client.close(function (err) { - test.done(err); - }); - } - }); - -// ActionQueue.enqueue([ -// function (cb) { -// client.connect(cb); -// }, -// function (cb) { -// function handleResults(err, results, queryHandle) { -// if (err) -// } -// -// for (var i = 0; i < max; ++i) { -// client.genericQuery('SHOW TABLES', handleResults); -// } -// }, -// function (results, queryHandle, cb) { -// console.log(++i, results); -// -// client.closeQuery(queryHandle, cb); - -//// client.genericQuery('SELECT 1; SELECT 1;', function (err, results) { -//// if (err) { -//// cb(err); -//// } else { -//// console.log(results); -//// test.deepEqual(results, ['SELECT 1', 'SELECT 1']); -//// cb(); -//// } -//// }); -//// }, -//// function (cb) { -//// client.genericQuery(['SELECT 1;', 'SELECT 1;'], function (err, results) { -//// if (err) { -//// cb(err); -//// } else { -//// console.log(results); -//// test.deepEqual(results, ['SELECT 1;', 'SELECT 1;']); -//// cb(); -//// } -//// }); -//// }, -//// function (cb) { -//// client.genericQuery(['SELECT 1', 'SELECT 1'], function (err, results) { -//// if (err) { -//// cb(err); -//// } else { -//// console.log(results); -//// test.deepEqual(results, ['SELECT 1', 'SELECT 1']); -//// cb(); -//// } -//// }); -//// }, -// function (cb) { -// client.genericQuery(['SELECT 1'], function (err, results) { -// if (err) { -// cb(err); -// } else { -// console.log(results); -// test.deepEqual(results, ['SELECT 1']); -// cb(); -// } -// }); -//// }, -//// function (cb) { -//// client.genericQuery([' SELECT 1; '], function (err, results) { -//// if (err) { -//// cb(err); -//// } else { -//// console.log(results); -//// test.deepEqual(results, ['SELECT 1;']); -//// cb(); -//// } -//// }); -//// }, -//// function (cb) { -//// client.genericQuery('SELECT * FROM game WHERE id = ?', [1], function (err, results) { -//// if (err) { -//// cb(err); -//// } else { -//// console.log(results); -//// test.deepEqual(results, ['SELECT * FROM game WHERE id = 1']); -//// cb(); -//// } -//// }); -//// }, -//// function (cb) { -//// client.genericQuery('SELECT * FROM game WHERE id = ? AND name = ?', [1, 'soccer'], function (err, results) { -//// if (err) { -//// cb(err); -//// } else { -//// console.log(results); -//// test.deepEqual(results, ["SELECT * FROM game WHERE id = 1 AND name = 'soccer'"]); -//// cb(); -//// } -//// }); -// } -// ], function (err) { -// -// }); -}; - -exports['single query(sql, params, callback)'] = function (test) { - var client = test_Setup.createDefaultCUBRIDDemodbConnection(); - - test.expect(4); - - async.waterfall([ - function (cb) { - client.connect(cb); - }, - function (cb) { - client.query('SELECT * FROM nation WHERE continent = ?', ['Asia'], cb); - }, - function (result, queryHandle, cb) { - test.ok(result); - test.ok(queryHandle > 0); - result = JSON.parse(result); - test.ok(result.RowsCount == 47); - - client.closeQuery(queryHandle, cb); - } - ], function (err) { - if (err) { - throw err; - } else { - test.ok(client._queriesPacketList.length == 0); - - client.close(function (err) { - test.done(err); - }); - } - }); -}; - -exports['multiple query(sql, params, callback) in the queue without closeQuery()'] = function (test) { - var client = test_Setup.createDefaultCUBRIDDemodbConnection(); - - var arr = [ - { - sql: "SHOW TABLES", - params: null, - rowsCount: 10 - }, - { - sql: "SELECT * FROM nation", - params: [], - rowsCount: 215 - }, - { - sql: "SELECT * FROM nation WHERE continent = ?", - params: ['Asia'], - rowsCount: 47 - }, - { - sql: "SELECT * FROM nation WHERE continent = ?", - params: 'Asia', - rowsCount: 47 - }, - { - sql: "SELECT * FROM history WHERE host_year = ?", - params: [2004], - rowsCount: 64 - }, - { - sql: "SELECT * FROM history WHERE host_year = ?", - params: 2004, - rowsCount: 64 - }, - { - sql: "SELECT * FROM history WHERE host_year = ?", - params: ['2004'], - rowsCount: 64 - }, - { - sql: "SELECT * FROM history WHERE host_year = ?", - params: '2004', - rowsCount: 64 - }, - { - sql: "SELECT * FROM game WHERE game_date = ?", - params: ['08/28/2004'], - rowsCount: 311 - }, - { - sql: "SELECT * FROM game WHERE game_date = ?", - params: '08/28/2004', - rowsCount: 311 - }, - { - sql: "SELECT * FROM game WHERE game_date = ?", - params: [new Date('8/28/2004')], - rowsCount: 311 - }, - { - sql: "SELECT * FROM game WHERE game_date = ?", - params: new Date('8/28/2004'), - rowsCount: 311 - }, - { - sql: "SELECT * FROM game WHERE game_date = ?", - params: [new Date()], - rowsCount: 0 - }, - { - sql: "SELECT * FROM game WHERE game_date = ?", - params: new Date(), - rowsCount: 0 - } - ]; - - test.expect(arr.length * 4 + 1); - - async.each(arr, function (query, done) { - client.query(query.sql, query.params, function (err, result, queryHandle) { - test.ok(!err); - test.ok(result); - test.ok(queryHandle > 0); - result = JSON.parse(result); - test.ok(result.RowsCount == query.rowsCount); - - done(); - }); - }, function (err) { - if (err) { - throw err; - } else { - test.ok(client._queriesPacketList.length > 0); - - client.close(function (err) { - test.done(err); - }); - } - }); -}; - -exports['single execute(sql, callback)'] = function (test) { - var client = test_Setup.createDefaultCUBRIDDemodbConnection(); - - test.expect(1); - - async.waterfall([ - function (cb) { - client.connect(cb); - }, - function (cb) { - client.setAutoCommitMode(false, cb); - }, - function (cb) { - client.execute("DELETE FROM code WHERE s_name = 'ZZZZ'", cb); - } - ], function (err) { - if (err) { - throw err; - } else { - test.ok(client._queriesPacketList.length == 0); - - client.close(function (err) { - test.done(err); - }); - } - }); -}; - -exports['multiple execute(sql, callback) in the queue'] = function (test) { - var client = test_Setup.createDefaultCUBRIDDemodbConnection(); - - var arr = [ - { - sql: "CREATE TABLE tbl_test(id INT)" - }, - { - sql: "INSERT INTO tbl_test (id) VALUES (1), (2), (3)" - }, - { - sql: "DROP TABLE tbl_test" - } - ]; - - test.expect(arr.length * 2 + 1 + 4 + 1); - - async.waterfall([ - function (cb) { - async.each(arr, function (query, done) { - client.execute(query.sql, function (err) { - test.ok(!err); - test.ok(client._queriesPacketList.length == 0); - - done(); - }); - }, cb); - }, - function (cb) { - test.ok(client._queriesPacketList.length == 0); - - client.query('SHOW TABLES', function (err, result, queryHandle) { - test.ok(!err); - test.ok(result); - test.ok(queryHandle > 0); - result = JSON.parse(result); - test.ok(result.RowsCount == 10); - - cb(); - }); - } - ], function (err) { - if (err) { - throw err; - } else { - test.ok(client._queriesPacketList.length == 1); - - client.close(function (err) { - test.done(err); - }); - } - }); -}; diff --git a/test/test.Helpers.js b/test/test.Helpers.js deleted file mode 100644 index 5dfbc21..0000000 --- a/test/test.Helpers.js +++ /dev/null @@ -1,115 +0,0 @@ -var codeCoveragePath = process.env.CODE_COV ? '-cov' : '', - Helpers = require('../src' + codeCoveragePath + '/utils/Helpers'); - -exports['validate input'] = function (test) { - test.expect(35); - - var buffer = new Buffer(5), - value1 = ['6', '7', '8']; - - buffer.write('12345'); - - var comb1 = Helpers._combineData(buffer, value1); - - test.equal(comb1.toString(), '12345678'); - - var value2 = new Buffer('678'), - comb2 = Helpers._combineData(buffer, value2); - - test.equal(comb2.toString(), '12345678'); - - var value3 = new Buffer(3); - value3[0] = '6'.charCodeAt(0); - value3[1] = '7'.charCodeAt(0); - value3[2] = '8'.charCodeAt(0); - - var comb3 = Helpers._combineData(buffer, value3); - - test.equal(comb3.toString(), '12345678'); - - var sql = 'INSERT INTO a VALUES(?, ?, ?)', - newsql = Helpers._sqlFormat(sql, ['1', 2, null], ["'", '', '']); - - test.equal(newsql, "INSERT INTO a VALUES('1', 2, NULL)"); - - test.equal(Helpers._escapeString('INSERT INTO "a VALUES(\b)'), 'INSERT INTO ""a VALUES(\\b)'); - - sql = 'stringWithDouble"Quote'; - - // Should not escape the double quote if the delimiter is a single quote. - test.equal(Helpers._escapeString(sql, "'"), sql); - - sql = "stringWithSingle'Quote"; - - // Should not escape the single quote if the delimiter is a double quote. - test.equal(Helpers._escapeString(sql, '"'), sql); - - sql = 'INSERT INTO a VALUES(?, ?, ?)'; - newsql = Helpers._sqlFormat(sql, ['stringWithDouble"Quote', 2, null]); - - test.equal(newsql, "INSERT INTO a VALUES('stringWithDouble\"Quote', 2, NULL)"); - - // Test Input validation functions - test.ok(Helpers._validateInputBoolean(null) === false); - test.ok(Helpers._validateInputBoolean(4) === false); - test.ok(Helpers._validateInputBoolean(3.14) === false); - test.ok(Helpers._validateInputBoolean('qwerty') === false); - test.ok(Helpers._validateInputBoolean(true) === true); - test.ok(Helpers._validateInputBoolean(1) === true); - - test.ok(Helpers._validateInputPositive(null) === false); - test.ok(Helpers._validateInputPositive(3.14) === true); - test.ok(Helpers._validateInputPositive(-1) === false); - test.ok(Helpers._validateInputPositive(0) === true); - test.ok(Helpers._validateInputPositive(14) === true); - - test.ok(Helpers._validateInputTimeout(null) === false); - test.ok(Helpers._validateInputTimeout(3.14) === false); - test.ok(Helpers._validateInputTimeout(-1) === false); - test.ok(Helpers._validateInputTimeout(0) === true); - test.ok(Helpers._validateInputTimeout(14) === true); - - test.ok(Helpers._validateInputString(null) === false); - test.ok(Helpers._validateInputString(3) === false); - test.ok(Helpers._validateInputString(true) === false); - test.ok(Helpers._validateInputString('') === false); - test.ok(Helpers._validateInputString('querty') === true); - - test.ok(Helpers._validateInputSQLString(null) === false); - test.ok(Helpers._validateInputSQLString(3) === false); - test.ok(Helpers._validateInputSQLString(true) === false); - test.ok(Helpers._validateInputSQLString('') === false); - test.ok(Helpers._validateInputSQLString('a') === false); - test.ok(Helpers._validateInputSQLString('qwerty') === true); - - test.done(); -}; - -//exports['_sqlFormat()'] = function (test) { -// var arr = [ -// { -// sql: 'INSERT INTO project (projectname, team, creator, description, log_limit, esm_code, sink_config, createtime, lastmodified) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)', -// values: ['qqqesen', 'qa', 60136, '1234123412', 20000000, '123456', JSON.stringify({ -// type: "hdfs", -// server: [ -// { -// ip: "1.1.1.1", -// port: 2222 -// } -// ], -// user: "hadoop", -// path:"/data" -// }), '2013-09-25 17:00:52', '2013-09-25 17:00:52'], -// outputSQL: "INSERT INTO project (projectname, team, creator, description, log_limit, esm_code, sink_config, createtime, lastmodified) VALUES ('qqqesen', 'qa', 60136, '1234123412', 20000000, '123456', '{\"type\":\"hdfs\",\"server\":[{\"ip\":\"1.1.1.1\",\"port\":2222}],\"user\":\"hadoop\",\"path\":\"/data\"}', '2013-09-25 17:00:52', '2013-09-25 17:00:52')" -// } -// ]; -// -// test.expect(arr.length); -// -// async.each(arr, function(obj, done) { -// Helpers._sqlFormat(obj.sql, obj.values); -// }, function (err) { -// -// }); -// -//}; diff --git a/test/testCUBRID.createConnection.js b/test/testCUBRID.createConnection.js deleted file mode 100644 index c76ca7f..0000000 --- a/test/testCUBRID.createConnection.js +++ /dev/null @@ -1,57 +0,0 @@ -var path = require('path'); - -exports[path.basename(__filename)] = function (test) { - var CUBRID = require('../'), - config = require('./testSetup/test_Setup').config, - connectionCount = 4, - closedCount = 0; - - test.expect(0); - - function connect(client) { - client.connect(function (err) { - if (err) { - throw err; - } else { - client.getEngineVersion(function (err) { - if (err) { - throw err; - } else { - client.close(function (err) { - if (err) { - throw err; - } else { - if (++closedCount == connectionCount) { - test.done(); - } - } - }); - } - }); - } - }); - } - - // Create a connection by passing a list of parameters. - connect(new CUBRID.createCUBRIDConnection(config.host, config.port, config.user, config.password, config.database)); - // Create a connection by passing a object of parameters. - connect(new CUBRID.createCUBRIDConnection({ - host: config.host, - port: config.port, - user: config.user, - password: config.password, - database: config.database - })); - - // Now test the alias function. - // Create a connection by passing a list of parameters. - connect(new CUBRID.createConnection(config.host, config.port, config.user, config.password, config.database)); - // Create a connection by passing a object of parameters. - connect(new CUBRID.createConnection({ - host: config.host, - port: config.port, - user: config.user, - password: config.password, - database: config.database - })); -}; diff --git a/test/testCUBRIDConnection.end.js b/test/testCUBRIDConnection.end.js deleted file mode 100644 index d53926f..0000000 --- a/test/testCUBRIDConnection.end.js +++ /dev/null @@ -1,49 +0,0 @@ -var path = require('path'); - -exports[path.basename(__filename)] = function (test) { - var client = require('./testSetup/test_Setup').createDefaultCUBRIDDemodbConnection(); - - test.expect(2); - - client.connect(function (err) { - if (err) { - throw err; - } else { - client.query('SELECT * FROM nation', function (err, result, queryHandle) { - if (err) { - throw err; - } else { - var foundQueryHandle = false; - - for (var i = client._queriesPacketList.length - 1; i > -1; --i) { - if (client._queriesPacketList[i].queryHandle === queryHandle) { - foundQueryHandle = true; - break; - } - } - - test.ok(foundQueryHandle === true); - - client.end(function (err) { - if (err) { - throw err; - } else { - foundQueryHandle = false; - - for (var i = client._queriesPacketList.length - 1; i > -1; --i) { - if (client._queriesPacketList[i].handle === queryHandle) { - foundQueryHandle = true; - break; - } - } - - test.ok(foundQueryHandle === false); - - test.done(); - } - }); - } - }); - } - }); -}; diff --git a/test/testCUBRIDConnection.getConnectionTimeout.js b/test/testCUBRIDConnection.getConnectionTimeout.js deleted file mode 100644 index cbbd3b7..0000000 --- a/test/testCUBRIDConnection.getConnectionTimeout.js +++ /dev/null @@ -1,15 +0,0 @@ -var path = require('path'); - -exports[path.basename(__filename)] = function (test) { - var CUBRID = require('../'), - client = new CUBRID.createCUBRIDConnection('www.google.com', 33000, 'public', '', 'demodb'); - - test.expect(2); - - test.equal(client.getConnectionTimeout(), 0, 'Initial connection timeout should be 0.'); - - client.setConnectionTimeout(2000); - test.equal(client.getConnectionTimeout(), 2000); - - test.done(); -}; diff --git a/test/testCUBRIDConnection.setConnectionTimeout.js b/test/testCUBRIDConnection.setConnectionTimeout.js deleted file mode 100644 index 6ea3caf..0000000 --- a/test/testCUBRIDConnection.setConnectionTimeout.js +++ /dev/null @@ -1,35 +0,0 @@ -var path = require('path'); - -exports[path.basename(__filename)] = function (test) { - var CUBRID = require('../'), - ErrorMessages = require('../src' + (process.env.CODE_COV ? '-cov' : '') + '/constants/ErrorMessages'), - client = new CUBRID.createCUBRIDConnection('www.google.com', 33000, 'public', '', 'demodb'); - - test.expect(7); - - client.setConnectionTimeout(2000); - test.equal(client.getConnectionTimeout(), 2000, 'Setting timeout value bigger than 0, should set it to that value.'); - - client.setConnectionTimeout(0); - test.equal(client.getConnectionTimeout(), 0, 'Setting timeout value to 0, should set it to 0.'); - - client.setConnectionTimeout(-3000); - test.equal(client.getConnectionTimeout(), 0, 'Setting timeout value to less than 0, should set it to 0.'); - - client.setConnectionTimeout(2000); - test.equal(client.getConnectionTimeout(), 2000); - - client.setConnectionTimeout(2000); - test.equal(client.getConnectionTimeout(), 2000, 'Setting the same timeout value again and again should be successful.'); - - client.connect(function (err) { - if (err) { - test.equal(err.message, ErrorMessages.ERROR_CONNECTION_TIMEOUT); - test.ok(client.connectionOpened === false); - - test.done(); - } else { - throw 'We should not get here!'; - } - }); -}; diff --git a/test/testSetup/fix_lcov.js b/test/testSetup/fix_lcov.js deleted file mode 100644 index a68a83d..0000000 --- a/test/testSetup/fix_lcov.js +++ /dev/null @@ -1,17 +0,0 @@ -var data = ''; - -process.stdin.resume(); -process.stdin.setEncoding('utf8'); - -process.stdin.on('data', function(chunk) { - data += chunk; -}); - -process.stdin.on('end', function() { - if (data && data.length) { - var re = /\bSF:/g, - preparedData = data.replace(re, 'SF:src/'); - - console.log(preparedData); - } -}); diff --git a/test/testSetup/index.js b/test/testSetup/index.js new file mode 100644 index 0000000..c8f303a --- /dev/null +++ b/test/testSetup/index.js @@ -0,0 +1,38 @@ +'use strict'; + +const path = require('path'); +const rootDir = path.resolve(__dirname, '..', '..'); +const CUBRID = require(rootDir); +const ConsoleLogger = require(path.join(rootDir, 'src', 'ConsoleLogger')); + +const config = { + hosts: ['localhost'], + port: 33000, + user: 'public', + password: '', + database: 'demodb', + maxConnectionRetryCount: 1, + logger: new ConsoleLogger, +}; + +exports.config = config; + +function createDefaultCUBRIDDemodbConnection() { + return new CUBRID.createCUBRIDConnection(config); +} + +exports.cleanup = function (tableName) { + return function cleanup() { + let client = createDefaultCUBRIDDemodbConnection(); + + this.timeout(5000); + + return client + .execute(`DROP TABLE IF EXISTS ${tableName}`) + .then(() => { + return client.close(); + }); + }; +}; + +exports.createDefaultCUBRIDDemodbConnection = createDefaultCUBRIDDemodbConnection; diff --git a/test/testSetup/test_Setup.js b/test/testSetup/test_Setup.js deleted file mode 100644 index 0ec64b9..0000000 --- a/test/testSetup/test_Setup.js +++ /dev/null @@ -1,16 +0,0 @@ -// This will require the `index.js` file located at the root -// directory of this **node-cubrid** module. -var CUBRID = require('../../'), - config = { - host: 'localhost', - port: 33000, - user: 'public', - password: '', - database: 'demodb' - }; - -exports.config = config; - -exports.createDefaultCUBRIDDemodbConnection = function () { - return new CUBRID.createCUBRIDConnection(config.host, config.port, config.user, config.password, config.database); -}; diff --git a/test/testTransactionHardDisconnect.js b/test/testTransactionHardDisconnect.js deleted file mode 100644 index 03bdc15..0000000 --- a/test/testTransactionHardDisconnect.js +++ /dev/null @@ -1,64 +0,0 @@ -var path = require('path'); - -exports[path.basename(__filename)] = function (test) { - var CUBRID = require('../'), - client = require('./testSetup/test_Setup').createDefaultCUBRIDDemodbConnection(), - Helpers = CUBRID.Helpers, - ActionQueue = CUBRID.ActionQueue, - Result2Array = CUBRID.Result2Array; - - test.expect(3); - - ActionQueue.enqueue([ - function (cb) { - client.connect(cb); - }, - function (cb) { - Helpers.logInfo('Connected...'); - client.batchExecuteNoQuery(['drop table if exists test_tran', 'create table test_tran(id int)'], cb); - }, - function (cb) { - client.beginTransaction(cb); - }, - function (cb) { - client.batchExecuteNoQuery('insert into test_tran values(1)', cb); - }, - function (cb) { - // Close the connection without explicitly committing. - // It should rollback automatically. - client.close(cb); - }, - function (cb) { - test.ok(client.connectionOpened === false); - - client.connect(cb); - }, - function (cb) { - client.query('SELECT * FROM test_tran', cb); - }, - function (result, queryHandle, cb) { - test.ok(Result2Array.TotalRowsCount(result) === 0); - client.closeQuery(queryHandle, cb); - }, - function (queryHandle, cb) { - // Cleaup after each test. - client.execute('drop table test_tran', cb); - }, - function (cb) { - client.query('select count(*) from db_class where class_name = \'test_tran\'', cb); - }, - function (result, queryHandle, cb) { - test.ok(Result2Array.RowsArray(result)[0][0] === 0); - - client.close(cb); - } - ], function (err) { - if (err) { - throw err.message; - } else { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - test.done(); - } - }); -}; diff --git a/test/test_ActionQueue.js b/test/test_ActionQueue.js deleted file mode 100644 index 918c6e9..0000000 --- a/test/test_ActionQueue.js +++ /dev/null @@ -1,52 +0,0 @@ -exports['test_ActionQueue'] = function (test) { - var codeCoveragePath = process.env.CODE_COV ? '-cov' : '', - ActionQueue = require('../src' + codeCoveragePath + '/utils/ActionQueue'), - count = 0, - startTime = (new Date()).getTime(); - - test.expect(2); - - ActionQueue.enqueue( - [ - function (callback) { - callback(null, '1'); - }, - function (data, callback) { - setTimeout(function () { - callback(null, data + ',2'); - }, 3000); - }, - function (data, callback) { - setTimeout(function () { - callback(null, data + ',3'); - }, 1000); - }, - function (data, callback) { - callback(null, data + ',4'); - } - ], - function (err, results) { - test.equal(results, '1,2,3,4'); - } - ); - - ActionQueue.while( - function () { - return count < 5; - }, - function (callback) { - count++; - setTimeout(callback, 1000); - }, - function (err) { - if (err) { - throw err.toString(); - } else { - var endTime = (new Date()).getTime(); - // 5 seconds have passed? - test.ok(endTime - startTime > 5 * 1000); - test.done(); - } - } - ); -}; diff --git a/test/test_Async.js b/test/test_Async.js deleted file mode 100644 index c5f3a74..0000000 --- a/test/test_Async.js +++ /dev/null @@ -1,94 +0,0 @@ -exports['test_Async'] = function (test) { - var CUBRID = require('../'), - client = require('./testSetup/test_Setup').createDefaultCUBRIDDemodbConnection(), - Helpers = CUBRID.Helpers, - Result2Array = CUBRID.Result2Array, - Async = require('async'), - returnedQueryHandle, fetchResult; - - test.expect(41); - - Helpers.logInfo(module.filename.toString() + ' started...'); - - Async.waterfall([ - function (cb) { - client.connect(cb); - }, - function (cb) { - client.getEngineVersion(cb); - }, - function (engineVersion, cb) { - Helpers.logInfo('EngineVersion is: ' + engineVersion); - client.query('select * from game', cb); - }, - function (result, queryHandle, cb) { - test.equal(Result2Array.RowsArray(result).length, 235); - - Helpers.logInfo('Query result rows count: ' + Result2Array.TotalRowsCount(result)); - - test.equal(Result2Array.ColumnNamesArray(result).toString(), 'host_year,event_code,athlete_code,stadium_code,nation_code,medal,game_date'); - - Helpers.logInfo('Query result column names: ' + Result2Array.ColumnNamesArray(result)); - - test.equal(Result2Array.ColumnTypesArray(result).toString(), 'Int,Int,Int,Int,Char,Char,Date'); - - Helpers.logInfo('Query result column data types: ' + Result2Array.ColumnTypesArray(result)); - Helpers.logInfo('Query results:'); - - var arr = Result2Array.RowsArray(result); - - test.equal(arr.length, 235); - test.equal(arr[0].toString().startsWith('2004,20021,14345,30116,NGR,B,2004-08-28T'), true); - test.equal(arr[arr.length - 1].toString().startsWith('2004,20317,14457,30124,ITA,G,2004-08-26T'), true); - - for (var j = 0; j < 1;++j) { - Helpers.logInfo(arr[j].toString()); - } - - returnedQueryHandle = queryHandle; - - Async.whilst( - function () { - return fetchResult !== null; - }, - function (callback) { - client.fetch(returnedQueryHandle, function (err, result) { - if (result !== null) { - Helpers.logInfo('Fetch results:'); - var arr = Result2Array.RowsArray(result); - test.ok(arr.length === 241 || arr.length === 224); - for (var k = 0; k < 1; k++) { - Helpers.logInfo(arr[k].toString()); - } - } else { - Helpers.logInfo('There is no more data to fetch.'); - } - fetchResult = result; - callback(err); - } - ); - }, - function (err) { - if (err) { - throw err.message; - } else { - cb(err); - } - } - ); - }, - function (cb) { - client.closeQuery(returnedQueryHandle, cb); - }, - function (queryHandle, cb) { - client.close(cb); - } - ], function (err) { - if (err) { - throw err; - } else { - Helpers.logInfo('Test passed.'); - test.done(); - } - }); -}; diff --git a/test/test_AutoCommitMode.js b/test/test_AutoCommitMode.js deleted file mode 100644 index 0077d14..0000000 --- a/test/test_AutoCommitMode.js +++ /dev/null @@ -1,76 +0,0 @@ -exports['test_AutoCommitMode'] = function (test) { - var CUBRID = require('../'), - client = require('./testSetup/test_Setup').createDefaultCUBRIDDemodbConnection(), - Helpers = CUBRID.Helpers, - Result2Array = CUBRID.Result2Array; - - function errorHandler(err) { - throw err.message; - } - - Helpers.logInfo(module.filename.toString() + ' started...'); - - test.expect(1); - - client.connect(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connection connected'); - - client.batchExecuteNoQuery(['drop table if exists node_test', 'create table node_test(id int)'], function (err) { - if (err) { - errorHandler(err); - } else { - client.setAutoCommitMode(false, function (err) { - if (err) { - errorHandler(err); - } else { - client.batchExecuteNoQuery(['insert into node_test values(1)'], function (err) { - if (err) { - errorHandler(err); - } else { - client.commit(function (err) { - if (err) { - errorHandler(err); - } else { - client.query('select * from node_test', function (err, result) { - if (err) { - errorHandler(err); - } else { - test.equal(Result2Array.TotalRowsCount(result), 1, 'Didn\'t commit!!!'); - - client.setAutoCommitMode(true, function (err) { - if (err) { - errorHandler(err); - } else { - client.batchExecuteNoQuery(['drop table node_test'], function (err) { - if (err) { - errorHandler(err); - } else { - client.close(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connection closed.'); - test.done(); - Helpers.logInfo('Test passed.'); - } - }); - } - }); - } - }); - } - }); - } - }); - } - }); - } - }); - } - }); - } - }); -}; diff --git a/test/test_BadConnect.js b/test/test_BadConnect.js deleted file mode 100644 index dbe28bb..0000000 --- a/test/test_BadConnect.js +++ /dev/null @@ -1,29 +0,0 @@ -exports['test_BadConnect'] = function (test) { - var CUBRID = require('../'), - config = require('./testSetup/test_Setup').config, - client = CUBRID.createCUBRIDConnection(config.host, config.port, config.user, 'xyz', 'demodb_xyz'), - Helpers = CUBRID.Helpers; - - Helpers.logInfo(module.filename.toString() + ' started...'); - - test.expect(1); - - client.connect(function (err) { - if (err) { - test.ok([ - // This is the correct message, CUBRID should return when a database is not found. - "-677:Failed to connect to database server, 'demodb_xyz', on the following host(s): localhost:localhost", - // When CUBRID is installed and started as a root, the following error is returned. - // This may be a CUBRID bug or a spec. Need to keep these until we figure out - // whether this is a bug or not. - '-985:The hostname on the database connection string should be specified when multihost is set in "databases.txt".', - // On CUBRID 9.1 and 8.4.1 the following error is returned. - "-985:No error message available."].indexOf(err.message) > -1); - Helpers.logInfo('Test passed.'); - test.done(); - } else { - throw 'We should not get here!'; - } - }); -}; - diff --git a/test/test_BadPort.js b/test/test_BadPort.js deleted file mode 100644 index 67c0a40..0000000 --- a/test/test_BadPort.js +++ /dev/null @@ -1,20 +0,0 @@ -exports['test_BadPort'] = function (test) { - var CUBRID = require('../'), - config = require('./testSetup/test_Setup').config, - client = CUBRID.createCUBRIDConnection(config.host, 80, config.user, config.password, config.database), - Helpers = CUBRID.Helpers; - - test.expect(1); - - Helpers.logInfo(module.filename.toString() + ' started...'); - - client.connect(function (err) { - if (err) { - test.ok(['connect ECONNREFUSED', 'connect ETIMEDOUT', 'read ECONNRESET'].indexOf(err.message) > -1); - Helpers.logInfo('Test passed.'); - test.done(); - } else { - throw 'We should not get here!'; - } - }); -}; diff --git a/test/test_BadSQLSyntax.js b/test/test_BadSQLSyntax.js deleted file mode 100644 index b10c8aa..0000000 --- a/test/test_BadSQLSyntax.js +++ /dev/null @@ -1,42 +0,0 @@ -exports['test_BadSQLSyntax'] = function (test) { - var CUBRID = require('../'), - Helpers = CUBRID.Helpers, - testSetup = require('./testSetup/test_Setup'), - client = testSetup.createDefaultCUBRIDDemodbConnection(); - - Helpers.logInfo(module.filename.toString() + ' started...'); - - test.expect(1); - - function errorHandler(err) { - Helpers.logError(err.message); - test.equal(err.message, '-493:Syntax: Unknown class "game_xyz". select * from game_xyz'); - } - - client.connect(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connected.'); - Helpers.logInfo('Querying: select * from game_xyz'); - - client.query('select * from game_xyz', function (err) { - if (err) { - errorHandler(err); - - client.close(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - test.done(); - } - }); - } else { - throw 'We should never get here!'; - } - }); - } - }); -}; diff --git a/test/test_BasicBatchExecute.js b/test/test_BasicBatchExecute.js deleted file mode 100644 index 9648eda..0000000 --- a/test/test_BasicBatchExecute.js +++ /dev/null @@ -1,49 +0,0 @@ -exports['test_BasicBatchExecute'] = function (test) { - var CUBRID = require('../'), - Helpers = CUBRID.Helpers, - client = require('./testSetup/test_Setup').createDefaultCUBRIDDemodbConnection(); - - function errorHandler(err) { - throw err.message; - } - - Helpers.logInfo(module.filename.toString() + ' started...'); - test.expect(0); - - client.connect(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connected.'); - client.batchExecuteNoQuery(['drop table if exists node_test', 'create table node_test(id int)'], function (err) { - if (err) { - errorHandler(err); - } else { - client.batchExecuteNoQuery(['insert into node_test values(1)'], function (err) { - if (err) { - errorHandler(err); - } else { - client.batchExecuteNoQuery(['drop table node_test'], function (err) { - if (err) { - errorHandler(err); - } else { - client.close(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - test.done(); - } - }); - } - }); - } - }); - } - }); - } - }); -}; - - diff --git a/test/test_BasicBatchExecute_ImplicitConnect.js b/test/test_BasicBatchExecute_ImplicitConnect.js deleted file mode 100644 index 25bb651..0000000 --- a/test/test_BasicBatchExecute_ImplicitConnect.js +++ /dev/null @@ -1,42 +0,0 @@ -exports['test_BasiBatchExecute_ImplicitConnect'] = function (test) { - var CUBRID = require('../'), - Helpers = CUBRID.Helpers, - client = require('./testSetup/test_Setup').createDefaultCUBRIDDemodbConnection(); - - function errorHandler(err) { - throw err.message; - } - - Helpers.logInfo(module.filename.toString() + ' started...'); - test.expect(0); - - Helpers.logInfo('Connected.'); - client.batchExecuteNoQuery(['drop table if exists node_test', 'create table node_test(id int)'], function (err) { - if (err) { - errorHandler(err); - } else { - client.batchExecuteNoQuery(['insert into node_test values(1)'], function (err) { - if (err) { - errorHandler(err); - } else { - client.batchExecuteNoQuery(['drop table node_test'], function (err) { - if (err) { - errorHandler(err); - } else { - client.close(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - test.done(); - } - }); - } - }); - } - }); - } - }); -}; - diff --git a/test/test_BasicConnect.js b/test/test_BasicConnect.js deleted file mode 100644 index 5d721a0..0000000 --- a/test/test_BasicConnect.js +++ /dev/null @@ -1,37 +0,0 @@ -exports['test_BasicConnect'] = function (test) { - var CUBRID = require('../'), - Helpers = CUBRID.Helpers, - client = require('./testSetup/test_Setup').createDefaultCUBRIDDemodbConnection(); - - function errorHandler(err) { - throw err.message; - } - - test.expect(0); - - Helpers.logInfo(module.filename.toString() + ' started...'); - - client.connect(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connected OK.'); - client.getEngineVersion(function (err, result) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('CUBRID engine version: ' + result); - client.close(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - test.done(); - } - }); - } - }); - } - }); -}; diff --git a/test/test_BasicEvents.js b/test/test_BasicEvents.js deleted file mode 100644 index 3b5a9f7..0000000 --- a/test/test_BasicEvents.js +++ /dev/null @@ -1,29 +0,0 @@ -exports['test_BasicEvents'] = function (test) { - var CUBRID = require('../'), - Helpers = CUBRID.Helpers, - client = require('./testSetup/test_Setup').createDefaultCUBRIDDemodbConnection(); - - Helpers.logInfo('Unit test ' + module.filename.toString() + ' started...'); - test.expect(0); - - client.connect(function () { - client.close(function () { - }); - }); - - client.on(client.EVENT_ERROR, function () { - throw 'We should not get here!'; - }); - - client.on(client.EVENT_CONNECTED, function () { - Helpers.logInfo('Connected.'); - }); - - client.on(client.EVENT_CONNECTION_CLOSED, function () { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - client.removeAllListeners(); - test.done(); - }); -}; - diff --git a/test/test_BasicEvents_Error.js b/test/test_BasicEvents_Error.js deleted file mode 100644 index e9a7ba8..0000000 --- a/test/test_BasicEvents_Error.js +++ /dev/null @@ -1,33 +0,0 @@ -exports['test_BasicEvents_Error'] = function (test) { - var CUBRID = require('../'), - config = require('./testSetup/test_Setup').config, - client = CUBRID.createCUBRIDConnection(config.host, config.port, 'unknown_user', 'xyz', config.database), - Helpers = CUBRID.Helpers; - - test.expect(1); - - Helpers.logInfo(module.filename.toString() + ' started...'); - - client.connect(function (err) { - if (!err) { - client.close(function () { - }); - } - }); - - client.on(client.EVENT_ERROR, function (err) { - Helpers.logInfo('Error: ' + err.message); - test.ok(err.message === '-165:User "unknown_user" is invalid.'); - Helpers.logInfo('Test passed.'); - test.done(); - }); - - client.on(client.EVENT_CONNECTED, function () { - throw 'We should not get here!'; - }); - - client.on(client.EVENT_CONNECTION_CLOSED, function () { - throw 'We should not get here!'; - }); -}; - diff --git a/test/test_BasicEvents_Error_2.js b/test/test_BasicEvents_Error_2.js deleted file mode 100644 index e6ffeb5..0000000 --- a/test/test_BasicEvents_Error_2.js +++ /dev/null @@ -1,27 +0,0 @@ -exports['test_BasicEvents_Error_2'] = function (test) { - var CUBRID = require('../'), - config = require('./testSetup/test_Setup').config, - client = CUBRID.createCUBRIDConnection(config.host, config.port, 'unknown_user', 'xyz', config.database), - Helpers = CUBRID.Helpers; - - test.expect(1); - - Helpers.logInfo(module.filename.toString() + ' started...'); - - client.connect(); - - client.on(client.EVENT_ERROR, function (err) { - Helpers.logInfo('Error: ' + err.message); - test.ok(err.message === '-165:User "unknown_user" is invalid.'); - Helpers.logInfo('Test passed.'); - test.done(); - }); - - client.on(client.EVENT_CONNECTED, function () { - throw 'We should not get here!'; - }); - - client.on(client.EVENT_CONNECTION_CLOSED, function () { - throw 'We should not get here!'; - }); -}; diff --git a/test/test_BasicExecute.js b/test/test_BasicExecute.js deleted file mode 100644 index 1a7a369..0000000 --- a/test/test_BasicExecute.js +++ /dev/null @@ -1,54 +0,0 @@ -exports['test_BasicExecute'] = function (test) { - var CUBRID = require('../'), - client = require('./testSetup/test_Setup').createDefaultCUBRIDDemodbConnection(), - Helpers = CUBRID.Helpers; - - function errorHandler(err) { - throw err.message; - } - - test.expect(0); - - Helpers.logInfo(module.filename.toString() + ' started...'); - - client.connect(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connected.'); - client.execute('DROP TABLE IF EXISTS node_test', function (err) { - if (err) { - errorHandler(err); - } else { - client.execute('CREATE TABLE node_test(id INT)', function (err) { - if (err) { - errorHandler(err); - } else { - client.execute('INSERT INTO node_test VALUES(1)', function (err) { - if (err) { - errorHandler(err); - } else { - client.execute('DROP TABLE node_test', function (err) { - if (err) { - errorHandler(err); - } else { - client.close(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - test.done(); - } - }); - } - }); - } - }); - } - }); - } - }); - } - }); -}; diff --git a/test/test_BasicExecute_2.js b/test/test_BasicExecute_2.js deleted file mode 100644 index 045ecf7..0000000 --- a/test/test_BasicExecute_2.js +++ /dev/null @@ -1,43 +0,0 @@ -exports['test_BasicExecute_2'] = function (test) { - var CUBRID = require('../'), - client = require('./testSetup/test_Setup').createDefaultCUBRIDDemodbConnection(), - Helpers = CUBRID.Helpers; - - function errorHandler(err) { - throw err.message; - } - - test.expect(0); - Helpers.logInfo(module.filename.toString() + ' started...'); - - client.connect(function (err) { - if (err) { - errorHandler(err); - } else { - var sqlsArr = []; - - Helpers.logInfo('Connected.'); - - sqlsArr.push('DROP TABLE IF EXISTS node_test'); - sqlsArr.push('CREATE TABLE node_test(id INT)'); - sqlsArr.push('INSERT INTO node_test VALUES(2)'); - sqlsArr.push('DROP TABLE IF EXISTS node_test'); - - client.batchExecuteNoQuery(sqlsArr, function (err) { - if (err) { - errorHandler(err); - } else { - client.close(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - test.done(); - } - }); - } - }); - } - }); -}; diff --git a/test/test_BasicExtendedSelect.js b/test/test_BasicExtendedSelect.js deleted file mode 100644 index 000716e..0000000 --- a/test/test_BasicExtendedSelect.js +++ /dev/null @@ -1,85 +0,0 @@ -exports['test_BasicExtendedSelect'] = function (test) { - var CUBRID = require('../'), - client = require('./testSetup/test_Setup').createDefaultCUBRIDDemodbConnection(), - Helpers = CUBRID.Helpers, - Result2Array = CUBRID.Result2Array; - - function errorHandler(err) { - throw err.message; - } - - test.expect(9); - - Helpers.logInfo(module.filename.toString() + ' started...'); - - client.connect(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connected.'); - client.getEngineVersion(function (err, result) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('CUBRID engine version: ' + result); - Helpers.logInfo('Querying: select * from game'); - client.query('select * from game', function (err, result, queryHandle) { - if (err) { - errorHandler(err); - } else { - test.equal(Result2Array.TotalRowsCount(result), 8653); - Helpers.logInfo('Query result rows count: ' + Result2Array.TotalRowsCount(result)); - test.equal(Result2Array.ColumnNamesArray(result).toString(), 'host_year,event_code,athlete_code,stadium_code,nation_code,medal,game_date'); - Helpers.logInfo('Query result column names: ' + Result2Array.ColumnNamesArray(result)); - test.equal(Result2Array.ColumnTypesArray(result).toString(), 'Int,Int,Int,Int,Char,Char,Date'); - Helpers.logInfo('Query result column data types: ' + Result2Array.ColumnTypesArray(result)); - Helpers.logInfo('Query results:'); - var arr = Result2Array.RowsArray(result); - test.equal(arr.length, 235); - test.equal(arr[0].toString().startsWith('2004,20021,14345,30116,NGR,B,2004-08-28T'), true); - test.equal(arr[arr.length - 1].toString().startsWith('2004,20317,14457,30124,ITA,G,2004-08-26T'), true); - for (var j = 0; j < 1; j++) { - Helpers.logInfo(arr[j].toString()); - } - client.fetch(queryHandle, function (err, result) { - if (err) { - errorHandler(err); - } else { - if (result) { - Helpers.logInfo('Fetch results:'); - var arr = Result2Array.RowsArray(result); - test.equal(arr.length, 241); - test.equal(arr[0].toString().startsWith('2004,20317,14375,30124,GRE,S,2004-08-26T'), true); - test.equal(arr[arr.length - 1].toString().startsWith('2004,20060,14340,30125,JPN,B,2004-08-25T'), true); - for (var k = 0; k < 1; k++) { - Helpers.logInfo(arr[k].toString()); - } - } else { - Helpers.logInfo('There is no more data to fetch.'); - } - client.closeQuery(queryHandle, function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Query closed.'); - client.close(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - test.done(); - } - }); - } - }); - } - }); - } - }); - } - }); - } - }); -}; - diff --git a/test/test_BasicExtendedSelect_Sequence.js b/test/test_BasicExtendedSelect_Sequence.js deleted file mode 100644 index 7f604c1..0000000 --- a/test/test_BasicExtendedSelect_Sequence.js +++ /dev/null @@ -1,58 +0,0 @@ -exports['test_BasicExtendedSelect_Sequence'] = function (test) { - var CUBRID = require('../'), - client = require('./testSetup/test_Setup').createDefaultCUBRIDDemodbConnection(), - Helpers = CUBRID.Helpers, - ActionQueue = CUBRID.ActionQueue, - Result2Array = CUBRID.Result2Array; - - test.expect(8); - - Helpers.logInfo(module.filename.toString() + ' started...'); - - ActionQueue.enqueue([ - function (cb) { - client.connect(cb); - }, - function (cb) { - client.getEngineVersion(cb); - }, - function (engineVersion, cb) { - Helpers.logInfo('Engine version is: ' + engineVersion); - client.query('select * from code', cb); - }, - function (result, queryHandle, cb) { - test.equal(Result2Array.TotalRowsCount(result), 6); - Helpers.logInfo('Query result rows count: ' + Result2Array.TotalRowsCount(result)); - Helpers.logInfo('Query results:'); - - var arr = Result2Array.RowsArray(result); - - test.equal(arr.length, 6); - test.equal(arr[0].toString(), 'X,Mixed'); - test.equal(arr[1].toString(), 'W,Woman'); - test.equal(arr[2].toString(), 'M,Man'); - test.equal(arr[3].toString(), 'B,Bronze'); - test.equal(arr[4].toString(), 'S,Silver'); - test.equal(arr[5].toString(), 'G,Gold'); - - for (var k = 0; k < arr.length; k++) { - Helpers.logInfo(arr[k].toString()); - } - - client.closeQuery(queryHandle, cb); - - Helpers.logInfo('Query closed.'); - }, - function (queryHandle, cb) { - client.close(cb); - Helpers.logInfo('Connection closed.'); - } - ], function (err) { - if (err) { - throw err; - } else { - Helpers.logInfo('Test passed.'); - test.done(); - } - }); -}; diff --git a/test/test_BasicMultiFetch.js b/test/test_BasicMultiFetch.js deleted file mode 100644 index 996da64..0000000 --- a/test/test_BasicMultiFetch.js +++ /dev/null @@ -1,100 +0,0 @@ -exports['test_BasicMultiFetch'] = function (test) { - var CUBRID = require('../'), - client = require('./testSetup/test_Setup').createDefaultCUBRIDDemodbConnection(), - Helpers = CUBRID.Helpers, - ActionQueue = CUBRID.ActionQueue, - Result2Array = CUBRID.Result2Array, - fetchResult; - - test.expect(41); - - Helpers.logInfo(module.filename.toString() + ' started...'); - - client.connect(function (err) { - var errHandler = function (err) { - Helpers.logInfo('Error - ' + err.message); - throw err.message; - }; - - if (err) { - errHandler(err); - } else { - Helpers.logInfo('Connected.'); - client.getEngineVersion(function (err, result) { - if (err) { - errHandler(err); - } else { - Helpers.logInfo('CUBRID engine version: ' + result); - client.query('select * from game', function (err, result, queryHandle) { - if (err) { - errHandler(err); - } else { - test.equal(Result2Array.TotalRowsCount(result), 8653); - Helpers.logInfo('Query result rows count: ' + Result2Array.TotalRowsCount(result)); - test.equal(Result2Array.ColumnNamesArray(result).toString(), 'host_year,event_code,athlete_code,stadium_code,nation_code,medal,game_date'); - Helpers.logInfo('Query result column names: ' + Result2Array.ColumnNamesArray(result)); - test.equal(Result2Array.ColumnTypesArray(result).toString(), 'Int,Int,Int,Int,Char,Char,Date'); - Helpers.logInfo('Query result column data types: ' + Result2Array.ColumnTypesArray(result)); - Helpers.logInfo('Query results:'); - var arr = Result2Array.RowsArray(result); - test.equal(arr.length, 235); - test.equal(arr[0].toString().startsWith('2004,20021,14345,30116,NGR,B,2004-08-28T'), true); - test.equal(arr[arr.length - 1].toString().startsWith('2004,20317,14457,30124,ITA,G,2004-08-26T'), true); - for (var j = 0; j < 1; j++) { - Helpers.logInfo(arr[j].toString()); - } - - ActionQueue.while( - function () { - return fetchResult !== null; - }, - function (callback) { - client.fetch(queryHandle, function (err, result) { - if (err) { - errHandler(err); - } else { - if (result !== null) { - Helpers.logInfo('Fetch results:'); - var arr = Result2Array.RowsArray(result); - test.ok(arr.length === 241 || arr.length === 224); - for (var k = 0; k < 1; k++) { - Helpers.logInfo(arr[k].toString()); - } - } else { - Helpers.logInfo('There is no more data to fetch.'); - } - fetchResult = result; - callback.call(err); - } - }); - }, - function (err) { - if (err) { - errHandler(err); - } else { - client.closeQuery(queryHandle, function (err) { - if (err) { - errHandler(err); - } else { - Helpers.logInfo('Query closed.'); - client.close(function (err) { - if (err) { - errHandler(err); - } else { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - test.done(); - } - }); - } - }); - } - } - ); - } - }); - } - }); - } - }); -}; diff --git a/test/test_BasicMultiFetch_Sequence.js b/test/test_BasicMultiFetch_Sequence.js deleted file mode 100644 index 9e35a50..0000000 --- a/test/test_BasicMultiFetch_Sequence.js +++ /dev/null @@ -1,83 +0,0 @@ -exports['test_BasicMultiFetch_Sequence'] = function (test) { - var CUBRID = require('../'), - client = require('./testSetup/test_Setup').createDefaultCUBRIDDemodbConnection(), - Helpers = CUBRID.Helpers, - ActionQueue = CUBRID.ActionQueue, - Result2Array = CUBRID.Result2Array, - returnedQueryHandle, fetchResult; - - test.expect(41); - Helpers.logInfo(module.filename.toString() + ' started...'); - - ActionQueue.enqueue([ - function (cb) { - client.connect(cb); - }, - function (cb) { - client.getEngineVersion(cb); - }, - function (engineVersion, cb) { - Helpers.logInfo('EngineVersion is: ' + engineVersion); - client.query('select * from game', cb); - }, - function (result, queryHandle, cb) { - test.ok(Result2Array.RowsArray(result).length === 235); - Helpers.logInfo('Query result rows count: ' + Result2Array.TotalRowsCount(result)); - test.ok(Result2Array.ColumnNamesArray(result).toString() === 'host_year,event_code,athlete_code,stadium_code,nation_code,medal,game_date'); - Helpers.logInfo('Query result column names: ' + Result2Array.ColumnNamesArray(result)); - test.ok(Result2Array.ColumnTypesArray(result).toString() === 'Int,Int,Int,Int,Char,Char,Date'); - Helpers.logInfo('Query result column data types: ' + Result2Array.ColumnTypesArray(result)); - Helpers.logInfo('Query results:'); - var arr = Result2Array.RowsArray(result); - test.ok(arr.length === 235); - test.ok(arr[0].toString().startsWith('2004,20021,14345,30116,NGR,B,2004-08-28T') === true); - test.ok(arr[arr.length - 1].toString().startsWith('2004,20317,14457,30124,ITA,G,2004-08-26T') === true); - for (var j = 0; j < 1; j++) { - Helpers.logInfo(arr[j].toString()); - } - returnedQueryHandle = queryHandle; - ActionQueue.while( - function () { - return fetchResult !== null; - }, - function (callback) { - client.fetch(returnedQueryHandle, function (err, result) { - if (result !== null) { - Helpers.logInfo('Fetch results:'); - var arr = Result2Array.RowsArray(result); - test.ok(arr.length === 241 || arr.length === 224); - for (var k = 0; k < 1; k++) { - Helpers.logInfo(arr[k].toString()); - } - } else { - Helpers.logInfo('There is no more data to fetch.'); - } - fetchResult = result; - callback.call(err); - } - ); - }, - function (err) { - if (err) { - throw err.message; - } else { - cb.call(err); - } - } - ); - }, - function (cb) { - client.closeQuery(returnedQueryHandle, cb); - }, - function (queryHandle, cb) { - client.close(cb); - } - ], function (err) { - if (err) { - throw err; - } else { - Helpers.logInfo('Test passed.'); - test.done(); - } - }); -}; diff --git a/test/test_BasicMultifetchOldProtocol.js b/test/test_BasicMultifetchOldProtocol.js deleted file mode 100644 index 1dba2a7..0000000 --- a/test/test_BasicMultifetchOldProtocol.js +++ /dev/null @@ -1,101 +0,0 @@ -exports['test_BasicMultifetchOldProtocol'] = function (test) { - var CUBRID = require('../'), - client = require('./testSetup/test_Setup').createDefaultCUBRIDDemodbConnection(), - Helpers = CUBRID.Helpers, - ActionQueue = CUBRID.ActionQueue, - Result2Array = CUBRID.Result2Array, - fetchResult; - - test.expect(41); - Helpers.logInfo(module.filename.toString() + ' started...'); - - client.connect(function (err) { - var errHandler = function (err) { - Helpers.logInfo('Error - ' + err.message); - throw err.message; - }; - - if (err) { - errHandler(err); - } else { - Helpers.logInfo('Connected.'); - client.getEngineVersion(function (err, result) { - if (err) { - errHandler(err); - } else { - client.setEnforceOldQueryProtocol(true); - Helpers.logInfo('CUBRID engine version: ' + result); - client.query('select * from game', function (err, result, queryHandle) { - if (err) { - errHandler(err); - } else { - test.ok(Result2Array.TotalRowsCount(result) === 8653); - Helpers.logInfo('Query result rows count: ' + Result2Array.TotalRowsCount(result)); - test.ok(Result2Array.ColumnNamesArray(result).toString() === 'host_year,event_code,athlete_code,stadium_code,nation_code,medal,game_date'); - Helpers.logInfo('Query result column names: ' + Result2Array.ColumnNamesArray(result)); - test.ok(Result2Array.ColumnTypesArray(result).toString() === 'Int,Int,Int,Int,Char,Char,Date'); - Helpers.logInfo('Query result column data types: ' + Result2Array.ColumnTypesArray(result)); - Helpers.logInfo('Query results:'); - var arr = Result2Array.RowsArray(result); - test.ok(arr.length === 241); - test.ok(arr[0].toString().startsWith('2004,20021,14345,30116,NGR,B,2004-08-28T') === true); - test.ok(arr[arr.length - 1].toString().startsWith('2004,20317,12906,30124,USA,B,2004-08-26T') === true); - for (var j = 0; j < 1; j++) { - Helpers.logInfo(arr[j].toString()); - } - - ActionQueue.while( - function () { - return fetchResult !== null; - }, - function (callback) { - client.fetch(queryHandle, function (err, result) { - if (err) { - errHandler(err); - } else { - if (result !== null) { - Helpers.logInfo('Fetch results:'); - var arr = Result2Array.RowsArray(result); - test.ok(arr.length === 241 || arr.length === 218); - for (var k = 0; k < 1; k++) { - Helpers.logInfo(arr[k].toString()); - } - } else { - Helpers.logInfo('There is no more data to fetch.'); - } - fetchResult = result; - callback.call(err); - } - }); - }, - function (err) { - if (err) { - errHandler(err); - } else { - client.closeQuery(queryHandle, function (err) { - if (err) { - errHandler(err); - } else { - Helpers.logInfo('Query closed.'); - client.close(function (err) { - if (err) { - errHandler(err); - } else { - client.setEnforceOldQueryProtocol(false); - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - test.done(); - } - }); - } - }); - } - } - ); - } - }); - } - }); - } - }); -}; diff --git a/test/test_BasicQueriesQueue.js b/test/test_BasicQueriesQueue.js deleted file mode 100644 index 0470ebf..0000000 --- a/test/test_BasicQueriesQueue.js +++ /dev/null @@ -1,67 +0,0 @@ -var path = require('path'); - -exports[path.basename(__filename)] = function (test) { - var CUBRID = require('../'), - client = require('./testSetup/test_Setup').createDefaultCUBRIDDemodbConnection(), - Helpers = CUBRID.Helpers, - Result2Array = CUBRID.Result2Array, - SQL_1 = 'SELECT COUNT(*) FROM [code]', - SQL_2 = 'SELECT * FROM [code] WHERE s_name = \'X\'', - SQL_3 = 'SELECT COUNT(*) FROM [code] WHERE f_name LIKE \'M%\''; - - test.expect(3); - Helpers.logInfo(module.filename.toString() + ' started...'); - - client.connect(function (err) { - if (err) { - throw err; - } else { - Helpers.logInfo('Connection opened...'); - Helpers.logInfo('Executing: ' + SQL_1); - - client.addQuery(SQL_1, function (err, result) { - if (err) { - throw err; - } else { - var arr = Result2Array.RowsArray(result); - Helpers.logInfo('Result: ' + arr); - test.ok(arr[0][0].toString() === '6'); - } - }); - - Helpers.logInfo('Executing: ' + SQL_2); - - client.addQuery(SQL_2, function (err, result) { - if (err) { - throw err; - } else { - Helpers.logInfo('Result: ' + Result2Array.RowsArray(result)); - test.ok(Result2Array.RowsArray(result).toString() === 'X,Mixed'); - } - }); - - Helpers.logInfo('Executing: ' + SQL_3); - - client.addQuery(SQL_3, function (err, result) { - if (err) { - throw err; - } else { - var arr = Result2Array.RowsArray(result); - - Helpers.logInfo('Result: ' + Result2Array.RowsArray(result)); - - test.ok(arr[0][0].toString() === '2'); - - client.close(function (err) { - if (err) { - throw err; - } else { - Helpers.logInfo('Test passed.'); - test.done(); - } - }); - } - }); - } - }); -}; diff --git a/test/test_BasicQueriesQueue_ImplicitConnect.js b/test/test_BasicQueriesQueue_ImplicitConnect.js deleted file mode 100644 index afa5296..0000000 --- a/test/test_BasicQueriesQueue_ImplicitConnect.js +++ /dev/null @@ -1,56 +0,0 @@ -exports['test_BasicQueriesQueue_ImplicitConnect'] = function (test) { - var CUBRID = require('../'), - client = require('./testSetup/test_Setup').createDefaultCUBRIDDemodbConnection(), - Helpers = CUBRID.Helpers, - Result2Array = CUBRID.Result2Array, - SQL_1 = 'SELECT COUNT(*) FROM [code]', - SQL_2 = 'SELECT * FROM [code] WHERE s_name = \'X\'', - SQL_3 = 'SELECT COUNT(*) FROM [code] WHERE f_name LIKE \'M%\''; - - function errorHandler(err) { - throw err.message; - } - - test.expect(3); - Helpers.logInfo(module.filename.toString() + ' started...'); - Helpers.logInfo('Executing [1]: ' + SQL_1); - client.addQuery(SQL_1, function (err, result) { - if (err) { - errorHandler(err); - } else { - var arr = Result2Array.RowsArray(result); - Helpers.logInfo('Result [1]: ' + Result2Array.RowsArray(result)); - test.ok(arr[0][0].toString() === '6'); - } - }); - - Helpers.logInfo('Executing [2]: ' + SQL_2); - client.addQuery(SQL_2, function (err, result) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Result [2]: ' + Result2Array.RowsArray(result)); - test.ok(Result2Array.RowsArray(result).toString() === 'X,Mixed'); - } - }); - - Helpers.logInfo('Executing [3]: ' + SQL_3); - client.addQuery(SQL_3, function (err, result) { - if (err) { - errorHandler(err); - } else { - var arr = Result2Array.RowsArray(result); - Helpers.logInfo('Result [3]: ' + Result2Array.RowsArray(result)); - test.ok(arr[0][0].toString() === '2'); - client.close(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - test.done(); - } - }); - } - }); -}; diff --git a/test/test_BasicSelect.js b/test/test_BasicSelect.js deleted file mode 100644 index c3a9fa1..0000000 --- a/test/test_BasicSelect.js +++ /dev/null @@ -1,53 +0,0 @@ -exports['test_BasicSelect'] = function (test) { - var CUBRID = require('../'), - client = require('./testSetup/test_Setup').createDefaultCUBRIDDemodbConnection(), - Helpers = CUBRID.Helpers, - Result2Array = CUBRID.Result2Array; - - function errorHandler(err) { - throw err.message; - } - - test.expect(4); - Helpers.logInfo(module.filename.toString() + ' started...'); - - client.connect(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connected.'); - Helpers.logInfo('Querying: select * from nation'); - client.query('select * from nation', function (err, result, queryHandle) { - if (err) { - errorHandler(err); - } else { - test.ok(Result2Array.TotalRowsCount(result) === 215); - Helpers.logInfo('Query result rows count: ' + Result2Array.TotalRowsCount(result)); - var arr = Result2Array.RowsArray(result); - test.ok(arr.length === 215); - test.ok(arr[0].toString() === 'SRB,Serbia,Europe,Beograd'); - test.ok(arr[arr.length - 1].toString() === 'AFG,Afghanistan,Asia,Kabul'); - for (var j = 0; j < 1; j++) { - Helpers.logInfo(arr[j].toString()); - } - client.closeQuery(queryHandle, function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Query closed.'); - client.close(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - test.done(); - } - }); - } - }); - } - }); - } - }); -}; diff --git a/test/test_BasicSelect_Events.js b/test/test_BasicSelect_Events.js deleted file mode 100644 index 7c75f2d..0000000 --- a/test/test_BasicSelect_Events.js +++ /dev/null @@ -1,75 +0,0 @@ -exports['test_BasicSelect_Events'] = function (test) { - var CUBRID = require('../'), - client = require('./testSetup/test_Setup').createDefaultCUBRIDDemodbConnection(), - Helpers = CUBRID.Helpers, - Result2Array = CUBRID.Result2Array; - -// TODO: avoid global variables. - global.savedQueryHandle = null; - - test.expect(0); - Helpers.logInfo(module.filename.toString() + ' started...'); - - client.connect(); - - client.on(client.EVENT_ERROR, function (err) { - Helpers.logError('Error!: ' + err.message); - throw 'We should not get here!'; - }); - - client.on(client.EVENT_CONNECTED, function () { - Helpers.logInfo('Connected.'); - Helpers.logInfo('Querying: select * from game'); - client.query('select * from game', function () { - }); - }); - - client.on(client.EVENT_QUERY_DATA_AVAILABLE, function (result, queryHandle) { - Helpers.logInfo('Data received.'); - Helpers.logInfo('Returned active query handle: ' + queryHandle); - global.savedQueryHandle = queryHandle; // Save handle - needed for further fetch operations - Helpers.logInfo('Total query result rows count: ' + Result2Array.TotalRowsCount(result)); - Helpers.logInfo('First "batch" of data returned rows count: ' + Result2Array.RowsArray(result).length); - Helpers.logInfo('Fetching more rows...'); - client.fetch(global.savedQueryHandle, function () { - }); - }); - - client.on(client.EVENT_FETCH_DATA_AVAILABLE, function (result) { - Helpers.logInfo('*** Fetch data received.'); - Helpers.logInfo('*** Current fetch of data returned rows count: ' + Result2Array.RowsArray(result).length); - Helpers.logInfo('*** First row: ' + Result2Array.RowsArray(result)[0].toString()); - // Continue to fetch... - Helpers.logInfo('...'); - Helpers.logInfo('...fetching more rows...'); - Helpers.logInfo('...'); - setTimeout(function () { - client.fetch(global.savedQueryHandle, function () { - }); - }, Math.random() * 500); // Simulate different responses time for each fetch - }); - - client.on(client.EVENT_FETCH_NO_MORE_DATA_AVAILABLE, function () { - Helpers.logInfo('No more data to receive.'); - Helpers.logInfo('Closing query...'); - client.closeQuery(global.savedQueryHandle, function () { - }); - }); - - client.on(client.EVENT_QUERY_CLOSED, function () { - Helpers.logInfo('Query closed.'); - global.savedQueryHandle = null; - Helpers.logInfo('Closing connection...'); - - client.close(function () { - }); - }); - - client.on(client.EVENT_CONNECTION_CLOSED, function () { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - client.removeAllListeners(); - test.done(); - }); -}; - diff --git a/test/test_BasicSelect_ImplicitConnect.js b/test/test_BasicSelect_ImplicitConnect.js deleted file mode 100644 index 6aab686..0000000 --- a/test/test_BasicSelect_ImplicitConnect.js +++ /dev/null @@ -1,54 +0,0 @@ -exports['test_BasicSelect_ImplicitConnect'] = function (test) { - var CUBRID = require('../'), - client = require('./testSetup/test_Setup').createDefaultCUBRIDDemodbConnection(), - Helpers = CUBRID.Helpers, - Result2Array = CUBRID.Result2Array; - - test.expect(4); - Helpers.logInfo(module.filename.toString() + ' started...'); - - function errorHandler(err) { - throw err.message; - } - - Helpers.logInfo('Connected.'); - Helpers.logInfo('Querying: select * from nation'); - client.query('select * from nation', function (err, result, queryHandle) { - if (err) { - errorHandler(err); - } else { - test.ok(Result2Array.TotalRowsCount(result) === 215); - Helpers.logInfo('Query result rows count: ' + Result2Array.TotalRowsCount(result)); - - var arr = Result2Array.RowsArray(result); - - test.ok(arr.length === 215); - test.ok(arr[0].toString() === 'SRB,Serbia,Europe,Beograd'); - test.ok(arr[arr.length - 1].toString() === 'AFG,Afghanistan,Asia,Kabul'); - - for (var j = 0; j < 1; ++j) { - Helpers.logInfo(arr[j].toString()); - } - - client.closeQuery(queryHandle, function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Query closed.'); - - client.close(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - test.done(); - } - }); - } - }); - } - }); -}; - - diff --git a/test/test_Basic_QueriesQueue_Events.js b/test/test_Basic_QueriesQueue_Events.js deleted file mode 100644 index 8df572c..0000000 --- a/test/test_Basic_QueriesQueue_Events.js +++ /dev/null @@ -1,70 +0,0 @@ -exports['test_Basic_QueriesQueue_Events'] = function (test) { - var CUBRID = require('../'), - Helpers = CUBRID.Helpers, - Result2Array = CUBRID.Result2Array, - client = require('./testSetup/test_Setup').createDefaultCUBRIDDemodbConnection(), - SQL_A = 'SELECT * FROM event', - SQL_B = 'SELECT * FROM record'; - - test.expect(4); - - Helpers.logInfo(module.filename.toString() + ' started...'); - - client.connect(); - - client.on(client.EVENT_ERROR, function (err) { - Helpers.logError('Error!: ' + err.message); - throw err; - }); - - client.on(client.EVENT_CONNECTED, function () { - Helpers.logInfo('Connected.'); - client.addQuery(SQL_A, null); - client.addQuery(SQL_B, null); - }); - - client.on(client.EVENT_QUERY_DATA_AVAILABLE, function (result, queryHandle, sql) { - Helpers.logInfo('[' + sql + '] executed - query handle is: ' + queryHandle); - var arr = Result2Array.RowsArray(result); - Helpers.logInfo('Query result first row: ' + arr[0]); - switch (sql) { - case SQL_A: - test.ok(Result2Array.TotalRowsCount(result) === 422); - test.ok(arr[0].toString() === '20421,Wrestling,Greco-Roman 97kg,M,1'); - break; - case SQL_B: - test.ok(Result2Array.TotalRowsCount(result) === 2000); - test.ok(arr[0].toString() === '2000,20243,14214,G,681.1,Score'); - } - Helpers.logInfo('...let\'s fetch more data...'); - client.fetch(queryHandle); - }); - - client.on(client.EVENT_FETCH_DATA_AVAILABLE, function (result, queryHandle) { - Helpers.logInfo('Fetch executed for queryHandle: ' + queryHandle); - var arr = Result2Array.RowsArray(result); - Helpers.logInfo('Fetch results - first row: ' + queryHandle + ': ' + arr[0]); - client.closeQuery(queryHandle, null); - }); - - client.on(client.EVENT_FETCH_NO_MORE_DATA_AVAILABLE, function (queryHandle) { - Helpers.logInfo('There is no more data to fetch for query with handle: ' + queryHandle); - client.closeQuery(queryHandle, null); - }); - - client.on(client.EVENT_QUERY_CLOSED, function (queryHandle) { - Helpers.logInfo('Query with handle: ' + queryHandle + ' was closed!'); - if (client.queriesQueueIsEmpty()) { - client.close(); - } else { - Helpers.logInfo('(...it\'s not the right time to close the connection! - there are some queries still pending execution...)'); - } - }); - - client.on(client.EVENT_CONNECTION_CLOSED, function () { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - client.removeAllListeners(); - test.done(); - }); -}; diff --git a/test/test_Basic_QueriesQueue_Events_Error.js b/test/test_Basic_QueriesQueue_Events_Error.js deleted file mode 100644 index e71e342..0000000 --- a/test/test_Basic_QueriesQueue_Events_Error.js +++ /dev/null @@ -1,33 +0,0 @@ -exports['test_Basic_QueriesQueue_Events_Error'] = function (test) { - var CUBRID = require('../'), - Helpers = CUBRID.Helpers, - Result2Array = CUBRID.Result2Array, - client = require('./testSetup/test_Setup').createDefaultCUBRIDDemodbConnection(), - SQL_A = 'SELECT * from x_code'; - - test.expect(1); - - Helpers.logInfo(module.filename.toString() + ' started...'); - - client.connect(); - - client.on(client.EVENT_ERROR, function (err) { - Helpers.logError('Error!: ' + err.message); - test.ok(err.message === '-493:Syntax: Unknown class "x_code". select * from x_code'); - client.close(); - }); - - client.on(client.EVENT_CONNECTED, function () { - Helpers.logInfo('Connected.'); - client.addQuery(SQL_A, null); - }); - - client.on(client.EVENT_CONNECTION_CLOSED, function () { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - setTimeout(function () { - client.removeAllListeners(); - test.done(); - }, 1000); - }); -}; diff --git a/test/test_BatchExecuteNoQueryPacket.js b/test/test_BatchExecuteNoQueryPacket.js deleted file mode 100644 index a79efb8..0000000 --- a/test/test_BatchExecuteNoQueryPacket.js +++ /dev/null @@ -1,44 +0,0 @@ -exports['test_BatchExecuteNoQueryPacket'] = function (test) { - var codeCoveragePath = process.env.CODE_COV ? '-cov' : '', - PacketReader = require('../src' + codeCoveragePath + '/packets/PacketReader'), - PacketWriter = require('../src' + codeCoveragePath + '/packets/PacketWriter'), - BatchExecuteNoQueryPacket = require('../src' + codeCoveragePath + '/packets/BatchExecuteNoQueryPacket'), - CAS = require('../src' + codeCoveragePath + '/constants/CASConstants'), - packetReader = new PacketReader(), - batchExecuteNoQueryPacket = new BatchExecuteNoQueryPacket({ - SQLs: ['create table t1(id int)', 'drop table t1'], - casInfo: [0, 255, 255, 255], - autoCommitMode: 1, - dbVersion: '8.4.1' - }), - packetWriter = new PacketWriter(batchExecuteNoQueryPacket.getBufferLength()); - - test.expect(16); - - batchExecuteNoQueryPacket.write(packetWriter); - test.equal(packetWriter._toBuffer()[3], 52); // Total length - - test.equal(packetWriter._toBuffer()[4], 0); // CasInfo - test.equal(packetWriter._toBuffer()[5], 255); // CasInfo - test.equal(packetWriter._toBuffer()[6], 255); // CasInfo - test.equal(packetWriter._toBuffer()[7], 255); // CasInfo - - test.equal(packetWriter._toBuffer()[8], CAS.CASFunctionCode.CAS_FC_EXECUTE_BATCH); - test.equal(packetWriter._toBuffer()[13], 1); - test.equal(packetWriter._toBuffer().slice(18, 41).toString(), 'create table t1(id int)'); - test.equal(packetWriter._toBuffer().slice(41 + 1 + 4, 59).toString(), 'drop table t1'); - - packetReader.write(new Buffer([0, 0, 0, 0, 0, 255, 255, 255, 0, 0, 0, 0])); - batchExecuteNoQueryPacket.parse(packetReader); - - test.equal(batchExecuteNoQueryPacket.casInfo[0], 0); // CasInfo - test.equal(batchExecuteNoQueryPacket.casInfo[1], 255); // CasInfo - test.equal(batchExecuteNoQueryPacket.casInfo[2], 255); // CasInfo - test.equal(batchExecuteNoQueryPacket.casInfo[3], 255); // CasInfo - - test.equal(batchExecuteNoQueryPacket.responseCode, 0); - - test.equal(batchExecuteNoQueryPacket.errorCode, 0); - test.equal(batchExecuteNoQueryPacket.errorMsg, ''); - test.done(); -}; diff --git a/test/test_BatchExecuteVariant.js b/test/test_BatchExecuteVariant.js deleted file mode 100644 index 161303d..0000000 --- a/test/test_BatchExecuteVariant.js +++ /dev/null @@ -1,54 +0,0 @@ -exports['test_BatchExecuteVariant'] = function (test) { - var CUBRID = require('../'), - client = require('./testSetup/test_Setup').createDefaultCUBRIDDemodbConnection(), - Helpers = CUBRID.Helpers; - - test.expect(0); - Helpers.logInfo(module.filename.toString() + ' started...'); - - function errorHandler(err) { - throw err.message; - } - - client.connect(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connected.'); - client.batchExecuteNoQuery('drop table if exists node_test', function (err) { - if (err) { - errorHandler(err); - } else { - client.batchExecuteNoQuery('create table node_test(id int)', function (err) { - if (err) { - errorHandler(err); - } else { - client.batchExecuteNoQuery('insert into node_test values(1)', function (err) { - if (err) { - errorHandler(err); - } else { - client.batchExecuteNoQuery('drop table node_test', function (err) { - if (err) { - errorHandler(err); - } else { - client.close(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - test.done(); - } - }); - } - }); - } - }); - } - }); - } - }); - } - }); -}; - diff --git a/test/test_BatchExecute_Error.js b/test/test_BatchExecute_Error.js deleted file mode 100644 index d04eece..0000000 --- a/test/test_BatchExecute_Error.js +++ /dev/null @@ -1,60 +0,0 @@ -exports['test_BatchExecute_Error'] = function (test) { - var CUBRID = require('../'), - client = require('./testSetup/test_Setup').createDefaultCUBRIDDemodbConnection(), - Helpers = CUBRID.Helpers; - - Helpers.logInfo(module.filename.toString() + ' started...'); - - client.connect(function (err) { - if (err) { - throw err; - } else { - if (client.getEngineVersion().startsWith('8.4.1')) { - test.expect(2); - } else { - test.expect(4); - } - - Helpers.logInfo('Connected.'); - - var sqlsArr = []; - - sqlsArr.push('drop table if exists node_test'); - sqlsArr.push('create table node_test(id xyz)'); - sqlsArr.push('create table node_test(id abc)'); - - client.batchExecuteNoQuery(sqlsArr, function (err) { - // There should be an error message. - test.ok(err); - - // Driver version >= 8.4.3 return an array of errors. - if (err instanceof Array) { - test.ok(err.length == 2); - - // CUBRID 8.4.x - if (client.getEngineVersion().startsWith('8.4')) { - test.ok(err[0].message === '-494:Semantic: xyz is not defined. create class node_test ( id xyz ) '); - test.ok(err[1].message === '-494:Semantic: abc is not defined. create class node_test ( id abc ) '); - } else { - // CUBRID 9.0+ - test.ok(err[0].message === "-494:Semantic: before ' xyz)'\nxyz is not defined. create class node_test ( id xyz ) "); - test.ok(err[1].message === "-494:Semantic: before ' abc)'\nabc is not defined. create class node_test ( id abc ) "); - } - } else { - // Driver version in 8.4.1 returns a single error. - test.ok(err.message === '-494:Semantic: xyz is not defined. create class node_test ( id xyz ) '); - } - - client.close(function (err) { - if (err) { - throw err; - } else { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - test.done(); - } - }); - }); - } - }); -}; diff --git a/test/test_BigString.js b/test/test_BigString.js deleted file mode 100644 index ce9d19b..0000000 --- a/test/test_BigString.js +++ /dev/null @@ -1,72 +0,0 @@ -exports['test_BigString'] = function (test) { - var CUBRID = require('../'), - client = require('./testSetup/test_Setup').createDefaultCUBRIDDemodbConnection(), - Helpers = CUBRID.Helpers, - Result2Array = CUBRID.Result2Array; - - function errorHandler(err) { - throw err.message; - } - - test.expect(4); - Helpers.logInfo(module.filename.toString() + ' started...'); - - client.connect(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connected.'); - Helpers.logInfo('Creating the test table...'); - client.batchExecuteNoQuery( - [ - 'drop table if exists test_big_string', - 'CREATE TABLE test_big_string(str char(1000000))', - 'INSERT INTO test_big_string VALUES(\'QWERTY\')' - ], - function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Querying: select * from test_big_string'); - client.query('select * from test_big_string', function (err, result, queryHandle) { - if (err) { - errorHandler(err); - } else { - test.ok(Result2Array.TotalRowsCount(result) === 1); - Helpers.logInfo('Query result rows count: ' + Result2Array.TotalRowsCount(result)); - var arr = Result2Array.RowsArray(result); - test.ok(arr.length === 1); - test.ok(arr[0][0].startsWith('QWERTY') === true); - test.ok(arr[0][0].length === 1000000); - - client.closeQuery(queryHandle, function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Query closed.'); - client.batchExecuteNoQuery('drop table test_big_string', function (err) { - if (err) { - errorHandler(err); - } else { - client.close(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - test.done(); - } - }); - } - }); - } - }); - } - }); - } - } - ); - } - }); -}; - diff --git a/test/test_Blob.js b/test/test_Blob.js deleted file mode 100644 index 4ed9554..0000000 --- a/test/test_Blob.js +++ /dev/null @@ -1,61 +0,0 @@ -exports['test_Blob'] = function (test) { - var CUBRID = require('../'), - client = require('./testSetup/test_Setup').createDefaultCUBRIDDemodbConnection(), - Helpers = CUBRID.Helpers, - ActionQueue = CUBRID.ActionQueue, - Result2Array = CUBRID.Result2Array; - - Helpers.logInfo(module.filename.toString() + ' started...'); - - ActionQueue.enqueue([ - function (cb) { - client.connect(cb); - }, - function (cb) { - var data = ''; - - for (var i = 0; i < 5120; i++) { - data += '11111111'; - } - - client.batchExecuteNoQuery(['drop table if exists test_lob', - 'create table test_lob(bl BLOB)', - 'insert into test_lob values(BIT_TO_BLOB(B\'' + data + '\'))'], cb); - }, - function (cb) { - Helpers.logInfo('Create table and insert done.'); - client.query('select * from test_lob', cb); - }, - function (result, queryHandle, cb) { - Helpers.logInfo('Query executed.'); - var arr = Result2Array.RowsArray(result); - var lobObject = arr[0][0]; - client.lobRead(lobObject, 1, lobObject.lobLength, cb); - }, - function (buff, read_length, cb) { - Helpers.logInfo('LOB Read done.'); - Helpers.logInfo(read_length); - Helpers.logInfo(buff.length); - test.ok(read_length === 5120); - test.ok(buff.length === 5120); - for (var i = 0; i < read_length; i++) { - test.ok(buff[i] === 255); - } - client.batchExecuteNoQuery(['DROP TABLE test_lob'], cb); - }, - function (cb) { - Helpers.logInfo('Drop table done.'); - client.close(cb); - } - ], function (err) { - if (err) { - Helpers.logError(err); - client.close(function () { - test.done(); - }); - } else { - Helpers.logInfo('Test passed.'); - test.done(); - } - }); -}; diff --git a/test/test_Blob_Insert.js b/test/test_Blob_Insert.js deleted file mode 100644 index aee2d0e..0000000 --- a/test/test_Blob_Insert.js +++ /dev/null @@ -1,68 +0,0 @@ -exports['test_Blob_Insert'] = function (test) { - var CUBRID = require('../'), - client = require('./testSetup/test_Setup').createDefaultCUBRIDDemodbConnection(), - Helpers = CUBRID.Helpers, - ActionQueue = CUBRID.ActionQueue, - Result2Array = CUBRID.Result2Array; - - test.expect(2*client._LOB_MAX_IO_LENGTH + 1); - Helpers.logInfo(module.filename.toString() + ' started...'); - - ActionQueue.enqueue([ - function (cb) { - client.connect(cb); - }, - function (cb) { - client.batchExecuteNoQuery(['drop table if exists test_blob', - 'create table test_blob(id int, bl blob)'], cb); - }, - function (cb) { - Helpers.logInfo('Create table done.'); - client.lobNew(client.LOB_TYPE_BLOB, cb); - }, - function (lobObject, cb) { - Helpers.logInfo('LobNew done.'); - Helpers.logInfo('Number of bytes to write: ' + 2 * client._LOB_MAX_IO_LENGTH); - var data = new Buffer(2 * client._LOB_MAX_IO_LENGTH); - for (var i = 0; i < 2 * client._LOB_MAX_IO_LENGTH; i++) { - data[i] = i; - } - client.lobWrite(lobObject, 1, data, cb); - }, - function (lobObject, written_length, cb) { - Helpers.logInfo('LobWrite done.'); - client.executeWithTypedParams('insert into test_blob values(1, ?)', [lobObject], ['blob'], cb); - }, - function (cb) { - Helpers.logInfo('Querying: select bl test_blob.'); - client.query('select bl from test_blob', cb); - }, - function (result, queryhandle, cb) { - Helpers.logInfo("Query executed."); - var arr = Result2Array.RowsArray(result); - var lobObject = arr[0][0]; - client.lobRead(lobObject, 1, lobObject.lobLength, cb); - }, - function (buf, readLength, cb) { - Helpers.logInfo("LobRead done.."); - Helpers.logInfo('Number of bytes read: ' + readLength); - test.ok(readLength === 2 * client._LOB_MAX_IO_LENGTH); - for (var i = 0; i < buf.length; i++) { - test.ok(buf[i] === i % 256); - } - client.batchExecuteNoQuery(['DROP TABLE test_blob'], cb); - }, - function (cb) { - Helpers.logInfo('Drop table done.'); - client.close(cb); - } - ], - function (err) { - if (err) { - throw err; - } else { - Helpers.logInfo('Test passed.'); - test.done(); - } - }); -}; diff --git a/test/test_Cache.js b/test/test_Cache.js deleted file mode 100644 index 98d18cc..0000000 --- a/test/test_Cache.js +++ /dev/null @@ -1,37 +0,0 @@ -exports['test_Cache'] = function (test) { - var codeCoveragePath = process.env.CODE_COV ? '-cov' : '', - Cache = require('../src' + codeCoveragePath + '/utils/Cache'), - Helpers = require('../src' + codeCoveragePath + '/utils/Helpers'); - - test.expect(9); - - var cache = new Cache(); - - cache.getSet(1, '1'); - cache.getSet(2, '22'); - cache.getSet(3, '333'); - - test.equal(cache.contains(1), true); - test.equal(cache.contains(2), true); - test.equal(cache.contains(3), true); - test.equal(cache.get(1), '1'); - test.equal(cache.get(2), '22'); - test.equal(cache.get(3), '333'); - test.equal(cache.contains(9), false); - - cache.clear(); - - test.equal(cache.contains(1), false); - - var cache2 = new Cache(3); - - cache2.getSet(1, '1'); - - setTimeout(function () { - test.equal(cache2.contains(1), false); - Helpers.logInfo('Unit test ended OK.'); - test.done(); - }, - 4000 - ); -}; diff --git a/test/test_ClientInfoExchangePacket.js b/test/test_ClientInfoExchangePacket.js deleted file mode 100644 index 54e808c..0000000 --- a/test/test_ClientInfoExchangePacket.js +++ /dev/null @@ -1,20 +0,0 @@ -exports['test_clientInfoExchangePacket'] = function (test) { - var codeCoveragePath = process.env.CODE_COV ? '-cov' : '', - PacketReader = require('../src' + codeCoveragePath + '/packets/PacketReader'), - PacketWriter = require('../src' + codeCoveragePath + '/packets/PacketWriter'), - ClientInfoExchange = require('../src' + codeCoveragePath + '/packets/ClientInfoExchangePacket'), - packetReader = new PacketReader(), - clientInfoExchange = new ClientInfoExchange(), - packetWriter = new PacketWriter(clientInfoExchange.getBufferLength()); - - test.expect(3); - - clientInfoExchange.write(packetWriter); - test.equal(packetWriter._toBuffer().slice(0, 5), 'CUBRK'); - test.equal(packetWriter._toBuffer()[5], 3); - - packetReader.write(new Buffer([0, 0, 1, 2])); //=258 - clientInfoExchange.parse(packetReader); - test.equal(clientInfoExchange.newConnectionPort, 258); - test.done(); -}; diff --git a/test/test_Clob.js b/test/test_Clob.js deleted file mode 100644 index dd799d4..0000000 --- a/test/test_Clob.js +++ /dev/null @@ -1,49 +0,0 @@ -exports['test_Clob'] = function (test) { - var CUBRID = require('../'), - client = require('./testSetup/test_Setup').createDefaultCUBRIDDemodbConnection(), - Helpers = CUBRID.Helpers, - ActionQueue = CUBRID.ActionQueue, - Result2Array = CUBRID.Result2Array; - - test.expect(2); - Helpers.logInfo(module.filename.toString() + ' started...'); - - ActionQueue.enqueue([ - function (cb) { - client.connect(cb); - }, - function (cb) { - client.batchExecuteNoQuery(['drop table if exists test_lob', - 'create table test_lob(cl CLOB)', - 'insert into test_lob values(CHAR_TO_CLOB(\'Clob test\'))'], cb); - }, - function (cb) { - Helpers.logInfo('Create table and insert done.'); - client.query('select * from test_lob', cb); - }, - function (result, queryHandle, cb) { - Helpers.logInfo('Query executed.'); - var arr = Result2Array.RowsArray(result); - var lobObject = arr[0][0]; - client.lobRead(lobObject, 1, lobObject.lobLength, cb); - }, - function (str, read_length, cb) { - Helpers.logInfo('LOB Read done.'); - test.ok(read_length === 9); - test.ok(str === 'Clob test'); - - client.batchExecuteNoQuery(['DROP TABLE test_lob'], cb); - }, - function (cb) { - Helpers.logInfo('Drop table done.'); - client.close(cb); - } - ], function (err) { - if (err) { - throw err; - } else { - Helpers.logInfo('Test passed.'); - test.done(); - } - }); -}; diff --git a/test/test_Clob_Insert.js b/test/test_Clob_Insert.js deleted file mode 100644 index a81ed6f..0000000 --- a/test/test_Clob_Insert.js +++ /dev/null @@ -1,62 +0,0 @@ -exports['test_Clob_Insert'] = function (test) { - var CUBRID = require('../'), - client = require('./testSetup/test_Setup').createDefaultCUBRIDDemodbConnection(), - Helpers = CUBRID.Helpers, - ActionQueue = CUBRID.ActionQueue, - Result2Array = CUBRID.Result2Array; - - test.expect(2); - Helpers.logInfo(module.filename.toString() + ' started...'); - - ActionQueue.enqueue([ - function (cb) { - client.connect(cb); - }, - function (cb) { - client.batchExecuteNoQuery(['drop table if exists test_clob', - 'create table test_clob(id int, cl clob)'], cb); - }, - function (cb) { - Helpers.logInfo('Create table done.'); - client.lobNew(client.LOB_TYPE_CLOB, cb); - }, - function (lobObject, cb) { - Helpers.logInfo('LobNew done.'); - var data = 'Test CLOB content.'; - client.lobWrite(lobObject, 1, data, cb); - }, - function (lobObject, written_length, cb) { - Helpers.logInfo('LobWrite done.'); - client.executeWithTypedParams('insert into test_clob values(1, ?)', [lobObject], ['clob'], cb); - }, - function (cb) { - Helpers.logInfo('Querying: select cl test_clob.'); - client.query('select cl from test_clob', cb); - }, - function (result, queryhandle, cb) { - Helpers.logInfo("Query executed."); - var arr = Result2Array.RowsArray(result); - var lobObject = arr[0][0]; - client.lobRead(lobObject, 1, lobObject.lobLength, cb); - }, - function (string, readLength, cb) { - Helpers.logInfo("LobRead done.."); - Helpers.logInfo('Number of bytes read: ' + readLength); - test.ok(readLength === 'Test CLOB content.'.length); - test.ok(string === 'Test CLOB content.'); - client.batchExecuteNoQuery(['DROP TABLE test_clob'], cb); - }, - function (cb) { - Helpers.logInfo('Drop table done.'); - client.close(cb); - } - ], - function (err) { - if (err) { - throw err; - } else { - Helpers.logInfo('Test passed.'); - test.done(); - } - }); -}; diff --git a/test/test_CloseDatabasePacket.js b/test/test_CloseDatabasePacket.js deleted file mode 100644 index 7c50b47..0000000 --- a/test/test_CloseDatabasePacket.js +++ /dev/null @@ -1,39 +0,0 @@ -exports['test_CloseConnectionPacket'] = function (test) { - var codeCoveragePath = process.env.CODE_COV ? '-cov' : '', - PacketReader = require('../src' + codeCoveragePath + '/packets/PacketReader'), - PacketWriter = require('../src' + codeCoveragePath + '/packets/PacketWriter'), - CloseDatabasePacket = require('../src' + codeCoveragePath + '/packets/CloseDatabasePacket'), - CAS = require('../src' + codeCoveragePath + '/constants/CASConstants'); - - test.expect(14); - var packetReader = new PacketReader(), - closeDatabasePacket = new CloseDatabasePacket({casInfo : [0, 255, 255, 255]}), - packetWriter = new PacketWriter(closeDatabasePacket.getBufferLength()); - - closeDatabasePacket.write(packetWriter); - test.equal(packetWriter._toBuffer()[3], 1); // Total length - - test.equal(packetWriter._toBuffer()[4], 0); // CasInfo - test.equal(packetWriter._toBuffer()[5], 255); // CasInfo - test.equal(packetWriter._toBuffer()[6], 255); // CasInfo - test.equal(packetWriter._toBuffer()[7], 255); // CasInfo - - test.equal(packetWriter._toBuffer()[8], CAS.CASFunctionCode.CAS_FC_CON_CLOSE); - - packetReader.write(new Buffer([0, 0, 0, 0, 0, 255, 255, 255, 0, 0, 0, 0])); - - test.equal(packetReader._packetLength(), 12); - - closeDatabasePacket.parse(packetReader); - - test.equal(closeDatabasePacket.casInfo[0], 0); // CasInfo - test.equal(closeDatabasePacket.casInfo[1], 255); // CasInfo - test.equal(closeDatabasePacket.casInfo[2], 255); // CasInfo - test.equal(closeDatabasePacket.casInfo[3], 255); // CasInfo - - test.equal(closeDatabasePacket.responseCode, 0); - - test.equal(closeDatabasePacket.errorCode, 0); - test.equal(closeDatabasePacket.errorMsg, ''); - test.done(); -}; diff --git a/test/test_CloseDefault.js b/test/test_CloseDefault.js deleted file mode 100644 index 70fb005..0000000 --- a/test/test_CloseDefault.js +++ /dev/null @@ -1,58 +0,0 @@ -var path = require('path'); - -exports[path.basename(__filename)] = function (test) { - var CUBRID = require('../'), - client = require('./testSetup/test_Setup').createDefaultCUBRIDDemodbConnection(), - Helpers = CUBRID.Helpers; - - test.expect(2); - Helpers.logInfo(module.filename.toString() + ' started...'); - - function errorHandler(err) { - throw err.message; - } - - client.connect(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connected.'); - Helpers.logInfo('Executing query...'); - client.query('select * from nation', function (err, result, queryHandle) { - if (err) { - errorHandler(err); - } else { - var foundQueryHandle = false; - for (var i = 0; i < client._queriesPacketList.length; i++) { - if (client._queriesPacketList[i].queryHandle === queryHandle) { - foundQueryHandle = true; - break; - } - } - - test.ok(foundQueryHandle === true); - - client.close(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connection closed.'); - foundQueryHandle = false; - for (var i = 0; i < client._queriesPacketList.length; i++) { - if (client._queriesPacketList[i].handle === queryHandle) { - foundQueryHandle = true; - break; - } - } - - test.ok(foundQueryHandle === false); - - Helpers.logInfo('Test passed.'); - test.done(); - } - }); - } - }); - } - }); -}; diff --git a/test/test_Connect.js b/test/test_Connect.js deleted file mode 100644 index 87e2bde..0000000 --- a/test/test_Connect.js +++ /dev/null @@ -1,37 +0,0 @@ -exports['test_Connect'] = function (test) { - var CUBRID = require('../'), - client = require('./testSetup/test_Setup').createDefaultCUBRIDDemodbConnection(), - Helpers = CUBRID.Helpers; - - test.expect(0); - Helpers.logInfo(module.filename.toString() + ' started...'); - - function errorHandler(err) { - throw err.message; - } - - client.connect(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connected OK.'); - client.getEngineVersion(function (err, result) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('CUBRID engine version: ' + result); - client.close(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - test.done(); - } - }); - } - }); - } - }); -}; - diff --git a/test/test_ConnectCollision.js b/test/test_ConnectCollision.js deleted file mode 100644 index 838b1d5..0000000 --- a/test/test_ConnectCollision.js +++ /dev/null @@ -1,40 +0,0 @@ -exports['test_ConnectCollision'] = function (test) { - var CUBRID = require('../'), - client = require('./testSetup/test_Setup').createDefaultCUBRIDDemodbConnection(), - Helpers = CUBRID.Helpers; - - test.expect(1); - Helpers.logInfo(module.filename.toString() + ' started...'); - - client.connect(function () { - // Close connection after 3 sec. - setTimeout(function (err) { - if (err) { - Helpers.logInfo('Error: ' + err.message); - } else { - Helpers.logInfo('Connected.'); - client.close(function (err) { - if (err) { - Helpers.logInfo('Error: ' + err.message); - } else { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - test.done(); - } - }); - } - }, 3000); - }); - - // Try to connect again - setTimeout(function () { - client.connect(function (err) { - if (err) { - Helpers.logInfo('Error: ' + err.message); - test.ok(err.message === 'A connection is already in progress! - denying current connection request.'); - } else { - client.close(null); - } - }); - }, 0); -}; diff --git a/test/test_ConnectTimeout.js b/test/test_ConnectTimeout.js deleted file mode 100644 index 50a69bd..0000000 --- a/test/test_ConnectTimeout.js +++ /dev/null @@ -1,44 +0,0 @@ -var path = require('path'); - -exports[path.basename(__filename)] = function (test) { - var CUBRID = require('../'), - host = 'www.google.com' - ErrorMessages = require('../src' + (process.env.CODE_COV ? '-cov' : '') + '/constants/ErrorMessages'), - client = new CUBRID.createCUBRIDConnection(host); - - test.expect(3); - - client.setConnectionTimeout(2000); - - client.connect(function (err) { - if (err) { - test.equal(err.message, ErrorMessages.ERROR_CONNECTION_TIMEOUT); - - client = new CUBRID.createConnection({ - host: host, - connectionTimeout: 2000 - }); - - client.connect(function (err) { - if (err) { - test.equal(err.message, ErrorMessages.ERROR_CONNECTION_TIMEOUT); - - client = new CUBRID.createConnection(host, 33000, 'public', '', 'demodb', 0, 2000); - - client.connect(function (err) { - if (err) { - test.equal(err.message, ErrorMessages.ERROR_CONNECTION_TIMEOUT); - test.done(); - } else { - throw 'We should not get here!'; - } - }); - } else { - throw 'We should not get here!'; - } - }); - } else { - throw 'We should not get here!'; - } - }); -}; diff --git a/test/test_Connect_Events.js b/test/test_Connect_Events.js deleted file mode 100644 index b10f758..0000000 --- a/test/test_Connect_Events.js +++ /dev/null @@ -1,38 +0,0 @@ -var path = require('path'); - -exports[path.basename(__filename)] = function (test) { - var CUBRID = require('../'), - client = require('./testSetup/test_Setup').createDefaultCUBRIDDemodbConnection(), - Helpers = CUBRID.Helpers; - - test.expect(0); - Helpers.logInfo(module.filename.toString() + ' started...'); - - client.connect(); - - client.on(client.EVENT_ERROR, function (err) { - throw err.message; - }); - - client.on(client.EVENT_CONNECTED, function () { - Helpers.logInfo('Connection opened.'); - client.query('select * from game'); - }); - - client.on(client.EVENT_QUERY_DATA_AVAILABLE, function (result, queryHandle) { - client.closeQuery(queryHandle, function () { - }); - }); - - client.on(client.EVENT_QUERY_CLOSED, function () { - client.close(); - }); - - client.on(client.EVENT_CONNECTION_CLOSED, function () { - Helpers.logInfo('Connection closed'); - Helpers.logInfo('Test passed'); - client.removeAllListeners(); - test.done(); - }); -}; - diff --git a/test/test_Connect_Sequence.js b/test/test_Connect_Sequence.js deleted file mode 100644 index c60f260..0000000 --- a/test/test_Connect_Sequence.js +++ /dev/null @@ -1,31 +0,0 @@ -exports['test_ConnectSequence'] = function (test) { - var CUBRID = require('../'), - client = require('./testSetup/test_Setup').createDefaultCUBRIDDemodbConnection(), - Helpers = CUBRID.Helpers, - ActionQueue = CUBRID.ActionQueue; - - test.expect(1); - Helpers.logInfo(module.filename.toString() + ' started...'); - - ActionQueue.enqueue([ - function (callback) { - client.connect(callback); - }, - function (callback) { - client.getEngineVersion(callback); - }, - function (version, callback) { - test.notEqual(version, null); - Helpers.logInfo('Engine version: ' + version); - client.close(callback); - } - ], - function (err) { - if (err) { - throw err.message; - } else { - Helpers.logInfo('Test passed.'); - test.done(); - } - }); -}; diff --git a/test/test_DataTypes.js b/test/test_DataTypes.js deleted file mode 100644 index 30f7e92..0000000 --- a/test/test_DataTypes.js +++ /dev/null @@ -1,129 +0,0 @@ -exports['test_DataTypes'] = function (test) { - var CUBRID = require('../'), - client = require('./testSetup/test_Setup').createDefaultCUBRIDDemodbConnection(), - Helpers = CUBRID.Helpers, - Result2Array = CUBRID.Result2Array; - - function errorHandler(err) { - throw err.message; - } - - - Helpers.logInfo(module.filename.toString() + ' started...'); - - client.connect(function (err) { - if (err) { - errorHandler(err); - } else { - var isCUBRID9 = client.getEngineVersion().startsWith('9'); - - test.expect(21 + (isCUBRID9 ? 1 : 0)); - - Helpers.logInfo('Connected.'); - Helpers.logInfo('Creating the test table...'); - - client.batchExecuteNoQuery([ - 'DROP TABLE IF EXISTS test_data_types', - 'CREATE TABLE test_data_types(' + - 'a BIGINT,' + - 'b BIT(1),' + - 'c BIT VARYING(1),' + - 'd BLOB,' + - 'e CHARACTER(1),' + - 'f CLOB,' + - 'g DATE,' + - 'h DATETIME,' + - 'i DOUBLE,' + - 'j FLOAT,' + - 'k INTEGER,' + - 'l MONETARY,' + - 'm NATIONAL CHARACTER(1),' + - 'o NATIONAL CHARACTER VARYING(100),' + - 'p NUMERIC(15,0),' + - 'r CHARACTER VARYING(100),' + - 's TIME,' + - 't TIMESTAMP,' + - (isCUBRID9 ? "z ENUM('red', 'blue', 'yellow') DEFAULT 'red'," : '') + - 'u VARCHAR(4096)' + - ')', - "INSERT INTO test_data_types VALUES(15, B'0', B'0', 'qwerty', 'a', 'qwerty', '2012-10-02', '2012-10-02 13:25:45', 1.5, 2.5, 14, 3.14, N'9', N'95', 16, 'varchar', '1899-12-31 13:25:45', '2012-10-02 13:25:45', " + (isCUBRID9 ? "'blue', " : '') + "'varchar')" - ], function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connected.'); - Helpers.logInfo('Querying: select * from test_data_types'); - - client.query('SELECT * FROM test_data_types', function (err, result, queryHandle) { - if (err) { - errorHandler(err); - } else { - test.ok(Result2Array.TotalRowsCount(result) === 1); - - Helpers.logInfo('Query result rows count: ' + Result2Array.TotalRowsCount(result)); - - var arr = Result2Array.RowsArray(result); - - test.ok(arr.length === 1); - test.ok(arr[0][0] === 15); - test.ok(arr[0][1][0] === 0); - test.ok(arr[0][2][0] === 0); - test.ok(typeof(arr[0][3]) === 'object'); - test.ok(arr[0][4] === 'a'); - test.ok(typeof(arr[0][5]) === 'object'); - test.ok(arr[0][6].toString().startsWith('2012-10-02') === true); - test.ok(arr[0][7].toString().startsWith('2012-10-02') === true); - test.ok(arr[0][8] === 1.5); - test.ok(arr[0][9] === 2.5); - test.ok(arr[0][10] === 14); - test.ok(arr[0][11] === 3.14); - test.ok(arr[0][12] === '9'); - test.ok(arr[0][13] === '95'); - test.ok(arr[0][14] === 16); - test.ok(arr[0][15] === 'varchar'); - test.ok(arr[0][16].toString().startsWith('1899-12-31') === true); - test.ok(arr[0][17].toString().startsWith('2012-10-02') === true); - - if (isCUBRID9) { - // ENUM was defined, check it. - test.ok(arr[0][18] === 'blue'); - test.ok(arr[0][19] === 'varchar'); - } else { - test.ok(arr[0][18] === 'varchar'); - } - - for (var j = 0; j < arr.length; ++j) { - Helpers.logInfo(arr[j].toString()); - } - - client.closeQuery(queryHandle, function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Query closed.'); - - client.batchExecuteNoQuery('DROP TABLE test_data_types', function (err) { - if (err) { - errorHandler(err); - } else { - client.close(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - - test.done(); - } - }); - } - }); - } - }); - } - }); - } - }); - } - }); -}; diff --git a/test/test_DataTypesEvents.js b/test/test_DataTypesEvents.js deleted file mode 100644 index 5e95554..0000000 --- a/test/test_DataTypesEvents.js +++ /dev/null @@ -1,113 +0,0 @@ -exports['test_DataTypesEvents'] = function (test) { - var CUBRID = require('../'), - client = require('./testSetup/test_Setup').createDefaultCUBRIDDemodbConnection(), - Helpers = CUBRID.Helpers, - Result2Array = CUBRID.Result2Array; - -// TODO: avoid using global variables. - global.savedQueryHandle = null; - global.batchExecuteNo = 0; - - test.expect(21); - Helpers.logInfo(module.filename.toString() + ' started...'); - - client.connect(null); - - client.on(client.EVENT_ERROR, function (err) { - Helpers.logError('Error: ' + err.message); - throw 'We should not get here!'; - }); - - client.on(client.EVENT_CONNECTED, function () { - Helpers.logInfo('Connected.'); - Helpers.logInfo('Batch execute: create table and insert.'); - client.batchExecuteNoQuery( - [ - 'drop table if exists test_data_types', - 'CREATE TABLE test_data_types(' + - 'a bigint,' + - 'b bit(1),' + - 'c bit varying(1),' + - 'd blob,' + - 'e character(1),' + - 'f clob,' + - 'g date,' + - 'h datetime,' + - 'i double,' + - 'j float,' + - 'k integer,' + - 'l monetary,' + - 'm national character(1),' + - 'o national character varying(100),' + - 'p numeric(15,0),' + - 'r character varying(100),' + - 's time,' + - 't timestamp,' + - 'u character varying(4096))', - 'insert into test_data_types values(15, B\'0\',B\'0\', \'qwerty\', \'a\', \'qwerty\', \'2012-10-02\',' + - '\'2012-10-02 13:25:45\', 1.5, 2.5, 14, 3.14, N\'9\', N\'95\', 16, \'varchar\', \'1899-12-31 13:25:45\',' + - '\'2012-10-02 13:25:45\', \'varchar\')' - ], - null); - }); - - client.on(client.EVENT_BATCH_COMMANDS_COMPLETED, function () { - if (global.batchExecuteNo === 0) { - Helpers.logInfo('Batch execute done.'); - Helpers.logInfo('Querying: select * from test_data_types'); - global.batchExecuteNo = 1; - client.query('select * from test_data_types', null); - } else { - Helpers.logInfo('Batch execute done.'); - Helpers.logInfo('Closing query...'); - client.closeQuery(global.savedQueryHandle, null); - } - }); - - client.on(client.EVENT_QUERY_DATA_AVAILABLE, function (result, queryHandle) { - Helpers.logInfo('Data received.'); - Helpers.logInfo('Returned active query handle: ' + queryHandle); - global.savedQueryHandle = queryHandle; // Save handle - needed for further fetch operations - test.ok(Result2Array.TotalRowsCount(result) === 1); - Helpers.logInfo('Total query result rows count: ' + Result2Array.TotalRowsCount(result)); - Helpers.logInfo('Returned rows count: ' + Result2Array.RowsArray(result).length); - var arr = Result2Array.RowsArray(result); - test.ok(arr.length === 1); - test.ok(arr[0][0] === 15); - test.ok(arr[0][1][0] === 0); - test.ok(arr[0][2][0] === 0); - test.ok(typeof(arr[0][3]) === 'object'); - test.ok(arr[0][4] === 'a'); - test.ok(typeof(arr[0][5]) === 'object'); - test.ok(arr[0][6].toString().startsWith('2012-10-02') === true); - test.ok(arr[0][7].toString().startsWith('2012-10-02') === true); - test.ok(arr[0][8] === 1.5); - test.ok(arr[0][9] === 2.5); - test.ok(arr[0][10] === 14); - test.ok(arr[0][11] === 3.14); - test.ok(arr[0][12] === '9'); - test.ok(arr[0][13] === '95'); - test.ok(arr[0][14] === 16); - test.ok(arr[0][15] === 'varchar'); - test.ok(arr[0][16].toString().startsWith('1899-12-31') === true); - test.ok(arr[0][17].toString().startsWith('2012-10-02') === true); - test.ok(arr[0][18] === 'varchar'); - - client.batchExecuteNoQuery('drop table test_data_types', null); - }); - - client.on(client.EVENT_QUERY_CLOSED, function () { - Helpers.logInfo('Query closed.'); - global.savedQueryHandle = null; - Helpers.logInfo('Closing connection...'); - client.close(null); - }); - - client.on(client.EVENT_CONNECTION_CLOSED, function () { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - client.removeAllListeners(); - test.done(); - }); -}; - diff --git a/test/test_EmitEvent.js b/test/test_EmitEvent.js deleted file mode 100644 index 57f10d9..0000000 --- a/test/test_EmitEvent.js +++ /dev/null @@ -1,42 +0,0 @@ -exports['test_EmitEvent'] = function (test) { - var events = require('events'), - CUBRID = require('../'), - Helpers = CUBRID.Helpers, - testing; - - var Test = function (err) { - this.err = err; - - this.EVENT_ERROR = 'error'; - this.EVENT_SUCCESS = 'success'; - }; - - Test.prototype = new events.EventEmitter; - - Test.prototype.increment = function () { - var self = this; - - Helpers._emitEvent(self, self.err, this.EVENT_ERROR, this.EVENT_SUCCESS, 'Success event'); - }; - - var test1 = new Test(null); - var test2 = new Test(new Error('Error!')); - - test2.on(test2.EVENT_ERROR, function (err) { - test.equal(err.message, 'Error!'); - }); - - test1.on(test1.EVENT_SUCCESS, function (messaje) { - test.equal(messaje, 'Success event'); - }); - - test.expect(2); - - Helpers.logInfo('Unit test ' + module.filename.toString() + ' started...'); - test1.increment(); - test2.increment(); - - Helpers.logInfo('Unit test ended OK.'); - test.done(); -}; - diff --git a/test/test_Encoding_Korean.js b/test/test_Encoding_Korean.js deleted file mode 100644 index b682700..0000000 --- a/test/test_Encoding_Korean.js +++ /dev/null @@ -1,47 +0,0 @@ -exports['test_Encoding_Korean'] = function (test) { - var CUBRID = require('../'), - client = require('./testSetup/test_Setup').createDefaultCUBRIDDemodbConnection(), - Helpers = CUBRID.Helpers, - ActionQueue = CUBRID.ActionQueue, - Result2Array = CUBRID.Result2Array, - testData = '이 소포를 부치고 싶은데요.'; // KO: 'I would like to send off this package.' - - test.expect(1); - Helpers.logInfo(module.filename.toString() + ' started...'); - - ActionQueue.enqueue([ - function (cb) { - client.connect(cb); - }, - function (cb) { - Helpers.logInfo('Connected...'); - client.batchExecuteNoQuery(['drop table if exists test_encoding', 'create table test_encoding(str varchar(256))'], cb); - }, - function (cb) { - client.batchExecuteNoQuery('insert into test_encoding values(\'' + testData + '\')', cb); - }, - function (cb) { - client.query('select * from test_encoding where str = \'' + testData + '\'', cb); - }, - function (result, queryHandle, cb) { - var arr = Result2Array.RowsArray(result); - test.ok(arr[0][0] === testData); - client.closeQuery(queryHandle, cb); - }, - function (queryHandle, cb) { - client.batchExecuteNoQuery('drop table test_encoding', cb); - }, - function (cb) { - client.close(cb); - } - ], - function (err) { - if (err) { - throw err; - } else { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - test.done(); - } - }); -}; diff --git a/test/test_Encoding_Russian.js b/test/test_Encoding_Russian.js deleted file mode 100644 index 8b9f2f0..0000000 --- a/test/test_Encoding_Russian.js +++ /dev/null @@ -1,46 +0,0 @@ -exports['test_Encoding_Russian'] = function (test) { - var CUBRID = require('../'), - client = require('./testSetup/test_Setup').createDefaultCUBRIDDemodbConnection(), - Helpers = CUBRID.Helpers, - ActionQueue = CUBRID.ActionQueue, - Result2Array = CUBRID.Result2Array, - testData = 'Я хотел бы отослать этот пакет.'; // Russian: 'I would like to send off this package.' - - test.expect(1); - Helpers.logInfo(module.filename.toString() + ' started...'); - - ActionQueue.enqueue([ - function (cb) { - client.connect(cb); - }, - function (cb) { - Helpers.logInfo('Connected...'); - client.batchExecuteNoQuery(['drop table if exists test_encoding', 'create table test_encoding(str varchar(256))'], cb); - }, - function (cb) { - client.batchExecuteNoQuery('insert into test_encoding values(\'' + testData + '\')', cb); - }, - function (cb) { - client.query('select * from test_encoding where str = \'' + testData + '\'', cb); - }, - function (result, queryHandle, cb) { - var arr = Result2Array.RowsArray(result); - test.ok(arr[0][0] === testData); - client.closeQuery(queryHandle, cb); - }, - function (queryHandle, cb) { - client.batchExecuteNoQuery('drop table test_encoding', cb); - }, - function (cb) { - client.close(cb); - } - ], function (err) { - if (err) { - throw err; - } else { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - test.done(); - } - }); -}; diff --git a/test/test_ExecuteQueryPacket.js b/test/test_ExecuteQueryPacket.js index 72717f5..d8f1c53 100644 --- a/test/test_ExecuteQueryPacket.js +++ b/test/test_ExecuteQueryPacket.js @@ -4,7 +4,6 @@ exports['test_ExecuteQueryPacket'] = function (test) { PacketWriter = require('../src' + codeCoveragePath + '/packets/PacketWriter'), ExecuteQueryPacket = require('../src' + codeCoveragePath + '/packets/ExecuteQueryPacket'), CAS = require('../src' + codeCoveragePath + '/constants/CASConstants'), - assert = require('assert'), packetReader = new PacketReader(), executeQueryPacket = new ExecuteQueryPacket({ sql: 'select * from code', diff --git a/test/test_ExecuteWithParams.js b/test/test_ExecuteWithParams.js deleted file mode 100644 index 89787af..0000000 --- a/test/test_ExecuteWithParams.js +++ /dev/null @@ -1,58 +0,0 @@ -exports['test_ExecuteWithParams'] = function (test) { - var CUBRID = require('../'), - client = require('./testSetup/test_Setup').createDefaultCUBRIDDemodbConnection(), - Helpers = CUBRID.Helpers, - assert = require('assert'), - sqlDrop = 'drop table if exists ?', - sqlCreate = 'create table ?(id int)', - sqlInsert = 'insert into ? values(1)', - arrValues = ['node_test']; - - function errorHandler(err) { - throw err.message; - } - - test.expect(0); - Helpers.logInfo(module.filename.toString() + ' started...'); - - client.connect(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connected.'); - client.executeWithParams(sqlDrop, arrValues, ['"'], function (err) { - if (err) { - errorHandler(err); - } else { - client.executeWithParams(sqlCreate, arrValues, ['"'], function (err) { - if (err) { - errorHandler(err); - } else { - client.executeWithParams(sqlInsert, arrValues, ['"'], function (err) { - if (err) { - errorHandler(err); - } else { - client.executeWithParams(sqlDrop, arrValues, ['"'], function (err) { - if (err) { - errorHandler(err); - } else { - client.close(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - test.done(); - } - }); - } - }); - } - }); - } - }); - } - }); - } - }); -}; diff --git a/test/test_ExecuteWithTypedParams.js b/test/test_ExecuteWithTypedParams.js deleted file mode 100644 index 225fe53..0000000 --- a/test/test_ExecuteWithTypedParams.js +++ /dev/null @@ -1,115 +0,0 @@ -exports['test_ExecuteWithTypedParams'] = function (test) { - var CUBRID = require('../'), - client = require('./testSetup/test_Setup').createDefaultCUBRIDDemodbConnection(), - Helpers = CUBRID.Helpers, - Result2Array = CUBRID.Result2Array; - - function errorHandler(err) { - throw err.message; - } - - test.expect(19); - Helpers.logInfo(module.filename.toString() + ' started...'); - - client.connect(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connected.'); - client.batchExecuteNoQuery( - [ - 'drop table if exists test_params', - 'CREATE TABLE test_params(' + - 'a bigint,' + - 'b bit(8),' + - 'c bit varying(8),' + - 'd character(1),' + - 'e date,' + - 'f datetime,' + - 'g double,' + - 'h float,' + - 'i integer,' + - 'j monetary,' + - 'k national character(1),' + - 'l national character varying(100),' + - 'm numeric(15,0),' + - 'n character varying(100),' + - 'o time,' + - 'p timestamp,' + - 'q character varying(4096))' - ], - function (err) { - if (err) { - errorHandler(err); - } else { - var bitValue = new Buffer(1); - bitValue[0] = 0; - var varBitValue = new Buffer(1); - varBitValue[0] = 128; - var date = new Date(); - date.setUTCFullYear(2012, 10, 2); - date.setUTCHours(13); - date.setUTCMinutes(25); - date.setUTCSeconds(45); - date.setUTCMilliseconds(0); - client.executeWithTypedParams('insert into test_params values( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', - [15, bitValue, varBitValue, 'a', date, date, 1.5, 2.5, 14, 3.14, '9' , '95', 16, 'varnchar', date, date, 'varchar'], - ['bigint', 'bit', 'varbit', 'char', 'date', 'datetime', 'double', 'float', 'int', 'monetary', - 'nchar', 'varnchar', 'numeric', 'varchar', 'time', 'timestamp', 'varchar'], - function (err) { - if (err) { - errorHandler(err); - } else { - client.query('select * from test_params', function (err, result, queryHandle) { - if (err) { - errorHandler(err); - } else { - test.ok(Result2Array.TotalRowsCount(result) === 1); - Helpers.logInfo('Query result rows count: ' + Result2Array.TotalRowsCount(result)); - var arr = Result2Array.RowsArray(result); - test.ok(arr.length === 1); - test.ok(arr[0][0] === 15); - test.ok(arr[0][1][0] === 0); - test.ok(arr[0][2][0] === 128); - test.ok(arr[0][3] === 'a'); - test.ok(arr[0][4].toString() === '2012-10-02T00:00:00.000Z'); - test.ok(arr[0][5].toString() === '2012-10-02T13:25:45.000Z'); - test.ok(arr[0][6] === 1.5); - test.ok(arr[0][7] === 2.5); - test.ok(arr[0][8] === 14); - test.ok(arr[0][9] === 3.14); - test.ok(arr[0][10] === '9'); - test.ok(arr[0][11] === '95'); - test.ok(arr[0][12] === 16); - test.ok(arr[0][13] === 'varnchar'); - test.ok(arr[0][14].toString() === '1899-12-31T13:25:45.000Z'); - test.ok(arr[0][15].toString() === '2012-10-02T13:25:45.000Z'); - test.ok(arr[0][16] === 'varchar'); - - for (var j = 0; j < arr.length; j++) { - Helpers.logInfo(arr[j].toString()); - } - client.execute('drop table test_params', function (err) { - if (err) { - errorHandler(err); - } else { - client.close(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - test.done(); - } - }); - } - }); - } - }); - } - }); - } - }); - } - }); -}; diff --git a/test/test_GetDbParameter.js b/test/test_GetDbParameter.js deleted file mode 100644 index d6cb659..0000000 --- a/test/test_GetDbParameter.js +++ /dev/null @@ -1,45 +0,0 @@ -exports['test_GetDbParameter'] = function (test) { - var CUBRID = require('../'), - client = require('./testSetup/test_Setup').createDefaultCUBRIDDemodbConnection(), - Helpers = CUBRID.Helpers, - CAS = require('../src' + (process.env.CODE_COV ? '-cov' : '') + '/constants/CASConstants'); - - function errorHandler(err) { - throw err.message; - } - - test.expect(1); - Helpers.logInfo(module.filename.toString() + ' started...'); - - client.connect(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connected OK.'); - - client.setDatabaseParameter(CAS.CCIDbParam.CCI_PARAM_ISOLATION_LEVEL, - CAS.CUBRIDIsolationLevel.TRAN_REP_CLASS_COMMIT_INSTANCE, function (err) { - if (err) { - errorHandler(err); - } else { - client.getDatabaseParameter(CAS.CCIDbParam.CCI_PARAM_ISOLATION_LEVEL, function (err, value) { - if (err) { - errorHandler(err); - } else { - test.ok(value === CAS.CUBRIDIsolationLevel.TRAN_REP_CLASS_COMMIT_INSTANCE); - client.close(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - test.done(); - } - }); - } - }); - } - }); - } - }); -}; diff --git a/test/test_GetDbParameterError.js b/test/test_GetDbParameterError.js deleted file mode 100644 index 8bf09ee..0000000 --- a/test/test_GetDbParameterError.js +++ /dev/null @@ -1,39 +0,0 @@ -//var CUBRID = require('../'), -// client = require('./testSetup/test_Setup').createDefaultCUBRIDDemodbConnection(), -// Helpers = CUBRID.Helpers, -// CAS = require('../src' + (process.env.CODE_COV ? '-cov' : '') + '/constants/CASConstants'); -// -//exports['test_GetDbParameterError'] = function (test) { -// test.expect(1); -// function errorHandler(err) { -// Helpers.logInfo(err.message); -// test.ok(err.message === '-1011:CAS_ER_PARAM_NAME'); -// client.close(function (err) { -// if (err) { -// errorHandler(err); -// } else { -// Helpers.logInfo('Connection closed.'); -// Helpers.logInfo('Test passed.'); -// test.done(); -// } -// }); -// } -// -// Helpers.logInfo(module.filename.toString() + ' started...'); -// -// client.connect(function (err) { -// if (err) { -// errorHandler(err); -// } else { -// Helpers.logInfo('Connected OK.'); -// -// client.getDatabaseParameter(CAS.CCIDbParam.CCI_PARAM_MAX_STRING_LENGTH, function (err, value) { -// if (err) { -// errorHandler(err); -// } else { -// throw 'We should not get here'; -// } -// }); -// } -// }); -//}; diff --git a/test/test_GetDbParameter_Events.js b/test/test_GetDbParameter_Events.js deleted file mode 100644 index 303572a..0000000 --- a/test/test_GetDbParameter_Events.js +++ /dev/null @@ -1,67 +0,0 @@ -exports['test_GetDbParameter_Events'] = function (test) { - var CUBRID = require('../'), - client = require('./testSetup/test_Setup').createDefaultCUBRIDDemodbConnection(), - Helpers = CUBRID.Helpers, - CAS = require('../src' + (process.env.CODE_COV ? '-cov' : '') + '/constants/CASConstants'); - - test.expect(0); - Helpers.logInfo(module.filename.toString() + ' started...'); - - client.connect(); - - client.on(client.EVENT_ERROR, function (err) { - Helpers.logInfo('Error: ' + err.message); - throw 'We should not get here!'; - }); - - client.on(client.EVENT_CONNECTED, function () { - Helpers.logInfo('Connected.'); - client.getDatabaseParameter(CAS.CCIDbParam.CCI_PARAM_ISOLATION_LEVEL, null); - }); - - client.on(client.EVENT_GET_DB_PARAMETER_COMPLETED, function (value) { - var isolationLevel = ''; - - if (typeof value === 'undefined') { - throw "Db parameter retrieved unsuccessfully!"; - } - - switch (value) { - case CAS.CUBRIDIsolationLevel.TRAN_UNKNOWN_ISOLATION: - isolationLevel = 'TRAN_UNKNOWN_ISOLATION'; - break; - case CAS.CUBRIDIsolationLevel.TRAN_COMMIT_CLASS_UNCOMMIT_INSTANCE: - isolationLevel = 'TRAN_COMMIT_CLASS_UNCOMMIT_INSTANCE'; - break; - case CAS.CUBRIDIsolationLevel.TRAN_COMMIT_CLASS_COMMIT_INSTANCE: - isolationLevel = 'TRAN_COMMIT_CLASS_COMMIT_INSTANCE'; - break; - case CAS.CUBRIDIsolationLevel.TRAN_REP_CLASS_UNCOMMIT_INSTANCE: - isolationLevel = 'TRAN_REP_CLASS_UNCOMMIT_INSTANCE'; - break; - case CAS.CUBRIDIsolationLevel.TRAN_REP_CLASS_COMMIT_INSTANCE: - isolationLevel = 'TRAN_REP_CLASS_COMMIT_INSTANCE'; - break; - case CAS.CUBRIDIsolationLevel.TRAN_REP_CLASS_REP_INSTANCE: - isolationLevel = 'TRAN_REP_CLASS_REP_INSTANCE'; - break; - case CAS.CUBRIDIsolationLevel.TRAN_SERIALIZABLE: - isolationLevel = 'TRAN_SERIALIZABLE'; - break; - } - - if (isolationLevel === '') { - throw "Db parameter value is not recognized!"; - } - - Helpers.logInfo('Get Db parameter completed: ' + isolationLevel); - client.close(); - }); - - client.on(client.EVENT_CONNECTION_CLOSED, function () { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - client.removeAllListeners(); - test.done(); - }); -}; diff --git a/test/test_IndexExports.js b/test/test_IndexExports.js deleted file mode 100644 index 170edbf..0000000 --- a/test/test_IndexExports.js +++ /dev/null @@ -1,59 +0,0 @@ -exports['test_IndexExports'] = function (test) { - var CUBRID = require('../'), - client = require('./testSetup/test_Setup').createDefaultCUBRIDDemodbConnection(), - Helpers = CUBRID.Helpers, - Result2Array = CUBRID.Result2Array; - - function errorHandler(err) { - throw err.message; - } - - test.expect(4); - Helpers.logInfo(module.filename.toString() + ' started...'); - - client.connect(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connected.'); - Helpers.logInfo('Querying: select * from nation'); - - client.query('select * from nation', function (err, result, queryHandle) { - if (err) { - errorHandler(err); - } else { - test.ok(Result2Array.TotalRowsCount(result) === 215); - Helpers.logInfo('Query result rows count: ' + Result2Array.TotalRowsCount(result)); - - var arr = Result2Array.RowsArray(result); - - test.ok(arr.length === 215); - test.ok(arr[0].toString() === 'SRB,Serbia,Europe,Beograd'); - test.ok(arr[arr.length - 1].toString() === 'AFG,Afghanistan,Asia,Kabul'); - - for (var j = 0; j < 1; j++) { - Helpers.logInfo(arr[j].toString()); - } - - client.closeQuery(queryHandle, function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Query closed.'); - - client.close(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - test.done(); - } - }); - } - }); - } - }); - } - }); -}; diff --git a/test/test_LastInsertID.js b/test/test_LastInsertID.js deleted file mode 100644 index b22dea2..0000000 --- a/test/test_LastInsertID.js +++ /dev/null @@ -1,69 +0,0 @@ -exports['test_LastInsertID'] = function (test) { - var CUBRID = require('../'), - client = require('./testSetup/test_Setup').createDefaultCUBRIDDemodbConnection(), - Helpers = CUBRID.Helpers, - Result2Array = CUBRID.Result2Array; - - function errorHandler(err) { - throw err.message; - } - - test.expect(2); - Helpers.logInfo(module.filename.toString() + ' started...'); - - client.connect(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connected.'); - - client.batchExecuteNoQuery(['drop table if exists node_test', 'create table node_test(id INT AUTO_INCREMENT NOT NULL PRIMARY KEY, text VARCHAR(32))'], function (err) { - if (err) { - errorHandler(err); - } else { - client.batchExecuteNoQuery(['insert into node_test values(NULL, \'database\'),(NULL, \'manager\')'], function (err) { - if (err) { - errorHandler(err); - } else { - client.query('select LAST_INSERT_ID()', function (err, result, queryHandle) { - if (err) { - errorHandler(err); - } else { - test.ok(Result2Array.TotalRowsCount(result) === 1); - - var arr = Result2Array.RowsArray(result); - - test.ok(arr[0].toString() === '1'); - - client.closeQuery(queryHandle, function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Query closed.'); - - client.batchExecuteNoQuery(['drop table node_test'], function (err) { - if (err) { - errorHandler(err); - } else { - client.close(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - test.done(); - } - }); - } - }); - } - }); - } - }); - } - }); - } - }); - } - }); -}; diff --git a/test/test_Named_Functions.js b/test/test_Named_Functions.js deleted file mode 100644 index ea4db9c..0000000 --- a/test/test_Named_Functions.js +++ /dev/null @@ -1,59 +0,0 @@ -exports['test_Named_Functions'] = function (test) { - var CUBRID = require('../'), - client = require('./testSetup/test_Setup').createDefaultCUBRIDDemodbConnection(), - Helpers = CUBRID.Helpers, - Result2Array = CUBRID.Result2Array; - - function errorHandler(err) { - throw err.message; - } - - test.expect(0); - Helpers.logInfo(module.filename.toString() + ' started...'); - - client.connect(connect_callback); - - function connect_callback(err) { - if (err) { - errorHandler(err); - } else { - client.query('select * from game', query_callback); - } - } - - function query_callback(err, result, queryHandle) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Query results:'); - Helpers.logInfo('Returned active query handle: ' + queryHandle); - Helpers.logInfo('Total query result rows count: ' + Result2Array.TotalRowsCount(result)); - Helpers.logInfo('First "batch" of data returned rows count: ' + Result2Array.RowsArray(result).length); - Helpers.logInfo('*** First row: ' + Result2Array.RowsArray(result)[0].toString()); - Helpers.logInfo('Fetching more rows...'); - client.fetch(queryHandle, fetch_callback); - } - } - - function fetch_callback(err, result) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Fetch results:'); - Helpers.logInfo('*** Fetch data received.'); - Helpers.logInfo('*** Current fetch of data returned rows count: ' + Result2Array.RowsArray(result).length); - Helpers.logInfo('*** First row: ' + Result2Array.RowsArray(result)[0].toString()); - client.close(close_callback); - } - } - - function close_callback(err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - test.done(); - } - } -}; diff --git a/test/test_NodePool.js b/test/test_NodePool.js deleted file mode 100644 index f1c3e1e..0000000 --- a/test/test_NodePool.js +++ /dev/null @@ -1,159 +0,0 @@ -exports['test_NodePool'] = function (test) { - var CUBRID = require('../'), - Helpers = CUBRID.Helpers, - Result2Array = CUBRID.Result2Array, - testSetup = require('./testSetup/test_Setup'), - generic_pool = require('generic-pool'); - - test.expect(8); - Helpers.logInfo(module.filename.toString() + ' started...'); - - var pool = generic_pool.Pool({ - name : 'cubrid-node-pool', - max : 2, - create : function (callback) { - var client = testSetup.createDefaultCUBRIDDemodbConnection(); - - client.connect(function (err) { - if (!err) { - Helpers.logInfo('Connection opened.'); - } - callback(err, client); - }); - }, - destroy : function (db) { - db.close(function (err) { - if (err) { - Helpers.logError(err); - } else { - Helpers.logInfo('Connection closed.'); - } - }); - }, - idleTimeoutMillis : 30000, - priorityRange : 3, - log : false - }); - - pool.acquire(function (err, client) { - if (err) { - Helpers.logError(err); - } - else { - client.query("select * from code", function (err, result, queryHandle) { - if (err) { - Helpers.logError(err); - } else { - Helpers.logInfo('[1] Query results:'); - test.ok(Result2Array.TotalRowsCount(result) === 6); - Helpers.logInfo('[1] Query results rows count: ' + Result2Array.TotalRowsCount(result)); - Helpers.logInfo('[1] Query results:'); - var arr = Result2Array.RowsArray(result); - test.ok(arr.length === 6); - client.closeQuery(queryHandle, function (err) { - if (err) { - Helpers.logError(err); - } else { - Helpers.logInfo('[1] Query closed.'); - // Return object back to pool - pool.release(client); - } - }); - } - }); - } - }, 1); - - pool.acquire(function (err, client) { - if (err) { - Helpers.logError(err); - } - else { - client.query("select * from code", function (err, result, queryHandle) { - if (err) { - Helpers.logError(err); - } else { - Helpers.logInfo('[2] Query results:'); - test.ok(Result2Array.TotalRowsCount(result) === 6); - Helpers.logInfo('[2] Query results rows count: ' + Result2Array.TotalRowsCount(result)); - Helpers.logInfo('[2] Query results:'); - var arr = Result2Array.RowsArray(result); - test.ok(arr.length === 6); - client.closeQuery(queryHandle, function (err) { - if (err) { - Helpers.logError(err); - } else { - Helpers.logInfo('[2] Query closed.'); - // Return object back to pool - pool.release(client); - } - }); - } - }); - } - }, 1); - - pool.acquire(function (err, client) { - if (err) { - Helpers.logError(err); - } - else { - client.query("select * from code", function (err, result, queryHandle) { - if (err) { - Helpers.logError(err); - } else { - Helpers.logInfo('[3] Query results:'); - test.ok(Result2Array.TotalRowsCount(result) === 6); - Helpers.logInfo('[3] Query results rows count: ' + Result2Array.TotalRowsCount(result)); - Helpers.logInfo('[3] Query results:'); - var arr = Result2Array.RowsArray(result); - test.ok(arr.length === 6); - client.closeQuery(queryHandle, function (err) { - if (err) { - Helpers.logError(err); - } else { - Helpers.logInfo('[3] Query closed.'); - // Return object back to pool - pool.release(client); - } - }); - } - }); - } - }, 2); - - pool.acquire(function (err, client) { - if (err) { - Helpers.logError(err); - } - else { - client.query("select * from code", function (err, result, queryHandle) { - if (err) { - Helpers.logError(err); - } else { - Helpers.logInfo('[4] Query results:'); - test.ok(Result2Array.TotalRowsCount(result) === 6); - Helpers.logInfo('[4] Query results rows count: ' + Result2Array.TotalRowsCount(result)); - Helpers.logInfo('[4] Query results:'); - var arr = Result2Array.RowsArray(result); - test.ok(arr.length === 6); - client.closeQuery(queryHandle, function (err) { - if (err) { - Helpers.logError(err); - } else { - Helpers.logInfo('[4] Query closed.'); - // Return object back to pool - pool.release(client); - } - }); - } - }); - } - }, 1); - - pool.drain(function () { - pool.destroyAllNow(function () { - test.done(); - }); - }); -}; diff --git a/test/test_ObjectsArray.js b/test/test_ObjectsArray.js deleted file mode 100644 index 9d94de0..0000000 --- a/test/test_ObjectsArray.js +++ /dev/null @@ -1,61 +0,0 @@ -exports['test_ObjectsArray'] = function (test) { - var CUBRID = require('../'), - client = require('./testSetup/test_Setup').createDefaultCUBRIDDemodbConnection(), - Helpers = CUBRID.Helpers, - Result2Array = CUBRID.Result2Array; - - function errorHandler(err) { - throw err.message; - } - - test.expect(6); - Helpers.logInfo(module.filename.toString() + ' started...'); - - client.connect(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connected.'); - Helpers.logInfo('Querying: select * from nation'); - - client.query('select * from nation', function (err, result, queryHandle) { - if (err) { - errorHandler(err); - } else { - test.ok(Result2Array.TotalRowsCount(result) === 215); - - Helpers.logInfo('Query result rows count: ' + Result2Array.TotalRowsCount(result)); - - var arr = Result2Array.ObjectsArray(result); - - test.ok(arr.length === 215); - test.ok(arr[arr.length - 1].code === 'AFG'); - test.ok(arr[arr.length - 1].name === 'Afghanistan'); - test.ok(arr[arr.length - 1].continent === 'Asia'); - test.ok(arr[arr.length - 1].capital === 'Kabul'); - - for (var j = 0; j < 1; ++j) { - Helpers.logInfo(arr[j].code + "," + arr[j].name + "," + arr[j].continent + "," + arr[j].capital); - } - - client.closeQuery(queryHandle, function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Query closed.'); - client.close(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - test.done(); - } - }); - } - }); - } - }); - } - }); -}; diff --git a/test/test_ParallelQueries.js b/test/test_ParallelQueries.js deleted file mode 100644 index 719fb05..0000000 --- a/test/test_ParallelQueries.js +++ /dev/null @@ -1,100 +0,0 @@ -exports['test_ParallelQueries'] = function (test) { - var CUBRID = require('../'), - testSetup = require('./testSetup/test_Setup'), - Helpers = CUBRID.Helpers, - Result2Array = CUBRID.Result2Array; - - test.expect(0); - Helpers.logInfo(module.filename.toString() + ' started...'); - - function fork(async_calls) { - for (var i = 0; i < async_calls.length; i++) { - async_calls[i](); - } - - setTimeout(function () { - Helpers.logInfo('Test passed.'); - test.done(); - }, 3000); - } - - function A() { - Helpers.logInfo('Function A called.'); - Helpers.logInfo('Connecting... [A].'); - - var client = testSetup.createDefaultCUBRIDDemodbConnection(); - - client.connect(function (err) { - if (err) { - throw err; - } else { - Helpers.logInfo('Connected [A], on port: ' + client.connectionBrokerPort); - setTimeout(function () { - client.query('select * from nation', function (err, result, queryHandle) { - Helpers.logInfo('Querying [A]: select * from nation'); - if (err) { - throw err; - } else { - Helpers.logInfo('Query result rows count [A]: ' + Result2Array.TotalRowsCount(result)); - client.closeQuery(queryHandle, function (err) { - if (err) { - throw err; - } else { - Helpers.logInfo('Query closed [A].'); - client.close(function (err) { - if (err) { - throw err; - } else { - Helpers.logInfo('Connection closed [A].'); - } - }); - } - }); - } - }); - }, 3000); - } - }); - } - - function B() { - Helpers.logInfo('Function B called.'); - var client2 = testSetup.createDefaultCUBRIDDemodbConnection(); - Helpers.logInfo('Connecting... [B].'); - client2.connect(function (err) { - if (err) { - throw err; - } else { - Helpers.logInfo('Connected [B], on port: ' + client2.connectionBrokerPort); - client2.query('select * from game', function (err, result, queryHandle) { - Helpers.logInfo('Querying [B]: select * from game'); - if (err) { - throw err; - } else { - Helpers.logInfo('Query result rows count [B]: ' + Result2Array.TotalRowsCount(result)); - client2.closeQuery(queryHandle, function (err) { - if (err) { - throw err; - } else { - Helpers.logInfo('Query closed [B].'); - client2.close(function (err) { - if (err) { - throw err; - } else { - Helpers.logInfo('Connection closed [B].'); - } - }); - } - }); - } - }); - } - }); - } - - function C() { - Helpers.logInfo('Function C called.'); - } - - fork([A, B, C]); -}; diff --git a/test/test_ParallelQueries_2.js b/test/test_ParallelQueries_2.js deleted file mode 100644 index add38b1..0000000 --- a/test/test_ParallelQueries_2.js +++ /dev/null @@ -1,94 +0,0 @@ -exports['test_ParallelQueries_2'] = function (test) { - var CUBRID = require('../'), - Helpers = CUBRID.Helpers, - Result2Array = CUBRID.Result2Array, - testSetup = require('./testSetup/test_Setup'), - // First connection - client = testSetup.createDefaultCUBRIDDemodbConnection(), - // Second connection - client2 = testSetup.createDefaultCUBRIDDemodbConnection(); - - test.expect(0); - - Helpers.logInfo(module.filename.toString() + ' started...'); - - function A() { - Helpers.logInfo('Function A called.'); - Helpers.logInfo('Connecting... [A].'); - client.connect(function (err) { - if (err) { - throw err; - } else { - Helpers.logInfo('Connected [A], on port: ' + client.connectionBrokerPort); - setTimeout(function () { - Helpers.logInfo('setTimeout is triggered. Executing client.query()'); - - client.query('select * from nation', function (err, result, queryHandle) { - Helpers.logInfo('Querying [A]: select * from nation'); - if (err) { - throw err; - } else { - Helpers.logInfo('Query result rows count [A]: ' + Result2Array.TotalRowsCount(result)); - client.closeQuery(queryHandle, function (err) { - if (err) { - throw err; - } else { - Helpers.logInfo('Query closed [A].'); - client.close(function (err) { - if (err) { - throw err; - } else { - Helpers.logInfo('Connection closed [A].'); - } - }); - } - }); - } - }); - }, 3000); - } - }); - } - - function B() { - Helpers.logInfo('Function B called.'); - Helpers.logInfo('Connecting... [B].'); - client2.connect(function (err) { - if (err) { - throw err; - } else { - Helpers.logInfo('Connected [B], on port: ' + client2.connectionBrokerPort); - client2.query('select * from game', function (err, result, queryHandle) { - Helpers.logInfo('Querying [B]: select * from game'); - if (err) { - throw err; - } else { - Helpers.logInfo('Query result rows count [B]: ' + Result2Array.TotalRowsCount(result)); - client2.closeQuery(queryHandle, function (err) { - if (err) { - throw err; - } else { - Helpers.logInfo('Query closed [B].'); - client2.close(function (err) { - if (err) { - throw err; - } else { - Helpers.logInfo('Connection closed [B].'); - } - }); - } - }); - } - }); - } - }); - } - - A(); - B(); - - setTimeout(function () { - Helpers.logInfo('Test passed.'); - test.done(); - }, 5000); -}; diff --git a/test/test_ParallelQueries_3.js b/test/test_ParallelQueries_3.js deleted file mode 100644 index e217f5c..0000000 --- a/test/test_ParallelQueries_3.js +++ /dev/null @@ -1,67 +0,0 @@ -exports['test_ParallelQueries_3'] = function (test) { - var CUBRID = require('../'), - testSetup = require('./testSetup/test_Setup'), - Helpers = CUBRID.Helpers, - Result2Array = CUBRID.Result2Array; - - test.expect(0); - Helpers.logInfo(module.filename.toString() + ' started...'); - - var executed = 0; - - function errorHandler(err) { - throw err.message; - } - - function RunQueryInSeparateConnection(i) { - setTimeout(function () { - Helpers.logInfo('Opening connecting no. ' + i + '...'); - var client = require('./testSetup/test_Setup').createDefaultCUBRIDDemodbConnection(); - - client.connect(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connection no. ' + i + ' was opened on port: ' + client.connectionBrokerPort); - - client.query('select * from nation', function (err, result, queryHandle) { - Helpers.logInfo('On connection no. ' + i + ' we are executing query: select * from nation'); - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('On connection no. ' + i + ' we got query result rows count: ' + Result2Array.TotalRowsCount(result)); - client.closeQuery(queryHandle, function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Query closed for connection no. ' + i + '.'); - - client.close(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connection no. ' + i + ' was closed.'); - executed++; - Helpers.logInfo('Functions completed: ' + executed + ' out of 10 scheduled.'); - } - }); - } - }); - } - }); - } - }); - }, Math.random() * 1000); - } - - Helpers.logInfo('Please wait 10 sec. for the test to complete...'); - setTimeout(function () { - Helpers.logInfo('Test passed.'); - test.done(); - }, 10000); - - // Open 10 connections and for each, execute a query - for (var i = 1; i <= 10; ++i) { - RunQueryInSeparateConnection(i); - } -}; diff --git a/test/test_PrepareExecuteOldProtocolPacket.js b/test/test_PrepareExecuteOldProtocolPacket.js index ea6401a..37df7b6 100644 --- a/test/test_PrepareExecuteOldProtocolPacket.js +++ b/test/test_PrepareExecuteOldProtocolPacket.js @@ -2,7 +2,7 @@ exports['test_PrepareExecuteOldProtocolPacket'] = function (test) { var codeCoveragePath = process.env.CODE_COV ? '-cov' : '', PacketReader = require('../src' + codeCoveragePath + '/packets/PacketReader'), PacketWriter = require('../src' + codeCoveragePath + '/packets/PacketWriter'), - PrepareExecuteOldProtocolPacket = require('../src' + codeCoveragePath + '/packets/PrepareExecuteOldProtocolPacket'), + PrepareExecutePacket = require('../src' + codeCoveragePath + '/packets/PrepareExecutePacket'), CAS = require('../src' + codeCoveragePath + '/constants/CASConstants'); test.expect(48); @@ -14,11 +14,11 @@ exports['test_PrepareExecuteOldProtocolPacket'] = function (test) { paramValues : {}, paramTypes : {} }, - prepareExecuteOldProtocolPacket = new PrepareExecuteOldProtocolPacket(options), + prepareExecutePacket = new PrepareExecutePacket(options), packetReader = new PacketReader(), - packetWriter = new PacketWriter(prepareExecuteOldProtocolPacket.getPrepareBufferLength()); + packetWriter = new PacketWriter(prepareExecutePacket.getPrepareBufferLength()); - prepareExecuteOldProtocolPacket.writePrepare(packetWriter); + prepareExecutePacket.writePrepare(packetWriter); test.equal(packetWriter._toBuffer()[3], 34); // Total length test.equal(packetWriter._toBuffer()[4], 0); // Casinfo @@ -40,30 +40,30 @@ exports['test_PrepareExecuteOldProtocolPacket'] = function (test) { 6, 0, 0, 0, 7, 102, 95, 110, 97, 109, 101, 0, 0, 0, 0, 1, 0, 0, 0, 0, 5, 99, 111, 100, 101, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0])); - prepareExecuteOldProtocolPacket.parsePrepare(packetReader); - test.equal(prepareExecuteOldProtocolPacket.queryHandle, 1); - test.equal(prepareExecuteOldProtocolPacket.resultCacheLifetime, -1); - test.equal(prepareExecuteOldProtocolPacket.statementType, 21); - test.equal(prepareExecuteOldProtocolPacket.bindCount, 0); - test.equal(prepareExecuteOldProtocolPacket.isUpdatable, false); - test.equal(prepareExecuteOldProtocolPacket.infoArray[0].ColumnType, 1); - test.equal(prepareExecuteOldProtocolPacket.infoArray[0].Scale, -1); - test.equal(prepareExecuteOldProtocolPacket.infoArray[0].Name, "s_name"); - test.equal(prepareExecuteOldProtocolPacket.infoArray[0].RealName, ""); - test.equal(prepareExecuteOldProtocolPacket.infoArray[0].TableName, "code"); - test.equal(prepareExecuteOldProtocolPacket.infoArray[0].IsNullable, false); - test.equal(prepareExecuteOldProtocolPacket.infoArray[0].DafaultValue, ""); - test.equal(prepareExecuteOldProtocolPacket.infoArray[0].IsAutoIncrement, false); - test.equal(prepareExecuteOldProtocolPacket.infoArray[0].IsUniqueKey, false); - test.equal(prepareExecuteOldProtocolPacket.infoArray[0].IsPrimaryKey, false); - test.equal(prepareExecuteOldProtocolPacket.infoArray[0].IsReverseIndex, false); - test.equal(prepareExecuteOldProtocolPacket.infoArray[0].IsReverseUnique, false); - test.equal(prepareExecuteOldProtocolPacket.infoArray[0].IsForeignKey, false); - test.equal(prepareExecuteOldProtocolPacket.infoArray[0].IsShared, false); + prepareExecutePacket.parsePrepare(packetReader); + test.equal(prepareExecutePacket.queryHandle, 1); + test.equal(prepareExecutePacket.resultCacheLifetime, -1); + test.equal(prepareExecutePacket.statementType, 21); + test.equal(prepareExecutePacket.bindCount, 0); + test.equal(prepareExecutePacket.isUpdatable, false); + test.equal(prepareExecutePacket.infoArray[0].ColumnType, 1); + test.equal(prepareExecutePacket.infoArray[0].Scale, -1); + test.equal(prepareExecutePacket.infoArray[0].Name, "s_name"); + test.equal(prepareExecutePacket.infoArray[0].RealName, ""); + test.equal(prepareExecutePacket.infoArray[0].TableName, "code"); + test.equal(prepareExecutePacket.infoArray[0].IsNullable, false); + test.equal(prepareExecutePacket.infoArray[0].DafaultValue, ""); + test.equal(prepareExecutePacket.infoArray[0].IsAutoIncrement, false); + test.equal(prepareExecutePacket.infoArray[0].IsUniqueKey, false); + test.equal(prepareExecutePacket.infoArray[0].IsPrimaryKey, false); + test.equal(prepareExecutePacket.infoArray[0].IsReverseIndex, false); + test.equal(prepareExecutePacket.infoArray[0].IsReverseUnique, false); + test.equal(prepareExecutePacket.infoArray[0].IsForeignKey, false); + test.equal(prepareExecutePacket.infoArray[0].IsShared, false); packetReader = new PacketReader(); - packetWriter = new PacketWriter(prepareExecuteOldProtocolPacket.getExecuteBufferLength()); - prepareExecuteOldProtocolPacket.writeExecute(packetWriter); + packetWriter = new PacketWriter(prepareExecutePacket.getExecuteBufferLength()); + prepareExecutePacket.writeExecute(packetWriter); test.equal(packetWriter._toBuffer()[3], 69); // Total length test.equal(packetWriter._toBuffer()[4], 1); // Casinfo @@ -92,7 +92,7 @@ exports['test_PrepareExecuteOldProtocolPacket'] = function (test) { 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 83, 0, 0, 0, 0, 7, 83, 105, 108, 118, 101, 114, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 71, 0, 0, 0, 0, 5, 71, 111, 108, 100, 0])); - var resultSet = prepareExecuteOldProtocolPacket.parseExecute(packetReader).resultSet; + var resultSet = prepareExecutePacket.parseExecute(packetReader).resultSet; test.equal(resultSet, '{"ColumnNames":["s_name","f_name"],"ColumnDataTypes":["Char","String"],"RowsCount":6,"ColumnValues":[["X","Mixed"],["W","Woman"],["M","Man"],["B","Bronze"],["S","Silver"],["G","Gold"]]}'); test.done(); diff --git a/test/test_QueriesQueue.js b/test/test_QueriesQueue.js deleted file mode 100644 index 82d6332..0000000 --- a/test/test_QueriesQueue.js +++ /dev/null @@ -1,123 +0,0 @@ -exports['test_QueriesQueue'] = function (test) { - var CUBRID = require('../'), - client = require('./testSetup/test_Setup').createDefaultCUBRIDDemodbConnection(), - Helpers = CUBRID.Helpers, - Result2Array = CUBRID.Result2Array, - SQL_A = 'SELECT * from nation', - SQL_B = 'SELECT * from code', - SQL_C = 'SELECT * from game'; - - test.expect(8); - Helpers.logInfo(module.filename.toString() + ' started...'); - client.connect(function (err) { - if (err) { - throw err; - } else { - Helpers.logInfo('Connection opened...'); - client.addQuery(SQL_A, function (err, result, queryHandle) { - if (err) { - throw err; - } else { - Helpers.logInfo(SQL_A + ' executed! - handle: ' + queryHandle); - var arr = Result2Array.RowsArray(result); - test.ok(arr.length === 215); - test.ok(arr[0].toString() === 'SRB,Serbia,Europe,Beograd'); - client.fetch(queryHandle, function (err, result, handle) { - if (err) { - throw err; - } else { - Helpers.logInfo('Fetch executed for queryHandle ' + queryHandle); - if (result !== null) { - Helpers.logInfo('Fetch results - first row: ' + queryHandle + ': ' + arr[0]); - } else { - Helpers.logInfo('There was no data to fetch.'); - } - client.closeQuery(handle, function (err) { - if (err) { - throw err; - } else { - Helpers.logInfo(SQL_A + ' closed!'); - } - }); - } - }); - } - }); - - client.addQuery(SQL_B, function (err, result, queryHandle) { - if (err) { - throw err; - } else { - Helpers.logInfo(SQL_B + ' executed! - handle: ' + queryHandle); - var arr = Result2Array.RowsArray(result); - test.ok(arr.length === 6); - test.ok(arr[0].toString() === 'X,Mixed'); - client.fetch(queryHandle, function (err, result, handle) { - if (err) { - throw err; - } else { - Helpers.logInfo('Fetch executed for queryHandle ' + queryHandle); - if (result !== null) { - Helpers.logInfo('Fetch results - first row: ' + queryHandle + ': ' + arr[0]); - } else { - Helpers.logInfo('There was no data to fetch.'); - } - client.closeQuery(handle, function (err) { - if (err) { - throw err; - } else { - Helpers.logInfo(SQL_B + ' closed!'); - } - }); - } - }); - } - }); - - client.addQuery(SQL_C, function (err, result, queryHandle) { - if (err) { - throw err; - } else { - Helpers.logInfo(SQL_C + ' executed! - handle: ' + queryHandle); - var arr = Result2Array.RowsArray(result); - test.ok(arr.length === 235); - test.ok(arr[0].toString() === '2004,20021,14345,30116,NGR,B,2004-08-28T00:00:00.000Z'); - client.fetch(queryHandle, function (err, result, handle) { - if (err) { - throw err; - } else { - Helpers.logInfo('Fetch executed for queryHandle ' + queryHandle); - if (result !== null) { - var arr = Result2Array.RowsArray(result); - Helpers.logInfo('Fetch results - first row: ' + queryHandle + ': ' + arr[0]); - test.ok(arr.length === 241); - test.ok(arr[0].toString() === '2004,20317,14375,30124,GRE,S,2004-08-26T00:00:00.000Z'); - } else { - Helpers.logInfo('There was no data to fetch.'); - } - client.closeQuery(handle, function (err) { - if (err) { - throw err; - } else { - Helpers.logInfo(SQL_C + ' closed!'); - } - }); - } - }); - } - }); - - setTimeout(function () { - client.close(function (err) { - if (err) { - throw err; - } else { - Helpers.logInfo('Connection closed...'); - Helpers.logInfo('Test passed.'); - test.done(); - } - }); - }, 5000); - } - }); -}; diff --git a/test/test_QueriesQueue_Events.js b/test/test_QueriesQueue_Events.js deleted file mode 100644 index a15fe7b..0000000 --- a/test/test_QueriesQueue_Events.js +++ /dev/null @@ -1,76 +0,0 @@ -var path = require('path'); - -exports[path.basename(__filename)] = function (test) { - var CUBRID = require('../'), - client = require('./testSetup/test_Setup').createDefaultCUBRIDDemodbConnection(), - Helpers = CUBRID.Helpers, - Result2Array = CUBRID.Result2Array, - SQL_A = 'SELECT * from nation', - SQL_B = 'SELECT * from code', - SQL_C = 'SELECT * from game'; - - test.expect(6); - Helpers.logInfo(module.filename.toString() + ' started...'); - client.connect(); - - client.on(client.EVENT_ERROR, function (err) { - Helpers.logError('Error!: ' + err.message); - throw err; - }); - - client.on(client.EVENT_CONNECTED, function () { - Helpers.logInfo('Connected.'); - client.addQuery(SQL_A, null); - client.addQuery(SQL_B, null); - client.addQuery(SQL_C, null); - }); - - client.on(client.EVENT_QUERY_DATA_AVAILABLE, function (result, queryHandle, sql) { - Helpers.logInfo('Executed! - handle: ' + queryHandle); - var arr = Result2Array.RowsArray(result); - Helpers.logInfo('Fetch results - first row: ' + queryHandle + ': ' + arr[0]); - switch (sql) { - case SQL_A: - test.ok(arr.length === 215); - test.ok(arr[0].toString() === 'SRB,Serbia,Europe,Beograd'); - break; - case SQL_B: - test.ok(Result2Array.TotalRowsCount(result) === 6); - test.ok(arr[0].toString() === 'X,Mixed'); - break; - case SQL_C: - test.ok(arr.length === 235); - test.ok(arr[0].toString() === '2004,20021,14345,30116,NGR,B,2004-08-28T00:00:00.000Z'); - } - client.fetch(queryHandle, null); - }); - - client.on(client.EVENT_FETCH_DATA_AVAILABLE, function (result, queryHandle) { - Helpers.logInfo('Fetch executed for queryHandle: ' + queryHandle); - var arr = Result2Array.RowsArray(result); - Helpers.logInfo('Fetch results - first row: ' + queryHandle + ': ' + arr[0]); - client.closeQuery(queryHandle, null); - }); - - client.on(client.EVENT_FETCH_NO_MORE_DATA_AVAILABLE, function (queryHandle) { - Helpers.logInfo('Fetch executed for queryHandle: ' + queryHandle); - Helpers.logInfo('There is no more data to fetch.'); - client.closeQuery(queryHandle, null); - }); - - client.on(client.EVENT_QUERY_CLOSED, function (queryHandle) { - Helpers.logInfo(queryHandle + ' was closed!'); - if (client.queriesQueueIsEmpty()) { - setTimeout(function () { - client.close(); - }, 1000); - } - }); - - client.on(client.EVENT_CONNECTION_CLOSED, function () { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - client.removeAllListeners(); - test.done(); - }); -}; diff --git a/test/test_QueriesQueue_Mixed.js b/test/test_QueriesQueue_Mixed.js deleted file mode 100644 index 2e40375..0000000 --- a/test/test_QueriesQueue_Mixed.js +++ /dev/null @@ -1,66 +0,0 @@ -exports['test_QueriesQueue_Mixed'] = function (test) { - var CUBRID = require('../'), - client = require('./testSetup/test_Setup').createDefaultCUBRIDDemodbConnection(), - Helpers = CUBRID.Helpers, - Result2Array = CUBRID.Result2Array, - SQL_DELETE = 'DELETE FROM [code] WHERE s_name = \'A\'', - SQL_INSERT = 'INSERT INTO [code] VALUES(\'A\', \'ABC\')', - SQL_COUNT = 'SELECT COUNT(*) from [code]'; - - test.expect(3); - Helpers.logInfo(module.filename.toString() + ' started...'); - client.connect(function (err) { - if (err) { - throw err; - } else { - Helpers.logInfo('Connection opened...'); - - Helpers.logInfo('Queue-ing: ' + SQL_DELETE); - client.addNonQuery(SQL_DELETE, function (err) { - if (err) { - throw err; - } else { - Helpers.logInfo(SQL_DELETE + ' executed.'); - } - }); - - Helpers.logInfo('Queue-ing: ' + SQL_INSERT); - client.addNonQuery(SQL_INSERT, function (err) { - if (err) { - throw err; - } else { - Helpers.logInfo(SQL_INSERT + ' executed.'); - } - }); - - Helpers.logInfo('Queue-ing: ' + SQL_COUNT); - client.addQuery(SQL_COUNT, function (err, result) { - if (err) { - throw err; - } else { - Helpers.logInfo(SQL_COUNT + ' executed.'); - Helpers.logInfo('Table rows count: ' + Result2Array.TotalRowsCount(result)); - var arr = Result2Array.RowsArray(result); - test.ok(arr.length === 1); - test.ok(arr[0][0] === 7); - } - }); - - Helpers.logInfo('Executing: ' + SQL_DELETE); - client.addNonQuery(SQL_DELETE, null); - client.addQuery(SQL_COUNT, function (err, result) { - if (err) { - throw err; - } else { - var arr = Result2Array.RowsArray(result); - test.ok(arr[0][0] === 6); - client.close(function () { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - test.done(); - }); - } - }); - } - }); -}; diff --git a/test/test_QueriesQueue_MultiFetch.js b/test/test_QueriesQueue_MultiFetch.js deleted file mode 100644 index f199269..0000000 --- a/test/test_QueriesQueue_MultiFetch.js +++ /dev/null @@ -1,178 +0,0 @@ -exports['test_QueriesQueue_MultiFetch'] = function (test) { - var CUBRID = require('../'), - client = require('./testSetup/test_Setup').createDefaultCUBRIDDemodbConnection(), - Helpers = CUBRID.Helpers, - ActionQueue = CUBRID.ActionQueue, - Result2Array = CUBRID.Result2Array, - SQL_A = 'SELECT * from event', - SQL_B = 'SELECT * from game', - SQL_C = 'SELECT * from participant', - SQL_A_fetchResult, SQL_B_fetchResult, SQL_C_fetchResult; - - test.expect(6); - Helpers.logInfo(module.filename.toString() + ' started...'); - - client.connect(function (err) { - if (err) { - throw err; - } else { - Helpers.logInfo('Connection opened...'); - - client.addQuery(SQL_A, function (err, result, queryHandle) { - if (err) { - throw err; - } else { - Helpers.logInfo(SQL_A + ' executed! - handle: ' + queryHandle); - - var arr = Result2Array.RowsArray(result); - - test.ok(Result2Array.TotalRowsCount(result) === 422); - test.ok(arr[0].toString() === '20421,Wrestling,Greco-Roman 97kg,M,1'); - - ActionQueue.while( - function () { - return SQL_A_fetchResult !== null; - }, - function (callback) { - client.fetch(queryHandle, function (err, result) { - if (err) { - throw err; - } else { - if (result !== null) { - Helpers.logInfo('Fetch executed for queryHandle ' + queryHandle); - var arr = Result2Array.RowsArray(result); - Helpers.logInfo('Fetch results - first row: ' + queryHandle + ': ' + arr[0]); - } else { - Helpers.logInfo('There is no more data to fetch.'); - } - SQL_A_fetchResult = result; - callback.call(err); - } - }); - }, - function (err) { - if (err) { - throw err; - } else { - client.closeQuery(queryHandle, function (err) { - if (err) { - throw err; - } else { - Helpers.logInfo('Query closed.'); - } - }); - } - } - ); - } - }); - - client.addQuery(SQL_B, function (err, result, queryHandle) { - if (err) { - throw err; - } else { - Helpers.logInfo(SQL_B + ' executed! - handle: ' + queryHandle); - - var arr = Result2Array.RowsArray(result); - - test.ok(arr.length === 235); - test.ok(arr[0].toString() === '2004,20021,14345,30116,NGR,B,2004-08-28T00:00:00.000Z'); - - ActionQueue.while( - function () { - return SQL_B_fetchResult !== null; - }, - function (callback) { - client.fetch(queryHandle, function (err, result) { - if (err) { - throw err; - } else { - if (result !== null) { - Helpers.logInfo('Fetch executed for queryHandle ' + queryHandle); - var arr = Result2Array.RowsArray(result); - Helpers.logInfo('Fetch results - first row: ' + queryHandle + ': ' + arr[0]); - } else { - Helpers.logInfo('There is no more data to fetch.'); - } - SQL_B_fetchResult = result; - callback.call(err); - } - }); - }, - function (err) { - if (err) { - throw err; - } else { - client.closeQuery(queryHandle, function (err) { - if (err) { - throw err; - } else { - Helpers.logInfo('Query closed.'); - } - }); - } - } - ); - } - }); - - client.addQuery(SQL_C, function (err, result, queryHandle) { - if (err) { - throw err; - } else { - Helpers.logInfo(SQL_C + ' executed! - handle: ' + queryHandle); - var arr = Result2Array.RowsArray(result); - test.ok(arr.length === 309); - test.ok(arr[0].toString() === '2004,ZAM,0,0,0'); - ActionQueue.while( - function () { - return SQL_C_fetchResult !== null; - }, - function (callback) { - client.fetch(queryHandle, function (err, result) { - if (err) { - throw err; - } else { - if (result !== null) { - Helpers.logInfo('Fetch executed for queryHandle ' + queryHandle); - var arr = Result2Array.RowsArray(result); - Helpers.logInfo('Fetch results - first row: ' + queryHandle + ': ' + arr[0]); - } else { - Helpers.logInfo('There is no more data to fetch.'); - } - SQL_C_fetchResult = result; - callback.call(err); - } - }); - }, - function (err) { - if (err) { - throw err; - } else { - client.closeQuery(queryHandle, function (err) { - if (err) { - throw err; - } else { - Helpers.logInfo('Query closed.'); - } - }); - } - } - ); - } - }); - - setTimeout(function () { - client.close(function (err) { - if (err) { - throw err; - } else { - Helpers.logInfo('Connection closed...'); - Helpers.logInfo('Test passed.'); - test.done(); - } - }); - }, 5000); - } - }); -}; diff --git a/test/test_QueryCollision_01.js b/test/test_QueryCollision_01.js deleted file mode 100644 index ac27939..0000000 --- a/test/test_QueryCollision_01.js +++ /dev/null @@ -1,53 +0,0 @@ -var path = require('path'); - -exports[path.basename(__filename)] = function (test) { - var CUBRID = require('../'), - client = require('./testSetup/test_Setup').createDefaultCUBRIDDemodbConnection(), - Helpers = CUBRID.Helpers; - - test.expect(10); - Helpers.logInfo(module.filename.toString() + ' started...'); - - test.ok(client.connectionPending === false); - test.ok(client.connectionOpened === false); - - client.connect(function () { - test.ok(client.connectionPending === false); - test.ok(client.connectionOpened === true); - - Helpers.logInfo('Executing first query...'); - client.query('select * from nation', function () { - Helpers.logInfo('First query call completed.'); - test.ok(client.connectionPending === false); - test.ok(client.connectionOpened === true); - - Helpers.logInfo('Executing second query...'); - client.query('select * from nation', function () { - }); - }); - - // Close the connection; this will close also the active query status - setTimeout(function () { - test.ok(client.connectionPending === false); - test.ok(client.connectionOpened === true); - - client.close(function () { - }); - }, 2000); - }); - - client.on(client.EVENT_CONNECTED, function () { - Helpers.logInfo('Connected.'); - }); - - client.on(client.EVENT_CONNECTION_CLOSED, function () { - Helpers.logInfo('Connection closed.'); - test.ok(client.connectionPending === false); - test.ok(client.connectionOpened === false); - Helpers.logInfo('Test passed.'); - client.removeAllListeners(); - test.done(); - }); -}; - - diff --git a/test/test_QueryCollision_02.js b/test/test_QueryCollision_02.js deleted file mode 100644 index 04933f6..0000000 --- a/test/test_QueryCollision_02.js +++ /dev/null @@ -1,72 +0,0 @@ -var path = require('path'), - Util = require('util'); - -exports[path.basename(__filename)] = function (test) { - var CUBRID = require('../'), - client = require('./testSetup/test_Setup').createDefaultCUBRIDDemodbConnection(), - EventEmitter = require('events').EventEmitter, - Helpers = CUBRID.Helpers, - Result2Array = CUBRID.Result2Array; - - test.expect(2); - Helpers.logInfo(module.filename.toString() + ' started...'); - - var getSingleValue = function (sql, client) { - this.sql = sql; - this.client = client; - - EventEmitter.call(this); - }; - - Util.inherits(getSingleValue, EventEmitter); - - getSingleValue.prototype.run = function () { - var self = this; - - this.client.query(this.sql, function (err, result, queryHandle) { - if (err) { - self.emit('error', err); - } else { - self.client.closeQuery(queryHandle, function (err) { - if (err) { - self.emit('error', err); - } else { - self.emit('done', Result2Array.RowsArray(result)[0][0]); - } - }); - } - }); - }; - - var getMyValue = new getSingleValue('select count(*) from game', client); - - getMyValue.on('error', function (err) { - Helpers.logInfo(err.message); - throw err; - }); - - getMyValue.on('done', function (result) { - test.ok(result === 8653); - - Helpers.logInfo('Test 1 passed.'); - }); - - var getMyValue2 = new getSingleValue('select wrong_count(*) from game', client); - - getMyValue2.on('error', function (err) { - if (client.getEngineVersion().startsWith('8.4')) { - test.ok(err.message === "-493:Syntax: syntax error, unexpected '*' "); - } else { - test.ok(err.message === "-493:Syntax: In line 1, column 20 before ') from game'\nSyntax error: unexpected '*', expecting SELECT or VALUE or VALUES or '(' "); - } - - Helpers.logInfo('Test 2 passed.'); - - client.close(function () { - test.done(); - }); - }); - - getMyValue.run(); - getMyValue2.run(); -}; diff --git a/test/test_QueryOldProtocol.js b/test/test_QueryOldProtocol.js deleted file mode 100644 index 0e88ed5..0000000 --- a/test/test_QueryOldProtocol.js +++ /dev/null @@ -1,64 +0,0 @@ -exports['test_QueryOldProtocol'] = function (test) { - var CUBRID = require('../'), - client = require('./testSetup/test_Setup').createDefaultCUBRIDDemodbConnection(), - Helpers = CUBRID.Helpers, - Result2Array = CUBRID.Result2Array; - - function errorHandler(err) { - throw err.message; - } - - test.expect(4); - Helpers.logInfo(module.filename.toString() + ' started...'); - - client.connect(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connected.'); - - client.setEnforceOldQueryProtocol(true); - - Helpers.logInfo('Querying: select * from nation'); - - client.query('select * from nation', function (err, result, queryHandle) { - if (err) { - errorHandler(err); - } else { - test.ok(Result2Array.TotalRowsCount(result) === 215); - - Helpers.logInfo('Query result rows count: ' + Result2Array.TotalRowsCount(result)); - - var arr = Result2Array.RowsArray(result); - - test.ok(arr.length === 215); - test.ok(arr[0].toString() === 'SRB,Serbia,Europe,Beograd'); - test.ok(arr[arr.length - 1].toString() === 'AFG,Afghanistan,Asia,Kabul'); - - for (var j = 0; j < 1; ++j) { - Helpers.logInfo(arr[j].toString()); - } - - client.closeQuery(queryHandle, function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Query closed.'); - - client.close(function (err) { - if (err) { - errorHandler(err); - } else { - client.setEnforceOldQueryProtocol(false); - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - test.done(); - } - }); - } - }); - } - }); - } - }); -}; diff --git a/test/test_QueryWithParams.js b/test/test_QueryWithParams.js index 121cc18..12098b2 100644 --- a/test/test_QueryWithParams.js +++ b/test/test_QueryWithParams.js @@ -1,6 +1,6 @@ exports['test_QueryWithParams'] = function (test) { var CUBRID = require('../'), - client = require('./testSetup/test_Setup').createDefaultCUBRIDDemodbConnection(), + client = require('./testSetup').createDefaultCUBRIDDemodbConnection(), Helpers = CUBRID.Helpers, Result2Array = CUBRID.Result2Array; diff --git a/test/test_QueryWithParams_2.js b/test/test_QueryWithParams_2.js index 46b931c..4e7fb71 100644 --- a/test/test_QueryWithParams_2.js +++ b/test/test_QueryWithParams_2.js @@ -1,26 +1,26 @@ var CUBRID = require('../'), - client = require('./testSetup/test_Setup').createDefaultCUBRIDDemodbConnection(), - Helpers = CUBRID.Helpers, - Result2Array = CUBRID.Result2Array, - sql = 'SELECT * FROM ? WHERE ? LIKE ? AND LENGTH(?) > ?', - arrValues = ['nation', 'code', 'A%', 'capital', '5']; + client = require('./testSetup').createDefaultCUBRIDDemodbConnection(), + Helpers = CUBRID.Helpers, + Result2Array = CUBRID.Result2Array, + sql = 'SELECT * FROM ? WHERE ? LIKE ? AND LENGTH(?) > ?', + arrValues = ['nation', 'code', 'A%', 'capital', '5']; exports['queryWithParams with defined arrValues and arrDelimiters'] = function (test) { - var arrDelimiters = ['`', '', '\'', '', '']; + var arrDelimiters = ['`', '', '\'', '', '']; - test.expect(1); + test.expect(1); Helpers.logInfo(module.filename.toString() + ' started...'); client.connect(function (err) { if (err) { - throw err; + throw err; } else { Helpers.logInfo('Connected.'); Helpers.logInfo('Querying: ' + sql); - client.queryWithParams(sql, arrValues, arrDelimiters, function (err, result, queryHandle) { + client.queryWithParams(sql, arrValues, arrDelimiters, function (err, result, queryHandle) { if (err) { - throw err; + throw err; } else { Helpers.logInfo('Query result rows count: ' + Result2Array.TotalRowsCount(result)); @@ -28,12 +28,12 @@ exports['queryWithParams with defined arrValues and arrDelimiters'] = function ( client.closeQuery(queryHandle, function (err) { if (err) { - throw err; + throw err; } else { Helpers.logInfo('Query closed.'); client.close(function (err) { if (err) { - throw err; + throw err; } else { Helpers.logInfo('Connection closed.'); Helpers.logInfo('Test passed.'); @@ -49,23 +49,23 @@ exports['queryWithParams with defined arrValues and arrDelimiters'] = function ( } exports['queryWithParams with defined arrValues but partially defined arrDelimiters (missing delimiters for strings and numbers)'] = function (test) { - var // Intentionally omitted the last delimiter. node-cubrid should - // automatically set it as single quotes. - arrDelimiters = ['`', '', '\'', '']; + var // Intentionally omitted the last delimiter. node-cubrid should + // automatically set it as single quotes. + arrDelimiters = ['`', '', '\'', '']; - test.expect(1); + test.expect(1); Helpers.logInfo(module.filename.toString() + ' started...'); client.connect(function (err) { if (err) { - throw err; + throw err; } else { Helpers.logInfo('Connected.'); Helpers.logInfo('Querying: ' + sql); - client.queryWithParams(sql, arrValues, arrDelimiters, function (err, result, queryHandle) { + client.queryWithParams(sql, arrValues, arrDelimiters, function (err, result, queryHandle) { if (err) { - throw err; + throw err; } else { Helpers.logInfo('Query result rows count: ' + Result2Array.TotalRowsCount(result)); @@ -73,12 +73,12 @@ exports['queryWithParams with defined arrValues but partially defined arrDelimit client.closeQuery(queryHandle, function (err) { if (err) { - throw err; + throw err; } else { Helpers.logInfo('Query closed.'); client.close(function (err) { if (err) { - throw err; + throw err; } else { Helpers.logInfo('Connection closed.'); Helpers.logInfo('Test passed.'); diff --git a/test/test_QueryWithTypedParams.js b/test/test_QueryWithTypedParams.js index 2ac5255..f60b6ed 100644 --- a/test/test_QueryWithTypedParams.js +++ b/test/test_QueryWithTypedParams.js @@ -1,6 +1,6 @@ exports['test_QueryWithTypedParams'] = function (test) { var CUBRID = require('../'), - client = require('./testSetup/test_Setup').createDefaultCUBRIDDemodbConnection(), + client = require('./testSetup').createDefaultCUBRIDDemodbConnection(), Helpers = CUBRID.Helpers, Result2Array = CUBRID.Result2Array, sql = 'select * from nation where continent = ?', diff --git a/test/test_Rollback.js b/test/test_Rollback.js deleted file mode 100644 index 62ec25f..0000000 --- a/test/test_Rollback.js +++ /dev/null @@ -1,74 +0,0 @@ -exports['test_Rollback'] = function (test) { - var CUBRID = require('../'), - client = require('./testSetup/test_Setup').createDefaultCUBRIDDemodbConnection(), - Helpers = CUBRID.Helpers, - Result2Array = CUBRID.Result2Array; - - function errorHandler(err) { - throw err.message; - } - - test.expect(1); - Helpers.logInfo(module.filename.toString() + ' started...'); - - client.connect(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connection connected'); - client.batchExecuteNoQuery(['drop table if exists node_test', 'create table node_test(id int)'], function (err) { - if (err) { - errorHandler(err); - } else { - client.setAutoCommitMode(false, function (err) { - if (err) { - errorHandler(err); - } else { - client.batchExecuteNoQuery(['insert into node_test values(1)'], function (err) { - if (err) { - errorHandler(err); - } else { - client.rollback(function (err) { - if (err) { - errorHandler(err); - } else { - client.query('select * from node_test', function (err, result) { - if (err) { - errorHandler(err); - } else { - test.ok(Result2Array.TotalRowsCount(result) !== 1, 'Didn\'t rollback!!!'); - - client.setAutoCommitMode(true, function (err) { - if (err) { - errorHandler(err); - } else { - client.batchExecuteNoQuery(['drop table node_test'], function (err) { - if (err) { - errorHandler(err); - } else { - client.close(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - test.done(); - } - }); - } - }); - } - }); - } - }); - } - }); - } - }); - } - }); - } - }); - } - }); -}; diff --git a/test/test_Schema.js b/test/test_Schema.js deleted file mode 100644 index 1aee411..0000000 --- a/test/test_Schema.js +++ /dev/null @@ -1,62 +0,0 @@ -exports['test_Schema'] = function (test) { - var CUBRID = require('../'), - client = require('./testSetup/test_Setup').createDefaultCUBRIDDemodbConnection(), - Helpers = CUBRID.Helpers, - ActionQueue = CUBRID.ActionQueue; - - test.expect(2); - Helpers.logInfo(module.filename.toString() + ' started...'); - - ActionQueue.enqueue([ - function (callback) { - client.connect(callback); - }, - function (callback) { - client.getSchema(client.SCHEMA_TABLE, null, callback); - }, - function (result, callback) { - Helpers.logInfo('Schema tables results:'); - - for (var i = 0; i < result.length; ++i) { - Helpers.logInfo(result[i]); - } - - if (client.getEngineVersion().startsWith('8.4')) { - test.ok(result.length === 32); - } else { - if (client.getEngineVersion().startsWith('9')) { - test.ok(result.length === 33); - } - } - callback(); - }, - function (callback) { - client.getSchema(client.SCHEMA_VIEW, null, callback); - }, - function (result, callback) { - Helpers.logInfo('Schema views results:'); - - for (var i = 0; i < result.length; ++i) { - Helpers.logInfo(result[i]); - } - - if (client.getEngineVersion().startsWith('8.4')) { - test.ok(result.length === 16); - } else { - test.ok(result.length === 17); - } - - callback(); - }, - function (callback) { - client.close(callback); - } - ], function (err) { - if (err) { - throw err.message; - } else { - Helpers.logInfo('Test passed.'); - test.done(); - } - }); -}; diff --git a/test/test_SchemaAttribute.js b/test/test_SchemaAttribute.js index b26ee84..6f6f6b6 100644 --- a/test/test_SchemaAttribute.js +++ b/test/test_SchemaAttribute.js @@ -1,10 +1,10 @@ exports['test_SchemaAttribute'] = function (test) { - var CUBRID = require('../'), - client = require('./testSetup/test_Setup').createDefaultCUBRIDDemodbConnection(), - Helpers = CUBRID.Helpers, - ActionQueue = CUBRID.ActionQueue; + var CUBRID = require('../'), + client = require('./testSetup').createDefaultCUBRIDDemodbConnection(), + Helpers = CUBRID.Helpers, + ActionQueue = CUBRID.ActionQueue; - test.expect(9); + test.expect(9); Helpers.logInfo(module.filename.toString() + ' started...'); ActionQueue.enqueue([ @@ -19,22 +19,22 @@ exports['test_SchemaAttribute'] = function (test) { Helpers.logInfo(result[i]); } - // CUBRID 8.4.x + // CUBRID 8.4.x if (client.getEngineVersion().startsWith('8.4')) { test.ok(result.length === 191); } else { - // CUBRID 9.0+ + // CUBRID 9.0+ test.ok(result.length === 212); } test.ok(result[0].Name === 'code'); test.ok(result[0].Scale === 0); - // CUBRID 8.4.x + // CUBRID 8.4.x if (client.getEngineVersion().startsWith('8.4')) { test.ok(result[0].Precision === 0); } else { - // CUBRID 9.0+ + // CUBRID 9.0+ test.ok(result[0].Precision === 10); } diff --git a/test/test_SchemaClassPrivilege.js b/test/test_SchemaClassPrivilege.js index 489fbe6..2ff66e2 100644 --- a/test/test_SchemaClassPrivilege.js +++ b/test/test_SchemaClassPrivilege.js @@ -1,10 +1,10 @@ exports['test_SchemaClassPrivilege'] = function (test) { - var CUBRID = require('../'), - client = require('./testSetup/test_Setup').createDefaultCUBRIDDemodbConnection(), - Helpers = CUBRID.Helpers, - ActionQueue = CUBRID.ActionQueue; + var CUBRID = require('../'), + client = require('./testSetup').createDefaultCUBRIDDemodbConnection(), + Helpers = CUBRID.Helpers, + ActionQueue = CUBRID.ActionQueue; - test.expect(4); + test.expect(4); Helpers.logInfo(module.filename.toString() + ' started...'); ActionQueue.enqueue([ @@ -19,11 +19,11 @@ exports['test_SchemaClassPrivilege'] = function (test) { Helpers.logInfo(result[i]); } - // CUBRID 8.4.x + // CUBRID 8.4.x if (client.getEngineVersion().startsWith('8.4')) { test.ok(result.length === 96); } else { - // CUBRID 9.0+ + // CUBRID 9.0+ test.ok(result.length === 97); } diff --git a/test/test_SchemaConstraint.js b/test/test_SchemaConstraint.js index a3ea5d2..bb6a55d 100644 --- a/test/test_SchemaConstraint.js +++ b/test/test_SchemaConstraint.js @@ -1,6 +1,6 @@ exports['test_SchemaConstraint'] = function (test) { var CUBRID = require('../'), - client = require('./testSetup/test_Setup').createDefaultCUBRIDDemodbConnection(), + client = require('./testSetup').createDefaultCUBRIDDemodbConnection(), Helpers = CUBRID.Helpers, ActionQueue = CUBRID.ActionQueue; diff --git a/test/test_SchemaExportedKeys.js b/test/test_SchemaExportedKeys.js index c6065ba..8216da8 100644 --- a/test/test_SchemaExportedKeys.js +++ b/test/test_SchemaExportedKeys.js @@ -1,6 +1,6 @@ exports['test_SchemaExportedKeys'] = function (test) { var CUBRID = require('../'), - client = require('./testSetup/test_Setup').createDefaultCUBRIDDemodbConnection(), + client = require('./testSetup').createDefaultCUBRIDDemodbConnection(), Helpers = CUBRID.Helpers, ActionQueue = CUBRID.ActionQueue; diff --git a/test/test_SchemaImportedKeys.js b/test/test_SchemaImportedKeys.js index f8f7ca7..57deadd 100644 --- a/test/test_SchemaImportedKeys.js +++ b/test/test_SchemaImportedKeys.js @@ -1,10 +1,10 @@ exports['test_SchemaImportedKeys'] = function (test) { - var CUBRID = require('../'), - client = require('./testSetup/test_Setup').createDefaultCUBRIDDemodbConnection(), - Helpers = CUBRID.Helpers, - ActionQueue = CUBRID.ActionQueue; + var CUBRID = require('../'), + client = require('./testSetup').createDefaultCUBRIDDemodbConnection(), + Helpers = CUBRID.Helpers, + ActionQueue = CUBRID.ActionQueue; - test.expect(17); + test.expect(17); Helpers.logInfo(module.filename.toString() + ' started...'); ActionQueue.enqueue([ @@ -19,9 +19,9 @@ exports['test_SchemaImportedKeys'] = function (test) { Helpers.logInfo(result[i]); } - test.ok(result.length === 2); + test.ok(result.length === 2); - // CUBRID 8.4.x + // CUBRID 8.4.x if (client.getEngineVersion().startsWith('8.4')) { test.ok(result[0].FkName === 'fk_game_athlete_code'); test.ok(result[0].PkName === 'pk_athlete_code'); @@ -40,7 +40,7 @@ exports['test_SchemaImportedKeys'] = function (test) { test.ok(result[1].UpdateAction === 1); test.ok(result[1].DeleteAction === 1); } else { - // CUBRID 9.0+ + // CUBRID 9.0+ test.ok(result[0].FkName === 'fk_game_event_code'); test.ok(result[0].PkName === 'pk_event_code'); test.ok(result[0].FkTableName === 'game'); diff --git a/test/test_SchemaPrimaryKeys.js b/test/test_SchemaPrimaryKeys.js index 23ab956..a1237f8 100644 --- a/test/test_SchemaPrimaryKeys.js +++ b/test/test_SchemaPrimaryKeys.js @@ -1,6 +1,6 @@ exports['test_PrimaryKeys'] = function (test) { var CUBRID = require('../'), - client = require('./testSetup/test_Setup').createDefaultCUBRIDDemodbConnection(), + client = require('./testSetup').createDefaultCUBRIDDemodbConnection(), Helpers = CUBRID.Helpers, ActionQueue = CUBRID.ActionQueue; diff --git a/test/test_SchemaUsers.js b/test/test_SchemaUsers.js index 3edf4e1..eeb6ef9 100644 --- a/test/test_SchemaUsers.js +++ b/test/test_SchemaUsers.js @@ -1,43 +1,43 @@ exports['test_SchemaUsers'] = function (test) { - var CUBRID = require('../'), - client = require('./testSetup/test_Setup').createDefaultCUBRIDDemodbConnection(), - Helpers = CUBRID.Helpers, - ActionQueue = CUBRID.ActionQueue, - Result2Array = CUBRID.Result2Array; + var CUBRID = require('../'), + client = require('./testSetup').createDefaultCUBRIDDemodbConnection(), + Helpers = CUBRID.Helpers, + ActionQueue = CUBRID.ActionQueue, + Result2Array = CUBRID.Result2Array; - test.expect(1); + test.expect(1); Helpers.logInfo(module.filename.toString() + ' started...'); ActionQueue.enqueue([ - function (callback) { - client.connect(callback); - }, - function (callback) { - client.query('select [name] from db_user', callback); - }, - function (result, queryHandle, callback) { - Helpers.logInfo(Result2Array.ColumnNamesArray(result).toString()); + function (callback) { + client.connect(callback); + }, + function (callback) { + client.query('select [name] from db_user', callback); + }, + function (result, queryHandle, callback) { + Helpers.logInfo(Result2Array.ColumnNamesArray(result).toString()); - var arr = Result2Array.RowsArray(result); - test.ok(arr.length === 2); + var arr = Result2Array.RowsArray(result); + test.ok(arr.length === 2); - for (var i = 0; i < arr.length; ++i) { - Helpers.logInfo(arr[i].toString()); - } + for (var i = 0; i < arr.length; ++i) { + Helpers.logInfo(arr[i].toString()); + } - callback(); - }, + callback(); + }, - function (callback) { - client.close(callback); - } - ], - function (err) { - if (err) { - throw err.message; - } else { - Helpers.logInfo('Test passed.'); - test.done(); - } - }); + function (callback) { + client.close(callback); + } + ], + function (err) { + if (err) { + throw err.message; + } else { + Helpers.logInfo('Test passed.'); + test.done(); + } + }); }; diff --git a/test/test_Schema_Events.js b/test/test_Schema_Events.js index cd95492..b1f9bdb 100644 --- a/test/test_Schema_Events.js +++ b/test/test_Schema_Events.js @@ -1,10 +1,10 @@ exports['test_Schema_Events'] = function (test) { - var CUBRID = require('../'), - client = require('./testSetup/test_Setup').createDefaultCUBRIDDemodbConnection(), - Helpers = CUBRID.Helpers, - currentSchemaToReceive = 0; + var CUBRID = require('../'), + client = require('./testSetup').createDefaultCUBRIDDemodbConnection(), + Helpers = CUBRID.Helpers, + currentSchemaToReceive = 0; - test.expect(2); + test.expect(2); Helpers.logInfo(module.filename.toString() + ' started...'); client.connect(); @@ -23,11 +23,11 @@ exports['test_Schema_Events'] = function (test) { client.on(client.EVENT_SCHEMA_DATA_AVAILABLE, function (result) { Helpers.logInfo('Schema data received.'); - for (var i = 0; i < result.length; ++i) { + for (var i = 0; i < result.length; ++i) { Helpers.logInfo(result[i]); } - if (client.getEngineVersion().startsWith('8.4')) { + if (client.getEngineVersion().startsWith('8.4')) { if (currentSchemaToReceive === client.SCHEMA_TABLE) { test.ok(result.length === 32); } else { diff --git a/test/test_Schema_Tables.js b/test/test_Schema_Tables.js index 434fed0..57c155c 100644 --- a/test/test_Schema_Tables.js +++ b/test/test_Schema_Tables.js @@ -1,6 +1,6 @@ exports['test_Schema_Tables'] = function (test) { var CUBRID = require('../'), - client = require('./testSetup/test_Setup').createDefaultCUBRIDDemodbConnection(), + client = require('./testSetup').createDefaultCUBRIDDemodbConnection(), Helpers = CUBRID.Helpers, ActionQueue = CUBRID.ActionQueue; diff --git a/test/test_Schema_Views.js b/test/test_Schema_Views.js index 2687c8a..a5d7fd9 100644 --- a/test/test_Schema_Views.js +++ b/test/test_Schema_Views.js @@ -1,6 +1,6 @@ exports['test_Schema_Views'] = function (test) { var CUBRID = require('../'), - client = require('./testSetup/test_Setup').createDefaultCUBRIDDemodbConnection(), + client = require('./testSetup').createDefaultCUBRIDDemodbConnection(), Helpers = CUBRID.Helpers, ActionQueue = CUBRID.ActionQueue; diff --git a/test/test_SelectConstant_01.js b/test/test_SelectConstant_01.js deleted file mode 100644 index e61b823..0000000 --- a/test/test_SelectConstant_01.js +++ /dev/null @@ -1,59 +0,0 @@ -exports['test_SelectConstant_01'] = function (test) { - var CUBRID = require('../'), - client = require('./testSetup/test_Setup').createDefaultCUBRIDDemodbConnection(), - Helpers = CUBRID.Helpers, - Result2Array = CUBRID.Result2Array; - - function errorHandler(err) { - throw err.message; - } - - test.expect(3); - Helpers.logInfo(module.filename.toString() + ' started...'); - - client.connect(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connected.'); - Helpers.logInfo('Querying: select 1'); - - client.query('select 1', function (err, result, queryHandle) { - if (err) { - errorHandler(err); - } else { - test.ok(Result2Array.TotalRowsCount(result) === 1); - - Helpers.logInfo('Query result rows count: ' + Result2Array.TotalRowsCount(result)); - Helpers.logInfo('Query results:'); - - var arr = Result2Array.RowsArray(result); - - test.ok(arr.length === 1); - test.ok(arr[0].toString() === '1'); - - for (var j = 0; j < arr.length; ++j) { - Helpers.logInfo(arr[j].toString()); - } - } - client.closeQuery(queryHandle, function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Query closed.'); - - client.close(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - test.done(); - } - }); - } - }); - }); - } - }); -}; diff --git a/test/test_SelectConstant_02.js b/test/test_SelectConstant_02.js deleted file mode 100644 index 7d74d2e..0000000 --- a/test/test_SelectConstant_02.js +++ /dev/null @@ -1,61 +0,0 @@ -exports['test_SelectConstant_02'] = function (test) { - var CUBRID = require('../'), - client = require('./testSetup/test_Setup').createDefaultCUBRIDDemodbConnection(), - Helpers = CUBRID.Helpers, - Result2Array = CUBRID.Result2Array; - - function errorHandler(err) { - throw err.message; - } - - test.expect(4); - Helpers.logInfo(module.filename.toString() + ' started...'); - - client.connect(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connected.'); - Helpers.logInfo('Querying: select null from nation where rownum < 3'); - - client.query('select null from nation where rownum < 3', function (err, result, queryHandle) { - if (err) { - errorHandler(err); - } else { - test.ok(Result2Array.TotalRowsCount(result) === 2); - - Helpers.logInfo('Query result rows count: ' + Result2Array.TotalRowsCount(result)); - Helpers.logInfo('Query results:'); - - var arr = Result2Array.RowsArray(result); - - test.ok(arr.length === 2); - test.ok(arr[0].toString() === ''); - test.ok(arr[1].toString() === ''); - - for (var j = 0; j < arr.length; ++j) { - Helpers.logInfo('Value returned: [' + arr[j].toString() + ']'); - } - - client.closeQuery(queryHandle, function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Query closed.'); - - client.close(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - test.done(); - } - }); - } - }); - } - }); - } - }); -}; diff --git a/test/test_SetAutoCommit.js b/test/test_SetAutoCommit.js deleted file mode 100644 index 7a828fd..0000000 --- a/test/test_SetAutoCommit.js +++ /dev/null @@ -1,43 +0,0 @@ -exports['test_SetAutoCommit'] = function (test) { - var CUBRID = require('../'), - client = require('./testSetup/test_Setup').createDefaultCUBRIDDemodbConnection(), - Helpers = CUBRID.Helpers; - - test.expect(2); - Helpers.logInfo(module.filename.toString() + ' started...'); - - client.connect(function (err) { - if (err) { - throw err; - } else { - Helpers.logInfo('Connected...'); - - client.setAutoCommitMode(false, function (err) { - if (err) { - throw err; - } else { - test.ok(client.autoCommitMode === false, 'AutoCommitMode not set correctly!'); - - client.setAutoCommitMode(true, function (err) { - if (err) { - throw err; - } else { - test.ok(client.autoCommitMode === true, 'AutoCommitMode not set correctly!'); - - client.close(function (err) { - if (err) { - throw err; - } else { - Helpers.logInfo('Connection closed...'); - Helpers.logInfo('Test passed.'); - test.done(); - } - }); - } - }); - } - }); - } - }); -}; - diff --git a/test/test_SetDbParameter.js b/test/test_SetDbParameter.js deleted file mode 100644 index 90070bb..0000000 --- a/test/test_SetDbParameter.js +++ /dev/null @@ -1,37 +0,0 @@ -exports['test_SetDbParameter'] = function (test) { - var CUBRID = require('../'), - client = require('./testSetup/test_Setup').createDefaultCUBRIDDemodbConnection(), - Helpers = CUBRID.Helpers, - CAS = require('../src' + (process.env.CODE_COV ? '-cov' : '') + '/constants/CASConstants'); - - function errorHandler(err) { - throw err.message; - } - - test.expect(0); - Helpers.logInfo(module.filename.toString() + ' started...'); - - client.connect(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connected OK.'); - - client.setDatabaseParameter(CAS.CCIDbParam.CCI_PARAM_ISOLATION_LEVEL, CAS.CUBRIDIsolationLevel.TRAN_REP_CLASS_COMMIT_INSTANCE, function (err) { - if (err) { - errorHandler(err); - } else { - client.close(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - test.done(); - } - }); - } - }); - } - }); -}; diff --git a/test/test_SetDbParameterError.js b/test/test_SetDbParameterError.js deleted file mode 100644 index ed3b23c..0000000 --- a/test/test_SetDbParameterError.js +++ /dev/null @@ -1,40 +0,0 @@ -exports['test_SetDbParameterError'] = function (test) { - var CUBRID = require('../'), - client = require('./testSetup/test_Setup').createDefaultCUBRIDDemodbConnection(), - Helpers = CUBRID.Helpers, - CAS = require('../src' + (process.env.CODE_COV ? '-cov' : '') + '/constants/CASConstants'); - - test.expect(1); - function errorHandler(err) { - Helpers.logInfo(err.message); - - test.ok(err.message === '-1011:CAS_ER_PARAM_NAME'); - - client.close(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - test.done(); - } - }); - } - - Helpers.logInfo(module.filename.toString() + ' started...'); - - client.connect(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connected OK.'); - client.setDatabaseParameter(CAS.CCIDbParam.CCI_PARAM_MAX_STRING_LENGTH, 99, function (err) { - if (err) { - errorHandler(err); - } else { - throw 'We should not get here'; - } - }); - } - }); -}; diff --git a/test/test_SetDbParameter_Events.js b/test/test_SetDbParameter_Events.js deleted file mode 100644 index 2dfa23f..0000000 --- a/test/test_SetDbParameter_Events.js +++ /dev/null @@ -1,35 +0,0 @@ -exports['test_SetDbParameter_Events'] = function (test) { - var CUBRID = require('../'), - client = require('./testSetup/test_Setup').createDefaultCUBRIDDemodbConnection(), - Helpers = CUBRID.Helpers, - CAS = require('../src' + (process.env.CODE_COV ? '-cov' : '') + '/constants/CASConstants'); - - test.expect(0); - Helpers.logInfo(module.filename.toString() + ' started...'); - - client.connect(); - - client.on(client.EVENT_ERROR, function (err) { - Helpers.logInfo('Error: ' + err.message); - throw 'We should not get here!'; - }); - - client.on(client.EVENT_CONNECTED, function () { - Helpers.logInfo('Connected.'); - client.setDatabaseParameter(CAS.CCIDbParam.CCI_PARAM_ISOLATION_LEVEL, - CAS.CUBRIDIsolationLevel.TRAN_REP_CLASS_COMMIT_INSTANCE, - null); - }); - - client.on(client.EVENT_SET_DB_PARAMETER_COMPLETED, function () { - Helpers.logInfo('Set Db parameter completed.'); - client.close(); - }); - - client.on(client.EVENT_CONNECTION_CLOSED, function () { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - client.removeAllListeners(); - test.done(); - }); -}; diff --git a/test/test_SocketError.js b/test/test_SocketError.js deleted file mode 100644 index 969e4d9..0000000 --- a/test/test_SocketError.js +++ /dev/null @@ -1,33 +0,0 @@ -exports['test_SocketError'] = function (test) { - var CUBRID = require('../'), - client = require('./testSetup/test_Setup').createDefaultCUBRIDDemodbConnection(), - Helpers = CUBRID.Helpers; - - test.expect(1); - Helpers.logInfo(module.filename.toString() + ' started...'); - - function errorHandler(err) { - Helpers.logInfo(err.message); - test.ok(err.message === 'This socket is closed.'); - Helpers.logInfo('Test passed.'); - test.done(); - } - - client.connect(function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('Connected.'); - Helpers.logInfo('Querying: select * from nation'); - client._socket.destroy(); - client.query('select * from nation', function (err) { - if (err) { - errorHandler(err); - } else { - Helpers.logInfo('We should not get here!'); - client.close(null); - } - }); - } - }); -}; diff --git a/test/test_Transaction.js b/test/test_Transaction.js deleted file mode 100644 index 7c04ab5..0000000 --- a/test/test_Transaction.js +++ /dev/null @@ -1,64 +0,0 @@ -exports['test_Transaction'] = function (test) { - var CUBRID = require('../'), - client = require('./testSetup/test_Setup').createDefaultCUBRIDDemodbConnection(), - Helpers = CUBRID.Helpers, - ActionQueue = CUBRID.ActionQueue, - Result2Array = CUBRID.Result2Array; - - test.expect(3); - Helpers.logInfo(module.filename.toString() + ' started...'); - - ActionQueue.enqueue([ - function (cb) { - client.connect(cb); - }, - function (cb) { - Helpers.logInfo('Connected...'); - client.batchExecuteNoQuery(['drop table if exists test_tran', 'create table test_tran(id int)'], cb); - }, - function (cb) { - client.beginTransaction(cb); - }, - function (cb) { - client.batchExecuteNoQuery('insert into test_tran values(1)', cb); - }, - function (cb) { - client.query('select * from test_tran', cb); - }, - function (result, queryHandle, cb) { - test.ok(Result2Array.TotalRowsCount(result) === 1); - client.closeQuery(queryHandle, cb); - }, - function (queryHandle, cb) { - client.rollback(cb); - }, - function (cb) { - client.query('select * from test_tran', cb); - }, - function (result, queryHandle, cb) { - test.ok(Result2Array.TotalRowsCount(result) === 0); - client.closeQuery(queryHandle, cb); - }, - function (queryHandle, cb) { - client.batchExecuteNoQuery('drop table test_tran', cb); - }, - function (cb) { - client.commit(cb); - }, - function (cb) { - client.query('select count(*) from db_class where class_name = \'test_tran\'', cb); - }, - function (result, queryHandle, cb) { - test.ok(Result2Array.RowsArray(result)[0][0] === 0); - client.close(cb); - } - ], function (err) { - if (err) { - throw err; - } else { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - test.done(); - } - }); -}; diff --git a/test/test_Transaction_Commit_Error.js b/test/test_Transaction_Commit_Error.js deleted file mode 100644 index 73e8435..0000000 --- a/test/test_Transaction_Commit_Error.js +++ /dev/null @@ -1,62 +0,0 @@ -exports['test_Transaction_Commit_Error'] = function (test) { - var CUBRID = require('../'), - client = require('./testSetup/test_Setup').createDefaultCUBRIDDemodbConnection(), - async = require('async'), - Helpers = CUBRID.Helpers, - Result2Array = CUBRID.Result2Array; - - Helpers.logInfo(module.filename.toString() + ' started...'); - test.expect(2); - var shards = [0, 1]; - - client.connect(function (err) { - if (err) { - Helpers.logError(err); - } - else { - Helpers.logInfo('Connected'); - - client.setAutoCommitMode(true); - client.setEnforceOldQueryProtocol(true); - - async.eachSeries(shards, selectAll, function (err) { - if (err) { - Helpers.logInfo(err); - } - - client.close(); - }); - } - }); - - client.on(client.EVENT_CONNECTION_CLOSED, function () { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - client.removeAllListeners(); - test.done(); - }); - - function selectAll(shardId, done) { - var sql = 'SELECT * FROM code'; - - Helpers.logInfo(sql); - - client.addQuery(sql, function (err, result, queryHandle) { - if (err) { - done(err); - } - else { - Helpers.logInfo('Shard(' + shardId + ') holds ' + Result2Array.TotalRowsCount(result) + ' records'); - client.closeQuery(queryHandle, function (err) { - client.commit(function (err) { - if (err) { - Helpers.logError(err); - test.ok(err.message === 'AutoCommitMode is enabled! - denying commit request.'); - } - done(); - }); - }); - } - }); - }; -}; diff --git a/test/test_Transaction_Events.js b/test/test_Transaction_Events.js deleted file mode 100644 index e7d2013..0000000 --- a/test/test_Transaction_Events.js +++ /dev/null @@ -1,108 +0,0 @@ -exports['test_Transaction_Events'] = function (test) { - var CUBRID = require('../'), - client = require('./testSetup/test_Setup').createDefaultCUBRIDDemodbConnection(), - Helpers = CUBRID.Helpers, - Result2Array = CUBRID.Result2Array; - -// TODO: avoid global variables. - global.savedQueryHandle = null; - global.batchExecuteNo = 1; - global.queryNo = 1; - - test.expect(3); - Helpers.logInfo(module.filename.toString() + ' started...'); - - client.connect(); - - client.on(client.EVENT_ERROR, function (err) { - Helpers.logError('Error!: ' + err.message); - throw 'We should not get here!'; - }); - - client.on(client.EVENT_CONNECTED, function () { - Helpers.logInfo('Connected.'); - Helpers.logInfo('Execute: create test table'); - client.batchExecuteNoQuery(['drop table if exists test_tran', 'create table test_tran(id int)'], null); - }); - - client.on(client.EVENT_BATCH_COMMANDS_COMPLETED, function () { - Helpers.logInfo('Batch executeDone'); - if (global.batchExecuteNo === 1) { - client.beginTransaction(null); - global.batchExecuteNo++; - } else { - if (global.batchExecuteNo === 2) { - Helpers.logInfo('Querying: select * from test_tran'); - client.query('select * from test_tran'); - global.batchExecuteNo++; - } - else { - Helpers.logInfo('Commiting transaction.'); - client.commit(null); - } - } - }); - - client.on(client.EVENT_BEGIN_TRANSACTION, function () { - Helpers.logInfo('Begin transaction.'); - Helpers.logInfo('Execute: insert into test_tran values(1)'); - client.batchExecuteNoQuery('insert into test_tran values(1)', null); - }); - - client.on(client.EVENT_ROLLBACK_COMPLETED, function () { - Helpers.logInfo('Transaction rollback completed.'); - Helpers.logInfo('Querying: select * from test_tran'); - client.query('select * from test_tran'); - }); - - client.on(client.EVENT_COMMIT_COMPLETED, function () { - Helpers.logInfo('Transaction commit completed.'); - Helpers.logInfo('select count(*) from db_class where class_name = \'test_tran\''); - client.query('select count(*) from db_class where class_name = \'test_tran\''); - }); - - client.on(client.EVENT_QUERY_DATA_AVAILABLE, function (result, queryHandle) { - Helpers.logInfo('Data received.'); - Helpers.logInfo('Returned active query handle: ' + queryHandle); - global.savedQueryHandle = queryHandle; // Save handle - needed for further fetch operations - if (global.queryNo === 1) { - test.ok(Result2Array.TotalRowsCount(result) === 1); - client.closeQuery(global.savedQueryHandle, null); - } else { - if (global.queryNo === 2) { - test.ok(Result2Array.TotalRowsCount(result) === 0); - client.closeQuery(global.savedQueryHandle, null); - } else { - test.ok(Result2Array.RowsArray(result)[0][0] === 0); - client.closeQuery(global.savedQueryHandle, null); - } - } - }); - - client.on(client.EVENT_QUERY_CLOSED, function () { - Helpers.logInfo('Query closed.'); - global.savedQueryHandle = null; - if (global.queryNo === 1) { - Helpers.logInfo('Transaction do rollback.'); - client.rollback(null); - global.queryNo++; - } else { - if (global.queryNo === 2) { - Helpers.logInfo('Execute: drop table test_tran'); - client.batchExecuteNoQuery('drop table test_tran', null); - global.queryNo++; - } else { - Helpers.logInfo('Closing connection...'); - client.close(); - } - } - }); - - client.on(client.EVENT_CONNECTION_CLOSED, function () { - Helpers.logInfo('Connection closed.'); - Helpers.logInfo('Test passed.'); - client.removeAllListeners(); - test.done(); - }); -}; - diff --git a/test/test_Utils.js b/test/test_Utils.js deleted file mode 100644 index 3409356..0000000 --- a/test/test_Utils.js +++ /dev/null @@ -1,33 +0,0 @@ -var path = require('path'); - -exports[path.basename(__filename)] = function (test) { - var codeCoveragePath = process.env.CODE_COV ? '-cov' : '', - srcDir = '../src' + codeCoveragePath, - GetResultsArray = require(srcDir + '/resultset/Result2Array').RowsArray, - GetResultsColumnNamesArray = require(srcDir + '/resultset/Result2Array').ColumnNamesArray, - GetResultsColumnTypesArray = require(srcDir + '/resultset/Result2Array').ColumnTypesArray, - GetResultsCount = require(srcDir + '/resultset/Result2Array').TotalRowsCount, - GetResultsObjectsArrays = require(srcDir + '/resultset/Result2Array').ObjectsArray; - - test.expect(10); - - var json_str = '{"ColumnNames":["s_name","f_name"],' + - '"ColumnDataTypes":["char","string"],' + - '"RowsCount":99,' + - '"ColumnValues":[["X","Mixed"],["W","Woman"],["M","Man"]]}'; - - test.equal(GetResultsArray(json_str).toString(), 'X,Mixed,W,Woman,M,Man'); - test.equal(GetResultsColumnNamesArray(json_str).toString(), 's_name,f_name'); - test.equal(GetResultsColumnTypesArray(json_str).toString(), 'char,string'); - test.equal(GetResultsCount(json_str), 99); - - var objectsArray = GetResultsObjectsArrays(json_str); - test.equal(objectsArray[0].s_name, 'X'); - test.equal(objectsArray[0].f_name, 'Mixed'); - test.equal(objectsArray[1].s_name, 'W'); - test.equal(objectsArray[1].f_name, 'Woman'); - test.equal(objectsArray[2].s_name, 'M'); - test.equal(objectsArray[2].f_name, 'Man'); - - test.done(); -}; diff --git a/tutorials/Introduction to CUBRID Node.js driver - Part I.docx b/tutorials/Introduction to CUBRID Node.js driver - Part I.docx deleted file mode 100644 index cdeda94..0000000 Binary files a/tutorials/Introduction to CUBRID Node.js driver - Part I.docx and /dev/null differ diff --git a/tutorials/Introduction to CUBRID Node.js driver - Part II.docx b/tutorials/Introduction to CUBRID Node.js driver - Part II.docx deleted file mode 100644 index 5bb5e5f..0000000 Binary files a/tutorials/Introduction to CUBRID Node.js driver - Part II.docx and /dev/null differ