{"version":3,"sources":["jsdelivr-header.js","/npm/ibm_db@3.3.5/lib/odbc.js"],"names":[],"mappings":"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","file":"/npm/ibm_db@3.3.5/lib/odbc.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/ibm_db@3.3.5/lib/odbc.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","/*\n  Copyright (c) 2013, Dan VerWeire <dverweire@gmail.com>\n  Copyright (c) 2010, Lee Smith <notwink@gmail.com>\n\n  Permission to use, copy, modify, and/or distribute this software for any\n  purpose with or without fee is hereby granted, provided that the above\n  copyright notice and this permission notice appear in all copies.\n\n  THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n  WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n  MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n  ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n*/\n\n// Setting SQLLIB bin path to the path env before load for windows\nvar os = require('os'),\n    path = require('path');\nvar platform = os.platform();\n\n// Set PATH and LIB env vars for clidriver.\nvar clidriver = path.resolve(__dirname, '../installer/clidriver');\nif (process.env.IBM_DB_HOME) {\n  clidriver = process.env.IBM_DB_HOME;\n}\nif(platform == 'win32')\n{\n  process.env.PATH = path.resolve(clidriver, 'bin') + ';' +\n                      path.resolve(clidriver, 'bin/amd64.VC12.CRT') + ';' +\n                      path.resolve(clidriver, 'bin/icc64') + ';' +\n                      path.resolve(clidriver, 'lib') + ';' + process.env.PATH;\n  process.env.LIB =  path.resolve(clidriver, 'bin') + ';' +\n                      path.resolve(clidriver, 'bin/icc64') + ';' +\n                      path.resolve(clidriver, 'lib') + ';' + process.env.LIB;\n}\nelse if(platform == 'linux') {\n  process.env.PATH = path.resolve(clidriver, 'bin') + ':' +\n                      path.resolve(clidriver, 'lib') + ':' + process.env.PATH;\n  process.env.LD_LIBRARY_PATH = path.resolve(clidriver, 'lib') + ':' +\n                                path.resolve(clidriver, 'lib/icc') + ':' + process.env.LD_LIBRARY_PATH;\n}\nelse if(platform == 'darwin') {\n  process.env.PATH = path.resolve(clidriver, 'bin') + ':' +\n                      path.resolve(clidriver, 'lib') + ':' + process.env.PATH;\n  process.env.DYLD_LIBRARY_PATH = path.resolve(clidriver, 'lib') + ':' +\n                                  path.resolve(clidriver, 'lib/icc') + ':' + process.env.DYLD_LIBRARY_PATH;\n}\nelse if(platform == 'aix') {\n  process.env.PATH = path.resolve(clidriver, 'bin') + ':' +\n                      path.resolve(clidriver, 'lib') + ':' + process.env.PATH;\n  process.env.LIBPATH = path.resolve(clidriver, 'lib') + ':' +\n                        path.resolve(clidriver, 'lib/icc') + ':' + process.env.LIBPATH;\n}\n\nvar odbc = require(\"bindings\")(\"odbc_bindings\")\n  , SimpleQueue = require(\"./simple-queue\")\n  , macro = require(\"./climacros\")\n  , util = require(\"util\")\n  , Readable = require('stream').Readable\n  , Q = require('q');\n\n\n// Call of odbc.ODBC() loads odbc library and allocate environment handle.\n// All calls of new Database() should use this same odbc unless passed as\n// options.odbc. ENV will keep value of this odbc after first call of Database.\nvar ENV;\nmodule.exports = function (options)\n{\n  return new Database(options);\n};\n\nmodule.exports.Database = Database;\nmodule.exports.ODBC = odbc.ODBC;\nmodule.exports.ODBCConnection = odbc.ODBCConnection;\nmodule.exports.ODBCStatement = odbc.ODBCStatement;\nmodule.exports.ODBCResult = odbc.ODBCResult;\n\nexports.debug = false;\nvar logParams = false;\nvar ibmdbStartTime = new Date();\nvar getElapsedTime = function(){\n            var tstamp = (new Date() - ibmdbStartTime)/1000.0;\n            //process.stdout.write(tstamp + \" :: \");\n            return (tstamp + \" :: \");\n            };\nmodule.exports.getElapsedTime = getElapsedTime;\n\nmodule.exports.debug = function(x) {\n    if(x) {\n        exports.debug = true;\n        console.log(\"node-ibm_db logs enabled.\");\n        if(x == 2) {\n            logParams = true;\n        }\n    }\n    else {\n        exports.debug = false;\n        console.log(\"node-ibm_db logs disabled.\");\n    }\n};\n\nvar connError = {\n    message: \"Connection not open.\",\n    sqlstate: \"08001\",\n    sqlcode: -30081\n};\n\nmodule.exports.open = function (connStr, options, cb)\n{\n  var db, deferred;\n\n  var DBFactory = function(options) {\n    return new Database(options);\n  };\n\n  if (!cb && typeof options !== 'function')\n  {\n    if(!options)\n    {\n      options = null;\n    }\n    db = DBFactory(options);\n    deferred = Q.defer();\n    db.open(connStr, function(err) {\n      if (err)\n      {\n        deferred.reject(err);\n      }\n      else\n      {\n        deferred.resolve(db);\n      }\n    });\n    return deferred.promise;\n  }\n\n  else if (typeof options === 'function')\n  {\n    cb = options;\n    options = null;\n  }\n\n  db = DBFactory(options);\n\n  db.open(connStr, function (err) {\n    cb && cb(err, db);\n  });\n};  // ibmdb.open\n\nmodule.exports.openSync = function (connStr, options)\n{\n  var db = new Database(options);\n  db.openSync(connStr);\n  return db;\n}; // ibmdb.openSync\n\n/*\n * Create Database.\n * (createDbSync)\n * args: dbName, codeSet, mode.\n * (codeSet, mode are optional and default values will be null)\n * \n * return: TRUE on success or FALSE on failure.\n */\nmodule.exports.createDbSync = function (dbName, connStr, options)\n{\n  // createDbSync API is not supported on z/OS:\n  // Databases are implemented/used in Db2 for z/OS differently than\n  // and Db2 for LUW.  A database in z/OS is simply a logical collection\n  // of table/index spaces that you create using the \"CREATE DATABASE\"\n  // SQL statement, while a database in LUW is conceptually equivalent\n  // to a subsystem in z/OS.  Connecting to a Db2 on z/OS subsystem\n  // entails a \"database\" is created already.  As such, this API is\n  // not applicable.\n  if (os.type() === \"OS/390\")\n  {\n    throw new Error(\"[node-ibm_db] createDbSync API is not supported on z/OS\");\n  }\n\n  var result;\n  var db = new Database(options);\n\n  if (typeof(connStr) === \"object\")\n  {\n    var obj = connStr;\n    connStr = \"\";\n\n    Object.keys(obj).forEach(function (key) {\n      connStr += key + \"=\" + obj[key] + \";\";\n    });\n  }\n  var conStr = connStr + \";\" + \"ATTACH=true\";\n\n  var connectionOpen = db.openSync(conStr);\n\n  if (connectionOpen)\n  {\n    db.connected = true;\n  }\n\n  if (!db.connected)\n  {\n    throw ({ message : \"Connection not open.\"});\n  }\n  else\n  {\n    if(dbName == null )\n    {\n      throw ({ message : \"Database Name <db_Name> is required.\"});\n    }\n    else\n    {\n      // IF: argument \"options\" is not passed while calling.\n      // THEN: db.codeSet and db.mode will be \"null\" (default value).\n      result = db.conn.createDbSync(dbName, db.codeSet, db.mode);\n      return result;\n    }\n  }\n}; // ibmdb.createDbSync\n\n/*\n * Drop Database.\n * (dropDbSync)\n * args: dbName\n * \n * return: TRUE on success or FALSE on failure.\n */\nmodule.exports.dropDbSync = function (dbName, connStr, options)\n{\n  // dropDbSync API is not supported on z/OS:\n  // Databases are implemented/used in Db2 for z/OS differently than\n  // and Db2 for LUW.  A database in z/OS is simply a logical collection\n  // of table/index spaces that you create using the \"CREATE DATABASE\"\n  // SQL statement, while a database in LUW is conceptually equivalent\n  // to a subsystem in z/OS.  Connecting to a Db2 on z/OS subsystem\n  // entails a \"database\" is created already.  As such, this API is\n  // not applicable for Db2 on z/OS servers.\n  if (os.type() === \"OS/390\")\n  {\n    throw new Error(\"[node-ibm_db] dropDbSync API is not supported on z/OS\");\n  }\n\n  var result;\n  var db = new Database(options);\n\n  if (typeof(connStr) === \"object\")\n  {\n    var obj = connStr;\n    connStr = \"\";\n\n    Object.keys(obj).forEach(function (key) {\n      connStr += key + \"=\" + obj[key] + \";\";\n    });\n  }\n  var conStr = connStr + \";\" + \"ATTACH=true\";  \n\n  var connectionOpen = db.openSync(conStr);\n\n  if (connectionOpen)\n  {\n    db.connected = true;\n  }\n\n  if (!db.connected)\n  {\n    throw ({ message : \"Connection not open.\"});\n  }\n  else\n  {\n    if(dbName == null )\n    {\n      throw ({ message : \"Database Name <db_Name> is required.\"});\n    }\n    else\n    {\n      result = db.conn.dropDbSync(dbName);\n      return result;\n    }\n  }\n}; // ibmdb.dropDbSync\n\nmodule.exports.close = function(db)\n{\n  if(db && typeof(db) === \"object\")\n  {\n    for(var key in db)\n    {\n      delete db[key];\n    }\n    db = undefined;\n  }\n}; // ibmdb.close\n\nfunction Database(options)\n{\n  var self = this;\n\n  options = options || {};\n\n  self.odbc = (options.odbc) ? options.odbc : ((ENV) ? ENV : new odbc.ODBC());\n  if(!ENV) ENV = self.odbc;\n  self.queue = new SimpleQueue();\n  self.fetchMode = options.fetchMode || null;\n  self.connected = false;\n  self.connectTimeout = options.connectTimeout || null;\n  self.systemNaming = options.systemNaming;\n  self.codeSet = options.codeSet || null;\n  self.mode = options.mode || null;\n  self.pool = options.pool || null;\n  if( self.pool ) { // Its a pooled connection\n    if( !self.realClose ) {\n      self.realClose = self.close;\n      self.close = self.poolClose;\n      self.realCloseSync = self.closeSync;\n      self.closeSync = self.poolCloseSync;\n    }\n    self.connStr = options.connStr || null;\n  }\n} // Database()\n\n//Expose constants\nObject.keys(odbc.ODBC).forEach(function (key) {\n  if (typeof odbc.ODBC[key] !== \"function\")\n  {\n    //On the database prototype\n    Database.prototype[key] = odbc.ODBC[key];\n\n    //On the exports\n    module.exports[key] = odbc.ODBC[key];\n  }\n});\n\nDatabase.prototype.open = function (connStr, cb) {\n  var self = this, deferred;\n\n  if (typeof(connStr) === \"object\")\n  {\n    var obj = connStr;\n    connStr = \"\";\n\n    Object.keys(obj).forEach(function (key) {\n      connStr += key + \"=\" + obj[key] + \";\";\n    });\n  }\n\n  if (!cb)\n  {\n    deferred = Q.defer();\n  }\n\n  self.odbc.createConnection(function (err, conn) {\n    if(!cb)\n    {\n      if (err) deferred.reject(err);\n    } else\n    {\n      if (err) return cb(err);\n    }\n\n    self.conn = conn;\n\n    if (self.connectTimeout || self.connectTimeout === 0)\n    {\n      self.conn.connectTimeout = self.connectTimeout;\n    }\n    if (typeof(self.systemNaming) !== 'undefined')\n    {\n      self.conn.systemNaming = self.systemNaming;\n    }\n\n    self.conn.open(connStr, function (err, result)\n    {\n      if(cb)\n      {\n        if (err) cb(err);\n        else {\n          self.connected = true;\n          cb(err, result);\n        }\n      } \n      else\n      {\n        if(err) deferred.reject(err);\n\n        self.connected = true;\n        deferred.resolve(result);\n      }\n    }); //conn.open\n  }); // odbc.createConnection\n\n  return deferred ? deferred.promise : null;\n}; // Database.open function\n\nDatabase.prototype.openSync = function (connStr)\n{\n  var self =  this;\n\n  self.conn = self.odbc.createConnectionSync();\n\n  if (self.connectTimeout || self.connectTimeout === 0)\n  {\n    self.conn.connectTimeout = self.connectTimeout;\n  }\n  if (typeof(self.systemNaming) !== 'undefined')\n  {\n    self.conn.systemNaming = self.systemNaming;\n  }\n\n  if (typeof(connStr) === \"object\")\n  {\n    var obj = connStr;\n    connStr = \"\";\n\n    Object.keys(obj).forEach(function (key) {\n      connStr += key + \"=\" + obj[key] + \";\";\n    });\n  }\n\n  var result = self.conn.openSync(connStr);\n\n  if (result)\n  {\n    self.connected = true;\n  }\n\n  return result;\n}; // Database.openSync\n\nDatabase.prototype.close = function (cb)\n{\n  var self = this, deferred;\n  if(!cb) \n  {\n    deferred = Q.defer();\n  }\n\n  self.queue.push(function (next) {\n    if(self.conn)\n    {\n      self.conn.close(function (err) {\n        self.connected = false;\n        delete self.conn;\n\n        if (err) {\n          deferred ? deferred.reject(err) : cb(err);\n        } else {\n          deferred ? deferred.resolve(true) : cb(null);\n        }\n        return next();\n      });\n    }\n    else\n    {\n      self.connected = false;\n      deferred ? deferred.resolve(true) : cb(null);\n      return next();\n    }\n  }); // self.queue.push\n\n  return deferred ? deferred.promise : false;\n}; // Database.close\n\nDatabase.prototype.closeSync = function ()\n{\n  var self = this;\n\n  var result;\n  if(self.conn) result = self.conn.closeSync();\n\n  self.connected = false;\n  delete self.conn;\n\n  return result;\n}; // closeSync\n\nDatabase.prototype.checkConnectionError = function (err)\n{\n  // For pooled connection, if we get SQL30081N, then close\n  // the connection now only and then proceed.\n\n  var self = this;\n  if(self.realClose){\n    if((err && err['message'] && err['message'].search(\"SQL30081N\") != -1))\n    {\n      // Close all connections in availablePool as all are invalid now\n      // It will be removed from available pool on next pool.open for connected=false\n      self.closeSync();  //Move connection from usedPool to availablePool\n      var availablePool = self.pool.availablePool[self.connStr];\n      if (availablePool && availablePool.length) {\n        for (var i = 0, len = availablePool.length; i < len; i++) {\n          availablePool[i].realCloseSync();\n        }\n      }\n      self.realCloseSync();\n    }\n  }\n}\n\nDatabase.prototype.query = function (query, params, cb)\n{\n  var self = this, deferred, sql, resultset = [], multipleResultSet = false;\n  var sqlca = {sqlstate:\"0\", sqlcode: 0};\n\n  exports.debug && console.log(getElapsedTime(), \"odbc.js:query() => Entry\");\n  //support for promises\n  if (!cb && typeof params !== 'function')\n  {\n    deferred = Q.defer();\n    !params ? params = null : '';\n  }\n\n  if (typeof(params) === 'function')\n  {\n    cb = params;\n    params = null;\n  }\n\n  self.queue.push(function (next) {\n    function cbQuery (initialErr, result, outparams)\n    {\n      if(outparams) {\n        resultset = outparams;\n        multipleResultSet = true;\n      }\n      if (result && typeof(result) === 'object') {\n        fetchMore();\n      } else {\n        if (initialErr) {\n          if (initialErr.sqlstate) {\n            sqlca.sqlstate = initialErr.sqlstate;\n          }\n          if (initialErr.sqlcode) {\n            sqlca.sqlcode = initialErr.sqlcode;\n          }\n          self.checkConnectionError(initialErr);\n          if(deferred) {\n            let error = {};\n            if(typeof initialErr === 'object') {\n                error = initialErr;\n            } else {\n                error[\"message\"] = initialErr;\n            }\n            error[\"resultset\"] = resultset;\n            error.sqlcode = sqlca.sqlcode;\n            error.sqlstate = sqlca.sqlstate;\n            deferred.reject(error);\n          } else {\n            cb(initialErr, resultset, sqlca);\n          }\n        }\n        if (result) { result.closeSync(); }\n        initialErr = null;\n        return next();\n      }\n\n      function fetchMore()\n      {\n        if (self.fetchMode)\n        {\n          result.fetchMode = self.fetchMode;\n        }\n\n        result._fetchAll(function (err, data, colcount) {\n          var moreResults = false, moreResultsError = null;\n\n          // If there is any error, return it now only.\n          if( err || initialErr )\n          {\n            self.checkConnectionError(err || initialErr);\n            if(multipleResultSet) resultset.push(data);\n            else resultset = data;\n            err = initialErr || err;\n            sqlca.sqlstate = err.sqlstate || sqlca.sqlstate;\n            sqlca.sqlcode = err.sqlcode || sqlca.sqlcode;\n            console.log(err, sqlca);\n            if(deferred) {\n              err[\"resultset\"] = resultset;\n              err.sqlcode = sqlca.sqlcode;\n              err.sqlstate = sqlca.sqlstate;\n              deferred.reject(err);\n            } else {\n              cb(err, resultset, sqlca);\n            }\n            if (result) { result.closeSync(); }\n            initialErr = null;\n            err = null;\n            return next();\n          }\n\n          // Get the result data\n          try\n          {\n            moreResults = result.moreResultsSync();\n          }\n          catch (e)\n          {\n            moreResultsError = e;\n            moreResults = false;\n            sqlca.sqlstate = e.sqlstate || sqlca.sqlstate;\n            sqlca.sqlcode = e.sqlcode || sqlca.sqlcode;\n          }\n\n          //close the result before calling back\n          //if there are not more result sets\n          if (moreResults)\n          {\n            resultset.push(data);\n            multipleResultSet = true;\n            fetchMore();\n          }\n          else\n          {\n            result.closeSync();\n            if( colcount ) {\n              if(multipleResultSet) resultset.push(data);\n              else resultset = data;\n            }\n\n            exports.debug && console.log(getElapsedTime(), \"odbc.js:query() => Done.\");\n            // send exception error and/or data to callback function.\n            // only once with all the results.\n            if( !sqlca.sqlcode && colcount && !resultset.length ) {\n                sqlca.sqlcode = 100;\n            }\n            if(deferred) {\n              if(moreResultsError) {\n                  moreResultsError[\"resultset\"] = resultset;\n                  moreResultsError.sqlcode = sqlca.sqlcode;\n                  moreResultsError.sqlstate = sqlca.sqlstate;\n                  deferred.reject(moreResultsError);\n              } else {\n                  deferred.resolve(resultset);\n              }\n            } else {\n              cb(moreResultsError, resultset, sqlca);\n            }\n          }\n          \n          moreResultsError = null;\n          return next();\n        });\n      } // function fetchMore\n    } //function cbQuery\n\n    if (!self.connected)\n    {\n      sqlca = {sqlstate: \"08001\", sqlcode : -30081};\n      deferred ? deferred.reject(connError) : cb(connError, [], sqlca);\n      return next();\n    }\n\n    if(typeof query === \"object\")\n    {\n      sql = query.sql;\n      if(query.params) params = query.params;\n    }\n    else\n    {\n      sql = query;\n    }\n    exports.debug && console.log(getElapsedTime(), \"odbc.js:query() => \", sql);\n\n    try {\n      if (params && params.length > 0)\n      {\n        if(Array.isArray(params))\n        {\n          var err = parseParams(params);\n          if(err) deferred ? deferred.reject(err) : cb(err);\n        }\n        if(exports.debug && logParams) {\n          console.log(\"%s odbc.js:query() params = \", getElapsedTime(), params);\n        }\n        if(typeof query === 'object')\n        {\n          query.params = params;\n          self.conn.query(query, cbQuery);\n        }\n        else\n          self.conn.query(query, params, cbQuery);\n      }\n      else\n      {\n        self.conn.query(query, cbQuery);\n      }\n    } catch (err)\n    {\n      self.checkConnectionError(err);\n      deferred ? deferred.reject(err) : cb(err);\n      return next();\n    }\n  }); //self.queue.push\n  return deferred ? deferred.promise : false;\n}; // Database.query\n\nDatabase.prototype.queryResult = function (query, params, cb)\n{\n  var self = this, deferred, sql;\n\n  //support for promises\n  if (!cb && typeof params !== 'function')\n  {\n    deferred = Q.defer();\n    !params ? params = null : '';\n  }\n\n  if (typeof(params) === 'function')\n  {\n    cb = params;\n    params = null;\n  }\n\n  if(typeof query === \"object\")\n  {\n      sql = query.sql;\n      if(query.params) params = query.params;\n  }\n  else\n  {\n      sql = query;\n  }\n\n  exports.debug && console.log(getElapsedTime(), \"odbc.js:queryResult() => \", sql);\n  self.queue.push(function (next) {\n    //ODBCConnection.query() is the fastest-path querying mechanism.\n    if (!self.connected)\n    {\n      deferred ? deferred.reject(connError) : cb(connError);\n      return next();\n    }\n\n    if (params && params.length > 0)\n    {\n      if(Array.isArray(params))\n      {\n        var err = parseParams(params);\n        if(err) deferred ? deferred.reject(err) : ( cb && cb(err) );\n      }\n      if(typeof query === 'object')\n      {\n        query.params = params;\n        self.conn.query(query, cbQuery);\n      }\n      else\n        self.conn.query(sql, params, cbQuery);\n    }\n    else\n    {\n      self.conn.query(sql, cbQuery);\n    }\n\n    function cbQuery (err, result, outparams)\n    {\n      if (err)\n      {\n        self.checkConnectionError(err);\n        deferred ? deferred.reject(err) : ( cb && cb(err, null, outparams) );\n        return next();\n      }\n\n      if (result && typeof(result) === 'object') {\n          if (self.fetchMode)\n          {\n            result.fetchMode = self.fetchMode;\n          }\n      }\n      else if( result )  // noResults = true is passed by application.\n      {\n          outparams = result; \n          result = null;\n      }\n\n      !cb ? deferred.resolve([result, outparams]) : cb(err, result, outparams);\n\n      return next();\n    } // function cbQuery\n  }); //self.queue.push\n  return deferred ? deferred.promise : false;\n}; // Database.queryResult\n\nDatabase.prototype.queryResultSync = function (query, params)\n{\n  var self = this, sql, outparams;\n  var result; // Must get closed by caller for success case.\n\n  if (!self.connected)\n  {\n    throw ({ message : \"Connection not open.\"});\n  }\n\n  if(typeof query === \"object\")\n  {\n      sql = query.sql;\n      if(query.params) params = query.params;\n  }\n  else\n  {\n      sql = query;\n  }\n\n  exports.debug && console.log(getElapsedTime(), \"odbc.js:queryResultSync() => \", sql);\n  try {\n    if (params)\n    {\n      if(Array.isArray(params))\n      {\n          var err = parseParams(params);\n          if(err) return err;\n      }\n      if(typeof query === 'object')\n      {\n          query.params = params;\n          result = self.conn.querySync(query);\n      }\n      else\n      {\n          result = self.conn.querySync(sql, params);\n      }\n    }\n    else\n    {\n      result = self.conn.querySync(sql); // Always returns [stmt, outparms]\n    }\n  } catch (e)\n  {\n      self.checkConnectionError(e);\n      return e;\n  }\n\n  if(Array.isArray(result)) // Its a CALL stmt with OUT params.\n  {\n    if(result[1]) { \n        outparams = result[1]; // INOUT and OUTPUT param values for SP.\n    }\n    result = result[0];\n  }\n  if (result && typeof(result) === 'object' && self.fetchMode)\n  {\n    result.fetchMode = self.fetchMode;\n  }\n  if( outparams ) return [result, outparams];\n  else return result;\n}; // Database.queryResultSync\n\nDatabase.prototype.querySync = function (query, params)\n{\n  var self = this, result, sql, outparams = null;\n\n  if (!self.connected)\n  {\n    throw ({ message : \"Connection not open.\"});\n  }\n\n  if(typeof query === \"object\")\n  {\n      sql = query.sql;\n      if(query.params) params = query.params;\n  }\n  else\n  {\n      sql = query;\n  }\n\n  exports.debug && console.log(getElapsedTime(), \"odbc.js:querySync() => \", sql);\n  try {\n    if (params)\n    {\n      if(Array.isArray(params))\n      {\n          var err = parseParams(params);\n          if(err) return err;\n          if(logParams) {\n            console.log(\"%s odbc.js:querySync() params = \", getElapsedTime(), params);\n          }\n      }\n      if(typeof query === 'object')\n      {\n          query.params = params;\n          result = self.conn.querySync(query);\n      }\n      else\n      {\n        result = self.conn.querySync(sql, params);\n      }\n    }\n    else\n    {\n      result = self.conn.querySync(query);\n    }\n  } catch (e)\n  {\n      self.checkConnectionError(e);\n      return e;\n  }\n\n  if(Array.isArray(result))\n  {\n    if(result[1]) { \n        outparams = result[1]; // INOUT and OUT param values for SP.\n    }\n    result = result[0];\n  }\n  if(!result) return outparams;  // For noResults.\n\n  // Processing for resultset.\n  var data, resultset = [], moreResults = true, moreResultsError = null;\n  var nullresult = true;\n\n  if(outparams) {\n      resultset = outparams;\n      nullresult = false;\n  }\n  if (self.fetchMode)\n  {\n    result.fetchMode = self.fetchMode;\n  }\n\n  while(moreResults)\n  {\n      data = result.fetchAllSync();\n      if(!data.length) {\n          moreResults = false;\n          break;\n      }\n      try\n      {\n          moreResults = result.moreResultsSync();\n      }\n      catch (e)\n      {\n          moreResultsError = e;\n          moreResults = false;\n          break;\n      }\n      if(data.length) {\n          if(nullresult && !moreResults) resultset = data;\n          else resultset.push(data);\n          nullresult = false;\n      }\n  }\n  result.closeSync();\n\n  if(moreResultsError) {\n      self.checkConnectionError(moreResultsError);\n      return moreResultsError;\n  }\n  if(nullresult) return [];\n\n  return resultset;\n}; // Database.querySync\n\nDatabase.prototype.executeFile = function (inputfile, delimiter, outputfile, cb) {\n    var fs = require('fs-extra');\n    var self = this, deferred, sql;\n\n    if (typeof (delimiter) === 'function') {\n        cb = delimiter;\n        delimiter = ';'\n    }\n\n    if (typeof (outputfile) === 'function') {\n        cb = outputfile;\n        outputfile = undefined;\n    }\n\n    //support for promises\n    if (!cb) {\n      deferred = Q.defer();\n    }\n\n    if (typeof inputfile !== \"string\") {\n        sql = inputfile.sql;\n        if (inputfile.delimiter) delimiter = inputfile.delimiter;\n        if (inputfile.outputfile) outputfile = inputfile.outputfile;\n    }\n    else {\n        sql = inputfile;\n    }\n\n    if (!self.connected) {\n        deferred ? deferred.reject(connError) : cb(connError);\n    }\n    fs.readFile(sql, function (err, sql) {\n        if (err) {\n            deferred ? deferred.reject(err) : cb(err);\n        }\n        else {\n            var query = sql.toString();\n            var myarray = query.split(delimiter);\n            var res = \"\";\n            if (outputfile !== undefined) {\n                if (fs.existsSync(outputfile)) {\n                    fs.unlinkSync(outputfile)\n                }\n                else {\n                    fs.ensureFileSync(outputfile)\n                }\n            }\n            for (var i = 0; i < myarray.length; i++) {\n                query = (myarray[i]).trim();\n                var result = [];\n                if(query) {\n                    result = self.querySync(query);\n                    if (!Array.isArray(result)) {\n                        if (outputfile === undefined) {\n                            deferred ? deferred.reject(result) : cb(result);\n                        }\n                        else {\n                            fs.appendFileSync(outputfile, result);\n                        }\n                    }\n                    if (result.length > 0) {\n                        result = JSON.stringify(result);\n                        if (outputfile === undefined) {\n                            res += result + delimiter;\n                        }\n                        else {\n                            fs.appendFileSync(outputfile, result + delimiter);\n                        }\n                    }\n                }\n            }\n            deferred ? deferred.resolve(res) : cb(err, res);\n        }\n    });\n}; \n\nDatabase.prototype.executeFileSync = function (inputfile, delimiter, outputfile)\n{\n    var fs = require('fs-extra');\n    var self = this, sql = null;\n    if (!self.connected)\n    {\n        throw ({ message: \"Connection not open.\" });\n    }\n    if (typeof inputfile !== \"string\")\n    {\n        sql = inputfile.sql;\n        if (inputfile.delimiter) delimiter = inputfile.delimiter;\n        if (inputfile.outputfile) outputfile = inputfile.outputfile;\n    }\n    else\n    {\n        sql = inputfile;\n    }\n    if (!fs.existsSync(sql))\n    {\n        return Error(\"[node-ibm_db] Input file \" + sql + \" does not exists\");\n    }\n    if (outputfile !== undefined)\n    {\n        if (fs.existsSync(outputfile))\n        {\n            fs.unlinkSync(outputfile)\n        }\n        else\n        {\n            fs.ensureFileSync(outputfile)\n        }\n    }\n    if (delimiter === undefined)\n    {\n        delimiter = ';'\n    }\n    var query = fs.readFileSync(sql, 'utf8')\n    var myarray = query.split(delimiter);\n    var res = \"\";\n    for (var i = 0; i < myarray.length; i++)\n    {\n        var result = self.querySync(myarray[i]);\n        if (!Array.isArray(result))\n        {\n            return result;\n        }\n        if (result.length > 0)\n        {\n            result = JSON.stringify(result)\n            if (outputfile === undefined)\n            {\n                res += result + delimiter\n            }\n            else\n            {\n                fs.appendFileSync(outputfile, result + delimiter)\n            }\n        }\n    }\n    return res;\n}; \n\nDatabase.prototype.queryStream = function queryStream(sql, params) \n{\n  var self = this;\n  var stream = new Readable({ objectMode: true });\n  var results;\n  stream._read = function() \n  {\n    // after the first internal call to _read, the 'results' should be set\n    // and the stream can continue fetching the results\n    if (results) return self.fetchStreamingResults(results, stream);\n\n    // in the first call to _read the stream starts to emit data once we've \n    // queried for results\n    return self.queryResult(sql, params, function (err, result) \n    {\n      if (err) \n      {\n        return process.nextTick(function () { stream.emit('error', err); });\n      }\n      results = result;\n      return self.fetchStreamingResults(results, stream);\n    });\n  };\n  return stream;\n};\n\nDatabase.prototype.fetchStreamingResults = function(results, stream) \n{\n  var self = this;\n  return results.fetch(function (err, data) \n  {\n    if (err) \n    {\n      return process.nextTick(function () { stream.emit('error', err); });\n    }\n    // when no more data returns, return push null to indicate the end of stream\n    if (!data) \n    { \n      results.closeSync(); // Close stmt handle. \n      stream.push(null);\n    }\n    else {\n      stream.push(data);\n    }\n  });\n};\n\nDatabase.prototype.beginTransaction = function (cb)\n{\n  var self = this\n      , deferred = null\n      , onBeginTransaction;\n  if(!cb) \n  {\n    deferred = Q.defer();\n  }\n  onBeginTransaction = function(err) \n  {\n    if(err) \n    {\n      self.checkConnectionError(err);\n      deferred ? deferred.reject(err) : cb(err);\n    }\n    else \n    {\n      deferred ? deferred.resolve(true) : cb(null);\n    }\n  };\n\n  self.conn.beginTransaction(onBeginTransaction);\n  self.conn.inTransaction = true;\n\n  return deferred ? deferred.promise : self;\n};\n\nDatabase.prototype.endTransaction = function (rollback, cb)\n{\n  var self = this, deferred = null;\n\n  if(!cb) \n  {\n    deferred = Q.defer();\n  }\n  var onEndTransaction = function(err) \n  {\n    if(err) \n    {\n      self.checkConnectionError(err);\n      deferred ? deferred.reject(err) : cb(err);\n    }\n    else \n    {\n      deferred ? deferred.resolve(true) : cb(null);\n    }\n  };\n  self.conn.endTransaction(rollback, onEndTransaction);\n  self.conn.inTransaction = false;\n\n  return deferred ? deferred.promise : self;\n};\n\nDatabase.prototype.commitTransaction = function (cb)\n{\n  var self = this;\n  //don't rollback\n  return self.endTransaction(false, cb); \n};\n\nDatabase.prototype.rollbackTransaction = function (cb)\n{\n  var self = this;\n  return self.endTransaction(true, cb); //rollback\n};\n\nDatabase.prototype.beginTransactionSync = function ()\n{\n  var self = this;\n\n  try {\n    self.conn.beginTransactionSync();\n  } catch (e) {\n    self.checkConnectionError(e);\n    throw new Error(e);\n  }\n  self.conn.inTransaction = true;\n\n  return self;\n};\n\nDatabase.prototype.endTransactionSync = function (rollback)\n{\n  var self = this;\n\n  self.conn.inTransaction = false;\n  try {\n    self.conn.endTransactionSync(rollback);\n  } catch (e) {\n    self.checkConnectionError(e);\n    throw new Error(e);\n  }\n\n  return self;\n};\n\nDatabase.prototype.commitTransactionSync = function ()\n{\n  var self = this;\n  return self.endTransactionSync(false); //don't rollback\n};\n\nDatabase.prototype.rollbackTransactionSync = function ()\n{\n  var self = this;\n  return self.endTransactionSync(true); //rollback\n};\n\nDatabase.prototype.columns = async function(catalog, schema, table, column, callback)\n{\n  var self = this, deferred;\n  var error = {\n      error : \"[node-ibm_db] Missing Arguments\",\n      message : \"The object you passed must contain four arguments: \" +\n                \"catalog, schema, table and column. \" +\n                \"This is required for the columns method to work.\"\n    };\n  if (!self.queue) self.queue = [];\n\n  callback = callback || arguments[arguments.length - 1];\n  if(typeof(callback) !== 'function') {\n    callback = null;\n    deferred = Q.defer();\n    if( arguments.length != 4 ) {\n        deferred.reject(error);\n        throw new Error(error.message);\n    }\n  }\n  else if( arguments.length != 5 ) {\n      callback(error, [], false);\n  }\n  self.queue.push(function (next) \n  {\n    self.conn.columns(catalog, schema, table, column, function (err, result) \n    {\n      if (err) {\n        self.checkConnectionError(err);\n        return deferred ? deferred.reject(err) : callback(err, [], false);\n      }\n\n      result._fetchAll(function (err, data)\n      {\n        result.closeSync();\n        self.checkConnectionError(err);\n        deferred ? deferred.resolve(data) : callback(err, data);\n        return next();\n      });\n    });\n  });\n  if(deferred) return deferred.promise;\n};\n\nDatabase.prototype.tables = function(catalog, schema, table, type, callback)\n{\n  var self = this, deferred;\n  var error = {\n      error : \"[node-ibm_db] Missing Arguments\",\n      message : \"The object you passed must contain four arguments: \" +\n                \"catalog, schema, table and type. \" +\n                \"This is required for the tables method to work.\"\n    };\n  if (!self.queue) self.queue = [];\n\n  callback = callback || arguments[arguments.length - 1];\n  if(typeof(callback) !== 'function') {\n    callback = null;\n    deferred = Q.defer();\n    if( arguments.length != 4 ) {\n        deferred.reject(error);\n        throw new Error(error.message);\n    }\n  }\n  else if( arguments.length != 5 ) {\n      callback(error, [], false);\n  }\n\n  self.queue.push(function (next) \n  {\n    self.conn.tables(catalog, schema, table, type, function (err, result) \n    {\n      if (err) {\n        self.checkConnectionError(err);\n        return deferred ? deferred.reject(err) : callback(err, [], false);\n      }\n\n      result._fetchAll(function (err, data)\n      {\n        result.closeSync();\n        self.checkConnectionError(err);\n        deferred ? deferred.resolve(data) : callback(err, data);\n        return next();\n      });\n    });\n  });\n  if(deferred) return deferred.promise;\n};\n\nDatabase.prototype.describe = async function(obj, callback)\n{\n  var self = this, deferred;\n  var error = {\n      error : \"[node-ibm_db] Missing Arguments\",\n      message : \"You must pass an object as argument 0 if you want \" +\n                \"anything productive to happen in the describe method.\"\n    };\n\n  if (typeof(callback) !== \"function\") {\n    callback = null;\n  }\n  if(!callback) {\n      deferred = Q.defer();\n  }\n  if (typeof(obj) !== \"object\") {\n    deferred ? deferred.reject(error) : callback && callback(error, []);\n  }\n\n  if (!obj.database) {\n    error = {\n      error : \"[node-ibmdb] Missing Arguments\",\n      message : \"The object you passed did not contain a database \" +\n                \"property. This is required for the describe method to work.\"\n    };\n    deferred ? deferred.reject(error) : callback && callback(error, []);\n  }\n\n  //set some defaults if they weren't passed\n  obj.schema = obj.schema || \"%\";\n  obj.type = obj.type || \"TABLE\";\n\n  if (obj.table && obj.column)\n  {\n    //get the column details\n    if(callback)\n      self.columns(obj.database, obj.schema, obj.table, obj.column, callback);\n    else\n      return await self.columns(obj.database, obj.schema, obj.table, obj.column);\n  }\n  else if (obj.table)\n  {\n    //get the columns in the table\n    if(callback)\n      self.columns(obj.database, obj.schema, obj.table, \"%\", callback);\n    else\n      return await self.columns(obj.database, obj.schema, obj.table, \"%\")\n                   .catch((e)=> { deferred.reject(e); });\n  }\n  else\n  {\n    //get the tables in the database\n    if(callback)\n      self.tables(obj.database, obj.schema, null, obj.type, callback);\n    else\n      return await self.tables(obj.database, obj.schema, null, obj.type);\n  }\n}; //Database.describe\n\nDatabase.prototype.prepare = function (sql, cb)\n{\n  var self = this, deferred;\n\n  if(!cb) \n  {\n    deferred = Q.defer();\n  }\n\n  self.conn.createStatement(function (err, stmt) \n  {\n    if(err)\n    {\n      self.checkConnectionError(err);\n      if(cb)\n      {\n        return cb(err);\n      } else\n      {\n        deferred.reject(err);\n      }\n    }\n\n    stmt.queue = new SimpleQueue();\n    stmt.db = self; // We need a reference to db to check for connection errors\n\n    stmt.prepare(sql, function (err) \n    {\n      if (err)\n      {\n        self.checkConnectionError(err);\n        if(cb)\n        {\n          return cb(err);\n        } else\n        {\n          deferred.reject(err)\n        }\n      }\n\n      deferred ? deferred.resolve(stmt) : cb(null, stmt);\n    });\n  });\n  return deferred ? deferred.promise : null;\n};\n\nDatabase.prototype.prepareSync = function (sql)\n{\n  var self = this;\n  var stmt = {};\n\n  try {\n    stmt = self.conn.createStatementSync();\n  } catch (e) {\n    self.checkConnectionError(e);\n    throw new Error(e);\n  }\n\n  stmt.queue = new SimpleQueue();\n  stmt.db = self; // We need a reference to db to check for connection errors\n\n  try {\n    stmt.prepareSync(sql);\n  } catch (e) {\n    self.checkConnectionError(e);\n    throw new Error(e);\n  }\n\n  return stmt;\n};\n\nDatabase.prototype.setIsolationLevel = function(isolationLevel) \n{\n  var self = this;\n  try {\n    self.conn.setIsolationLevel(isolationLevel);\n  } catch (e) {\n    self.checkConnectionError(e);\n    throw new Error(e);\n  }\n  return true;\n};\n\nconst MAXINFO_LEN = 256; // odbc.C CLI_MAXINFO_LEN\nDatabase.prototype.getInfoSync = function(infoType, infoLen)\n{\n  // infoType - mandatory\n  // infoLen - optional\n\n  var self = this;\n  if (!self.connected)\n  {\n    throw ({ message : \"Connection not open.\"});\n  }\n  if (Number.isInteger(infoType) === false) {\n    return { message : \"Invalid infoType requested.\"};\n  }\n  if (Number.isInteger(infoLen) === false) {\n    infoLen = MAXINFO_LEN;\n  }\n\n  try {\n    return self.conn.getInfoSync(infoType, infoLen);\n  } catch (e) {\n    self.checkConnectionError(e);\n    throw new Error(e);\n  }\n} //getInfoSync\n\nDatabase.prototype.getInfo = function (infoType, infoLen, cb)\n{\n  // infoType - mandatory\n  // infoLen - optional\n  // cb - optional. If not cb, then return promise\n \n  var self = this, deferred;\n\n  //support for promises\n  if (!cb && typeof infoLen !== 'function')\n  {\n    deferred = Q.defer();\n  }\n  // For (infoType, cb)\n  if (typeof(infoLen) === 'function')\n  {\n    cb = infoLen;\n    infoLen = MAXINFO_LEN;\n  }\n  if (Number.isInteger(infoLen) === false) {\n    infoLen = MAXINFO_LEN;\n  }\n\n  self.queue.push(function (next)\n  {\n    exports.debug && console.log(getElapsedTime(), \"odbc.js: infoType => \", infoType);\n    if (!self.connected) {\n      deferred ? deferred.reject(connError) : cb(connError);\n      return next();\n    }\n\n    if (Number.isInteger(infoType) === false) {\n      var err = { message : \"Invalid infoType used, \" + infoType};\n      deferred ? deferred.reject(err) : cb(err);\n      return next();\n    }\n\n    self.conn.getInfo(infoType, infoLen, function (err, value)\n    {\n      if (err)\n      {\n        self.checkConnectionError(err);\n        deferred ? deferred.reject(err) : cb(err);\n        return next();\n      }\n      deferred ? deferred.resolve(value) : cb(null, value);\n      return next();\n    });\n  });\n  if(deferred) return deferred.promise;\n} //getInfo\n\nDatabase.prototype.getTypeInfoSync = function(dataType)\n{\n  // infoType - mandatory\n\n  var self = this;\n  var stmt = 0;\n  var data = [];\n  if (!self.connected)\n  {\n    throw ({ message : \"Connection not open.\"});\n  }\n  if (Number.isInteger(dataType) === false) {\n    throw { message : \"Invalid dataType used, \" + dataType};\n  }\n\n  try {\n    stmt = self.conn.getTypeInfoSync(dataType);\n    data = stmt.fetchAllSync();\n    stmt.closeSync();\n    return data;\n  } catch (e) {\n    self.checkConnectionError(e);\n    throw new Error(e);\n  }\n} //getTypeInfoSync\n\nDatabase.prototype.getTypeInfo = function (dataType, cb)\n{\n  // dataType - mandatory\n  // cb - optional. If not cb, then return promise\n\n  var self = this, deferred;\n\n  if (typeof dataType === 'function')\n  {\n      cb = dataType;\n  }\n  //support for promises\n  if (!cb && typeof dataType !== 'function')\n  {\n    deferred = Q.defer();\n  }\n\n  self.queue.push(function (next)\n  {\n    exports.debug && console.log(getElapsedTime(), \"odbc.js: dataType => \", dataType);\n    if (!self.connected) {\n      deferred ? deferred.reject(connError) : cb(connError);\n      return next();\n    }\n\n    if (Number.isInteger(dataType) === false) {\n      var err = { message : \"Invalid dataType.\" };\n      if (typeof dataType === 'function') {\n        err = { message : \"Missing dataType.\" };\n      }\n      deferred ? deferred.reject(err) : cb(err);\n      return next();\n    }\n\n    self.conn.getTypeInfo(dataType, function (err, result)\n    {\n      if (err) {\n        self.checkConnectionError(err);\n        deferred ? deferred.reject(err) : cb(err, false);\n        return next();\n      }\n\n      result.fetchAll(function (err, data)\n      {\n        result.closeSync();\n        if(err) {\n            self.checkConnectionError(err);\n            deferred ? deferred.reject(err) : cb(err, data);\n        } else {\n            deferred ? deferred.resolve(data) : cb(err, data);\n        }\n        return next();\n      });\n    });\n  });\n  if(deferred) return deferred.promise;\n} //getTypeInfo\n\nDatabase.prototype.getFunctionsSync = function(functionId)\n{\n  // functionId - mandatory\n\n  var self = this;\n  var fExists = 0;\n  if (!self.connected)\n  {\n    throw ({ message : \"Connection not open.\"});\n  }\n  if (Number.isInteger(functionId) === false) {\n    return { message : \"Invalid functionId.\"};\n  }\n\n  try {\n    fExists = self.conn.getFunctionsSync(functionId);\n  } catch (e) {\n    self.checkConnectionError(e);\n    throw new Error(e);\n  }\n  if(fExists)\n  {\n    if(functionId) return true;\n    else\n    {\n        var functionMap = {};\n        var i = 0;\n        for ( i = 1; i < 100; i++ )\n        {\n            if(fExists[i])\n            {\n                functionMap[macro.functionids[i]] = true;\n            }\n            else\n            {\n                functionMap[i] = false;\n            }\n        }\n        return functionMap;\n    }\n  }\n  else return false;\n} //getFunctionsSync\n\nDatabase.prototype.getFunctions = function (functionId, cb)\n{\n  // functionId - mandatory\n  // cb - optional. If not cb, then return promise\n\n  var self = this, deferred;\n\n  if (typeof(functionId) === 'function')\n  {\n    cb = functionId;\n    functionId = null;\n  }\n  //support for promises\n  if (!cb)\n  {\n    deferred = Q.defer();\n  }\n\n  self.queue.push(function (next)\n  {\n    exports.debug && console.log(getElapsedTime(), \"odbc.js: functionId => \", functionId);\n    if (!self.connected) {\n      deferred ? deferred.reject(connError) : cb(connError);\n      return next();\n    }\n\n    if (Number.isInteger(functionId) === false) {\n      var err = { message : \"Invalid functionId = \" + functionId};\n      deferred ? deferred.reject(err) : cb(err);\n      return next();\n    }\n\n    self.conn.getFunctions(functionId, function (err, value)\n    {\n      if (err)\n      {\n        self.checkConnectionError(err);\n        deferred ? deferred.reject(err) : cb(err);\n        return next();\n      }\n      var result = false;\n      if(value)\n      {\n        if(functionId) result = true;\n        else\n        {\n            var functionMap = {};\n            var i = 0;\n            for ( i = 1; i < 100; i++ )\n            {\n              if(value[i])\n              {\n                functionMap[macro.functionids[i]] = true;\n              }\n              else\n              {\n                functionMap[i] = false;\n              }\n            }\n            result = functionMap;\n        }\n      }\n      deferred ? deferred.resolve(result) : cb(null, result);\n      return next();\n    });\n  });\n  if(deferred) return deferred.promise;\n} //getFunctions\n\n// Function to set connection level attributes\nDatabase.prototype.setAttr = function (attr, value, cb)\n{\n  // attr, value - mandatory\n  // cb - optional. If not cb, then return promise\n\n  var self = this, deferred;\n\n  //support for promises\n  if (!cb)\n  {\n    deferred = Q.defer();\n  }\n\n  self.queue.push(function (next)\n  {\n    exports.debug && console.log(getElapsedTime(),\n        \"odbc.js:setAttr() Attribute = \", attr, \", Value = \", value);\n    if (!self.connected) {\n      deferred ? deferred.reject(connError) : cb(connError);\n      return next();\n    }\n\n    if (Number.isInteger(attr) === false) {\n      var connattr = macro.connAttributes[attr];\n      if (Number.isInteger(connattr) === false) {\n        var err = { message : \"Invalid attr = \" + attr};\n        deferred ? deferred.reject(err) : cb(err);\n        return next();\n      } else {\n        attr = connattr;\n      }\n    }\n\n    self.conn.setAttr(attr, value, function (err)\n    {\n      if (err)\n      {\n        self.checkConnectionError(err);\n        deferred ? deferred.reject(err) : cb(err);\n        return next();\n      }\n      deferred ? deferred.resolve(true) : cb(null, true);\n      return next();\n    });\n  });\n  if(deferred) return deferred.promise;\n} //setAttr\n\n// Async Function to set connection level attributes\nDatabase.prototype.setAttrSync = function (attr, value)\n{\n    // attr, value - mandatory\n    var self = this;\n\n    exports.debug && console.log(getElapsedTime(),\n        \"odbc.js:setAttrSync() Attribute = \", attr, \", Value = \", value);\n\n    if (!self.connected) {\n      return (connError);\n    }\n    if (Number.isInteger(attr) === false) {\n      return { message : \"Invalid Attribute.\"};\n    }\n\n  try {\n      return self.conn.setAttrSync(attr, value);\n  } catch (e) {\n    self.checkConnectionError(e);\n    return new Error(e);\n  }\n}; // setAttrSync\n\n//Proxy all of the ODBCStatement functions so that they are queued\nif( !odbc.ODBCStatement.prototype._execute ) { //issue #514\n  odbc.ODBCStatement.prototype._execute = odbc.ODBCStatement.prototype.execute;\n  odbc.ODBCStatement.prototype._executeSync = odbc.ODBCStatement.prototype.executeSync;\n  odbc.ODBCStatement.prototype._executeDirect = odbc.ODBCStatement.prototype.executeDirect;\n  odbc.ODBCStatement.prototype._executeDirectSync = odbc.ODBCStatement.prototype.executeDirectSync;\n  odbc.ODBCStatement.prototype._executeNonQuery = odbc.ODBCStatement.prototype.executeNonQuery;\n  odbc.ODBCStatement.prototype._executeNonQuerySync = odbc.ODBCStatement.prototype.executeNonQuerySync;\n  odbc.ODBCStatement.prototype._prepare = odbc.ODBCStatement.prototype.prepare;\n  odbc.ODBCStatement.prototype._bind = odbc.ODBCStatement.prototype.bind;\n  odbc.ODBCStatement.prototype._bindSync = odbc.ODBCStatement.prototype.bindSync;\n  odbc.ODBCStatement.prototype._setAttr = odbc.ODBCStatement.prototype.setAttr;\n  odbc.ODBCStatement.prototype._setAttrSync = odbc.ODBCStatement.prototype.setAttrSync;\n  odbc.ODBCStatement.prototype._close = odbc.ODBCStatement.prototype.close;\n\n  //Proxy all of the ODBCResult functions so that they are queued\n  odbc.ODBCResult.prototype._fetch = odbc.ODBCResult.prototype.fetch;\n  odbc.ODBCResult.prototype._fetchAll = odbc.ODBCResult.prototype.fetchAll;\n  odbc.ODBCResult.prototype._getData = odbc.ODBCResult.prototype.getData;\n  odbc.ODBCResult.prototype._close = odbc.ODBCResult.prototype.close;\n}\n\nodbc.ODBCStatement.prototype.execute = function (params, cb)\n{\n  var self = this, deferred;\n  self.queue = self.queue || new SimpleQueue();\n\n  if (!cb) {\n    if (typeof params === 'function') {\n      cb = params;\n      params = null;\n    }\n    else {\n      deferred = Q.defer();\n    }\n  }\n\n  self.queue.push(function (next) {\n    //If params were passed to this function, then bind them and\n    //then execute.\n    if (params)\n    {\n      if(Array.isArray(params))\n      {\n        var err = parseParams(params);\n        if(err)\n        {\n          if(deferred)\n          {\n            deferred.reject(err);\n          } else\n          {\n            cb(err);\n          }\n        }\n      }\n      if(exports.debug) {\n        if(logParams) {\n          console.log(\"%s odbc.js:execute() bind params = \", getElapsedTime(), params);\n        } else {\n          console.log(\"%s odbc.js:execute()\", getElapsedTime());\n        }\n      }\n      self._bind(params, function (err) {\n        if (err) {\n          self.db.checkConnectionError(err);\n          deferred ? deferred.reject(err) : cb(err);\n          return next();\n        }\n\n        self._execute(function (err, result, outparams) {\n          if (err) {\n            self.db.checkConnectionError(err);\n          }\n\n          if(deferred) {\n            if(err) {\n              deferred.reject(err);\n            } else {\n              if(outparams) {\n                deferred.resolve([result, outparams]);\n              } else {\n                deferred.resolve(result);\n              }\n            }\n          } else {\n            cb(err, result, outparams);\n          }\n\n          return next();\n        });\n      });\n    }\n    //Otherwise execute and pop the next bind call\n    else\n    {\n      self._execute(function (err, result, outparams) {\n        if (err) {\n          self.db.checkConnectionError(err);\n        }\n\n        if(deferred) {\n          if(err) {\n            deferred.reject(err);\n          } else {\n              if(outparams) {\n                deferred.resolve([result, outparams]);\n              } else {\n                deferred.resolve(result);\n              }\n          }\n        } else {\n          cb(err, result, outparams);\n        }\n\n        //NOTE: We only execute the next queued bind call after\n        // we have called execute() or executeNonQuery(). This ensures\n        // that we don't call a bind() a bunch of times without ever\n        // actually executing that bind. Not\n        self.bindQueue && self.bindQueue.next();\n\n        return next();\n      });\n    }\n  });\n  return deferred ? deferred.promise : null;\n};\n\nodbc.ODBCStatement.prototype.executeSync = function (params)\n{\n  var self = this, err;\n\n  //If params are passed to this function, first bind them and\n  //then execute.\n  if (params)\n  {\n      err = self.bindSync(params);\n      if(err !== true) console.log(err);\n  }\n  return self._executeSync();\n};\n\nfunction parseParams(params)\n{\n    var err, prm, paramtype, ctype, sqltype, datatype, data, len;\n    for (var i = 0; i < params.length; i++)\n    {\n        if(Object.prototype.toString.call(params[i]) == \"[object Object]\")\n        {\n            //{ParamType:\"INPUT\", DataType:\"BLOB\", Data:imgfile}\n            //{\"ParamType\":\"INPUT\", CType:\"BINARY\", SQLType:\"BLOB\", Data:imgfile, Length:50}\n            paramtype = 1; ctype = undefined; sqltype = undefined;\n            datatype = undefined; data = undefined, len = 0;\n            prm = params[i];\n            if(prm.ParamType)\n            {\n                if(Number.isInteger(prm.ParamType))\n                {\n                    if(prm.ParamType > 0 && prm.ParamType < 5)\n                        paramtype = prm.ParamType;\n                }\n                else if(prm.ParamType == \"OUTPUT\")\n                    paramtype = 4; // SQL_PARAM_OUTPUT\n                else if(prm.ParamType == \"INOUT\")\n                    paramtype = 2; // SQL_PARAM_INPUT_OUTPUT\n                else if(prm.ParamType == \"FILE\")\n                    paramtype = 3; // SQLBindFileToParam()\n            }\n\n            if(prm.CType)\n            {\n                if(Number.isInteger(prm.CType))\n                {\n                    ctype = prm.CType;\n                }\n                else if(prm.CType == \"CHAR\")\n                    ctype = 1;\n                else if(prm.CType == \"BINARY\")\n                    ctype = -2;\n                else if(prm.CType == \"DOUBLE\" || prm.CType == \"DECIMAL\")\n                    ctype = 8; // SQL_C_DOUBLE=8, SQL_DECIMAL=3\n                else if(prm.CType == \"INTEGER\")\n                    ctype = 4;\n                else if(prm.CType == \"BIGINT\")\n                    ctype = -25;\n            }\n\n            // Either SQLType or DataType must be entered.\n            // If SQLType is used, DataType will be ignored.\n            if(prm.SQLType || prm.DataType)\n            {\n                var type = prm.SQLType || prm.DataType;\n                if(Number.isInteger(type))\n                {\n                    sqltype = type;\n                }\n                else if(type == \"DOUBLE\")\n                {\n                    sqltype = 8;                 // SQL_DOUBLE\n                    if(!ctype) ctype = sqltype;\n                }\n                else if(type == \"DECIMAL\")\n                {\n                    sqltype = 3;                 // SQL_DECIMAL\n                    if(!ctype) ctype = 8;        // sql_C_DOUBLE\n                }\n                else if(type == \"BIGINT\")\n                {\n                    sqltype = -5;                 // SQL_BIGINT\n                    if(!ctype) ctype = -25;       // sql_C_BIGINT\n                }\n                else if(type == \"CHAR\")\n                {\n                    sqltype = 1;                 // SQL_CHAR\n                    if(!ctype) ctype = sqltype;\n                }\n                else if(type == \"BINARY\")\n                {\n                    sqltype = -2;\n                    if(!ctype) ctype = sqltype;\n                }\n                else if(type == \"BLOB\")\n                {\n                    sqltype = -98;               // SQL_BLOB\n                    if(!ctype) ctype = -2;\n                }\n                else if(type == \"CLOB\")\n                {\n                    sqltype = -99;\n                    if(!ctype) ctype = 1;\n                }\n                else if(type == \"DBCLOB\")\n                {\n                    sqltype = -350;\n                    if(!ctype) ctype = sqltype;\n                }\n                else if(type == \"XML\")\n                {\n                    sqltype = -370;\n                    if(!ctype) ctype = 1;\n                }\n                else if(type == \"GRAPHIC\")\n                {\n                    sqltype = -95;\n                    if(!ctype) ctype = -99; //SQL_C_DBCHAR\n                }\n                else if(type == \"VARGRAPHIC\")\n                {\n                    sqltype = -96;\n                    if(!ctype) ctype = -99; //SQL_C_DBCHAR\n                }\n                else if(type == \"LONGGRAPHIC\")\n                {\n                    sqltype = -97;\n                    if(!ctype) ctype = -99; //SQL_C_DBCHAR\n                }\n            }\n            if(prm.Length > 0 && Number.isInteger(prm.Length))\n            {\n                len = prm.Length;\n            }\n\n            if(prm.Data === undefined )\n            {\n                err = \"odbc.js:parseParams =>Data is missing from \" + JSON.stringify(prm);\n                break;\n            }\n            if(Number.isInteger(prm.Data))\n            {\n                if(!ctype) ctype = -25; // SQL_C_SBIGINT\n                if(!sqltype) sqltype = -5; // SQL_BIGINT\n\n            }\n            else if( (paramtype == 4) && (prm.Data === \"\") )\n            {\n                prm.Data = \"abc\";\n            }\n\n            if(!ctype) ctype = 1;\n            if(!sqltype) sqltype = 1;\n            if(paramtype == 3) // For BindFileToParam()\n            {\n                ctype = 1;\n                if(!((sqltype == -98) || (sqltype == -99) ||\n                     (sqltype == -350) || (sqltype == -370)))\n                {\n                    err = \"odbc.js:parseParams => DataType is missing form \" + prm;\n                    break;\n                }\n            }\n\n            params[i] = [paramtype, ctype, sqltype, prm.Data, len];\n        }\n        //console.log(i + \"th param = \" + params[i]);\n    }\n    return err;\n}\n\nif(Number.isInteger === undefined)   // node.js < v0.12.0 do not support isInteger\n{\n    Number.isInteger = function(x)\n    {\n        if((typeof x === 'number') && (x % 1 === 0)) return true;\n        else return false;\n    };\n}\n\nodbc.ODBCStatement.prototype.executeDirect = function (sql, cb) \n{\n  var self = this, deferred;\n\n  if(!cb) {\n      deferred = Q.defer();\n  }\n  self.queue = self.queue || new SimpleQueue();\n\n  self.queue.push(function (next) {\n    self._executeDirect(sql, function (err, result) {\n        if(err) {\n            deferred ? deferred.reject(err) : cb(err, result);\n        } else {\n            deferred ? deferred.resolve(result) : cb(err, result);\n        }\n\n      return next();\n    });\n  });\n  return deferred ? deferred.promise : null;\n};\n\nodbc.ODBCStatement.prototype.executeNonQuery = function (params, cb) \n{\n  var self = this, deferred;\n\n  if (!cb) {\n    if (typeof params === 'function') {\n      cb = params;\n      params = null;\n    }\n    else {\n      deferred = Q.defer();\n    }\n  }\n  self.queue = self.queue || new SimpleQueue();\n\n  self.queue.push(function (next) {\n    //If params were passed to this function, then bind them and\n    //then executeNonQuery.\n    if (params) \n    {\n      if(Array.isArray(params))\n      {\n        var err = parseParams(params);\n        if(err) deferred ? deferred.reject(err) : cb(err);\n      }\n      if(exports.debug) {\n        if(logParams) {\n          console.log(\"%s odbc.js:executeNonQuery() bind params = \", getElapsedTime(), params);\n        } else {\n          console.log(\"%s odbc.js:executeNonQuery()\", getElapsedTime());\n        }\n      }\n      self._bind(params, function (err) {\n        if (err) {\n          if(deferred)\n          {\n            deferred.reject(err);\n          } \n          else\n          {\n            cb && cb(err)\n          }\n          return next();\n        }\n\n        self._executeNonQuery(function (err, result) {\n          if(deferred) {\n            if(err) {\n              deferred.reject(err);\n            } else {\n              deferred.resolve(result);\n            }\n          } else {\n            cb &&  cb(err, result);\n          }\n          return next();\n        });\n      });\n    }\n    //Otherwise executeNonQuery and pop the next bind call\n    else {\n      self._executeNonQuery(function (err, result) {\n        if(deferred) {\n          if(err) {\n            deferred.reject(err);\n          } else {\n            deferred.resolve(result);\n          }\n        } else {\n          cb && cb(err, result);\n        }\n\n        //NOTE: We only execute the next queued bind call after\n        // we have called execute() or executeNonQuery(). This ensures\n        // that we don't call a bind() a bunch of times without ever\n        // actually executing that bind.\n        self.bindQueue && self.bindQueue.next();\n\n        return next();\n      });\n    }\n  });\n  return deferred ? deferred.promise : null;\n};\n\nodbc.ODBCStatement.prototype.executeNonQuerySync = function (params)\n{\n  var self = this, err;\n\n  //If params are passed to this function, first bind them and\n  //then execute.\n  if (params)\n  {\n      err = self.bindSync(params);\n      if(err !== true) console.log(err);\n  }\n  return self._executeNonQuerySync();\n};\n\nodbc.ODBCStatement.prototype.prepare = function (sql, cb) {\n  var self = this, deferred;\n\n  if(!cb) {\n      deferred = Q.defer();\n  }\n  self.queue = self.queue || new SimpleQueue();\n\n  self.queue.push(function (next) {\n    try {\n      self._prepare(sql, function (err) {\n        if(cb) {\n          cb(err);\n        } else {\n          err ? deferred.reject(err) : deferred.resolve(true);\n        }\n      });\n    } catch (ex) {\n        cb ? cb(ex) : deferred.reject(ex);\n    }\n    return next();\n  });\n  return deferred ? deferred.promise : null;\n};\n\n// Function to bind parameters before execute or executeSync\nodbc.ODBCStatement.prototype.bind = function (ary, cb) {\n  var self = this, deferred;\n\n  if(!cb) {\n    if (typeof ary === 'function') {\n      cb = ary;\n      ary = null;\n    }\n    else {\n      deferred = Q.defer();\n    }\n  }\n  self.bindQueue = self.bindQueue || new SimpleQueue();\n\n  self.bindQueue.push(function () {\n    if(Array.isArray(ary))\n    {\n      var err = parseParams(ary);\n      if(err) deferred ? deferred.reject(err) : cb(err);\n    }\n    if(exports.debug) {\n      if(logParams) {\n        console.log(\"%s odbc.js:bind() params = \", getElapsedTime(), ary);\n      } else {\n        console.log(\"%s odbc.js:bind()\", getElapsedTime());\n      }\n    }\n    self._bind(ary, function (err) {\n      if(cb) {\n        cb(err);\n      } else {\n        err ? deferred.reject(err) : deferred.resolve(true);\n      }\n\n      //NOTE: we do not call next() here because\n      //we want to pop the next bind call only\n      //after the next execute call\n    });\n  });\n};\n\n// Async Function to bind parameters before execute or executeSync\nodbc.ODBCStatement.prototype.bindSync = function (ary) {\n    var self = this;\n    if(Array.isArray(ary))\n    {\n      var err = parseParams(ary);\n      if(err) return false;\n    }\n    if(exports.debug) {\n      if(logParams) {\n        console.log(\"%s odbc.js::bindSync() params = \", getElapsedTime(), ary);\n      } else {\n        console.log(\"%s odbc.js:bindSync()\", getElapsedTime());\n      }\n    }\n    return self._bindSync(ary); \n};\n\n// Function to set statement attributes before execute or executeSync\nodbc.ODBCStatement.prototype.setAttr = function (attr, value, cb) {\n  var self = this, deferred;\n\n  if(!cb) {\n      deferred = Q.defer();\n  }\n  self.setAttrQueue = self.setAttrQueue || new SimpleQueue();\n\n  self.setAttrQueue.push(function () {\n    exports.debug && console.log(\"%s odbc.js:setAttr() Attribute = \", getElapsedTime(), attr, \", value = \", value);\n    self._setAttr(attr, value, function (err) {\n      if(cb) {\n        cb(err);\n      } else {\n        err ? deferred.reject(err) : deferred.resolve(true);\n      }\n    });\n  });\n  return deferred ? deferred.promise : null;\n};\n\n// Async Function to set statement attributes  before execute or executeSync\nodbc.ODBCStatement.prototype.setAttrSync = function (attr, value) {\n    var self = this;\n    exports.debug && console.log(\"%s odbc.js:setAttrSync() Attribute = \", getElapsedTime(), attr, \", Value = \", value);\n    return self._setAttrSync(attr, value); \n};\n\n// Async funcion to close a statement object to free statement handle\n// If no callback function, then return Promise.\nodbc.ODBCStatement.prototype.close = function (closeOption, cb)\n{\n  var self = this, deferred;\n  self.queue = self.queue || new SimpleQueue();\n\n  if (!cb)\n  {\n      if (typeof closeOption === 'function') {\n          cb = closeOption;\n          closeOption = 1;\n      } else {\n        deferred = Q.defer();\n      }\n      if(!closeOption) closeOption = 1;\n  }\n\n  self.queue.push(function (next) {\n    self._close(closeOption, function (err) {\n      if( err ) {\n          deferred ? deferred.reject(err) : cb(err);\n      } else {\n          deferred ? deferred.resolve(false) : cb(null);\n      }\n\n      return next();\n    });\n  });\n  return deferred ? deferred.promise : false;\n};\n\n// Async function to fetch single row of data post execute or executeSync call.\n// result.fetch(option, callback);\n// result.fetch({fetchMode:4|3|0}); default value of fetchMode is 4 - OBJECT\n// fetchMode:0 => will not return any data, we need to retrieve data using\n// getData() or getDataSync() APIs.\n// If callback function is not provided, it will return Promise.\n// Below is the Promisified implementation of fetch() function.\nodbc.ODBCResult.prototype.fetch = function (option, cb) {\n  var self = this, deferred;\n  self.queue = self.queue || new SimpleQueue();\n\n  if (!cb)\n  {\n    if(typeof option === 'function')\n    {\n      cb = option;\n      option = undefined;\n    }\n    else\n    {\n      deferred = Q.defer();\n    }\n  }\n  if (typeof option === 'object')\n  {\n    if (option.fetchMode !=0 && option.fetchMode !=3 && option.fetchMode !=4)\n    {\n      var error = \"Invalid fetchMode!\";\n      !cb ? deferred.reject(error) : cb(error);\n    } else {\n      self.fetchMode = option.fetchMode;\n    }\n  } else {\n    option = undefined;\n  }\n\n  if (option)\n  {\n    self.queue.push(function (next) {\n      self._fetch(option, function (err, data) {\n        if( err ) {\n          deferred ? deferred.reject(err) : cb(err, null);\n        } else {\n          deferred ? deferred.resolve(data) : cb(null, data);\n        }\n        return next();\n      });\n    });\n  }\n  else\n  {\n    self.queue.push(function (next) {\n      self._fetch(function (err, data) {\n        if( err ) {\n          deferred ? deferred.reject(err) : cb(err, null);\n        } else {\n          deferred ? deferred.resolve(data) : cb(null, data);\n        }\n        return next();\n      });\n    });\n  }\n  return deferred ? deferred.promise : false;\n};\n\nodbc.ODBCResult.prototype.fetchAll = function (option, cb)\n{\n  var self = this, deferred;\n\n  if (!cb)\n  {\n    if(typeof option === 'function')\n    {\n      cb = option;\n      option = undefined;\n    }\n    else\n    {\n      deferred = Q.defer();\n    }\n  }\n  if (typeof option === 'object')\n  {\n    if (option.fetchMode !=3 && option.fetchMode !=4)\n    {\n      var error = \"Invalid fetchMode!\";\n      !cb ? deferred.reject(error) : cb(error);\n    } else {\n      self.fetchMode = option.fetchMode;\n    }\n  } else {\n    option = undefined;\n  }\n\n  if (option)\n  {\n      self._fetchAll(option, function (err, data, count) {\n        if( err ) {\n          deferred ? deferred.reject(err) : cb(err, null, 0);\n        } else {\n          deferred ? deferred.resolve(data) : cb(null, data, count);\n        }\n      });\n  }\n  else\n  {\n      self._fetchAll(function (err, data, count) {\n        if( err ) {\n          deferred ? deferred.reject(err) : cb(err, null, 0);\n        } else {\n          deferred ? deferred.resolve(data) : cb(null, data, count);\n        }\n      });\n  }\n  return deferred ? deferred.promise : false;\n};\n\n// Async funcion to getData for a column after call of fetch with fetchMode:0\n// If no callback function, then return Promise.\nodbc.ODBCResult.prototype.getData = function (colNum, dataSize, cb)\n{\n  var self = this, deferred;\n\n  if (!cb && typeof colNum !== 'function' && typeof dataSize !== 'function')\n  {\n      deferred = Q.defer();\n  }\n  self.queue = self.queue || new SimpleQueue();\n\n  if (!cb && typeof dataSize === 'function')\n  {\n    cb = dataSize;\n    dataSize = 0;\n  }\n  if (!colNum)\n  {\n      colNum = 0;\n  }\n\n  self.queue.push(function (next) {\n    self._getData(colNum, dataSize, function (err, data) {\n      if( err ) {\n          deferred ? deferred.reject(err) : cb(err, null);\n      } else {\n          deferred ? deferred.resolve(data) : cb(null, data);\n      }\n\n      return next();\n    });\n  });\n  return deferred ? deferred.promise : false;\n};\n\n// Async funcion to close a result object to free statement handle\n// If no callback function, then return Promise.\nodbc.ODBCResult.prototype.close = function (closeOption, cb)\n{\n  var self = this, deferred;\n  self.queue = self.queue || new SimpleQueue();\n\n  if (!cb)\n  {\n      if (typeof closeOption === 'function') {\n          cb = closeOption;\n          closeOption = 1;\n      } else {\n        deferred = Q.defer();\n      }\n      if(!closeOption) closeOption = 1;\n  }\n\n  self.queue.push(function (next) {\n    self._close(closeOption, function (err) {\n      if( err ) {\n          deferred ? deferred.reject(err) : cb(err);\n      } else {\n          deferred ? deferred.resolve(false) : cb(null);\n      }\n\n      return next();\n    });\n  });\n  return deferred ? deferred.promise : false;\n};\n\n\n/***** CONNECTION POOLING RELATED APIs *******/\n/*===========================================*/\n\nmodule.exports.Pool = Pool;\n\nPool.count = 0;\n\nfunction Pool (_options) {\n  var self = this;\n  self.options = {};\n  self.maxPoolSize = 0;\n  if(_options) \n  {\n    if(_options.idleTimeout && !isNaN(_options.idleTimeout))\n      self.options.idleTimeout = _options.idleTimeout;\n    if(_options.autoCleanIdle)\n      self.options.autoCleanIdle = _options.autoCleanIdle;\n    if(_options.maxPoolSize)\n      self.maxPoolSize = _options.maxPoolSize;\n    if(_options.connectTimeout)\n      self.options.connectTimeout = _options.connectTimeout;\n    if(_options.systemNaming)\n      self.options.systemNaming=_options.systemNaming;\n  }\n  self.index = Pool.count++;\n  self.availablePool = {};\n  self.usedPool = {};\n  self.poolSize = 0;\n  self.queue = self.queue || new SimpleQueue();\n  self.queue.executing = true; // Do not call next, untill next is called by db.close();\n  if(!ENV) ENV = new odbc.ODBC();\n  self.odbc = ENV;\n  self.options.connectTimeout = self.options.connectTimeout || 60;\n}\n\n// Get a new connection from pool asynchronously\nPool.prototype.open = function (connStr, callback)\n{\n  var self = this\n    , db, deferred\n    ;\n\n  if (!callback)\n  {\n    deferred = Q.defer();\n  }\n  //check to see if we already have a connection for this connection string\n  if (self.availablePool[connStr] && self.availablePool[connStr].length)\n  {\n    // Remove connection if marked as not connected.\n    do {\n      db = self.availablePool[connStr].shift();\n      if (db && !db.connected) {\n        db = null;\n        if(self.poolSize) self.poolSize--;\n      }\n      else { break; }\n    } while (!db);\n  }\n  if (db) {\n    db.lastUsed=null;\n    self.usedPool[connStr] = self.usedPool[connStr] || [];\n    self.usedPool[connStr].push(db);\n    deferred ? deferred.resolve(db) : callback(null, db);\n  }\n  else if((self.maxPoolSize > 0) && (self.poolSize >= self.maxPoolSize))\n  {\n    // Move it to queue untill an existing connection is not closed.\n    // Call it from db.close() version of pool.open and pool.init.\n    function queueCallback(next) {\n      if (self.availablePool[connStr] && self.availablePool[connStr].length)\n      {\n        db = self.availablePool[connStr].shift();\n        db.lastUsed=null;\n        self.usedPool[connStr] = self.usedPool[connStr] || [];\n        self.usedPool[connStr].push(db);\n        deferred ? deferred.resolve(db) : callback(null, db);\n      }\n      else {\n        self.queue.push(queueCallback);\n      }\n    }\n    self.queue.push(queueCallback);\n  }\n  else\n  {\n    if(typeof(self.options.odbc) === 'undefined')\n        self.options.odbc = self.odbc;\n    self.options.pool = self;\n    self.options.connStr = connStr;\n    db = new Database(self.options);\n    self.poolSize++;\n\n    db.open(connStr, function (error) {\n      exports.debug && console.log(\"%s odbc.js : pool[%s] : pool.db.open new connection.\", getElapsedTime(), self.index);\n      if(error)\n      {\n        self.poolSize--;\n        deferred ? deferred.reject(error) : callback(error, db);\n      }\n      else\n      {\n        self.usedPool[connStr] = self.usedPool[connStr] || [];\n        db.created = Date.now();\n        self.usedPool[connStr].push(db);\n        deferred ? deferred.resolve(db) : callback(error, db);\n      }\n    }); //db.open\n  }\n  return deferred ? deferred.promise : null;\n};\n\n// Get a new connection from pool synchronously\nPool.prototype.openSync = function (connStr)\n{\n  var self = this\n    , db\n    ;\n\n  //check to see if we already have a connection for this connection string\n  if (self.availablePool[connStr] && self.availablePool[connStr].length)\n  {\n    // Remove connection if marked as not connected.\n    do {\n      db = self.availablePool[connStr].shift();\n      if (db && !db.connected) {\n        db = null;\n        if(self.poolSize) self.poolSize--;\n      }\n      else { break; }\n    } while (!db);\n  }\n  if (db) {\n    db.lastUsed=null;\n    self.usedPool[connStr] = self.usedPool[connStr] || [];\n    self.usedPool[connStr].push(db);\n    return db;\n  }\n  else if((self.maxPoolSize > 0) && (self.poolSize >= self.maxPoolSize))\n  {\n    // Move it to queue untill an existing connection is not closed.\n    // Call it from db.close() version of pool.open and pool.init.\n    function queueCallback(next) {\n      if (self.availablePool[connStr] && self.availablePool[connStr].length)\n      {\n        db = self.availablePool[connStr].shift();\n        db.lastUsed=null;\n        self.usedPool[connStr] = self.usedPool[connStr] || [];\n        self.usedPool[connStr].push(db);\n        return db;\n      }\n      else {\n        self.queue.push(queueCallback);\n      }\n    }\n    self.queue.push(queueCallback);\n  }\n  else\n  {\n    if(typeof(self.options.odbc) === 'undefined')\n        self.options.odbc = self.odbc;\n    self.options.pool = self;\n    self.options.connStr = connStr;\n    db = new Database(self.options);\n\n    exports.debug && console.log(\"%s odbc.js : pool[%s] : pool.db.openSync new connection.\", getElapsedTime(), self.index);\n    db.openSync(connStr);\n    self.poolSize++;\n    self.usedPool[connStr] = self.usedPool[connStr] || [];\n    db.created = Date.now();\n    self.usedPool[connStr].push(db);\n    return db;\n  }\n}; //pool.openSync\n\n// closeSync function for pooled connection.\nDatabase.prototype.poolCloseSync = function ()\n{\n    var db = this;\n    var self = this.pool;\n    var connStr = this.connStr;\n    if( !self ) { return db.closeSync(); }\n\n    self.availablePool[connStr] = self.availablePool[connStr] || [];\n    // If conn.closeSync is called more than once for this connection,\n    // nothing to do. Just return.\n    if( self.availablePool[connStr] &&\n        self.availablePool[connStr].indexOf(db) >= 0 )\n    {\n        return;\n    }\n    db.lastUsed = Date.now();\n\n    // If this connection has some active transaction, rollback the\n    // transaction to free up the held resorces before moving back to\n    // the pool. So that, next request can get afresh connection from pool.\n    if(db.conn && db.conn.inTransaction)\n    {\n      try {\n        db.rollbackTransactionSync();\n      } catch(error) {\n          // Just ignore the error, since we're closing the connection.\n      }\n    }\n\n    //remove this db from the usedPool\n    if(self.usedPool[connStr]) {\n      self.usedPool[connStr].splice(self.usedPool[connStr].indexOf(db), 1);\n      self.poolSize--;\n    }\n\n    //move this connection back to the connection pool at the end.\n    if(db.conn)\n    {\n      self.availablePool[connStr].push(db);\n      self.poolSize++;\n    }\n\n    if(db.conn && self.options.autoCleanIdle) self.cleanUp(connStr);\n    return self.queue.next();\n};  // db.poolCloseSync function\n\n// conn.close function for pooled connection.\nDatabase.prototype.poolClose = function (cb)\n{\n    var db = this;\n    var self = this.pool;\n    var connStr = this.connStr;\n    if( !self ) { return db.close(cb); }\n    var deferred;\n    if(!cb) {\n        deferred = Q.defer();\n    }\n\n    self.availablePool[connStr] = self.availablePool[connStr] || [];\n    // If conn.close is called more than once for this connection,\n    // nothing to do. Just call the callback function and return.\n    if( self.availablePool[connStr] &&\n        self.availablePool[connStr].indexOf(db) >= 0 )\n    {\n        deferred ? deferred.resolve(true) : cb(null);\n        return;\n    }\n    db.lastUsed = Date.now();\n\n    // If this connection has some active transaction, rollback the\n    // transaction to free up the held resorces before moving back to\n    // the pool. So that, next request can get afresh connection from pool.\n    if(db.conn && db.conn.inTransaction)\n    {\n        db.rollbackTransaction(function(err){});\n    }\n\n    //remove this db from the usedPool\n    if(self.usedPool[connStr]) {\n      self.usedPool[connStr].splice(self.usedPool[connStr].indexOf(db), 1);\n      self.poolSize--;\n    }\n\n    //move this connection back to the connection pool at the end.\n    if(db.conn)\n    {\n      self.availablePool[connStr].push(db);\n      self.poolSize++;\n    }\n    deferred ? deferred.resolve(true) : cb(null);\n\n    if(db.conn && self.options.autoCleanIdle) self.cleanUp(connStr);\n    //if(exports.debug) {\n        //process.stdout.write(getElapsedTime());\n        //console.log(util.inspect(self, {depth: null}));\n    //}\n    return self.queue.next();\n};  // poolClose function\n\nPool.prototype.init = function(count, connStr)\n{\n  var self = this;\n  var ret = false;\n  exports.debug && console.log(getElapsedTime(), \"Max pool size at start of init = \" + self.maxPoolSize);\n\n  //check to see if we already have a connection for this connection string\n  if (self.availablePool[connStr] && self.availablePool[connStr].length)\n  {\n    console.log(\"Pool is already initialized and it has \"+\n           self.availablePool[connStr].length + \" available connections.\\n\");\n    return;\n  }\n  else if(count < 1) {\n    let err = {};\n    err[\"message\"] = \"Error: Count should be greater than 0. Pool not initialized.\";\n    exports.debug && console.log(getElapsedTime(), err.message);\n    return err;\n  }\n  else\n  {\n    if((self.maxPoolSize > 0) && (count > self.maxPoolSize))\n    {\n        console.log(getElapsedTime(), \" ** Can not open connection more than max pool size.\\n\");\n        count = self.maxPoolSize;\n    }\n\n    if(typeof(self.options.odbc) === 'undefined')\n        self.options.odbc = self.odbc;\n    self.options.pool = self;\n    self.options.connStr = connStr;\n    for(var i = 0; i < count; i++)\n    {\n        var db = new Database(self.options);\n        self.poolSize++;\n        try{\n            ret = db.openSync(connStr);\n        } catch (ret) {\n            self.poolSize--;\n            exports.debug && console.log(\"%s odbc.js: %d connection(s) initialized.\\n\", getElapsedTime(), self.poolSize);\n            return ret;\n        }\n        if(ret !== true) break; \n        exports.debug && console.log(\"%s odbc.js : pool[%s] : pool.init %d\", getElapsedTime(), self.index, i);\n\n        self.availablePool[connStr] = self.availablePool[connStr] || [];\n        db.created = Date.now();\n\n        db.availablePool = self.availablePool[connStr] || [];\n        self.availablePool[connStr].push(db);\n    }\n    self.usedPool[connStr] = self.usedPool[connStr] || [];\n    exports.debug && console.log(getElapsedTime(), \"Max pool size = \" + self.maxPoolSize);\n    exports.debug && console.log(getElapsedTime(), \"Pool = \", self);\n    return ret;\n  }\n};// Pool.init()\n\n// Initialize pool asynchronously\nPool.prototype.initAsync = function(count, connStr, cb)\n{\n  var self = this, deferred;\n  var ret = false;\n  exports.debug && console.log(getElapsedTime(), \"Max pool size at start of init = \" + self.maxPoolSize);\n\n  if (typeof(connStr) === \"object\")\n  {\n    let obj = connStr;\n    connStr = \"\";\n\n    Object.keys(obj).forEach(function (key) {\n      connStr += key + \"=\" + obj[key] + \";\";\n    });\n  }\n\n  if (!cb)\n  {\n    deferred = Q.defer();\n  }\n  //check to see if we already have a connection for this connection string\n  if (self.availablePool[connStr] && self.availablePool[connStr].length)\n  {\n    console.log(\"Pool is already initialized and it has \"+\n           self.availablePool[connStr].length + \" available connections.\\n\");\n    deferred ? deferred.resolve(true) : cb(null);\n  }\n  else if(count < 1) {\n    let err = {};\n    err[\"message\"] = \"Error: Count should be greater than 0. Pool not initialized.\";\n    exports.debug && console.log(getElapsedTime(), err.message);\n    deferred ? deferred.reject(err) : cb(err);\n  }\n  else\n  {\n    if((self.maxPoolSize > 0) && (count > self.maxPoolSize))\n    {\n        console.log(getElapsedTime(), \" ** Can not open connection more than max pool size.\\n\");\n        count = self.maxPoolSize;\n    }\n\n    if(typeof(self.options.odbc) === 'undefined')\n        self.options.odbc = self.odbc;\n    self.options.pool = self;\n    self.options.connStr = connStr;\n    self.availablePool[connStr] = self.availablePool[connStr] || [];\n    self.usedPool[connStr] = self.usedPool[connStr] || [];\n\n    for(var i = 0; i < count; i++)\n    {\n      (function (connNo) {\n        var db = new Database(self.options);\n        self.poolSize++;\n        db.open(connStr, function(error) {\n          if(error) {\n            self.poolSize--;\n          } else {\n            exports.debug && console.log(\"%s odbc.js: %d connections initialized.\\n\",\n                                         getElapsedTime(), self.poolSize);\n            exports.debug && console.log(\"%s odbc.js : pool[%s] : pool.init %d\",\n                                         getElapsedTime(), self.index, connNo);\n\n            db.created = Date.now();\n            db.availablePool = self.availablePool[connStr];\n            self.availablePool[connStr].push(db);\n          }\n          if(connNo == count) {\n            exports.debug && console.log(getElapsedTime(), \"Pool = \", self);\n            if(error) {\n              deferred ? deferred.reject(error) : cb(error);\n            } else {\n              deferred ? deferred.resolve(true) : cb(null);\n            }\n          }\n        });\n      })(i+1);\n    }\n  }\n  return deferred ? deferred.promise : null;\n};// Pool.initAsync()\n\n// No of active connections in pool should not grow more than maxPoolSize.\n// Run test/test-max-pool-size.js to test this functionality.\nPool.prototype.setMaxPoolSize = function(size)\n{\n    var self = this;\n    self.maxPoolSize = size;\n    exports.debug && console.log(getElapsedTime(), \"Max pool size is set to \" + self.maxPoolSize);\n    return true;\n};\n\nPool.prototype.setConnectTimeout = function(timeout)\n{\n    // Don't use this API. Will be removed in next major release.\n    // It is just a place holder as of now to avoid breaking of \n    // existing applications that uses it.\n\n    // Now there is no timeout for connection request from pool.\n    // Once conn.close() get called for existing pooled connection,\n    // the waiting connection request will get that connection from\n    // pool as connection pooling uses now FIFO queue for new\n    // connections beyond maxPoolSize.\n    return true;\n};\n\n// Close idle connections\nPool.prototype.cleanUp = function(connStr) {\n  var self = this;\n  if(self.availablePool[connStr].length < 2) return;\n\n  self.availablePool[connStr] = self.availablePool[connStr].filter(function(conn) \n  {\n    if(conn.lastUsed && \n       (Date.now()-conn.lastUsed > (self.options.idleTimeout || 1800 * 1000)) && \n       conn.realClose ) \n    {\n       conn.realClose(function() \n       {\n         if(self.poolSize) self.poolSize--;\n         exports.debug && console.log(\"odbc.js : pool[%s] : Pool.cleanUp() : \" +\n                 \"pool.realClose() : Connection duration : %s\", self.index, \n                 (Date.now() - conn.created)/1000);\n       });\n       return false;\n    }\n    else \n    {\n      return true;\n    }\n  });\n}; //Pool.cleanUp()\n\nPool.prototype.close = function (callback)\n{\n  var self = this\n    , required = 0\n    , received = 0\n    , connections\n    , key\n    , x\n    , deferred\n    ;\n\n    if(!callback) {\n        deferred = Q.defer();\n    }\n  exports.debug && console.log(\"%s odbc.js : pool[%s] : pool.close()\", getElapsedTime(), self.index);\n  //we set a timeout because a previous db.close() may\n  //have caused db.open() behind the scenes to prepare\n  //a new connection\n  setTimeout(function () {\n    //merge the available pool and the usedPool\n    var pools = {};\n\n    for (key in self.availablePool)\n    {\n      pools[key] = (pools[key] || []).concat(self.availablePool[key]);\n    }\n\n    for (key in self.usedPool)\n    {\n      pools[key] = (pools[key] || []).concat(self.usedPool[key]);\n    }\n\n    exports.debug && console.log(\"%s odbc.js : pool[%s] : pool.close() - setTimeout() callback\", getElapsedTime(), self.index);\n    //console.dir(pools);\n\n    if (Object.keys(pools).length === 0)\n    {\n      if (callback) return callback();\n      else return deferred.resolve(true);\n    }\n\n    for (key in pools)\n    {\n      connections = pools[key];\n      var connLen = connections.length;\n      required += connLen;\n\n      if(exports.debug) { \n        console.log(\"%s odbc.js : pool[%s] : pool.close() - processing pools - connections: %s\",\n                    getElapsedTime(), self.index, connections.length);\n      }\n\n      for (x = 0 ; x < connLen; x ++)\n      {\n        (function (x) {\n          //call the realClose method to avoid\n          //automatically re-opening the connection\n          if(exports.debug) { \n            console.log(\"%s odbc.js : pool[%s] : pool.close() - calling realClose() for connection #%s\", \n                        getElapsedTime(), self.index, x + 1);\n          }\n\n          if(connections[x].realClose) {\n           connections[x].realClose(function () {\n            if(exports.debug) { \n              console.log(\"%s odbc.js : pool[%s] : pool.close() - realClose() callback for connection #%s\", \n                          getElapsedTime(), self.index, x + 1);\n            }\n            module.exports.close(connections[x]);\n            received += 1;\n            if(self.poolSize) self.poolSize--;\n\n            if (received === required)\n            {\n              deferred ? deferred.resolve(true) : callback();\n\n              //prevent mem leaks\n              self = null;\n              connections = null;\n              required = null;\n              received = null;\n              key = null;\n\n              return;\n            }\n           }); // connections[x].realClose i.e. conn.close().\n          }\n          else {\n              exports.debug && console.log(\"%s realClose is not a member of connection %s\", getElapsedTime(), x + 1);\n          }\n        })(x);\n      } //for loop.\n    } //for (key in pools)\n  }, 2000);  //setTimeout\n  return deferred ? deferred.promise : null;\n};  //Pool.close()\n\nPool.prototype.closeSync = function ()\n{\n    var self = this\n      , connections\n      , key\n      , x, error\n      ;\n\n    exports.debug && console.log(\"%s odbc.js : pool[%s] : pool.closeSync()\", getElapsedTime(), self.index);\n\n    //merge the available pool and the usedPool\n    var pools = {};\n\n    for (key in self.availablePool)\n    {\n      pools[key] = (pools[key] || []).concat(self.availablePool[key]);\n    }\n    for (key in self.usedPool)\n    {\n      pools[key] = (pools[key] || []).concat(self.usedPool[key]);\n    }\n\n    if (Object.keys(pools).length === 0)\n    {\n      return null;\n    }\n\n    for (key in pools)\n    {\n      connections = pools[key];\n      var connLen = connections.length;\n\n      if(exports.debug) {\n        console.log(\"%s odbc.js : pool[%s] : pool.closeSync() - processing pools - connections: %s\",\n                    getElapsedTime(), self.index, connLen);\n      }\n\n      for (x = 0 ; x < connLen; x ++)\n      {\n          if(exports.debug) {\n            console.log(\"%s odbc.js : pool[%s] : pool.closeSync() - calling realClose() for connection #%s\",\n                        getElapsedTime(), self.index, x + 1);\n          }\n\n          if(connections[x].realCloseSync) {\n            error = connections[x].realCloseSync();\n            module.exports.close(connections[x]);\n            if(self.poolSize) self.poolSize--;\n          }\n          else {\n              exports.debug && console.log(\"%s realCloseSync is not a member of connection %s\", getElapsedTime(), x + 1);\n          }\n      }\n    } //for (key in pools)\n    self = null;\n    return error;\n};  //Pool.closeSync()\n\n\n// Add attributes from climacros.js\nvar attr;\nfor (attr in macro.attributes) {\n    module.exports[attr] = macro.attributes[attr];\n}\n\n"]}