Rework how errors are thrown
This commit is contained in:
parent
7126ff0c9a
commit
7665061280
|
@ -19,6 +19,7 @@
|
||||||
|
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
|
const errors = require('./errors.js');
|
||||||
const nodbUtil = require('./util.js');
|
const nodbUtil = require('./util.js');
|
||||||
|
|
||||||
class AqQueue {
|
class AqQueue {
|
||||||
|
@ -33,7 +34,7 @@ class AqQueue {
|
||||||
// Returns a single message from the queue, if one is available.
|
// Returns a single message from the queue, if one is available.
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
async deqOne() {
|
async deqOne() {
|
||||||
nodbUtil.checkArgCount(arguments, 0, 0);
|
errors.assertArgCount(arguments, 0, 0);
|
||||||
return await this._deqOne();
|
return await this._deqOne();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -44,8 +45,8 @@ class AqQueue {
|
||||||
// if any are available.
|
// if any are available.
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
async deqMany(maxMessages) {
|
async deqMany(maxMessages) {
|
||||||
nodbUtil.checkArgCount(arguments, 1, 1);
|
errors.assertArgCount(arguments, 1, 1);
|
||||||
nodbUtil.assert(typeof maxMessages === 'number', 'NJS-005', 1);
|
errors.assertParamValue(typeof maxMessages === 'number', 1);
|
||||||
return await this._deqMany(maxMessages);
|
return await this._deqMany(maxMessages);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -55,9 +56,9 @@ class AqQueue {
|
||||||
// Enqueues a single message into the queue.
|
// Enqueues a single message into the queue.
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
async enqOne(message) {
|
async enqOne(message) {
|
||||||
nodbUtil.checkArgCount(arguments, 1, 1);
|
errors.assertArgCount(arguments, 1, 1);
|
||||||
nodbUtil.assert(typeof message === 'object' || typeof message === 'string',
|
errors.assertParamValue(typeof message === 'object' ||
|
||||||
'NJS-005', 1);
|
typeof message === 'string', 1);
|
||||||
return await this._enqOne(message);
|
return await this._enqOne(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -68,8 +69,8 @@ class AqQueue {
|
||||||
// multiple round-trips.
|
// multiple round-trips.
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
async enqMany(messages) {
|
async enqMany(messages) {
|
||||||
nodbUtil.checkArgCount(arguments, 1, 1);
|
errors.assertArgCount(arguments, 1, 1);
|
||||||
nodbUtil.assert(Array.isArray(messages), 'NJS-005', 1);
|
errors.assertParamValue(Array.isArray(messages), 1);
|
||||||
return await this._enqMany(messages);
|
return await this._enqMany(messages);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
const BaseDbObject = require('./dbObject.js');
|
const BaseDbObject = require('./dbObject.js');
|
||||||
const EventEmitter = require('events');
|
const EventEmitter = require('events');
|
||||||
const QueryStream = require('./queryStream.js');
|
const QueryStream = require('./queryStream.js');
|
||||||
|
const errors = require('./errors.js');
|
||||||
const nodbUtil = require('./util.js');
|
const nodbUtil = require('./util.js');
|
||||||
const constants = require('./constants.js');
|
const constants = require('./constants.js');
|
||||||
const settings = require('./settings.js');
|
const settings = require('./settings.js');
|
||||||
|
@ -40,7 +41,7 @@ class Connection extends EventEmitter {
|
||||||
async _acquireLock() {
|
async _acquireLock() {
|
||||||
if (this._inProgress) {
|
if (this._inProgress) {
|
||||||
if (settings.errorOnConcurrentExecute) {
|
if (settings.errorOnConcurrentExecute) {
|
||||||
throw new Error(nodbUtil.getErrorMessage('NJS-081'));
|
errors.throwErr(errors.ERR_CONCURRENT_OPS);
|
||||||
}
|
}
|
||||||
await new Promise((resolve, reject) => {
|
await new Promise((resolve, reject) => {
|
||||||
const payload = {resolve: resolve, reject: reject};
|
const payload = {resolve: resolve, reject: reject};
|
||||||
|
@ -105,7 +106,7 @@ class Connection extends EventEmitter {
|
||||||
// Breaks the execution of the statement.
|
// Breaks the execution of the statement.
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
async breakExecution() {
|
async breakExecution() {
|
||||||
nodbUtil.checkArgCount(arguments, 0, 0);
|
errors.assertArgCount(arguments, 0, 0);
|
||||||
await this._break();
|
await this._break();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -115,10 +116,10 @@ class Connection extends EventEmitter {
|
||||||
// Changes the password of the specified user.
|
// Changes the password of the specified user.
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
async changePassword(user, password, newPassword) {
|
async changePassword(user, password, newPassword) {
|
||||||
nodbUtil.checkArgCount(arguments, 3, 3);
|
errors.assertArgCount(arguments, 3, 3);
|
||||||
nodbUtil.assert(typeof user === 'string', 'NJS-005', 1);
|
errors.assertParamValue(typeof user === 'string', 1);
|
||||||
nodbUtil.assert(typeof password === 'string', 'NJS-005', 2);
|
errors.assertParamValue(typeof password === 'string', 2);
|
||||||
nodbUtil.assert(typeof newPassword === 'string', 'NJS-005', 3);
|
errors.assertParamValue(typeof newPassword === 'string', 3);
|
||||||
await this._changePassword(user, password, newPassword);
|
await this._changePassword(user, password, newPassword);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -130,16 +131,16 @@ class Connection extends EventEmitter {
|
||||||
async close(a1) {
|
async close(a1) {
|
||||||
let options = {};
|
let options = {};
|
||||||
|
|
||||||
nodbUtil.checkArgCount(arguments, 0, 1);
|
errors.assertArgCount(arguments, 0, 1);
|
||||||
if (arguments.length == 1) {
|
if (arguments.length == 1) {
|
||||||
nodbUtil.assert(nodbUtil.isObject(a1), 'NJS-005', 1);
|
errors.assertParamValue(nodbUtil.isObject(a1), 1);
|
||||||
options = a1;
|
options = a1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// If already in the process of closing, throw an error instead of doing
|
// If already in the process of closing, throw an error instead of doing
|
||||||
// a roundtrip
|
// a roundtrip
|
||||||
if (this._closing) {
|
if (this._closing) {
|
||||||
throw new Error (nodbUtil.getErrorMessage('NJS-003'));
|
errors.throwErr(errors.ERR_INVALID_CONNECTION);
|
||||||
}
|
}
|
||||||
|
|
||||||
this._closing = true;
|
this._closing = true;
|
||||||
|
@ -162,7 +163,7 @@ class Connection extends EventEmitter {
|
||||||
// Commits the current transaction.
|
// Commits the current transaction.
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
async commit() {
|
async commit() {
|
||||||
nodbUtil.checkArgCount(arguments, 0, 0);
|
errors.assertArgCount(arguments, 0, 0);
|
||||||
await this._commit();
|
await this._commit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -172,8 +173,8 @@ class Connection extends EventEmitter {
|
||||||
// Creates a temporary LOB and returns it to the caller.
|
// Creates a temporary LOB and returns it to the caller.
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
async createLob(type) {
|
async createLob(type) {
|
||||||
nodbUtil.checkArgCount(arguments, 1, 1);
|
errors.assertArgCount(arguments, 1, 1);
|
||||||
nodbUtil.assert(typeof type === 'number', 'NJS-005', 1);
|
errors.assertParamValue(typeof type === 'number', 1);
|
||||||
return (await this._createLob(type));
|
return (await this._createLob(type));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -186,17 +187,17 @@ class Connection extends EventEmitter {
|
||||||
let binds = [];
|
let binds = [];
|
||||||
let executeOpts = {};
|
let executeOpts = {};
|
||||||
|
|
||||||
nodbUtil.checkArgCount(arguments, 1, 3);
|
errors.assertArgCount(arguments, 1, 3);
|
||||||
nodbUtil.assert(typeof sql === 'string', 'NJS-005', 1);
|
errors.assertParamValue(typeof sql === 'string', 1);
|
||||||
|
|
||||||
switch (arguments.length) {
|
switch (arguments.length) {
|
||||||
case 2:
|
case 2:
|
||||||
nodbUtil.assert(nodbUtil.isObjectOrArray(a2), 'NJS-005', 2);
|
errors.assertParamValue(nodbUtil.isObjectOrArray(a2), 2);
|
||||||
binds = a2;
|
binds = a2;
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
nodbUtil.assert(nodbUtil.isObjectOrArray(a2), 'NJS-005', 2);
|
errors.assertParamValue(nodbUtil.isObjectOrArray(a2), 2);
|
||||||
nodbUtil.assert(nodbUtil.isObject(a3), 'NJS-005', 3);
|
errors.assertParamValue(nodbUtil.isObject(a3), 3);
|
||||||
binds = a2;
|
binds = a2;
|
||||||
executeOpts = a3;
|
executeOpts = a3;
|
||||||
break;
|
break;
|
||||||
|
@ -235,18 +236,18 @@ class Connection extends EventEmitter {
|
||||||
async executeMany(sql, bindsOrNumIters, a3) {
|
async executeMany(sql, bindsOrNumIters, a3) {
|
||||||
let options = {};
|
let options = {};
|
||||||
|
|
||||||
nodbUtil.checkArgCount(arguments, 2, 3);
|
errors.assertArgCount(arguments, 2, 3);
|
||||||
nodbUtil.assert(typeof sql === 'string', 'NJS-005', 1);
|
errors.assertParamValue(typeof sql === 'string', 1);
|
||||||
if (typeof bindsOrNumIters === 'number') {
|
if (typeof bindsOrNumIters === 'number') {
|
||||||
nodbUtil.assert(Number.isInteger(bindsOrNumIters), 'NJS-005', 2);
|
errors.assertParamValue(Number.isInteger(bindsOrNumIters), 2);
|
||||||
nodbUtil.assert(bindsOrNumIters > 0, 'NJS-005', 2);
|
errors.assertParamValue(bindsOrNumIters > 0, 2);
|
||||||
} else {
|
} else {
|
||||||
nodbUtil.assert(Array.isArray(bindsOrNumIters), 'NJS-005', 2);
|
errors.assertParamValue(Array.isArray(bindsOrNumIters), 2);
|
||||||
nodbUtil.assert(bindsOrNumIters.length > 0, 'NJS-005', 2);
|
errors.assertParamValue(bindsOrNumIters.length > 0, 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (arguments.length == 3) {
|
if (arguments.length == 3) {
|
||||||
nodbUtil.assert(nodbUtil.isObject(a3), 'NJS-005', 3);
|
errors.assertParamValue(nodbUtil.isObject(a3), 3);
|
||||||
options = a3;
|
options = a3;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -262,8 +263,8 @@ class Connection extends EventEmitter {
|
||||||
// using the fully qualified name.
|
// using the fully qualified name.
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
async getDbObjectClass(name) {
|
async getDbObjectClass(name) {
|
||||||
nodbUtil.checkArgCount(arguments, 1, 1);
|
errors.assertArgCount(arguments, 1, 1);
|
||||||
nodbUtil.assert(typeof name === 'string', 'NJS-005', 1);
|
errors.assertParamValue(typeof name === 'string', 1);
|
||||||
|
|
||||||
let cls = this._dbObjectClasses[name];
|
let cls = this._dbObjectClasses[name];
|
||||||
if (cls) {
|
if (cls) {
|
||||||
|
@ -280,10 +281,10 @@ class Connection extends EventEmitter {
|
||||||
async getQueue(name, a2) {
|
async getQueue(name, a2) {
|
||||||
let options = {};
|
let options = {};
|
||||||
|
|
||||||
nodbUtil.checkArgCount(arguments, 1, 2);
|
errors.assertArgCount(arguments, 1, 2);
|
||||||
nodbUtil.assert(typeof name === 'string', 'NJS-005', 1);
|
errors.assertParamValue(typeof name === 'string', 1);
|
||||||
if (arguments.length == 2) {
|
if (arguments.length == 2) {
|
||||||
nodbUtil.assert(nodbUtil.isObject(a2), 'NJS-005', 2);
|
errors.assertParamValue(nodbUtil.isObject(a2), 2);
|
||||||
options = a2;
|
options = a2;
|
||||||
}
|
}
|
||||||
return (await this._getQueue(name, options));
|
return (await this._getQueue(name, options));
|
||||||
|
@ -296,7 +297,7 @@ class Connection extends EventEmitter {
|
||||||
// the current connection).
|
// the current connection).
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
getSodaDatabase() {
|
getSodaDatabase() {
|
||||||
nodbUtil.checkArgCount(arguments, 0, 0);
|
errors.assertArgCount(arguments, 0, 0);
|
||||||
return (this._getSodaDatabase());
|
return (this._getSodaDatabase());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -306,7 +307,7 @@ class Connection extends EventEmitter {
|
||||||
// Returns information about the statement.
|
// Returns information about the statement.
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
async getStatementInfo(sql) {
|
async getStatementInfo(sql) {
|
||||||
nodbUtil.checkArgCount(arguments, 1, 1);
|
errors.assertArgCount(arguments, 1, 1);
|
||||||
return (await this._getStatementInfo(sql));
|
return (await this._getStatementInfo(sql));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -326,7 +327,7 @@ class Connection extends EventEmitter {
|
||||||
// Sends a "ping" to the database to see if it is "alive".
|
// Sends a "ping" to the database to see if it is "alive".
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
async ping() {
|
async ping() {
|
||||||
nodbUtil.checkArgCount(arguments, 0, 0);
|
errors.assertArgCount(arguments, 0, 0);
|
||||||
await this._ping();
|
await this._ping();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -338,15 +339,15 @@ class Connection extends EventEmitter {
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
queryStream(sql, binding, options) {
|
queryStream(sql, binding, options) {
|
||||||
|
|
||||||
nodbUtil.checkArgCount(arguments, 1, 3);
|
errors.assertArgCount(arguments, 1, 3);
|
||||||
nodbUtil.assert(typeof sql === 'string', 'NJS-005', 1);
|
errors.assertParamValue(typeof sql === 'string', 1);
|
||||||
|
|
||||||
if (binding) {
|
if (binding) {
|
||||||
nodbUtil.assert(nodbUtil.isObjectOrArray(binding), 'NJS-005', 2);
|
errors.assertParamValue(nodbUtil.isObjectOrArray(binding), 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (options) {
|
if (options) {
|
||||||
nodbUtil.assert(nodbUtil.isObject(options), 'NJS-005', 3);
|
errors.assertParamValue(nodbUtil.isObject(options), 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
binding = binding || [];
|
binding = binding || [];
|
||||||
|
@ -358,18 +359,13 @@ class Connection extends EventEmitter {
|
||||||
|
|
||||||
// calling execute() via nextTick to ensure that handlers are registered
|
// calling execute() via nextTick to ensure that handlers are registered
|
||||||
// prior to the events being emitted
|
// prior to the events being emitted
|
||||||
process.nextTick(() => {
|
process.nextTick(async () => {
|
||||||
try {
|
try {
|
||||||
const p = this._execute(sql, binding, options);
|
const result = await this._execute(sql, binding, options);
|
||||||
p.then(function(result) {
|
if (!result.resultSet) {
|
||||||
if (!result.resultSet) {
|
errors.throwErr(errors.ERR_NOT_A_QUERY);
|
||||||
stream.destroy(new Error(nodbUtil.getErrorMessage('NJS-019')));
|
}
|
||||||
} else {
|
stream._open(result.resultSet);
|
||||||
stream._open(result.resultSet);
|
|
||||||
}
|
|
||||||
}, function(err) {
|
|
||||||
stream.destroy(err);
|
|
||||||
});
|
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
stream.destroy(err);
|
stream.destroy(err);
|
||||||
return;
|
return;
|
||||||
|
@ -385,7 +381,7 @@ class Connection extends EventEmitter {
|
||||||
// Rolls back the current transaction.
|
// Rolls back the current transaction.
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
async rollback() {
|
async rollback() {
|
||||||
nodbUtil.checkArgCount(arguments, 0, 0);
|
errors.assertArgCount(arguments, 0, 0);
|
||||||
await this._rollback();
|
await this._rollback();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -396,9 +392,9 @@ class Connection extends EventEmitter {
|
||||||
async shutdown(a1) {
|
async shutdown(a1) {
|
||||||
let mode = constants.SHUTDOWN_MODE_DEFAULT;
|
let mode = constants.SHUTDOWN_MODE_DEFAULT;
|
||||||
|
|
||||||
nodbUtil.checkArgCount(arguments, 0, 1);
|
errors.assertArgCount(arguments, 0, 1);
|
||||||
if (a1 !== undefined) {
|
if (a1 !== undefined) {
|
||||||
nodbUtil.assert(typeof mode === 'number', 'NJS-005', 1);
|
errors.assertParamValue(typeof mode === 'number', 1);
|
||||||
mode = a1;
|
mode = a1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -412,9 +408,9 @@ class Connection extends EventEmitter {
|
||||||
async startup(a1) {
|
async startup(a1) {
|
||||||
let opts = {};
|
let opts = {};
|
||||||
|
|
||||||
nodbUtil.checkArgCount(arguments, 0, 1);
|
errors.assertArgCount(arguments, 0, 1);
|
||||||
if (arguments.length == 1) {
|
if (arguments.length == 1) {
|
||||||
nodbUtil.assert(typeof opts === 'object', 'NJS-005', 1);
|
errors.assertParamValue(typeof opts === 'object', 1);
|
||||||
opts = a1;
|
opts = a1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -428,9 +424,9 @@ class Connection extends EventEmitter {
|
||||||
// changes or of AQ messages available to dequeue.
|
// changes or of AQ messages available to dequeue.
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
async subscribe(name, options) {
|
async subscribe(name, options) {
|
||||||
nodbUtil.checkArgCount(arguments, 2, 2);
|
errors.assertArgCount(arguments, 2, 2);
|
||||||
nodbUtil.assert(typeof name === 'string', 'NJS-005', 1);
|
errors.assertParamValue(typeof name === 'string', 1);
|
||||||
nodbUtil.assert(nodbUtil.isObject(options), 'NJS-005', 2);
|
errors.assertParamValue(nodbUtil.isObject(options), 2);
|
||||||
await this._subscribe(name, options);
|
await this._subscribe(name, options);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -440,19 +436,19 @@ class Connection extends EventEmitter {
|
||||||
// Starts a two-phase-commit transaction.
|
// Starts a two-phase-commit transaction.
|
||||||
//--------------------------------------------------------------------------
|
//--------------------------------------------------------------------------
|
||||||
async tpcBegin(xid, flag, timeout) {
|
async tpcBegin(xid, flag, timeout) {
|
||||||
nodbUtil.checkArgCount(arguments, 1, 3);
|
errors.assertArgCount(arguments, 1, 3);
|
||||||
nodbUtil.assert(nodbUtil.isXid(xid), 'NJS-005', 1);
|
errors.assertParamValue(nodbUtil.isXid(xid), 1);
|
||||||
|
|
||||||
if (arguments.length < 3) {
|
if (arguments.length < 3) {
|
||||||
timeout = 60; // seconds
|
timeout = 60; // seconds
|
||||||
} else {
|
} else {
|
||||||
nodbUtil.assert(typeof timeout === 'number', 'NJS-005', 3);
|
errors.assertParamValue(typeof timeout === 'number', 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (arguments.length < 2) {
|
if (arguments.length < 2) {
|
||||||
flag = constants.TPC_BEGIN_NEW;
|
flag = constants.TPC_BEGIN_NEW;
|
||||||
} else {
|
} else {
|
||||||
nodbUtil.assert(typeof flag === 'number', 'NJS-005', 2);
|
errors.assertParamValue(typeof flag === 'number', 2);
|
||||||
}
|
}
|
||||||
await this._tpcBegin(xid, flag, timeout);
|
await this._tpcBegin(xid, flag, timeout);
|
||||||
}
|
}
|
||||||
|
@ -463,15 +459,15 @@ class Connection extends EventEmitter {
|
||||||
// Commits a two-phase-commit transaction.
|
// Commits a two-phase-commit transaction.
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
async tpcCommit(xid, onePhase) {
|
async tpcCommit(xid, onePhase) {
|
||||||
nodbUtil.checkArgCount(arguments, 0, 2);
|
errors.assertArgCount(arguments, 0, 2);
|
||||||
|
|
||||||
if (arguments.length < 2) {
|
if (arguments.length < 2) {
|
||||||
onePhase = false;
|
onePhase = false;
|
||||||
} else {
|
} else {
|
||||||
nodbUtil.assert(typeof onePhase === 'boolean', 'NJS-005', 2);
|
errors.assertParamValue(typeof onePhase === 'boolean', 2);
|
||||||
}
|
}
|
||||||
if (arguments.length >= 1) {
|
if (arguments.length >= 1) {
|
||||||
nodbUtil.assert(nodbUtil.isXid(xid), 'NJS-005', 1);
|
errors.assertParamValue(nodbUtil.isXid(xid), 1);
|
||||||
}
|
}
|
||||||
await this._tpcCommit(xid, onePhase);
|
await this._tpcCommit(xid, onePhase);
|
||||||
}
|
}
|
||||||
|
@ -482,16 +478,16 @@ class Connection extends EventEmitter {
|
||||||
// Ends a two-phase-commit transaction.
|
// Ends a two-phase-commit transaction.
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
async tpcEnd(xid, flag) {
|
async tpcEnd(xid, flag) {
|
||||||
nodbUtil.checkArgCount(arguments, 0, 2);
|
errors.assertArgCount(arguments, 0, 2);
|
||||||
|
|
||||||
if (arguments.length < 2) {
|
if (arguments.length < 2) {
|
||||||
flag = constants.TPC_END_NORMAL;
|
flag = constants.TPC_END_NORMAL;
|
||||||
} else {
|
} else {
|
||||||
nodbUtil.assert(typeof flag === 'number', 'NJS-005', 2);
|
errors.assertParamValue(typeof flag === 'number', 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (arguments.length >= 1) {
|
if (arguments.length >= 1) {
|
||||||
nodbUtil.assert(nodbUtil.isXid(xid), 'NJS-005', 1);
|
errors.assertParamValue(nodbUtil.isXid(xid), 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
await this._tpcEnd(xid, flag);
|
await this._tpcEnd(xid, flag);
|
||||||
|
@ -504,8 +500,8 @@ class Connection extends EventEmitter {
|
||||||
// transaction.
|
// transaction.
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
async tpcForget(xid) {
|
async tpcForget(xid) {
|
||||||
nodbUtil.checkArgCount(arguments, 1, 1);
|
errors.assertArgCount(arguments, 1, 1);
|
||||||
nodbUtil.assert(nodbUtil.isXid(xid), 'NJS-005', 1);
|
errors.assertParamValue(nodbUtil.isXid(xid), 1);
|
||||||
|
|
||||||
await this._tpcForget(xid);
|
await this._tpcForget(xid);
|
||||||
}
|
}
|
||||||
|
@ -516,9 +512,9 @@ class Connection extends EventEmitter {
|
||||||
// Prepares a two-phase-commit transaction for commit.
|
// Prepares a two-phase-commit transaction for commit.
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
async tpcPrepare(xid) {
|
async tpcPrepare(xid) {
|
||||||
nodbUtil.checkArgCount(arguments, 0, 1);
|
errors.assertArgCount(arguments, 0, 1);
|
||||||
if (arguments.length >= 1) {
|
if (arguments.length >= 1) {
|
||||||
nodbUtil.assert(nodbUtil.isXid(xid), 'NJS-005', 1);
|
errors.assertParamValue(nodbUtil.isXid(xid), 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
return await this._tpcPrepare(xid);
|
return await this._tpcPrepare(xid);
|
||||||
|
@ -530,10 +526,10 @@ class Connection extends EventEmitter {
|
||||||
// Returns a list of pending two-phase-commit transactions.
|
// Returns a list of pending two-phase-commit transactions.
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
async tpcRecover(asString) {
|
async tpcRecover(asString) {
|
||||||
nodbUtil.checkArgCount(arguments, 0, 1);
|
errors.assertArgCount(arguments, 0, 1);
|
||||||
|
|
||||||
if (arguments.length == 1) {
|
if (arguments.length == 1) {
|
||||||
nodbUtil.assert(typeof asString === 'boolean', 'NJS-005', 1);
|
errors.assertParamValue(typeof asString === 'boolean', 1);
|
||||||
} else {
|
} else {
|
||||||
asString = true;
|
asString = true;
|
||||||
}
|
}
|
||||||
|
@ -564,9 +560,9 @@ class Connection extends EventEmitter {
|
||||||
// Rolls back the current changes in a two-phase-commit transaction.
|
// Rolls back the current changes in a two-phase-commit transaction.
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
async tpcRollback(xid) {
|
async tpcRollback(xid) {
|
||||||
nodbUtil.checkArgCount(arguments, 0, 1);
|
errors.assertArgCount(arguments, 0, 1);
|
||||||
if (arguments.length == 1) {
|
if (arguments.length == 1) {
|
||||||
nodbUtil.assert(nodbUtil.isXid(xid), 'NJS-005', 1);
|
errors.assertParamValue(nodbUtil.isXid(xid), 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
await this._tpcRollback(xid);
|
await this._tpcRollback(xid);
|
||||||
|
@ -578,8 +574,8 @@ class Connection extends EventEmitter {
|
||||||
// Destroy a subscription which was earlier created using subscribe().
|
// Destroy a subscription which was earlier created using subscribe().
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
async unsubscribe(name) {
|
async unsubscribe(name) {
|
||||||
nodbUtil.checkArgCount(arguments, 1, 1);
|
errors.assertArgCount(arguments, 1, 1);
|
||||||
nodbUtil.assert(typeof name === 'string', 'NJS-005', 1);
|
errors.assertParamValue(typeof name === 'string', 1);
|
||||||
await this._unsubscribe(name);
|
await this._unsubscribe(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,385 @@
|
||||||
|
// Copyright (c) 2022, Oracle and/or its affiliates.
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
//
|
||||||
|
// You may not use the identified files except in compliance with the Apache
|
||||||
|
// License, Version 2.0 (the "License.")
|
||||||
|
//
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0.
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
//
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
//
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
const util = require('util');
|
||||||
|
|
||||||
|
// define error prefix for all messages
|
||||||
|
const ERR_PREFIX = "NJS";
|
||||||
|
|
||||||
|
// define error number constants (used in JavaScript library)
|
||||||
|
const ERR_MISSING_CALLBACK = 1;
|
||||||
|
const ERR_INVALID_POOL = 2;
|
||||||
|
const ERR_INVALID_CONNECTION = 3;
|
||||||
|
const ERR_INVALID_PROPERTY_VALUE = 4;
|
||||||
|
const ERR_INVALID_PARAMETER_VALUE = 5;
|
||||||
|
const ERR_INVALID_PROPERTY_VALUE_IN_PARAM = 7;
|
||||||
|
const ERR_INVALID_NUMBER_OF_PARAMETERS = 9;
|
||||||
|
const ERR_UNSUPPORTED_DATA_TYPE = 10;
|
||||||
|
const ERR_BIND_VALUE_AND_TYPE_MISMATCH = 11;
|
||||||
|
const ERR_INVALID_BIND_DATA_TYPE = 12;
|
||||||
|
const ERR_INVALID_BIND_DIRECTION = 13;
|
||||||
|
const ERR_NO_TYPE_FOR_CONVERSION = 15;
|
||||||
|
const ERR_INSUFFICENT_BUFFER_FOR_BINDS = 16;
|
||||||
|
const ERR_BUSY_RS = 17;
|
||||||
|
const ERR_INVALID_RS = 18;
|
||||||
|
const ERR_NOT_A_QUERY = 19;
|
||||||
|
const ERR_INVALID_TYPE_FOR_CONVERSION = 21;
|
||||||
|
const ERR_INVALID_LOB = 22;
|
||||||
|
const ERR_BUSY_LOB = 23;
|
||||||
|
const ERR_INSUFFICIENT_MEMORY = 24;
|
||||||
|
const ERR_INVALID_TYPE_FOR_ARRAY_BIND = 34;
|
||||||
|
const ERR_REQUIRED_MAX_ARRAY_SIZE = 35;
|
||||||
|
const ERR_INVALID_ARRAY_SIZE = 36;
|
||||||
|
const ERR_INCOMPATIBLE_TYPE_ARRAY_BIND = 37;
|
||||||
|
const ERR_CONN_REQUEST_TIMEOUT = 40;
|
||||||
|
const ERR_CANNOT_CONVERT_RS_TO_STREAM = 41;
|
||||||
|
const ERR_CANNOT_INVOKE_RS_METHODS = 42;
|
||||||
|
const ERR_RS_ALREADY_CONVERTED = 43;
|
||||||
|
const ERR_INVALID_BIND_UNIT = 44;
|
||||||
|
const ERR_CANNOT_LOAD_BINARY = 45;
|
||||||
|
const ERR_POOL_WITH_ALIAS_ALREADY_EXISTS = 46;
|
||||||
|
const ERR_POOL_WITH_ALIAS_NOT_FOUND = 47;
|
||||||
|
const ERR_INCOMPATIBLE_TYPE_ARRAY_INDEX_BIND = 52;
|
||||||
|
const ERR_NON_ARRAY_PROVIDED = 53;
|
||||||
|
const ERR_MIXED_BIND = 55;
|
||||||
|
const ERR_MISSING_MAX_SIZE_BY_POS = 56;
|
||||||
|
const ERR_MISSING_MAX_SIZE_BY_NAME = 57;
|
||||||
|
const ERR_MAX_SIZE_TOO_SMALL = 58;
|
||||||
|
const ERR_MISSING_TYPE_BY_POS = 59;
|
||||||
|
const ERR_MISSING_TYPE_BY_NAME = 60;
|
||||||
|
const ERR_INVALID_SUBSCR = 61;
|
||||||
|
const ERR_MISSING_SUBSCR_CALLBACK = 62;
|
||||||
|
const ERR_MISSING_SUBSCR_SQL = 63;
|
||||||
|
const ERR_POOL_CLOSING = 64;
|
||||||
|
const ERR_POOL_CLOSED = 65;
|
||||||
|
const ERR_INVALID_SODA_DOC_CURSOR = 66;
|
||||||
|
const ERR_NO_BINARY_AVAILABLE = 67;
|
||||||
|
const ERR_INVALID_ERR_NUM = 68;
|
||||||
|
const ERR_NODE_TOO_OLD = 69;
|
||||||
|
const ERR_INVALID_AQ_MESSAGE = 70;
|
||||||
|
const ERR_CONVERT_FROM_OBJ_ELEMENT = 71;
|
||||||
|
const ERR_CONVERT_FROM_OBJ_ATTR = 72;
|
||||||
|
const ERR_CONVERT_TO_OBJ_ELEMENT = 73;
|
||||||
|
const ERR_CONVERT_TO_OBJ_ATTR = 74;
|
||||||
|
const ERR_DBL_CONNECT_STRING = 75;
|
||||||
|
const ERR_QUEUE_MAX_EXCEEDED = 76;
|
||||||
|
const ERR_CLIENT_LIB_ALREADY_INITIALIZED = 77;
|
||||||
|
const ERR_UNSUPPORTED_DATA_TYPE_IN_JSON = 78;
|
||||||
|
const ERR_CONVERT_TO_JSON_VALUE = 79;
|
||||||
|
const ERR_DBL_USER = 80;
|
||||||
|
const ERR_CONCURRENT_OPS = 81;
|
||||||
|
const ERR_POOL_RECONFIGURING = 82;
|
||||||
|
const ERR_POOL_STATISTICS_DISABLED = 83;
|
||||||
|
const ERR_TOKEN_BASED_AUTH = 84;
|
||||||
|
const ERR_POOL_TOKEN_BASED_AUTH = 85;
|
||||||
|
const ERR_CONN_TOKEN_BASED_AUTH = 86;
|
||||||
|
const ERR_TOKEN_HAS_EXPIRED = 87;
|
||||||
|
const ERR_TOKEN_CALLBACK_DUP = 88;
|
||||||
|
|
||||||
|
const messages = new Map();
|
||||||
|
messages.set(ERR_INVALID_CONNECTION,
|
||||||
|
'invalid connection');
|
||||||
|
messages.set(ERR_INVALID_POOL,
|
||||||
|
'invalid pool');
|
||||||
|
messages.set(ERR_INVALID_PROPERTY_VALUE,
|
||||||
|
'invalid value for property %s');
|
||||||
|
messages.set(ERR_MISSING_CALLBACK,
|
||||||
|
'expected callback as last parameter');
|
||||||
|
messages.set(ERR_INVALID_PARAMETER_VALUE,
|
||||||
|
'invalid value for parameter %d');
|
||||||
|
messages.set(ERR_INVALID_PROPERTY_VALUE_IN_PARAM,
|
||||||
|
'invalid value for "%s" in parameter %d');
|
||||||
|
messages.set(ERR_INVALID_NUMBER_OF_PARAMETERS,
|
||||||
|
'invalid number of parameters');
|
||||||
|
messages.set(ERR_UNSUPPORTED_DATA_TYPE,
|
||||||
|
'unsupported data type %d in column %d');
|
||||||
|
messages.set(ERR_BIND_VALUE_AND_TYPE_MISMATCH,
|
||||||
|
'encountered bind value and type mismatch');
|
||||||
|
messages.set(ERR_INVALID_BIND_DATA_TYPE,
|
||||||
|
'encountered invalid bind data type in parameter %d');
|
||||||
|
messages.set(ERR_INVALID_BIND_DIRECTION,
|
||||||
|
'invalid bind direction');
|
||||||
|
messages.set(ERR_NO_TYPE_FOR_CONVERSION,
|
||||||
|
'type was not specified for conversion');
|
||||||
|
messages.set(ERR_INSUFFICENT_BUFFER_FOR_BINDS,
|
||||||
|
'buffer is too small for OUT binds');
|
||||||
|
messages.set(ERR_BUSY_RS,
|
||||||
|
'concurrent operations on ResultSet are not allowed');
|
||||||
|
messages.set(ERR_INVALID_RS,
|
||||||
|
'invalid ResultSet');
|
||||||
|
messages.set(ERR_NOT_A_QUERY,
|
||||||
|
'ResultSet cannot be returned for non-query statements');
|
||||||
|
messages.set(ERR_INVALID_TYPE_FOR_CONVERSION,
|
||||||
|
'invalid type for conversion specified');
|
||||||
|
messages.set(ERR_INVALID_LOB,
|
||||||
|
'invalid Lob');
|
||||||
|
messages.set(ERR_BUSY_LOB,
|
||||||
|
'concurrent operations on LOB are not allowed');
|
||||||
|
messages.set(ERR_INSUFFICIENT_MEMORY,
|
||||||
|
'memory allocation failed');
|
||||||
|
messages.set(ERR_INVALID_TYPE_FOR_ARRAY_BIND,
|
||||||
|
'data type is unsupported for array bind');
|
||||||
|
messages.set(ERR_REQUIRED_MAX_ARRAY_SIZE,
|
||||||
|
'maxArraySize is required for IN OUT array bind');
|
||||||
|
messages.set(ERR_INVALID_ARRAY_SIZE,
|
||||||
|
'given array is of size greater than maxArraySize');
|
||||||
|
messages.set(ERR_INCOMPATIBLE_TYPE_ARRAY_BIND,
|
||||||
|
'invalid data type at array index %d for bind ":%"');
|
||||||
|
messages.set(ERR_CONN_REQUEST_TIMEOUT,
|
||||||
|
'connection request timeout. Request exceeded queueTimeout of %d');
|
||||||
|
messages.set(ERR_CANNOT_CONVERT_RS_TO_STREAM,
|
||||||
|
'cannot convert ResultSet to QueryStream after invoking methods');
|
||||||
|
messages.set(ERR_CANNOT_INVOKE_RS_METHODS,
|
||||||
|
'cannot invoke ResultSet methods after converting to QueryStream');
|
||||||
|
messages.set(ERR_RS_ALREADY_CONVERTED,
|
||||||
|
'ResultSet already converted to QueryStream');
|
||||||
|
messages.set(ERR_INVALID_BIND_UNIT,
|
||||||
|
'bind object must contain one of the following keys: ' +
|
||||||
|
'"dir", "type", "maxSize", or "val"');
|
||||||
|
messages.set(ERR_CANNOT_LOAD_BINARY,
|
||||||
|
'cannot load a node-oracledb binary for Node.js %s');
|
||||||
|
messages.set(ERR_POOL_WITH_ALIAS_ALREADY_EXISTS,
|
||||||
|
'pool alias "%s" already exists in the connection pool cache');
|
||||||
|
messages.set(ERR_POOL_WITH_ALIAS_NOT_FOUND,
|
||||||
|
'pool alias "%s" not found in connection pool cache');
|
||||||
|
messages.set(ERR_INCOMPATIBLE_TYPE_ARRAY_INDEX_BIND,
|
||||||
|
'invalid data type at array index %d for bind position %d');
|
||||||
|
messages.set(ERR_NON_ARRAY_PROVIDED,
|
||||||
|
'an array value was expected');
|
||||||
|
messages.set(ERR_MIXED_BIND,
|
||||||
|
'binding by position and name cannot be mixed');
|
||||||
|
messages.set(ERR_MISSING_MAX_SIZE_BY_POS,
|
||||||
|
'maxSize must be specified and not zero for bind position %d');
|
||||||
|
messages.set(ERR_MISSING_MAX_SIZE_BY_NAME,
|
||||||
|
'maxSize must be specified and not zero for bind "%s"');
|
||||||
|
messages.set(ERR_MAX_SIZE_TOO_SMALL,
|
||||||
|
'maxSize of %d is too small for value of length %d in row %d');
|
||||||
|
messages.set(ERR_MISSING_TYPE_BY_POS,
|
||||||
|
'type must be specified for bind position %d');
|
||||||
|
messages.set(ERR_MISSING_TYPE_BY_NAME,
|
||||||
|
'type must be specified for bind "%s"');
|
||||||
|
messages.set(ERR_INVALID_SUBSCR,
|
||||||
|
'invalid subscription');
|
||||||
|
messages.set(ERR_MISSING_SUBSCR_CALLBACK,
|
||||||
|
'subscription notification callback missing');
|
||||||
|
messages.set(ERR_MISSING_SUBSCR_SQL,
|
||||||
|
'subscription notification SQL missing');
|
||||||
|
messages.set(ERR_POOL_CLOSING,
|
||||||
|
'connection pool is closing');
|
||||||
|
messages.set(ERR_POOL_CLOSED,
|
||||||
|
'connection pool was closed');
|
||||||
|
messages.set(ERR_INVALID_SODA_DOC_CURSOR,
|
||||||
|
'invalid SODA document cursor');
|
||||||
|
messages.set(ERR_NO_BINARY_AVAILABLE,
|
||||||
|
'a pre-built node-oracledb binary was not found for %s');
|
||||||
|
messages.set(ERR_INVALID_ERR_NUM,
|
||||||
|
'invalid error number %d supplied');
|
||||||
|
messages.set(ERR_NODE_TOO_OLD,
|
||||||
|
'node-oracledb %s requires Node.js %s or later');
|
||||||
|
messages.set(ERR_INVALID_AQ_MESSAGE,
|
||||||
|
'message must be a string, buffer, database object or an object ' +
|
||||||
|
'containing a payload property which itself is a string, buffer or ' +
|
||||||
|
'database object');
|
||||||
|
messages.set(ERR_CONVERT_FROM_OBJ_ELEMENT,
|
||||||
|
'cannot convert from element of type "%s" to JavaScript value');
|
||||||
|
messages.set(ERR_CONVERT_FROM_OBJ_ATTR,
|
||||||
|
'cannot convert from attribute "%s" of type "%s" to JavaScript value');
|
||||||
|
messages.set(ERR_CONVERT_TO_OBJ_ELEMENT,
|
||||||
|
'cannot convert from JavaScript value to element of type %s');
|
||||||
|
messages.set(ERR_CONVERT_TO_OBJ_ATTR,
|
||||||
|
'cannot convert from JavaScript value to attribute "%s" of type "%s"');
|
||||||
|
messages.set(ERR_DBL_CONNECT_STRING,
|
||||||
|
'only one of connectString and connectionString can be used');
|
||||||
|
messages.set(ERR_QUEUE_MAX_EXCEEDED,
|
||||||
|
'connection request rejected. Pool queue length queueMax %d reached');
|
||||||
|
messages.set(ERR_CLIENT_LIB_ALREADY_INITIALIZED,
|
||||||
|
'Oracle Client library has already been initialized');
|
||||||
|
messages.set(ERR_UNSUPPORTED_DATA_TYPE_IN_JSON,
|
||||||
|
'unsupported data type %d in JSON value');
|
||||||
|
messages.set(ERR_CONVERT_TO_JSON_VALUE,
|
||||||
|
'cannot convert from JavaScript value to JSON value');
|
||||||
|
messages.set(ERR_DBL_USER,
|
||||||
|
'only one of user and username can be used');
|
||||||
|
messages.set(ERR_CONCURRENT_OPS,
|
||||||
|
'concurrent operations on a connection are disabled');
|
||||||
|
messages.set(ERR_POOL_RECONFIGURING,
|
||||||
|
'connection pool is being reconfigured');
|
||||||
|
messages.set(ERR_POOL_STATISTICS_DISABLED,
|
||||||
|
'pool statistics not enabled');
|
||||||
|
messages.set(ERR_TOKEN_BASED_AUTH,
|
||||||
|
'invalid or missing parameter with token based authentication. ' +
|
||||||
|
'The token and privateKey attributes must contain values. ' +
|
||||||
|
'Other credentials cannot be specified');
|
||||||
|
messages.set(ERR_POOL_TOKEN_BASED_AUTH,
|
||||||
|
'invalid connection pool configuration with token based authentication. ' +
|
||||||
|
'The homogeneous and externalAuth attributes must be set to true');
|
||||||
|
messages.set(ERR_CONN_TOKEN_BASED_AUTH,
|
||||||
|
'invalid standalone configuration with token based authentication. ' +
|
||||||
|
'The externalAuth attribute must be set to true');
|
||||||
|
messages.set(ERR_TOKEN_HAS_EXPIRED,
|
||||||
|
'access token has expired');
|
||||||
|
messages.set(ERR_TOKEN_CALLBACK_DUP,
|
||||||
|
'accessTokenCallback cannot be specified when accessToken is a function');
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// assert()
|
||||||
|
//
|
||||||
|
// Checks the condition, and if the condition is not true, throws an exception
|
||||||
|
// using the specified error number and arguments.
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
function assert(condition) {
|
||||||
|
if (!condition) {
|
||||||
|
const args = Array.prototype.slice.call(arguments, 1);
|
||||||
|
throwErr(...args);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// assertArgCount()
|
||||||
|
//
|
||||||
|
// Asserts that the argument count falls between the minimum and maximum number
|
||||||
|
// of arguments.
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
function assertArgCount(args, minArgCount, maxArgCount) {
|
||||||
|
assert(args.length >= minArgCount && args.length <= maxArgCount,
|
||||||
|
ERR_INVALID_NUMBER_OF_PARAMETERS);
|
||||||
|
}
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// assertParamPropValue()
|
||||||
|
//
|
||||||
|
// Asserts that the property value of a parmeter passes the specified
|
||||||
|
// condition.
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
function assertParamPropValue(condition, parameterNum, propName) {
|
||||||
|
assert(condition, ERR_INVALID_PROPERTY_VALUE_IN_PARAM, propName,
|
||||||
|
parameterNum);
|
||||||
|
}
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// assertParamValue()
|
||||||
|
//
|
||||||
|
// Asserts that the parmeter value passes the specified condition.
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
function assertParamValue(condition, parameterNum) {
|
||||||
|
assert(condition, ERR_INVALID_PARAMETER_VALUE, parameterNum);
|
||||||
|
}
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// assertPropValue()
|
||||||
|
//
|
||||||
|
// Asserts that the property value passes the specified condition.
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
function assertPropValue(condition, propName) {
|
||||||
|
assert(condition, ERR_INVALID_PROPERTY_VALUE, propName);
|
||||||
|
}
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// throwErr()
|
||||||
|
//
|
||||||
|
// Throws an error with the given error number after formatting it with the
|
||||||
|
// given arguments.
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
function throwErr(errorNum) {
|
||||||
|
let baseText = messages.get(errorNum);
|
||||||
|
if (!baseText)
|
||||||
|
baseText = messages.get(ERR_INVALID_ERR_NUM);
|
||||||
|
const errorNumStr = errorNum.toString().padStart(3, '0');
|
||||||
|
const args = [...arguments];
|
||||||
|
args[0] = `${ERR_PREFIX}-${errorNumStr}: ${baseText}`;
|
||||||
|
throw new Error(util.format(...args));
|
||||||
|
}
|
||||||
|
|
||||||
|
// define exports
|
||||||
|
module.exports = {
|
||||||
|
ERR_MISSING_CALLBACK,
|
||||||
|
ERR_INVALID_POOL,
|
||||||
|
ERR_INVALID_CONNECTION,
|
||||||
|
ERR_INVALID_PROPERTY_VALUE,
|
||||||
|
ERR_INVALID_PARAMETER_VALUE,
|
||||||
|
ERR_INVALID_PROPERTY_VALUE_IN_PARAM,
|
||||||
|
ERR_INVALID_NUMBER_OF_PARAMETERS,
|
||||||
|
ERR_UNSUPPORTED_DATA_TYPE,
|
||||||
|
ERR_BIND_VALUE_AND_TYPE_MISMATCH,
|
||||||
|
ERR_INVALID_BIND_DATA_TYPE,
|
||||||
|
ERR_INVALID_BIND_DIRECTION,
|
||||||
|
ERR_NO_TYPE_FOR_CONVERSION,
|
||||||
|
ERR_INSUFFICENT_BUFFER_FOR_BINDS,
|
||||||
|
ERR_BUSY_RS,
|
||||||
|
ERR_INVALID_RS,
|
||||||
|
ERR_NOT_A_QUERY,
|
||||||
|
ERR_INVALID_TYPE_FOR_CONVERSION,
|
||||||
|
ERR_INVALID_LOB,
|
||||||
|
ERR_BUSY_LOB,
|
||||||
|
ERR_INSUFFICIENT_MEMORY,
|
||||||
|
ERR_INVALID_TYPE_FOR_ARRAY_BIND,
|
||||||
|
ERR_REQUIRED_MAX_ARRAY_SIZE,
|
||||||
|
ERR_INVALID_ARRAY_SIZE,
|
||||||
|
ERR_INCOMPATIBLE_TYPE_ARRAY_BIND,
|
||||||
|
ERR_CONN_REQUEST_TIMEOUT,
|
||||||
|
ERR_CANNOT_CONVERT_RS_TO_STREAM,
|
||||||
|
ERR_CANNOT_INVOKE_RS_METHODS,
|
||||||
|
ERR_RS_ALREADY_CONVERTED,
|
||||||
|
ERR_INVALID_BIND_UNIT,
|
||||||
|
ERR_CANNOT_LOAD_BINARY,
|
||||||
|
ERR_POOL_WITH_ALIAS_ALREADY_EXISTS,
|
||||||
|
ERR_POOL_WITH_ALIAS_NOT_FOUND,
|
||||||
|
ERR_INCOMPATIBLE_TYPE_ARRAY_INDEX_BIND,
|
||||||
|
ERR_NON_ARRAY_PROVIDED,
|
||||||
|
ERR_MIXED_BIND,
|
||||||
|
ERR_MISSING_MAX_SIZE_BY_POS,
|
||||||
|
ERR_MISSING_MAX_SIZE_BY_NAME,
|
||||||
|
ERR_MAX_SIZE_TOO_SMALL,
|
||||||
|
ERR_MISSING_TYPE_BY_POS,
|
||||||
|
ERR_MISSING_TYPE_BY_NAME,
|
||||||
|
ERR_INVALID_SUBSCR,
|
||||||
|
ERR_MISSING_SUBSCR_CALLBACK,
|
||||||
|
ERR_MISSING_SUBSCR_SQL,
|
||||||
|
ERR_POOL_CLOSING,
|
||||||
|
ERR_POOL_CLOSED,
|
||||||
|
ERR_INVALID_SODA_DOC_CURSOR,
|
||||||
|
ERR_NO_BINARY_AVAILABLE,
|
||||||
|
ERR_INVALID_ERR_NUM,
|
||||||
|
ERR_NODE_TOO_OLD,
|
||||||
|
ERR_INVALID_AQ_MESSAGE,
|
||||||
|
ERR_CONVERT_FROM_OBJ_ELEMENT,
|
||||||
|
ERR_CONVERT_FROM_OBJ_ATTR,
|
||||||
|
ERR_CONVERT_TO_OBJ_ELEMENT,
|
||||||
|
ERR_CONVERT_TO_OBJ_ATTR,
|
||||||
|
ERR_DBL_CONNECT_STRING,
|
||||||
|
ERR_QUEUE_MAX_EXCEEDED,
|
||||||
|
ERR_CLIENT_LIB_ALREADY_INITIALIZED,
|
||||||
|
ERR_UNSUPPORTED_DATA_TYPE_IN_JSON,
|
||||||
|
ERR_CONVERT_TO_JSON_VALUE,
|
||||||
|
ERR_DBL_USER,
|
||||||
|
ERR_CONCURRENT_OPS,
|
||||||
|
ERR_POOL_RECONFIGURING,
|
||||||
|
ERR_POOL_STATISTICS_DISABLED,
|
||||||
|
ERR_TOKEN_BASED_AUTH,
|
||||||
|
ERR_POOL_TOKEN_BASED_AUTH,
|
||||||
|
ERR_CONN_TOKEN_BASED_AUTH,
|
||||||
|
assert,
|
||||||
|
assertArgCount,
|
||||||
|
assertParamPropValue,
|
||||||
|
assertParamValue,
|
||||||
|
assertPropValue,
|
||||||
|
throwErr
|
||||||
|
};
|
|
@ -22,6 +22,7 @@
|
||||||
const { Duplex } = require('stream');
|
const { Duplex } = require('stream');
|
||||||
const Connection = require('./connection.js');
|
const Connection = require('./connection.js');
|
||||||
const constants = require('./constants.js');
|
const constants = require('./constants.js');
|
||||||
|
const errors = require('./errors.js');
|
||||||
const nodbUtil = require('./util.js');
|
const nodbUtil = require('./util.js');
|
||||||
|
|
||||||
class Lob extends Duplex {
|
class Lob extends Duplex {
|
||||||
|
@ -119,7 +120,7 @@ class Lob extends Duplex {
|
||||||
// versions of node-oracledb.
|
// versions of node-oracledb.
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
async close() {
|
async close() {
|
||||||
nodbUtil.checkArgCount(arguments, 0, 0);
|
errors.assertArgCount(arguments, 0, 0);
|
||||||
if (this.valid) {
|
if (this.valid) {
|
||||||
try {
|
try {
|
||||||
await this._close();
|
await this._close();
|
||||||
|
@ -135,7 +136,7 @@ class Lob extends Duplex {
|
||||||
// Returns all of the data in the LOB as a single string or buffer.
|
// Returns all of the data in the LOB as a single string or buffer.
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
async getData() {
|
async getData() {
|
||||||
nodbUtil.checkArgCount(arguments, 0, 0);
|
errors.assertArgCount(arguments, 0, 0);
|
||||||
return await this._getData();
|
return await this._getData();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -151,7 +152,7 @@ class Lob extends Duplex {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
nodbUtil.wrap_fns(Lob.prototype, "NJS-023",
|
nodbUtil.wrap_fns(Lob.prototype, errors.ERR_BUSY_LOB,
|
||||||
"close",
|
"close",
|
||||||
"getData");
|
"getData");
|
||||||
Lob.prototype._serializedRead = nodbUtil.serialize(Lob.prototype.readData);
|
Lob.prototype._serializedRead = nodbUtil.serialize(Lob.prototype.readData);
|
||||||
|
|
122
lib/oracledb.js
122
lib/oracledb.js
|
@ -21,15 +21,15 @@
|
||||||
|
|
||||||
const constants = require('./constants.js');
|
const constants = require('./constants.js');
|
||||||
const nodbUtil = require('./util.js');
|
const nodbUtil = require('./util.js');
|
||||||
|
const errors = require('./errors.js');
|
||||||
const util = require('util');
|
const util = require('util');
|
||||||
|
|
||||||
// This version of node-oracledb works with Node.js 14 or later. The test
|
// This version of node-oracledb works with Node.js 14 or later. The test
|
||||||
// stops hard-to-interpret runtime errors and crashes with older Node.js
|
// stops hard-to-interpret runtime errors and crashes with older Node.js
|
||||||
// versions.
|
// versions.
|
||||||
let vs = process.version.substring(1).split(".").map(Number);
|
let vs = process.version.substring(1).split(".").map(Number);
|
||||||
if (vs[0] < 14) {
|
errors.assert(vs[0] >= 14, errors.ERR_NODE_TOO_OLD,
|
||||||
throw new Error(nodbUtil.getErrorMessage('NJS-069', nodbUtil.PACKAGE_JSON_VERSION, "14.0"));
|
nodbUtil.PACKAGE_JSON_VERSION, "14.0");
|
||||||
}
|
|
||||||
|
|
||||||
const AqDeqOptions = require('./aqDeqOptions.js');
|
const AqDeqOptions = require('./aqDeqOptions.js');
|
||||||
const AqEnqOptions = require('./aqEnqOptions.js');
|
const AqEnqOptions = require('./aqEnqOptions.js');
|
||||||
|
@ -86,7 +86,7 @@ for (let i = 0; i < binaryLocations.length; i++) {
|
||||||
} else {
|
} else {
|
||||||
nodeInfo = `\n Node.js require('oracledb') error was:\n ${err.message}\n ${nodbUtil.getInstallHelp()}\n`;
|
nodeInfo = `\n Node.js require('oracledb') error was:\n ${err.message}\n ${nodbUtil.getInstallHelp()}\n`;
|
||||||
}
|
}
|
||||||
throw new Error(nodbUtil.getErrorMessage('NJS-045', nodeInfo));
|
errors.throwErr(errors.ERR_CANNOT_LOAD_BINARY, nodeInfo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -101,14 +101,11 @@ async function createPool(poolAttrs) {
|
||||||
let poolAlias;
|
let poolAlias;
|
||||||
|
|
||||||
// check arguments
|
// check arguments
|
||||||
nodbUtil.checkArgCount(arguments, 1, 1);
|
errors.assertArgCount(arguments, 1, 1);
|
||||||
nodbUtil.assert(nodbUtil.isObject(poolAttrs), 'NJS-005', 1);
|
errors.assertParamValue(nodbUtil.isObject(poolAttrs), 1);
|
||||||
if (poolAttrs.poolAlias !== undefined) {
|
if (poolAttrs.poolAlias !== undefined) {
|
||||||
if (typeof poolAttrs.poolAlias !== 'string' ||
|
errors.assertParamPropValue(typeof poolAttrs.poolAlias === 'string' &&
|
||||||
poolAttrs.poolAlias.length === 0) {
|
poolAttrs.poolAlias.length !== 0, 1, "poolAlias");
|
||||||
throw new Error(nodbUtil.getErrorMessage('NJS-004',
|
|
||||||
'poolAttrs.poolAlias'));
|
|
||||||
}
|
|
||||||
poolAlias = poolAttrs.poolAlias;
|
poolAlias = poolAttrs.poolAlias;
|
||||||
} else if (poolAttrs.poolAlias === undefined
|
} else if (poolAttrs.poolAlias === undefined
|
||||||
&& !poolCache[defaultPoolAlias]
|
&& !poolCache[defaultPoolAlias]
|
||||||
|
@ -116,20 +113,20 @@ async function createPool(poolAttrs) {
|
||||||
poolAlias = defaultPoolAlias;
|
poolAlias = defaultPoolAlias;
|
||||||
}
|
}
|
||||||
if (poolCache[poolAlias] || tempUsedPoolAliases[poolAlias]) {
|
if (poolCache[poolAlias] || tempUsedPoolAliases[poolAlias]) {
|
||||||
throw new Error(nodbUtil.getErrorMessage('NJS-046', poolAlias));
|
errors.throwErr(errors.ERR_POOL_WITH_ALIAS_ALREADY_EXISTS, poolAlias);
|
||||||
}
|
}
|
||||||
if (poolAttrs.accessToken !== undefined) {
|
if (poolAttrs.accessToken !== undefined) {
|
||||||
// cannot set username or password for token based authentication
|
// cannot set username or password for token based authentication
|
||||||
if (poolAttrs.user !== undefined ||
|
if (poolAttrs.user !== undefined ||
|
||||||
poolAttrs.password !== undefined) {
|
poolAttrs.password !== undefined) {
|
||||||
throw new Error(nodbUtil.getErrorMessage('NJS-084'));
|
errors.throwErr(errors.ERR_TOKEN_BASED_AUTH);
|
||||||
}
|
}
|
||||||
|
|
||||||
// homogeneous and externalAuth must be set to true for token based
|
// homogeneous and externalAuth must be set to true for token based
|
||||||
// authentication
|
// authentication
|
||||||
if (poolAttrs.homogeneous === false ||
|
if (poolAttrs.homogeneous === false ||
|
||||||
poolAttrs.externalAuth === false) {
|
poolAttrs.externalAuth === false) {
|
||||||
throw new Error(nodbUtil.getErrorMessage('NJS-085'));
|
errors.throwErr(errors.ERR_POOL_TOKEN_BASED_AUTH);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -152,12 +149,10 @@ async function createPool(poolAttrs) {
|
||||||
|
|
||||||
// token based authentication
|
// token based authentication
|
||||||
if (poolAttrs.accessToken !== undefined) {
|
if (poolAttrs.accessToken !== undefined) {
|
||||||
// accessTokenCallback is depricated from node-oracledb 5.5
|
|
||||||
if (poolAttrs.accessTokenCallback !== undefined &&
|
if (poolAttrs.accessTokenCallback !== undefined &&
|
||||||
typeof poolAttrs.accessToken === 'function') {
|
typeof poolAttrs.accessToken === 'function') {
|
||||||
throw new Error(nodbUtil.getErrorMessage('NJS-088'));
|
errors.throwErr(errors.ERR_TOKEN_CALLBACK_DUP);
|
||||||
}
|
}
|
||||||
|
|
||||||
await nodbUtil.checkToken(adjustedPoolAttrs);
|
await nodbUtil.checkToken(adjustedPoolAttrs);
|
||||||
if (typeof poolAttrs.accessToken === 'function') {
|
if (typeof poolAttrs.accessToken === 'function') {
|
||||||
adjustedPoolAttrs.accessTokenCallback = poolAttrs.accessToken;
|
adjustedPoolAttrs.accessTokenCallback = poolAttrs.accessToken;
|
||||||
|
@ -212,12 +207,11 @@ async function getConnection(a1) {
|
||||||
let connAttrs = {};
|
let connAttrs = {};
|
||||||
|
|
||||||
// verify the number and types of arguments
|
// verify the number and types of arguments
|
||||||
nodbUtil.checkArgCount(arguments, 0, 1);
|
errors.assertArgCount(arguments, 0, 1);
|
||||||
if (arguments.length == 0) {
|
if (arguments.length == 0) {
|
||||||
poolAlias = defaultPoolAlias;
|
poolAlias = defaultPoolAlias;
|
||||||
} else {
|
} else {
|
||||||
nodbUtil.assert(typeof a1 === 'string' || nodbUtil.isObject(a1),
|
errors.assertParamValue(typeof a1 === 'string' || nodbUtil.isObject(a1), 1);
|
||||||
'NJS-005', 1);
|
|
||||||
if (typeof a1 === 'string') {
|
if (typeof a1 === 'string') {
|
||||||
poolAlias = a1;
|
poolAlias = a1;
|
||||||
} else {
|
} else {
|
||||||
|
@ -232,7 +226,7 @@ async function getConnection(a1) {
|
||||||
if (poolAlias) {
|
if (poolAlias) {
|
||||||
pool = poolCache[poolAlias];
|
pool = poolCache[poolAlias];
|
||||||
if (!pool) {
|
if (!pool) {
|
||||||
throw new Error(nodbUtil.getErrorMessage('NJS-047', poolAlias));
|
errors.throwErr(errors.ERR_POOL_WITH_ALIAS_NOT_FOUND, poolAlias);
|
||||||
}
|
}
|
||||||
return await pool.getConnection(connAttrs);
|
return await pool.getConnection(connAttrs);
|
||||||
|
|
||||||
|
@ -242,12 +236,12 @@ async function getConnection(a1) {
|
||||||
// cannot set username or password for token based authentication
|
// cannot set username or password for token based authentication
|
||||||
if (connAttrs.user !== undefined ||
|
if (connAttrs.user !== undefined ||
|
||||||
connAttrs.password !== undefined) {
|
connAttrs.password !== undefined) {
|
||||||
throw new Error(nodbUtil.getErrorMessage('NJS-084'));
|
errors.throwErr(errors.ERR_TOKEN_BASED_AUTH);
|
||||||
}
|
}
|
||||||
|
|
||||||
// externalAuth must be set to true for token based authentication
|
// externalAuth must be set to true for token based authentication
|
||||||
if (connAttrs.externalAuth === false) {
|
if (connAttrs.externalAuth === false) {
|
||||||
throw new Error(nodbUtil.getErrorMessage('NJS-086'));
|
errors.throwErr(errors.ERR_CONN_TOKEN_BASED_AUTH);
|
||||||
}
|
}
|
||||||
|
|
||||||
await nodbUtil.checkToken(connAttrs);
|
await nodbUtil.checkToken(connAttrs);
|
||||||
|
@ -271,10 +265,11 @@ async function getConnection(a1) {
|
||||||
function getPool(poolAlias) {
|
function getPool(poolAlias) {
|
||||||
let pool;
|
let pool;
|
||||||
|
|
||||||
nodbUtil.checkArgCount(arguments, 0, 1);
|
errors.assertArgCount(arguments, 0, 1);
|
||||||
|
|
||||||
if (poolAlias) {
|
if (poolAlias) {
|
||||||
nodbUtil.assert(typeof poolAlias === 'string' || typeof poolAlias === 'number', 'NJS-005', 1);
|
errors.assertParamValue(typeof poolAlias === 'string' ||
|
||||||
|
typeof poolAlias === 'number', 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
poolAlias = poolAlias || defaultPoolAlias;
|
poolAlias = poolAlias || defaultPoolAlias;
|
||||||
|
@ -282,7 +277,7 @@ function getPool(poolAlias) {
|
||||||
pool = poolCache[poolAlias];
|
pool = poolCache[poolAlias];
|
||||||
|
|
||||||
if (!pool) {
|
if (!pool) {
|
||||||
throw new Error(nodbUtil.getErrorMessage('NJS-047', poolAlias));
|
errors.throwErr(errors.ERR_POOL_WITH_ALIAS_NOT_FOUND, poolAlias);
|
||||||
}
|
}
|
||||||
|
|
||||||
return pool;
|
return pool;
|
||||||
|
@ -295,9 +290,9 @@ function getPool(poolAlias) {
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
function initOracleClient(arg1) {
|
function initOracleClient(arg1) {
|
||||||
let options = {};
|
let options = {};
|
||||||
nodbUtil.checkArgCount(arguments, 0, 1);
|
errors.assertArgCount(arguments, 0, 1);
|
||||||
if (arg1 !== undefined) {
|
if (arg1 !== undefined) {
|
||||||
nodbUtil.assert(nodbUtil.isObject(arg1), 'NJS-005', 1);
|
errors.assertParamValue(nodbUtil.isObject(arg1), 1);
|
||||||
options = arg1;
|
options = arg1;
|
||||||
}
|
}
|
||||||
if (_initOracleClientArgs === undefined) {
|
if (_initOracleClientArgs === undefined) {
|
||||||
|
@ -332,14 +327,14 @@ async function shutdown(a1, a2) {
|
||||||
let shutdownMode = constants.SHUTDOWN_MODE_DEFAULT;
|
let shutdownMode = constants.SHUTDOWN_MODE_DEFAULT;
|
||||||
|
|
||||||
// verify the number and types of arguments
|
// verify the number and types of arguments
|
||||||
nodbUtil.checkArgCount(arguments, 0, 2);
|
errors.assertArgCount(arguments, 0, 2);
|
||||||
if (arguments.length == 2) {
|
if (arguments.length == 2) {
|
||||||
nodbUtil.assert(typeof a1 === 'object', 'NJS-005', 1);
|
errors.assertParamValue(typeof a1 === 'object', 1);
|
||||||
nodbUtil.assert(typeof a2 === 'number', 'NJS-005', 2);
|
errors.assertParamValue(typeof a2 === 'number', 2);
|
||||||
connAttr = a1;
|
connAttr = a1;
|
||||||
shutdownMode = a2;
|
shutdownMode = a2;
|
||||||
} else if (arguments.length == 1) {
|
} else if (arguments.length == 1) {
|
||||||
nodbUtil.assert(typeof a1 === 'object', 'NJS-005', 1);
|
errors.assertParamValue(typeof a1 === 'object', 1);
|
||||||
connAttr = a1;
|
connAttr = a1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -375,14 +370,14 @@ async function startup(a1, a2) {
|
||||||
let startupAttr = {};
|
let startupAttr = {};
|
||||||
|
|
||||||
// verify the number and types of arguments
|
// verify the number and types of arguments
|
||||||
nodbUtil.checkArgCount(arguments, 0, 2);
|
errors.assertArgCount(arguments, 0, 2);
|
||||||
if (arguments.length == 2) {
|
if (arguments.length == 2) {
|
||||||
nodbUtil.assert (typeof a1 === 'object', 'NJS-005', 1);
|
errors.assertParamValue(typeof a1 === 'object', 1);
|
||||||
nodbUtil.assert (typeof a2 === 'object', 'NJS-005', 2);
|
errors.assertParamValue(typeof a2 === 'object', 2);
|
||||||
connAttr = a1;
|
connAttr = a1;
|
||||||
startupAttr = a2;
|
startupAttr = a2;
|
||||||
} else if (arguments.length == 1) {
|
} else if (arguments.length == 1) {
|
||||||
nodbUtil.assert(typeof a1 === 'object', 'NJS-005', 1);
|
errors.assertParamValue(typeof a1 === 'object', 1);
|
||||||
connAttr = a1;
|
connAttr = a1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -731,140 +726,133 @@ module.exports = {
|
||||||
|
|
||||||
// property setters
|
// property setters
|
||||||
set autoCommit(value) {
|
set autoCommit(value) {
|
||||||
nodbUtil.assert(typeof value === 'boolean', 'NJS-004', "autoCommit");
|
errors.assertPropValue(typeof value === 'boolean', "autoCommit");
|
||||||
settings.autoCommit = value;
|
settings.autoCommit = value;
|
||||||
},
|
},
|
||||||
|
|
||||||
set connectionClass(value) {
|
set connectionClass(value) {
|
||||||
nodbUtil.assert(typeof value === 'string', 'NJS-004', "connectionClass");
|
errors.assertPropValue(typeof value === 'string', "connectionClass");
|
||||||
settings.connectionClass = value;
|
settings.connectionClass = value;
|
||||||
},
|
},
|
||||||
|
|
||||||
set dbObjectAsPojo(value) {
|
set dbObjectAsPojo(value) {
|
||||||
nodbUtil.assert(typeof value === 'boolean', 'NJS-004', "dbObjectAsPojo");
|
errors.assertPropValue(typeof value === 'boolean', "dbObjectAsPojo");
|
||||||
settings.dbObjectAsPojo = value;
|
settings.dbObjectAsPojo = value;
|
||||||
},
|
},
|
||||||
|
|
||||||
set edition(value) {
|
set edition(value) {
|
||||||
nodbUtil.assert(typeof value === 'string', 'NJS-004', "edition");
|
errors.assertPropValue(typeof value === 'string', "edition");
|
||||||
settings.edition = value;
|
settings.edition = value;
|
||||||
},
|
},
|
||||||
|
|
||||||
set errorOnConcurrentExecute(value) {
|
set errorOnConcurrentExecute(value) {
|
||||||
nodbUtil.assert(typeof value === 'boolean', 'NJS-004',
|
errors.assertPropValue(typeof value === 'boolean',
|
||||||
"errorOnConcurrentExecute");
|
"errorOnConcurrentExecute");
|
||||||
settings.errorOnConcurrentExecute = value;
|
settings.errorOnConcurrentExecute = value;
|
||||||
},
|
},
|
||||||
|
|
||||||
set events(value) {
|
set events(value) {
|
||||||
nodbUtil.assert(typeof value === 'boolean', 'NJS-004', "events");
|
errors.assertPropValue(typeof value === 'boolean', "events");
|
||||||
settings.events = value;
|
settings.events = value;
|
||||||
},
|
},
|
||||||
|
|
||||||
set externalAuth(value) {
|
set externalAuth(value) {
|
||||||
nodbUtil.assert(typeof value === 'boolean', 'NJS-004', "externalAuth");
|
errors.assertPropValue(typeof value === 'boolean', "externalAuth");
|
||||||
settings.externalAuth = value;
|
settings.externalAuth = value;
|
||||||
},
|
},
|
||||||
|
|
||||||
set fetchArraySize(value) {
|
set fetchArraySize(value) {
|
||||||
nodbUtil.assert(Number.isInteger(value) && value > 0, 'NJS-004',
|
errors.assertPropValue(Number.isInteger(value) && value > 0,
|
||||||
"fetchArraySize");
|
"fetchArraySize");
|
||||||
settings.fetchArraySize = value;
|
settings.fetchArraySize = value;
|
||||||
},
|
},
|
||||||
|
|
||||||
set fetchAsBuffer(value) {
|
set fetchAsBuffer(value) {
|
||||||
nodbUtil.assert(Array.isArray(value), 'NJS-004', "fetchAsBuffer");
|
errors.assertPropValue(Array.isArray(value), "fetchAsBuffer");
|
||||||
for (const element of value) {
|
for (const element of value) {
|
||||||
nodbUtil.assert(Number.isInteger(element) && element > 0, 'NJS-004',
|
|
||||||
"fetchAsBuffer");
|
|
||||||
if (element !== constants.DB_TYPE_BLOB) {
|
if (element !== constants.DB_TYPE_BLOB) {
|
||||||
throw new Error(nodbUtil.getErrorMessage('NJS-021'));
|
errors.throwErr(errors.ERR_INVALID_TYPE_FOR_CONVERSION);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
settings.fetchAsBuffer = value;
|
settings.fetchAsBuffer = value;
|
||||||
},
|
},
|
||||||
|
|
||||||
set fetchAsString(value) {
|
set fetchAsString(value) {
|
||||||
nodbUtil.assert(Array.isArray(value), 'NJS-004', "fetchAsString");
|
errors.assertPropValue(Array.isArray(value), "fetchAsString");
|
||||||
for (const element of value) {
|
for (const element of value) {
|
||||||
nodbUtil.assert(Number.isInteger(element) && element > 0, 'NJS-004',
|
|
||||||
"fetchAsString");
|
|
||||||
if (element != constants.DB_TYPE_NUMBER &&
|
if (element != constants.DB_TYPE_NUMBER &&
|
||||||
element != constants.DB_TYPE_TIMESTAMP_LTZ &&
|
element != constants.DB_TYPE_TIMESTAMP_LTZ &&
|
||||||
element != constants.DB_TYPE_RAW &&
|
element != constants.DB_TYPE_RAW &&
|
||||||
element != constants.DB_TYPE_CLOB &&
|
element != constants.DB_TYPE_CLOB &&
|
||||||
element != constants.DB_TYPE_NCLOB &&
|
element != constants.DB_TYPE_NCLOB &&
|
||||||
element != constants.DB_TYPE_JSON) {
|
element != constants.DB_TYPE_JSON) {
|
||||||
throw new Error(nodbUtil.getErrorMessage('NJS-021'));
|
errors.throwErr(errors.ERR_INVALID_TYPE_FOR_CONVERSION);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
settings.fetchAsString = value;
|
settings.fetchAsString = value;
|
||||||
},
|
},
|
||||||
|
|
||||||
set lobPrefetchSize(value) {
|
set lobPrefetchSize(value) {
|
||||||
nodbUtil.assert(Number.isInteger(value) && value >= 0, 'NJS-004',
|
errors.assertPropValue(Number.isInteger(value) && value >= 0,
|
||||||
"lobPrefetchSize");
|
"lobPrefetchSize");
|
||||||
settings.lobPrefetchSize = value;
|
settings.lobPrefetchSize = value;
|
||||||
},
|
},
|
||||||
|
|
||||||
set maxRows(value) {
|
set maxRows(value) {
|
||||||
nodbUtil.assert(Number.isInteger(value) && value >= 0, 'NJS-004',
|
errors.assertPropValue(Number.isInteger(value) && value >= 0, "maxRows");
|
||||||
"maxRows");
|
|
||||||
settings.maxRows = value;
|
settings.maxRows = value;
|
||||||
},
|
},
|
||||||
|
|
||||||
set outFormat(value) {
|
set outFormat(value) {
|
||||||
if (value !== constants.OUT_FORMAT_ARRAY &&
|
if (value !== constants.OUT_FORMAT_ARRAY &&
|
||||||
value !== constants.OUT_FORMAT_OBJECT) {
|
value !== constants.OUT_FORMAT_OBJECT) {
|
||||||
throw new Error(nodbUtil.getErrorMessage('NJS-004', "outFormat"));
|
errors.throwErr(errors.ERR_INVALID_PROPERTY_VALUE, "outFormat");
|
||||||
}
|
}
|
||||||
settings.outFormat = value;
|
settings.outFormat = value;
|
||||||
},
|
},
|
||||||
|
|
||||||
set poolIncrement(value) {
|
set poolIncrement(value) {
|
||||||
nodbUtil.assert(Number.isInteger(value) && value >= 0, 'NJS-004',
|
errors.assertPropValue(Number.isInteger(value) && value >= 0,
|
||||||
"poolIncrement");
|
"poolIncrement");
|
||||||
settings.poolIncrement = value;
|
settings.poolIncrement = value;
|
||||||
},
|
},
|
||||||
|
|
||||||
set poolMax(value) {
|
set poolMax(value) {
|
||||||
nodbUtil.assert(Number.isInteger(value) && value >= 0, 'NJS-004',
|
errors.assertPropValue(Number.isInteger(value) && value >= 0, "poolMax");
|
||||||
"poolMax");
|
|
||||||
settings.poolMax = value;
|
settings.poolMax = value;
|
||||||
},
|
},
|
||||||
|
|
||||||
set poolMaxPerShard(value) {
|
set poolMaxPerShard(value) {
|
||||||
nodbUtil.assert(Number.isInteger(value) && value >= 0, 'NJS-004',
|
errors.assertPropValue(Number.isInteger(value) && value >= 0,
|
||||||
"poolMaxPerShard");
|
"poolMaxPerShard");
|
||||||
settings.poolMaxPerShard = value;
|
settings.poolMaxPerShard = value;
|
||||||
},
|
},
|
||||||
|
|
||||||
set poolMin(value) {
|
set poolMin(value) {
|
||||||
nodbUtil.assert(Number.isInteger(value) && value >= 0, 'NJS-004',
|
errors.assertPropValue(Number.isInteger(value) && value >= 0, "poolMin");
|
||||||
"poolMin");
|
|
||||||
settings.poolMin = value;
|
settings.poolMin = value;
|
||||||
},
|
},
|
||||||
|
|
||||||
set poolPingInterval(value) {
|
set poolPingInterval(value) {
|
||||||
nodbUtil.assert(Number.isInteger(value) && value < 2 ** 31 &&
|
errors.assertPropValue(Number.isInteger(value) && value < 2 ** 31 &&
|
||||||
value >= (-2) ** 31, 'NJS-004', "poolPingInterval");
|
value >= (-2) ** 31, "poolPingInterval");
|
||||||
settings.poolPingInterval = value;
|
settings.poolPingInterval = value;
|
||||||
},
|
},
|
||||||
|
|
||||||
set poolTimeout(value) {
|
set poolTimeout(value) {
|
||||||
nodbUtil.assert(Number.isInteger(value) && value >= 0, 'NJS-004',
|
errors.assertPropValue(Number.isInteger(value) && value >= 0,
|
||||||
"poolTimeout");
|
"poolTimeout");
|
||||||
settings.poolTimeout = value;
|
settings.poolTimeout = value;
|
||||||
},
|
},
|
||||||
|
|
||||||
set prefetchRows(value) {
|
set prefetchRows(value) {
|
||||||
nodbUtil.assert(Number.isInteger(value) && value >= 0, 'NJS-004',
|
errors.assertPropValue(Number.isInteger(value) && value >= 0,
|
||||||
"prefetchRows");
|
"prefetchRows");
|
||||||
settings.prefetchRows = value;
|
settings.prefetchRows = value;
|
||||||
},
|
},
|
||||||
|
|
||||||
set stmtCacheSize(value) {
|
set stmtCacheSize(value) {
|
||||||
nodbUtil.assert(Number.isInteger(value) && value >= 0, 'NJS-004',
|
errors.assertPropValue(Number.isInteger(value) && value >= 0,
|
||||||
"stmtCacheSize");
|
"stmtCacheSize");
|
||||||
settings.stmtCacheSize = value;
|
settings.stmtCacheSize = value;
|
||||||
},
|
},
|
||||||
|
|
46
lib/pool.js
46
lib/pool.js
|
@ -21,6 +21,7 @@
|
||||||
|
|
||||||
const EventEmitter = require('events');
|
const EventEmitter = require('events');
|
||||||
const constants = require('./constants.js');
|
const constants = require('./constants.js');
|
||||||
|
const errors = require('./errors.js');
|
||||||
const settings = require('./settings.js');
|
const settings = require('./settings.js');
|
||||||
const nodbUtil = require('./util.js');
|
const nodbUtil = require('./util.js');
|
||||||
const PoolStatistics = require('./poolStatistics.js');
|
const PoolStatistics = require('./poolStatistics.js');
|
||||||
|
@ -68,14 +69,13 @@ class Pool extends EventEmitter {
|
||||||
// appropriate exception if not.
|
// appropriate exception if not.
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
_checkPoolOpen(ignoreReconfiguring) {
|
_checkPoolOpen(ignoreReconfiguring) {
|
||||||
// if already in reconfiguring status, nothing to do.
|
|
||||||
if (this.status === constants.POOL_STATUS_DRAINING) {
|
if (this.status === constants.POOL_STATUS_DRAINING) {
|
||||||
throw new Error(nodbUtil.getErrorMessage('NJS-064'));
|
errors.throwErr(errors.ERR_POOL_CLOSING);
|
||||||
} else if (this.status === constants.POOL_STATUS_CLOSED) {
|
} else if (this.status === constants.POOL_STATUS_CLOSED) {
|
||||||
throw new Error(nodbUtil.getErrorMessage('NJS-065'));
|
errors.throwErr(errors.ERR_POOL_CLOSED);
|
||||||
} else if (!ignoreReconfiguring) {
|
} else if (!ignoreReconfiguring) {
|
||||||
if (this.status === constants.POOL_STATUS_RECONFIGURING) {
|
if (this.status === constants.POOL_STATUS_RECONFIGURING) {
|
||||||
throw new Error(nodbUtil.getErrorMessage('NJS-082'));
|
errors.throwErr(errors.ERR_POOL_RECONFIGURING);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -294,14 +294,14 @@ class Pool extends EventEmitter {
|
||||||
let forceClose = false;
|
let forceClose = false;
|
||||||
|
|
||||||
// check arguments
|
// check arguments
|
||||||
nodbUtil.checkArgCount(arguments, 0, 1);
|
errors.assertArgCount(arguments, 0, 1);
|
||||||
if (arguments.length == 1) {
|
if (arguments.length == 1) {
|
||||||
|
|
||||||
// drain time must be a valid number; timeouts larger than a 32-bit signed
|
// drain time must be a valid number; timeouts larger than a 32-bit signed
|
||||||
// integer are not supported
|
// integer are not supported
|
||||||
nodbUtil.assert(typeof a1 === 'number', 'NJS-005', 1);
|
errors.assertParamValue(typeof a1 === 'number', 1);
|
||||||
if (a1 < 0 || isNaN(a1) || a1 > 2 ** 31) {
|
if (a1 < 0 || isNaN(a1) || a1 > 2 ** 31) {
|
||||||
throw new Error(nodbUtil.getErrorMessage('NJS-005', 1));
|
errors.throwErr(errors.ERR_INVALID_PARAMETER_VALUE, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
// no need to worry about drain time if no connections are out!
|
// no need to worry about drain time if no connections are out!
|
||||||
|
@ -349,7 +349,7 @@ class Pool extends EventEmitter {
|
||||||
logStatistics() {
|
logStatistics() {
|
||||||
const stats = this.getStatistics();
|
const stats = this.getStatistics();
|
||||||
if (stats === null) {
|
if (stats === null) {
|
||||||
throw new Error(nodbUtil.getErrorMessage('NJS-083'));
|
errors.throwErr(errors.ERR_POOL_STATISTICS_DISABLED);
|
||||||
}
|
}
|
||||||
stats.logStatistics();
|
stats.logStatistics();
|
||||||
}
|
}
|
||||||
|
@ -367,9 +367,9 @@ class Pool extends EventEmitter {
|
||||||
let options = {};
|
let options = {};
|
||||||
|
|
||||||
// check arguments
|
// check arguments
|
||||||
nodbUtil.checkArgCount(arguments, 0, 1);
|
errors.assertArgCount(arguments, 0, 1);
|
||||||
if (arguments.length == 1) {
|
if (arguments.length == 1) {
|
||||||
nodbUtil.assert(nodbUtil.isObject(a1), 'NJS-005', 1);
|
errors.assertParamValue(nodbUtil.isObject(a1), 1);
|
||||||
options = a1;
|
options = a1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -402,7 +402,7 @@ class Pool extends EventEmitter {
|
||||||
if (this._enableStatistics) {
|
if (this._enableStatistics) {
|
||||||
this._totalRequestsRejected += 1;
|
this._totalRequestsRejected += 1;
|
||||||
}
|
}
|
||||||
throw new Error(nodbUtil.getErrorMessage('NJS-076', this._queueMax));
|
errors.throwErr(errors.ERR_QUEUE_MAX_EXCEEDED, this._queueMax);
|
||||||
}
|
}
|
||||||
|
|
||||||
// if too many connections are out, wait until room is made available or
|
// if too many connections are out, wait until room is made available or
|
||||||
|
@ -425,8 +425,12 @@ class Pool extends EventEmitter {
|
||||||
this._totalRequestTimeouts += 1;
|
this._totalRequestTimeouts += 1;
|
||||||
this._updateWaitStatistics(payload);
|
this._updateWaitStatistics(payload);
|
||||||
}
|
}
|
||||||
reject(new Error(nodbUtil.getErrorMessage('NJS-040',
|
try {
|
||||||
this._queueTimeout)));
|
errors.throwErr(errors.ERR_CONN_REQUEST_TIMEOUT,
|
||||||
|
this._queueTimeout);
|
||||||
|
} catch (err) {
|
||||||
|
reject(err);
|
||||||
|
}
|
||||||
}, this._queueTimeout);
|
}, this._queueTimeout);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -524,27 +528,27 @@ class Pool extends EventEmitter {
|
||||||
async reconfigure(options) {
|
async reconfigure(options) {
|
||||||
|
|
||||||
// check arguments
|
// check arguments
|
||||||
nodbUtil.checkArgCount(arguments, 1, 1);
|
errors.assertArgCount(arguments, 1, 1);
|
||||||
nodbUtil.assert(nodbUtil.isObject(options));
|
errors.assertParamValue(nodbUtil.isObject(options));
|
||||||
|
|
||||||
// reconfiguration can happen only when status is OPEN
|
// reconfiguration can happen only when status is OPEN
|
||||||
this._checkPoolOpen(false);
|
this._checkPoolOpen(false);
|
||||||
|
|
||||||
if ((options.queueMax !== undefined) &&
|
if ((options.queueMax !== undefined) &&
|
||||||
(typeof options.queueMax !== "number"))
|
(typeof options.queueMax !== "number"))
|
||||||
throw new Error(nodbUtil.getErrorMessage('NJS-004', "queueMax"));
|
errors.throwErr(errors.ERR_INVALID_PROPERTY_VALUE, "queueMax");
|
||||||
|
|
||||||
if ((options.queueTimeout !== undefined) &&
|
if ((options.queueTimeout !== undefined) &&
|
||||||
(typeof options.queueTimeout !== "number"))
|
(typeof options.queueTimeout !== "number"))
|
||||||
throw new Error(nodbUtil.getErrorMessage('NJS-004', "queueTimeout"));
|
errors.throwErr(errors.ERR_INVALID_PROPERTY_VALUE, "queueTimeout");
|
||||||
|
|
||||||
if ((options.enableStatistics !== undefined) &&
|
if ((options.enableStatistics !== undefined) &&
|
||||||
(typeof options.enableStatistics !== "boolean"))
|
(typeof options.enableStatistics !== "boolean"))
|
||||||
throw new Error(nodbUtil.getErrorMessage('NJS-004', "enableStatistics"));
|
errors.throwErr(errors.ERR_INVALID_PROPERTY_VALUE, "enableStatistics");
|
||||||
|
|
||||||
if ((options.resetStatistics !== undefined) &&
|
if ((options.resetStatistics !== undefined) &&
|
||||||
(typeof options.resetStatistics != "boolean"))
|
(typeof options.resetStatistics != "boolean"))
|
||||||
throw new Error(nodbUtil.getErrorMessage('NJS-004', "resetStatistics"));
|
errors.throwErr(errors.ERR_INVALID_PROPERTY_VALUE, "resetStatistics");
|
||||||
|
|
||||||
this._status = constants.POOL_STATUS_RECONFIGURING;
|
this._status = constants.POOL_STATUS_RECONFIGURING;
|
||||||
try {
|
try {
|
||||||
|
@ -586,8 +590,8 @@ class Pool extends EventEmitter {
|
||||||
// Set parameters for token based authentication.
|
// Set parameters for token based authentication.
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
async setAccessToken(options) {
|
async setAccessToken(options) {
|
||||||
nodbUtil.checkArgCount(arguments, 1, 1);
|
errors.assertArgCount(arguments, 1, 1);
|
||||||
nodbUtil.assert(nodbUtil.isObject(options), 'NJS-005', 1);
|
errors.assertParamValue(nodbUtil.isObject(options), 1);
|
||||||
await this._setAccessToken(options);
|
await this._setAccessToken(options);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -21,8 +21,9 @@
|
||||||
|
|
||||||
const QueryStream = require('./queryStream.js');
|
const QueryStream = require('./queryStream.js');
|
||||||
const nodbUtil = require('./util.js');
|
const nodbUtil = require('./util.js');
|
||||||
const settings = require('./settings.js');
|
|
||||||
const constants = require('./constants.js');
|
const constants = require('./constants.js');
|
||||||
|
const errors = require('./errors.js');
|
||||||
|
const settings = require('./settings.js');
|
||||||
const Connection = require('./connection.js');
|
const Connection = require('./connection.js');
|
||||||
|
|
||||||
class ResultSet {
|
class ResultSet {
|
||||||
|
@ -132,10 +133,10 @@ class ResultSet {
|
||||||
// Close the result set and make it unusable for further operations.
|
// Close the result set and make it unusable for further operations.
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
async close() {
|
async close() {
|
||||||
nodbUtil.checkArgCount(arguments, 0, 0);
|
errors.assertArgCount(arguments, 0, 0);
|
||||||
|
|
||||||
if (this._convertedToStream) {
|
if (this._convertedToStream) {
|
||||||
throw new Error(nodbUtil.getErrorMessage('NJS-042'));
|
errors.throwErr(errors.ERR_CANNOT_INVOKE_RS_METHODS);
|
||||||
}
|
}
|
||||||
|
|
||||||
this._processingStarted = true;
|
this._processingStarted = true;
|
||||||
|
@ -150,10 +151,10 @@ class ResultSet {
|
||||||
// through the thread pool that would be required if implemented in C.
|
// through the thread pool that would be required if implemented in C.
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
async getRow() {
|
async getRow() {
|
||||||
nodbUtil.checkArgCount(arguments, 0, 0);
|
errors.assertArgCount(arguments, 0, 0);
|
||||||
|
|
||||||
if (this._convertedToStream && !this._allowGetRowCall) {
|
if (this._convertedToStream && !this._allowGetRowCall) {
|
||||||
throw new Error(nodbUtil.getErrorMessage('NJS-042'));
|
errors.throwErr(errors.ERR_CANNOT_INVOKE_RS_METHODS);
|
||||||
}
|
}
|
||||||
|
|
||||||
this._allowGetRowCall = false;
|
this._allowGetRowCall = false;
|
||||||
|
@ -177,17 +178,16 @@ class ResultSet {
|
||||||
async getRows(numRows) {
|
async getRows(numRows) {
|
||||||
let rowsNeeded;
|
let rowsNeeded;
|
||||||
|
|
||||||
nodbUtil.checkArgCount(arguments, 0, 1);
|
errors.assertArgCount(arguments, 0, 1);
|
||||||
|
|
||||||
if (arguments.length == 0) {
|
if (arguments.length == 0) {
|
||||||
numRows = 0;
|
numRows = 0;
|
||||||
} else {
|
} else {
|
||||||
nodbUtil.assert(Number.isInteger(numRows), 'NJS-005', 1);
|
errors.assertParamValue(Number.isInteger(numRows) && numRows >= 0, 1);
|
||||||
nodbUtil.assert(numRows >= 0, 'NJS-005', 1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this._convertedToStream) {
|
if (this._convertedToStream) {
|
||||||
throw new Error(nodbUtil.getErrorMessage('NJS-042'));
|
errors.throwErr(errors.ERR_CANNOT_INVOKE_RS_METHODS);
|
||||||
}
|
}
|
||||||
|
|
||||||
this._processingStarted = true;
|
this._processingStarted = true;
|
||||||
|
@ -227,14 +227,14 @@ class ResultSet {
|
||||||
// Converts a result set to a QueryStream object.
|
// Converts a result set to a QueryStream object.
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
toQueryStream() {
|
toQueryStream() {
|
||||||
nodbUtil.checkArgCount(arguments, 0, 0);
|
errors.assertArgCount(arguments, 0, 0);
|
||||||
|
|
||||||
if (this._processingStarted) {
|
if (this._processingStarted) {
|
||||||
throw new Error(nodbUtil.getErrorMessage('NJS-041'));
|
errors.throwErr(errors.ERR_CANNOT_CONVERT_RS_TO_STREAM);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this._convertedToStream) {
|
if (this._convertedToStream) {
|
||||||
throw new Error(nodbUtil.getErrorMessage('NJS-043'));
|
errors.throwErr(errors.ERR_RS_ALREADY_CONVERTED);
|
||||||
}
|
}
|
||||||
|
|
||||||
this._convertedToStream = true;
|
this._convertedToStream = true;
|
||||||
|
@ -257,7 +257,7 @@ class ResultSet {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
nodbUtil.wrap_fns(ResultSet.prototype, "NJS-017",
|
nodbUtil.wrap_fns(ResultSet.prototype, errors.ERR_BUSY_RS,
|
||||||
"close",
|
"close",
|
||||||
"getRow",
|
"getRow",
|
||||||
"getRows");
|
"getRows");
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
|
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
|
const errors = require('./errors.js');
|
||||||
const nodbUtil = require('./util.js');
|
const nodbUtil = require('./util.js');
|
||||||
|
|
||||||
class SodaCollection {
|
class SodaCollection {
|
||||||
|
@ -28,7 +29,7 @@ class SodaCollection {
|
||||||
}
|
}
|
||||||
|
|
||||||
find() {
|
find() {
|
||||||
nodbUtil.checkArgCount(arguments, 0, 0);
|
errors.assertArgCount(arguments, 0, 0);
|
||||||
return this._find();
|
return this._find();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -42,8 +43,8 @@ class SodaCollection {
|
||||||
// Create an index on the collection.
|
// Create an index on the collection.
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
async createIndex(spec) {
|
async createIndex(spec) {
|
||||||
nodbUtil.checkArgCount(arguments, 1, 1);
|
errors.assertArgCount(arguments, 1, 1);
|
||||||
nodbUtil.assert(nodbUtil.isObject(spec), 'NJS-005', 1);
|
errors.assertParamValue(nodbUtil.isObject(spec), 1);
|
||||||
return await this._createIndex(JSON.stringify(spec));
|
return await this._createIndex(JSON.stringify(spec));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -53,7 +54,7 @@ class SodaCollection {
|
||||||
// Drop the collection.
|
// Drop the collection.
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
async drop() {
|
async drop() {
|
||||||
nodbUtil.checkArgCount(arguments, 0, 0);
|
errors.assertArgCount(arguments, 0, 0);
|
||||||
return await this._drop();
|
return await this._drop();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -65,10 +66,10 @@ class SodaCollection {
|
||||||
async dropIndex(indexName, a2) {
|
async dropIndex(indexName, a2) {
|
||||||
let options = {};
|
let options = {};
|
||||||
|
|
||||||
nodbUtil.checkArgCount(arguments, 1, 2);
|
errors.assertArgCount(arguments, 1, 2);
|
||||||
nodbUtil.assert(typeof indexName === 'string', 'NJS-005', 1);
|
errors.assertParamValue(typeof indexName === 'string', 1);
|
||||||
if (arguments.length == 2) {
|
if (arguments.length == 2) {
|
||||||
nodbUtil.assert(typeof a2 === 'object', 'NJS-005', 2);
|
errors.assertParamValue(typeof a2 === 'object', 2);
|
||||||
options = a2;
|
options = a2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -80,7 +81,7 @@ class SodaCollection {
|
||||||
// Return the data guide for the collection.
|
// Return the data guide for the collection.
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
async getDataGuide() {
|
async getDataGuide() {
|
||||||
nodbUtil.checkArgCount(arguments, 0, 0);
|
errors.assertArgCount(arguments, 0, 0);
|
||||||
return await this._getDataGuide();
|
return await this._getDataGuide();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -90,12 +91,8 @@ class SodaCollection {
|
||||||
// Insert an array of documents into the collection in a single round-trip.
|
// Insert an array of documents into the collection in a single round-trip.
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
async insertMany(docs) {
|
async insertMany(docs) {
|
||||||
nodbUtil.checkArgCount(arguments, 1, 1);
|
errors.assertArgCount(arguments, 1, 1);
|
||||||
nodbUtil.assert(Array.isArray(docs), 'NJS-005', 1);
|
errors.assertParamValue(Array.isArray(docs) && docs.length > 0, 1);
|
||||||
|
|
||||||
if (docs.length == 0) {
|
|
||||||
throw new Error(nodbUtil.getErrorMessage('NJS-005', 1));
|
|
||||||
}
|
|
||||||
|
|
||||||
let actualDocs = Array(docs.length);
|
let actualDocs = Array(docs.length);
|
||||||
for (let i = 0; i < docs.length; i++) {
|
for (let i = 0; i < docs.length; i++) {
|
||||||
|
@ -118,18 +115,14 @@ class SodaCollection {
|
||||||
async insertManyAndGet(docs, a2) {
|
async insertManyAndGet(docs, a2) {
|
||||||
let options = {};
|
let options = {};
|
||||||
|
|
||||||
nodbUtil.checkArgCount(arguments, 1, 2);
|
errors.assertArgCount(arguments, 1, 2);
|
||||||
nodbUtil.assert(Array.isArray(docs), 'NJS-005', 1);
|
errors.assertParamValue(Array.isArray(docs) && docs.length > 0, 1);
|
||||||
|
|
||||||
if (arguments.length == 2) {
|
if (arguments.length == 2) {
|
||||||
nodbUtil.assert(nodbUtil.isObject(a2), 'NJS-005', 2);
|
errors.assertParamValue(nodbUtil.isObject(a2), 2);
|
||||||
options = a2;
|
options = a2;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (docs.length == 0) {
|
|
||||||
throw new Error(nodbUtil.getErrorMessage('NJS-005', 1));
|
|
||||||
}
|
|
||||||
|
|
||||||
let actualDocs = Array(docs.length);
|
let actualDocs = Array(docs.length);
|
||||||
for (let i = 0; i < docs.length; i++) {
|
for (let i = 0; i < docs.length; i++) {
|
||||||
let content = docs[i];
|
let content = docs[i];
|
||||||
|
@ -148,9 +141,9 @@ class SodaCollection {
|
||||||
// Inserts a single document into the collection.
|
// Inserts a single document into the collection.
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
async insertOne(content) {
|
async insertOne(content) {
|
||||||
nodbUtil.checkArgCount(arguments, 1, 1);
|
errors.assertArgCount(arguments, 1, 1);
|
||||||
nodbUtil.assert(nodbUtil.isObject(content) ||
|
errors.assertParamValue(nodbUtil.isObject(content) ||
|
||||||
nodbUtil.isSodaDocument(content), 'NJS-005', 1);
|
nodbUtil.isSodaDocument(content), 1);
|
||||||
|
|
||||||
if (!nodbUtil.isSodaDocument(content)) {
|
if (!nodbUtil.isSodaDocument(content)) {
|
||||||
content = Buffer.from(JSON.stringify(content));
|
content = Buffer.from(JSON.stringify(content));
|
||||||
|
@ -168,12 +161,12 @@ class SodaCollection {
|
||||||
async insertOneAndGet(content, a2) {
|
async insertOneAndGet(content, a2) {
|
||||||
let options = {};
|
let options = {};
|
||||||
|
|
||||||
nodbUtil.checkArgCount(arguments, 1, 2);
|
errors.assertArgCount(arguments, 1, 2);
|
||||||
nodbUtil.assert(nodbUtil.isObject(content) ||
|
errors.assertParamValue(nodbUtil.isObject(content) ||
|
||||||
nodbUtil.isSodaDocument(content), 'NJS-005', 1);
|
nodbUtil.isSodaDocument(content), 1);
|
||||||
|
|
||||||
if (arguments.length == 2) {
|
if (arguments.length == 2) {
|
||||||
nodbUtil.assert(nodbUtil.isObject(a2), 'NJS-005', 2);
|
errors.assertParamValue(nodbUtil.isObject(a2), 2);
|
||||||
options = a2;
|
options = a2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -190,9 +183,9 @@ class SodaCollection {
|
||||||
// Saves a single document into the collection.
|
// Saves a single document into the collection.
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
async save(content) {
|
async save(content) {
|
||||||
nodbUtil.checkArgCount(arguments, 1, 1);
|
errors.assertArgCount(arguments, 1, 1);
|
||||||
nodbUtil.assert(nodbUtil.isObject(content) ||
|
errors.assertParamValue(nodbUtil.isObject(content) ||
|
||||||
nodbUtil.isSodaDocument(content), 'NJS-005', 1);
|
nodbUtil.isSodaDocument(content), 1);
|
||||||
|
|
||||||
if (!nodbUtil.isSodaDocument(content)) {
|
if (!nodbUtil.isSodaDocument(content)) {
|
||||||
content = Buffer.from(JSON.stringify(content));
|
content = Buffer.from(JSON.stringify(content));
|
||||||
|
@ -210,12 +203,12 @@ class SodaCollection {
|
||||||
async saveAndGet(content, a2) {
|
async saveAndGet(content, a2) {
|
||||||
let options = {};
|
let options = {};
|
||||||
|
|
||||||
nodbUtil.checkArgCount(arguments, 1, 2);
|
errors.assertArgCount(arguments, 1, 2);
|
||||||
nodbUtil.assert(nodbUtil.isObject(content) ||
|
errors.assertParamValue(nodbUtil.isObject(content) ||
|
||||||
nodbUtil.isSodaDocument(content), 'NJS-005', 1);
|
nodbUtil.isSodaDocument(content), 1);
|
||||||
|
|
||||||
if (arguments.length == 2) {
|
if (arguments.length == 2) {
|
||||||
nodbUtil.assert(nodbUtil.isObject(a2), 'NJS-005', 2);
|
errors.assertParamValue(nodbUtil.isObject(a2), 2);
|
||||||
options = a2;
|
options = a2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -232,7 +225,7 @@ class SodaCollection {
|
||||||
// Remove all of the documents from a collection.
|
// Remove all of the documents from a collection.
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
async truncate() {
|
async truncate() {
|
||||||
nodbUtil.checkArgCount(arguments, 0, 0);
|
errors.assertArgCount(arguments, 0, 0);
|
||||||
await this._truncate();
|
await this._truncate();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
|
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
|
const errors = require('./errors.js');
|
||||||
const nodbUtil = require('./util.js');
|
const nodbUtil = require('./util.js');
|
||||||
|
|
||||||
class SodaDatabase {
|
class SodaDatabase {
|
||||||
|
@ -35,16 +36,15 @@ class SodaDatabase {
|
||||||
async createCollection(name, a2) {
|
async createCollection(name, a2) {
|
||||||
let options = {};
|
let options = {};
|
||||||
|
|
||||||
nodbUtil.checkArgCount(arguments, 1, 2);
|
errors.assertArgCount(arguments, 1, 2);
|
||||||
nodbUtil.assert(typeof name === 'string', 'NJS-005', 1);
|
errors.assertParamValue(typeof name === 'string', 1);
|
||||||
|
|
||||||
if (arguments.length == 2) {
|
if (arguments.length == 2) {
|
||||||
nodbUtil.assert(nodbUtil.isObject(a2), 'NJS-005', 2);
|
errors.assertParamValue(nodbUtil.isObject(a2), 2);
|
||||||
options = a2;
|
options = a2;
|
||||||
if (options.metaData) {
|
if (options.metaData) {
|
||||||
if (!nodbUtil.isObject(options.metaData)) {
|
errors.assertParamPropValue(nodbUtil.isObject(options.metaData), 2,
|
||||||
throw new Error(nodbUtil.getErrorMessage('NJS-005', 2));
|
"metaData");
|
||||||
}
|
|
||||||
options.metaData = JSON.stringify(options.metaData);
|
options.metaData = JSON.stringify(options.metaData);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -60,11 +60,11 @@ class SodaDatabase {
|
||||||
createDocument(content, a2) {
|
createDocument(content, a2) {
|
||||||
let options = {};
|
let options = {};
|
||||||
|
|
||||||
nodbUtil.checkArgCount(arguments, 1, 2);
|
errors.assertArgCount(arguments, 1, 2);
|
||||||
nodbUtil.assert(Buffer.isBuffer(content) || typeof content === 'string' ||
|
errors.assertParamValue(Buffer.isBuffer(content) ||
|
||||||
nodbUtil.isObject(content), 'NJS-005', 1);
|
typeof content === 'string' || nodbUtil.isObject(content), 1);
|
||||||
if (arguments.length > 1) {
|
if (arguments.length > 1) {
|
||||||
nodbUtil.assert(nodbUtil.isObject(a2), 'NJS-005', 2);
|
errors.assertParamValue(nodbUtil.isObject(a2), 2);
|
||||||
options = a2;
|
options = a2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -85,9 +85,9 @@ class SodaDatabase {
|
||||||
async getCollectionNames(a1) {
|
async getCollectionNames(a1) {
|
||||||
let options = {};
|
let options = {};
|
||||||
|
|
||||||
nodbUtil.checkArgCount(arguments, 0, 1);
|
errors.assertArgCount(arguments, 0, 1);
|
||||||
if (arguments.length == 1) {
|
if (arguments.length == 1) {
|
||||||
nodbUtil.assert(nodbUtil.isObject(a1), 'NJS-005', 1);
|
errors.assertParamValue(nodbUtil.isObject(a1), 1);
|
||||||
options = a1;
|
options = a1;
|
||||||
}
|
}
|
||||||
return await this._getCollectionNames(options);
|
return await this._getCollectionNames(options);
|
||||||
|
@ -98,8 +98,8 @@ class SodaDatabase {
|
||||||
// Open an existing SODA collection and return it to the caller.
|
// Open an existing SODA collection and return it to the caller.
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
async openCollection(name) {
|
async openCollection(name) {
|
||||||
nodbUtil.checkArgCount(arguments, 1, 1);
|
errors.assertArgCount(arguments, 1, 1);
|
||||||
nodbUtil.assert(typeof name === 'string', 'NJS-005', 1);
|
errors.assertParamValue(typeof name === 'string', 1);
|
||||||
return await this._openCollection(name);
|
return await this._openCollection(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -19,9 +19,9 @@
|
||||||
|
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
|
const errors = require('./errors.js');
|
||||||
const nodbUtil = require('./util.js');
|
const nodbUtil = require('./util.js');
|
||||||
|
|
||||||
|
|
||||||
class SodaDocCursor {
|
class SodaDocCursor {
|
||||||
|
|
||||||
_getConnection() {
|
_getConnection() {
|
||||||
|
@ -33,7 +33,7 @@ class SodaDocCursor {
|
||||||
// Return the new document available from the cursor.
|
// Return the new document available from the cursor.
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
async getNext() {
|
async getNext() {
|
||||||
nodbUtil.checkArgCount(arguments, 0, 0);
|
errors.assertArgCount(arguments, 0, 0);
|
||||||
return await this._getNext();
|
return await this._getNext();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -43,7 +43,7 @@ class SodaDocCursor {
|
||||||
// Close the cursor and make it unusable for further operations.
|
// Close the cursor and make it unusable for further operations.
|
||||||
//--------------------------------------------------------------------------
|
//--------------------------------------------------------------------------
|
||||||
async close() {
|
async close() {
|
||||||
nodbUtil.checkArgCount(arguments, 0, 0);
|
errors.assertArgCount(arguments, 0, 0);
|
||||||
await this._close();
|
await this._close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
|
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
|
const errors = require('./errors.js');
|
||||||
const nodbUtil = require('./util.js');
|
const nodbUtil = require('./util.js');
|
||||||
|
|
||||||
class SodaOperation {
|
class SodaOperation {
|
||||||
|
@ -37,7 +38,7 @@ class SodaOperation {
|
||||||
// Return a count of the number of documents that match the search criteria.
|
// Return a count of the number of documents that match the search criteria.
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
async count() {
|
async count() {
|
||||||
nodbUtil.checkArgCount(arguments, 0, 0);
|
errors.assertArgCount(arguments, 0, 0);
|
||||||
return await this._count(this._options);
|
return await this._count(this._options);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -48,7 +49,7 @@ class SodaOperation {
|
||||||
// criteria.
|
// criteria.
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
async getCursor() {
|
async getCursor() {
|
||||||
nodbUtil.checkArgCount(arguments, 0, 0);
|
errors.assertArgCount(arguments, 0, 0);
|
||||||
return await this._getCursor(this._options);
|
return await this._getCursor(this._options);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -57,7 +58,7 @@ class SodaOperation {
|
||||||
// Return an array of documents that match the search criteria.
|
// Return an array of documents that match the search criteria.
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
async getDocuments() {
|
async getDocuments() {
|
||||||
nodbUtil.checkArgCount(arguments, 0, 0);
|
errors.assertArgCount(arguments, 0, 0);
|
||||||
return await this._getDocuments(this._options);
|
return await this._getDocuments(this._options);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -67,7 +68,7 @@ class SodaOperation {
|
||||||
// Return the first document that matches the search criteria.
|
// Return the first document that matches the search criteria.
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
async getOne() {
|
async getOne() {
|
||||||
nodbUtil.checkArgCount(arguments, 0, 0);
|
errors.assertArgCount(arguments, 0, 0);
|
||||||
return await this._getOne(this._options);
|
return await this._getOne(this._options);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -78,9 +79,9 @@ class SodaOperation {
|
||||||
// specified document.
|
// specified document.
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
async replaceOne(content) {
|
async replaceOne(content) {
|
||||||
nodbUtil.checkArgCount(arguments, 1, 1);
|
errors.assertArgCount(arguments, 1, 1);
|
||||||
nodbUtil.assert(nodbUtil.isObject(content) ||
|
errors.assertParamValue(nodbUtil.isObject(content) ||
|
||||||
nodbUtil.isSodaDocument(content), 'NJS-005', 1);
|
nodbUtil.isSodaDocument(content), 1);
|
||||||
|
|
||||||
if (!nodbUtil.isSodaDocument(content)) {
|
if (!nodbUtil.isSodaDocument(content)) {
|
||||||
content = Buffer.from(JSON.stringify(content));
|
content = Buffer.from(JSON.stringify(content));
|
||||||
|
@ -96,9 +97,9 @@ class SodaOperation {
|
||||||
// specified document and then return a result document containing metadata.
|
// specified document and then return a result document containing metadata.
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
async replaceOneAndGet(content) {
|
async replaceOneAndGet(content) {
|
||||||
nodbUtil.checkArgCount(arguments, 1, 1);
|
errors.assertArgCount(arguments, 1, 1);
|
||||||
nodbUtil.assert(nodbUtil.isObject(content) ||
|
errors.assertParamValue(nodbUtil.isObject(content) ||
|
||||||
nodbUtil.isSodaDocument(content), 'NJS-005', 1);
|
nodbUtil.isSodaDocument(content), 1);
|
||||||
|
|
||||||
if (!nodbUtil.isSodaDocument(content)) {
|
if (!nodbUtil.isSodaDocument(content)) {
|
||||||
content = Buffer.from(JSON.stringify(content));
|
content = Buffer.from(JSON.stringify(content));
|
||||||
|
@ -114,38 +115,38 @@ class SodaOperation {
|
||||||
// and return information about the operation to the caller.
|
// and return information about the operation to the caller.
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
async remove() {
|
async remove() {
|
||||||
nodbUtil.checkArgCount(arguments, 0, 0);
|
errors.assertArgCount(arguments, 0, 0);
|
||||||
return await this._remove(this._options);
|
return await this._remove(this._options);
|
||||||
}
|
}
|
||||||
|
|
||||||
// fetchArraySize - a non-terminal function that can chain further
|
// fetchArraySize - a non-terminal function that can chain further
|
||||||
fetchArraySize(n) {
|
fetchArraySize(n) {
|
||||||
nodbUtil.checkArgCount(arguments, 1, 1);
|
errors.assertArgCount(arguments, 1, 1);
|
||||||
nodbUtil.assert(typeof n === 'number', 'NJS-005', 1);
|
errors.assertParamValue(typeof n === 'number', 1);
|
||||||
this._options.fetchArraySize = n;
|
this._options.fetchArraySize = n;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
// filter property - a non-terminal function and can chain further
|
// filter property - a non-terminal function and can chain further
|
||||||
filter(f) {
|
filter(f) {
|
||||||
nodbUtil.checkArgCount (arguments, 1, 1);
|
errors.assertArgCount (arguments, 1, 1);
|
||||||
nodbUtil.assert(nodbUtil.isObject(f), 'NJS-005', 1);
|
errors.assertParamValue(nodbUtil.isObject(f), 1);
|
||||||
this._options.filter = JSON.stringify(f);
|
this._options.filter = JSON.stringify(f);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
// hint - a non-terminal function and can chain further
|
// hint - a non-terminal function and can chain further
|
||||||
hint(val) {
|
hint(val) {
|
||||||
nodbUtil.checkArgCount(arguments, 1, 1);
|
errors.assertArgCount(arguments, 1, 1);
|
||||||
nodbUtil.assert(typeof val === 'string', 'NJS-005', 1);
|
errors.assertParamValue(typeof val === 'string', 1);
|
||||||
this._options.hint = val;
|
this._options.hint = val;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
// key - a non-terminal function and can chain further
|
// key - a non-terminal function and can chain further
|
||||||
key(k) {
|
key(k) {
|
||||||
nodbUtil.checkArgCount(arguments, 1, 1);
|
errors.assertArgCount(arguments, 1, 1);
|
||||||
nodbUtil.assert(typeof k === 'string', 'NJS-005', 1);
|
errors.assertParamValue(typeof k === 'string', 1);
|
||||||
this._options.key = k;
|
this._options.key = k;
|
||||||
this._options.keys = undefined;
|
this._options.keys = undefined;
|
||||||
return this;
|
return this;
|
||||||
|
@ -153,11 +154,11 @@ class SodaOperation {
|
||||||
|
|
||||||
// keys - a non-terminal function and can chain further
|
// keys - a non-terminal function and can chain further
|
||||||
keys(arr) {
|
keys(arr) {
|
||||||
nodbUtil.checkArgCount(arguments, 1, 1);
|
errors.assertArgCount(arguments, 1, 1);
|
||||||
nodbUtil.assert(Array.isArray(arr), 'NJS-005', 1);
|
errors.assertParamValue(Array.isArray(arr), 1);
|
||||||
|
|
||||||
for (let i = 0; i < arr.length; i++) {
|
for (let i = 0; i < arr.length; i++) {
|
||||||
nodbUtil.assert(typeof arr[i] === 'string', 'NJS-005', 1);
|
errors.assertParamValue(typeof arr[i] === 'string', 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
this._options.keys = arr;
|
this._options.keys = arr;
|
||||||
|
@ -167,24 +168,24 @@ class SodaOperation {
|
||||||
|
|
||||||
// limit property - a non-terminal function and can chain further
|
// limit property - a non-terminal function and can chain further
|
||||||
limit(n) {
|
limit(n) {
|
||||||
nodbUtil.checkArgCount(arguments, 1, 1);
|
errors.assertArgCount(arguments, 1, 1);
|
||||||
nodbUtil.assert(typeof n === 'number', 'NJS-005', 1);
|
errors.assertParamValue(typeof n === 'number', 1);
|
||||||
this._options.limit = n;
|
this._options.limit = n;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
// skip property - a non-terminal function and can chain further
|
// skip property - a non-terminal function and can chain further
|
||||||
skip(n) {
|
skip(n) {
|
||||||
nodbUtil.checkArgCount(arguments, 1, 1);
|
errors.assertArgCount(arguments, 1, 1);
|
||||||
nodbUtil.assert(typeof n === 'number', 'NJS-005', 1);
|
errors.assertParamValue(typeof n === 'number', 1);
|
||||||
this._options.skip = n;
|
this._options.skip = n;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
// version property - a non-terminal function and can chain further
|
// version property - a non-terminal function and can chain further
|
||||||
version(v) {
|
version(v) {
|
||||||
nodbUtil.checkArgCount(arguments, 1, 1);
|
errors.assertArgCount(arguments, 1, 1);
|
||||||
nodbUtil.assert(typeof v === 'string', 'NJS-005', 1);
|
errors.assertParamValue(typeof v === 'string', 1);
|
||||||
this._options.version = v;
|
this._options.version = v;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
85
lib/util.js
85
lib/util.js
|
@ -19,7 +19,7 @@
|
||||||
|
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
const util = require('util');
|
const errors = require('./errors.js');
|
||||||
|
|
||||||
// node-oracledb version number
|
// node-oracledb version number
|
||||||
let packageJSON;
|
let packageJSON;
|
||||||
|
@ -43,38 +43,6 @@ module.exports.BINARY_FILE = BINARY_FILE;
|
||||||
const STAGING_DIR = 'package/Staging';
|
const STAGING_DIR = 'package/Staging';
|
||||||
module.exports.STAGING_DIR = STAGING_DIR;
|
module.exports.STAGING_DIR = STAGING_DIR;
|
||||||
|
|
||||||
// errorMessages is for NJS error messages used in the JavaScript layer
|
|
||||||
const errorMessages = {
|
|
||||||
'NJS-002': 'NJS-002: invalid pool',
|
|
||||||
'NJS-004': 'NJS-004: invalid value for property %s',
|
|
||||||
'NJS-005': 'NJS-005: invalid value for parameter %d',
|
|
||||||
'NJS-009': 'NJS-009: invalid number of parameters',
|
|
||||||
'NJS-017': 'NJS-017: concurrent operations on ResultSet are not allowed',
|
|
||||||
'NJS-021': 'NJS-021: invalid type for conversion specified',
|
|
||||||
'NJS-023': 'NJS-023: concurrent operations on LOB are not allowed',
|
|
||||||
'NJS-037': 'NJS-037: incompatible type of value provided',
|
|
||||||
'NJS-040': 'NJS-040: connection request timeout. Request exceeded queueTimeout of %d',
|
|
||||||
'NJS-041': 'NJS-041: cannot convert ResultSet to QueryStream after invoking methods',
|
|
||||||
'NJS-042': 'NJS-042: cannot invoke ResultSet methods after converting to QueryStream',
|
|
||||||
'NJS-043': 'NJS-043: ResultSet already converted to QueryStream',
|
|
||||||
'NJS-045': 'NJS-045: cannot load a node-oracledb binary for Node.js ' + process.versions.node + ' (' + process.platform + ' ' + process.arch + ') %s',
|
|
||||||
'NJS-046': 'NJS-046: poolAlias "%s" already exists in the connection pool cache',
|
|
||||||
'NJS-047': 'NJS-047: poolAlias "%s" not found in the connection pool cache',
|
|
||||||
'NJS-064': 'NJS-064: connection pool is closing',
|
|
||||||
'NJS-065': 'NJS-065: connection pool was closed',
|
|
||||||
'NJS-067': 'NJS-067: a pre-built node-oracledb binary was not found for %s',
|
|
||||||
'NJS-069': 'NJS-069: node-oracledb %s requires Node.js %s or later',
|
|
||||||
'NJS-076': 'NJS-076: connection request rejected. Pool queue length queueMax %d reached',
|
|
||||||
'NJS-081': 'NJS-081: concurrent operations on a connection are disabled',
|
|
||||||
'NJS-082': 'NJS-082: connection pool is being reconfigured',
|
|
||||||
'NJS-083': 'NJS-083: pool statistics not enabled',
|
|
||||||
'NJS-084': 'NJS-084: invalid access token',
|
|
||||||
'NJS-085': 'NJS-085: invalid connection pool configuration with token based authentication. The homogeneous and externalAuth attributes must be set to true',
|
|
||||||
'NJS-086': 'NJS-086: invalid standalone configuration with token based authentication. The externalAuth attribute must be set to true',
|
|
||||||
'NJS-087': 'NJS-087: access token has expired',
|
|
||||||
'NJS-088': 'NJS-088: accessTokenCallback cannot be specified when accessToken is a function'
|
|
||||||
};
|
|
||||||
|
|
||||||
// getInstallURL returns a string with installation URL
|
// getInstallURL returns a string with installation URL
|
||||||
function getInstallURL() {
|
function getInstallURL() {
|
||||||
return ('Node-oracledb installation instructions: https://oracle.github.io/node-oracledb/INSTALL.html');
|
return ('Node-oracledb installation instructions: https://oracle.github.io/node-oracledb/INSTALL.html');
|
||||||
|
@ -137,39 +105,6 @@ function getInstallHelp() {
|
||||||
|
|
||||||
module.exports.getInstallHelp = getInstallHelp;
|
module.exports.getInstallHelp = getInstallHelp;
|
||||||
|
|
||||||
// getErrorMessage is used to get and format error messages to make throwing
|
|
||||||
// errors a little more convenient.
|
|
||||||
function getErrorMessage(errorCode) {
|
|
||||||
let args = Array.prototype.slice.call(arguments);
|
|
||||||
args[0] = errorMessages[errorCode];
|
|
||||||
return util.format.apply(util, args);
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports.getErrorMessage = getErrorMessage;
|
|
||||||
|
|
||||||
// assert is typically used at the beginning of public functions to assert
|
|
||||||
// preconditions for the function to execute. Most commonly it is used to
|
|
||||||
// validate the number of arguments and their types and throw an error if they
|
|
||||||
// don't match what is expected.
|
|
||||||
function assert(condition, errorCode, messageArg1) {
|
|
||||||
if (!condition) {
|
|
||||||
throw new Error(getErrorMessage(errorCode, messageArg1));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports.assert = assert;
|
|
||||||
|
|
||||||
// checkArgCount is used to validate the number of arguments, particularly with
|
|
||||||
// optional parameters (range of number of parameters). If the number of
|
|
||||||
// arguments is not within the given range, an error is thrown.
|
|
||||||
function checkArgCount(args, minArgCount, maxArgCount) {
|
|
||||||
if (args.length < minArgCount || args.length > maxArgCount)
|
|
||||||
throw new Error(getErrorMessage('NJS-009'));
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports.checkArgCount = checkArgCount;
|
|
||||||
|
|
||||||
|
|
||||||
// The callbackify function is used to wrap async methods to add optional
|
// The callbackify function is used to wrap async methods to add optional
|
||||||
// callback support. If the last parameter passed to a method is a function,
|
// callback support. If the last parameter passed to a method is a function,
|
||||||
// then it is assumed that the callback pattern is being used and the promise
|
// then it is assumed that the callback pattern is being used and the promise
|
||||||
|
@ -230,7 +165,7 @@ module.exports.serialize = serialize;
|
||||||
function preventConcurrent(func, errorCode) {
|
function preventConcurrent(func, errorCode) {
|
||||||
return async function() {
|
return async function() {
|
||||||
if (this._isActive)
|
if (this._isActive)
|
||||||
throw new Error(getErrorMessage(errorCode));
|
errors.throwErr(errorCode);
|
||||||
this._isActive = true;
|
this._isActive = true;
|
||||||
try {
|
try {
|
||||||
return await func.apply(this, arguments);
|
return await func.apply(this, arguments);
|
||||||
|
@ -250,7 +185,7 @@ module.exports.preventConcurrent = preventConcurrent;
|
||||||
function wrap_fns(proto) {
|
function wrap_fns(proto) {
|
||||||
let nameIndex = 1;
|
let nameIndex = 1;
|
||||||
let preventConcurrentErrorCode;
|
let preventConcurrentErrorCode;
|
||||||
if (arguments[1].startsWith('NJS-')) {
|
if (typeof arguments[1] === 'number') {
|
||||||
nameIndex = 2;
|
nameIndex = 2;
|
||||||
preventConcurrentErrorCode = arguments[1];
|
preventConcurrentErrorCode = arguments[1];
|
||||||
}
|
}
|
||||||
|
@ -293,9 +228,9 @@ function isXid(value) {
|
||||||
module.exports.isXid = isXid;
|
module.exports.isXid = isXid;
|
||||||
|
|
||||||
function isTokenExpired(token) {
|
function isTokenExpired(token) {
|
||||||
assert(typeof token === 'string', 'NJS-084');
|
errors.assert(typeof token === 'string', errors.ERR_TOKEN_BASED_AUTH);
|
||||||
if (token.split('.')[1] === undefined) {
|
if (token.split('.')[1] === undefined) {
|
||||||
throw new Error(getErrorMessage('NJS-084'));
|
errors.throwErr(errors.ERR_TOKEN_BASED_AUTH);
|
||||||
}
|
}
|
||||||
|
|
||||||
const base64Url = token.split('.')[1];
|
const base64Url = token.split('.')[1];
|
||||||
|
@ -304,7 +239,7 @@ function isTokenExpired(token) {
|
||||||
const payloadInit = buff.toString('ascii');
|
const payloadInit = buff.toString('ascii');
|
||||||
|
|
||||||
let expiry = JSON.parse(payloadInit).exp;
|
let expiry = JSON.parse(payloadInit).exp;
|
||||||
assert(expiry != undefined, 'NJS-084');
|
errors.assert(expiry != undefined, errors.ERR_TOKEN_BASED_AUTH);
|
||||||
expiry = expiry * 1000;
|
expiry = expiry * 1000;
|
||||||
|
|
||||||
return (new Date().getTime() > expiry);
|
return (new Date().getTime() > expiry);
|
||||||
|
@ -316,7 +251,7 @@ function isTokenValid(accessToken) {
|
||||||
switch (typeof accessToken) {
|
switch (typeof accessToken) {
|
||||||
case 'string':
|
case 'string':
|
||||||
if (accessToken === '') {
|
if (accessToken === '') {
|
||||||
throw new Error(getErrorMessage('NJS-084'));
|
errors.throwErr(errors.ERR_TOKEN_BASED_AUTH);
|
||||||
}
|
}
|
||||||
|
|
||||||
return !isTokenExpired(accessToken);
|
return !isTokenExpired(accessToken);
|
||||||
|
@ -325,12 +260,12 @@ function isTokenValid(accessToken) {
|
||||||
accessToken.token === '' ||
|
accessToken.token === '' ||
|
||||||
accessToken.privateKey === undefined ||
|
accessToken.privateKey === undefined ||
|
||||||
accessToken.privateKey === '') {
|
accessToken.privateKey === '') {
|
||||||
throw new Error(getErrorMessage('NJS-084'));
|
errors.throwErr(errors.ERR_TOKEN_BASED_AUTH);
|
||||||
}
|
}
|
||||||
|
|
||||||
return !isTokenExpired(accessToken.token);
|
return !isTokenExpired(accessToken.token);
|
||||||
default:
|
default:
|
||||||
throw new Error(getErrorMessage('NJS-084'));
|
errors.throwErr(errors.ERR_TOKEN_BASED_AUTH);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -347,7 +282,7 @@ async function checkToken(attrs) {
|
||||||
accessToken = attrs.accessToken;
|
accessToken = attrs.accessToken;
|
||||||
}
|
}
|
||||||
if (!isTokenValid(accessToken)) {
|
if (!isTokenValid(accessToken)) {
|
||||||
throw new Error(getErrorMessage('NJS-087'));
|
errors.throwErr(errors.ERR_TOKEN_HAS_EXPIRED);
|
||||||
}
|
}
|
||||||
if (typeof accessToken === 'string') {
|
if (typeof accessToken === 'string') {
|
||||||
attrs.token = accessToken;
|
attrs.token = accessToken;
|
||||||
|
|
|
@ -376,21 +376,21 @@ describe('86. fetchClobAsString3.js', function() {
|
||||||
done();
|
done();
|
||||||
}); // 86.2.7
|
}); // 86.2.7
|
||||||
|
|
||||||
it('86.2.8 undefined in fetchAsString will throw NJS-004', function() {
|
it('86.2.8 undefined in fetchAsString will throw NJS-021', function() {
|
||||||
should.throws(
|
should.throws(
|
||||||
function() {
|
function() {
|
||||||
oracledb.fetchAsString = [ undefined ];
|
oracledb.fetchAsString = [ undefined ];
|
||||||
},
|
},
|
||||||
/NJS-004:/
|
/NJS-021:/
|
||||||
);
|
);
|
||||||
}); // 86.2.8
|
}); // 86.2.8
|
||||||
|
|
||||||
it('86.2.9 Random string in fetchAsString will throw NJS-004', function() {
|
it('86.2.9 Random string in fetchAsString will throw NJS-021', function() {
|
||||||
should.throws(
|
should.throws(
|
||||||
function() {
|
function() {
|
||||||
oracledb.fetchAsString = [ "foobar" ];
|
oracledb.fetchAsString = [ "foobar" ];
|
||||||
},
|
},
|
||||||
/NJS-004:/
|
/NJS-021:/
|
||||||
);
|
);
|
||||||
}); // 86.2.9
|
}); // 86.2.9
|
||||||
|
|
||||||
|
@ -403,39 +403,39 @@ describe('86. fetchClobAsString3.js', function() {
|
||||||
);
|
);
|
||||||
}); // 86.2.10
|
}); // 86.2.10
|
||||||
|
|
||||||
it('86.2.11 Negative integer in fetchAsString will throw NJS-004', function() {
|
it('86.2.11 Negative integer in fetchAsString will throw NJS-021', function() {
|
||||||
should.throws(
|
should.throws(
|
||||||
function() {
|
function() {
|
||||||
oracledb.fetchAsString = [ -1 ];
|
oracledb.fetchAsString = [ -1 ];
|
||||||
},
|
},
|
||||||
/NJS-004:/
|
/NJS-021:/
|
||||||
);
|
);
|
||||||
}); // 86.2.11
|
}); // 86.2.11
|
||||||
|
|
||||||
it('86.2.12 Random float in fetchAsString will throw NJS-004', function() {
|
it('86.2.12 Random float in fetchAsString will throw NJS-021', function() {
|
||||||
should.throws(
|
should.throws(
|
||||||
function() {
|
function() {
|
||||||
oracledb.fetchAsString = [ 3.1415 ];
|
oracledb.fetchAsString = [ 3.1415 ];
|
||||||
},
|
},
|
||||||
/NJS-004:/
|
/NJS-021:/
|
||||||
);
|
);
|
||||||
}); // 86.2.12
|
}); // 86.2.12
|
||||||
|
|
||||||
it('86.2.13 Array in fetchAsString will throw NJS-004', function() {
|
it('86.2.13 Array in fetchAsString will throw NJS-021', function() {
|
||||||
should.throws(
|
should.throws(
|
||||||
function() {
|
function() {
|
||||||
oracledb.fetchAsString = [ [3] ];
|
oracledb.fetchAsString = [ [3] ];
|
||||||
},
|
},
|
||||||
/NJS-004:/
|
/NJS-021:/
|
||||||
);
|
);
|
||||||
}); // 86.2.13
|
}); // 86.2.13
|
||||||
|
|
||||||
it('86.2.14 Object in fetchAsString will throw NJS-004', function() {
|
it('86.2.14 Object in fetchAsString will throw NJS-021', function() {
|
||||||
should.throws(
|
should.throws(
|
||||||
function() {
|
function() {
|
||||||
oracledb.fetchAsString = [ {1:1} ];
|
oracledb.fetchAsString = [ {1:1} ];
|
||||||
},
|
},
|
||||||
/NJS-004:/
|
/NJS-021:/
|
||||||
);
|
);
|
||||||
}); // 86.2.14
|
}); // 86.2.14
|
||||||
|
|
||||||
|
|
|
@ -166,7 +166,7 @@ describe('67. poolCache.js', function() {
|
||||||
|
|
||||||
oracledb.createPool(dbConfig, function(err, pool) {
|
oracledb.createPool(dbConfig, function(err, pool) {
|
||||||
should.exist(err);
|
should.exist(err);
|
||||||
(err.message).should.startWith('NJS-004:');
|
(err.message).should.startWith('NJS-007:');
|
||||||
|
|
||||||
should.not.exist(pool);
|
should.not.exist(pool);
|
||||||
|
|
||||||
|
@ -554,7 +554,7 @@ describe('67. poolCache.js', function() {
|
||||||
oracledb.createPool(dbConfig, function(err) {
|
oracledb.createPool(dbConfig, function(err) {
|
||||||
should.exist(err);
|
should.exist(err);
|
||||||
|
|
||||||
(err.message).should.startWith('NJS-004:');
|
(err.message).should.startWith('NJS-007:');
|
||||||
|
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
|
@ -567,8 +567,8 @@ describe('67. poolCache.js', function() {
|
||||||
oracledb.createPool(dbConfig, function(err) {
|
oracledb.createPool(dbConfig, function(err) {
|
||||||
should.exist(err);
|
should.exist(err);
|
||||||
|
|
||||||
(err.message).should.startWith('NJS-004:');
|
(err.message).should.startWith('NJS-007:');
|
||||||
// NJS-004: invalid value for property poolAttrs.poolAlias
|
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -580,7 +580,7 @@ describe('67. poolCache.js', function() {
|
||||||
oracledb.createPool(dbConfig, function(err) {
|
oracledb.createPool(dbConfig, function(err) {
|
||||||
should.exist(err);
|
should.exist(err);
|
||||||
|
|
||||||
(err.message).should.startWith('NJS-004:');
|
(err.message).should.startWith('NJS-007:');
|
||||||
|
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
|
@ -593,7 +593,7 @@ describe('67. poolCache.js', function() {
|
||||||
oracledb.createPool(dbConfig, function(err) {
|
oracledb.createPool(dbConfig, function(err) {
|
||||||
should.exist(err);
|
should.exist(err);
|
||||||
|
|
||||||
(err.message).should.startWith('NJS-004:');
|
(err.message).should.startWith('NJS-007:');
|
||||||
|
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
|
@ -606,7 +606,7 @@ describe('67. poolCache.js', function() {
|
||||||
oracledb.createPool(dbConfig, function(err) {
|
oracledb.createPool(dbConfig, function(err) {
|
||||||
should.exist(err);
|
should.exist(err);
|
||||||
|
|
||||||
(err.message).should.startWith('NJS-004:');
|
(err.message).should.startWith('NJS-007:');
|
||||||
|
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
|
@ -619,7 +619,7 @@ describe('67. poolCache.js', function() {
|
||||||
oracledb.createPool(dbConfig, function(err) {
|
oracledb.createPool(dbConfig, function(err) {
|
||||||
should.exist(err);
|
should.exist(err);
|
||||||
|
|
||||||
(err.message).should.startWith('NJS-004:');
|
(err.message).should.startWith('NJS-007:');
|
||||||
|
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
|
@ -632,7 +632,7 @@ describe('67. poolCache.js', function() {
|
||||||
oracledb.createPool(dbConfig, function(err) {
|
oracledb.createPool(dbConfig, function(err) {
|
||||||
should.exist(err);
|
should.exist(err);
|
||||||
|
|
||||||
(err.message).should.startWith('NJS-004:');
|
(err.message).should.startWith('NJS-007:');
|
||||||
|
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
|
|
|
@ -432,7 +432,7 @@ describe('164. soda1.js', () => {
|
||||||
|
|
||||||
await testsUtil.assertThrowsAsync(
|
await testsUtil.assertThrowsAsync(
|
||||||
async () => await sd.createCollection(t_collname, options),
|
async () => await sd.createCollection(t_collname, options),
|
||||||
/NJS-005:/
|
/NJS-007:/
|
||||||
);
|
);
|
||||||
|
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
|
|
|
@ -338,10 +338,7 @@ describe('14. stream2.js', function() {
|
||||||
|
|
||||||
var metaDataRead = false;
|
var metaDataRead = false;
|
||||||
stream.on('metadata', function(metaData) {
|
stream.on('metadata', function(metaData) {
|
||||||
should.deepEqual(
|
should.equal(metaData[0].name, 'EMPLOYEE_NAME');
|
||||||
metaData,
|
|
||||||
[ { name: 'EMPLOYEE_NAME' } ]
|
|
||||||
);
|
|
||||||
metaDataRead = true;
|
metaDataRead = true;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -567,10 +564,8 @@ describe('14. stream2.js', function() {
|
||||||
|
|
||||||
var metaDataRead = false;
|
var metaDataRead = false;
|
||||||
stream.on('metadata', function(metaData) {
|
stream.on('metadata', function(metaData) {
|
||||||
should.deepEqual(
|
should.equal(metaData[0].name, 'A');
|
||||||
metaData,
|
should.equal(metaData[1].name, 'B');
|
||||||
[ { name: 'A' }, { name: 'B' } ]
|
|
||||||
);
|
|
||||||
metaDataRead = true;
|
metaDataRead = true;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue