oracledb 6.1.0 → 6.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/build/Release/oracledb-6.3.0-darwin-x64.node +0 -0
- package/build/Release/oracledb-6.3.0-darwin-x64.node-buildinfo.txt +1 -0
- package/build/Release/oracledb-6.3.0-js-buildinfo.txt +1 -0
- package/build/Release/oracledb-6.3.0-linux-arm64.node +0 -0
- package/build/Release/oracledb-6.3.0-linux-arm64.node-buildinfo.txt +1 -0
- package/build/Release/oracledb-6.3.0-linux-x64.node +0 -0
- package/build/Release/oracledb-6.3.0-linux-x64.node-buildinfo.txt +1 -0
- package/build/Release/oracledb-6.3.0-win32-x64.node +0 -0
- package/build/Release/oracledb-6.3.0-win32-x64.node-buildinfo.txt +1 -0
- package/examples/README.md +26 -8
- package/examples/dbconfig.js +57 -40
- package/examples/example.js +6 -4
- package/lib/connection.js +67 -1
- package/lib/dbObject.js +9 -0
- package/lib/errors.js +25 -7
- package/lib/future.js +53 -0
- package/lib/impl/connection.js +56 -0
- package/lib/impl/pool.js +5 -3
- package/lib/impl/resultset.js +48 -11
- package/lib/oracledb.js +34 -14
- package/lib/pool.js +10 -0
- package/lib/sodaCollection.js +11 -0
- package/lib/sodaOperation.js +16 -0
- package/lib/thin/connection.js +184 -155
- package/lib/thin/dbObject.js +49 -2
- package/lib/thin/index.js +1 -1
- package/lib/thin/pool.js +3 -2
- package/lib/thin/protocol/buffer.js +79 -70
- package/lib/thin/protocol/capabilities.js +3 -1
- package/lib/thin/protocol/constants.js +31 -14
- package/lib/thin/protocol/messages/auth.js +6 -2
- package/lib/thin/protocol/messages/base.js +36 -14
- package/lib/thin/protocol/messages/dataType.js +8 -5
- package/lib/thin/protocol/messages/lobOp.js +7 -8
- package/lib/thin/protocol/messages/withData.js +62 -22
- package/lib/thin/protocol/oson.js +13 -10
- package/lib/thin/protocol/packet.js +6 -5
- package/lib/thin/protocol/utils.js +2 -2
- package/lib/thin/sqlnet/connStrategy.js +8 -4
- package/lib/thin/sqlnet/constants.js +138 -138
- package/lib/thin/sqlnet/ezConnectResolver.js +10 -43
- package/lib/thin/sqlnet/navNodes.js +7 -7
- package/lib/thin/sqlnet/networkSession.js +22 -21
- package/lib/thin/sqlnet/ntTcp.js +7 -7
- package/lib/thin/sqlnet/packet.js +1 -1
- package/lib/thin/statement.js +345 -113
- package/lib/thin/util.js +35 -86
- package/lib/types.js +6 -1
- package/lib/util.js +12 -0
- package/lib/version.js +1 -1
- package/package.json +1 -1
- package/build/Release/oracledb-6.1.0-darwin-x64.node +0 -0
- package/build/Release/oracledb-6.1.0-darwin-x64.node-buildinfo.txt +0 -1
- package/build/Release/oracledb-6.1.0-js-buildinfo.txt +0 -1
- package/build/Release/oracledb-6.1.0-linux-arm64.node +0 -0
- package/build/Release/oracledb-6.1.0-linux-arm64.node-buildinfo.txt +0 -1
- package/build/Release/oracledb-6.1.0-linux-x64.node +0 -0
- package/build/Release/oracledb-6.1.0-linux-x64.node-buildinfo.txt +0 -1
- package/build/Release/oracledb-6.1.0-win32-x64.node +0 -0
- package/build/Release/oracledb-6.1.0-win32-x64.node-buildinfo.txt +0 -1
|
@@ -81,7 +81,7 @@ const dataTypes = [
|
|
|
81
81
|
[constants.TNS_DATA_TYPE_LONG_RAW, constants.TNS_DATA_TYPE_LONG_RAW, constants.TNS_TYPE_REP_UNIVERSAL],
|
|
82
82
|
[constants.TNS_DATA_TYPE_UB2, constants.TNS_DATA_TYPE_UB2, constants.TNS_TYPE_REP_UNIVERSAL],
|
|
83
83
|
[constants.TNS_DATA_TYPE_UB4, constants.TNS_DATA_TYPE_UB4, constants.TNS_TYPE_REP_UNIVERSAL],
|
|
84
|
-
[constants.TNS_DATA_TYPE_SB1, constants.TNS_DATA_TYPE_SB1, constants.
|
|
84
|
+
[constants.TNS_DATA_TYPE_SB1, constants.TNS_DATA_TYPE_SB1, constants.TNS_TYPE_REP_ORACLE],
|
|
85
85
|
[constants.TNS_DATA_TYPE_SB2, constants.TNS_DATA_TYPE_SB2, constants.TNS_TYPE_REP_UNIVERSAL],
|
|
86
86
|
[constants.TNS_DATA_TYPE_SB4, constants.TNS_DATA_TYPE_SB4, constants.TNS_TYPE_REP_UNIVERSAL],
|
|
87
87
|
[constants.TNS_DATA_TYPE_SWORD, constants.TNS_DATA_TYPE_SWORD, constants.TNS_TYPE_REP_UNIVERSAL],
|
|
@@ -93,7 +93,7 @@ const dataTypes = [
|
|
|
93
93
|
[constants.TNS_DATA_TYPE_AMS, constants.TNS_DATA_TYPE_AMS, constants.TNS_TYPE_REP_UNIVERSAL],
|
|
94
94
|
[constants.TNS_DATA_TYPE_BRN, constants.TNS_DATA_TYPE_BRN, constants.TNS_TYPE_REP_UNIVERSAL],
|
|
95
95
|
[constants.TNS_DATA_TYPE_CWD, constants.TNS_DATA_TYPE_CWD, constants.TNS_TYPE_REP_UNIVERSAL],
|
|
96
|
-
[constants.
|
|
96
|
+
[constants.TNS_DATA_TYPE_OAC122, constants.TNS_DATA_TYPE_OAC122, constants.TNS_TYPE_REP_UNIVERSAL],
|
|
97
97
|
[constants.TNS_DATA_TYPE_OER8, constants.TNS_DATA_TYPE_OER8, constants.TNS_TYPE_REP_UNIVERSAL],
|
|
98
98
|
[constants.TNS_DATA_TYPE_FUN, constants.TNS_DATA_TYPE_FUN, constants.TNS_TYPE_REP_UNIVERSAL],
|
|
99
99
|
[constants.TNS_DATA_TYPE_AUA, constants.TNS_DATA_TYPE_AUA, constants.TNS_TYPE_REP_UNIVERSAL],
|
|
@@ -294,7 +294,7 @@ const dataTypes = [
|
|
|
294
294
|
[constants.TNS_DATA_TYPE_PDN, constants.TNS_DATA_TYPE_NUMBER, constants.TNS_TYPE_REP_ORACLE],
|
|
295
295
|
[constants.TNS_DATA_TYPE_VCS, constants.TNS_DATA_TYPE_VARCHAR, constants.TNS_TYPE_REP_UNIVERSAL],
|
|
296
296
|
[constants.TNS_DATA_TYPE_VBI, constants.TNS_DATA_TYPE_VARCHAR, constants.TNS_TYPE_REP_UNIVERSAL],
|
|
297
|
-
[constants.
|
|
297
|
+
[constants.TNS_DATA_TYPE_OAC9, constants.TNS_DATA_TYPE_OAC9, constants.TNS_TYPE_REP_UNIVERSAL],
|
|
298
298
|
[constants.TNS_DATA_TYPE_UIN, constants.TNS_DATA_TYPE_NUMBER, constants.TNS_TYPE_REP_ORACLE],
|
|
299
299
|
[constants.TNS_DATA_TYPE_SLS, constants.TNS_DATA_TYPE_NUMBER, constants.TNS_TYPE_REP_ORACLE],
|
|
300
300
|
[constants.TNS_DATA_TYPE_LVC, constants.TNS_DATA_TYPE_VARCHAR, constants.TNS_TYPE_REP_UNIVERSAL],
|
|
@@ -360,7 +360,7 @@ const dataTypes = [
|
|
|
360
360
|
[constants.TNS_DATA_TYPE_AC_REPLAY, constants.TNS_DATA_TYPE_AC_REPLAY, constants.TNS_TYPE_REP_UNIVERSAL],
|
|
361
361
|
[constants.TNS_DATA_TYPE_AC_CONT, constants.TNS_DATA_TYPE_AC_CONT, constants.TNS_TYPE_REP_UNIVERSAL],
|
|
362
362
|
[constants.TNS_DATA_TYPE_IMPLRES, constants.TNS_DATA_TYPE_IMPLRES, constants.TNS_TYPE_REP_UNIVERSAL],
|
|
363
|
-
[constants.
|
|
363
|
+
[constants.TNS_DATA_TYPE_OER19, constants.TNS_DATA_TYPE_OER19, constants.TNS_TYPE_REP_UNIVERSAL],
|
|
364
364
|
[constants.TNS_DATA_TYPE_TXT, constants.TNS_DATA_TYPE_TXT, constants.TNS_TYPE_REP_UNIVERSAL],
|
|
365
365
|
[constants.TNS_DATA_TYPE_XSSESSNS, constants.TNS_DATA_TYPE_XSSESSNS, constants.TNS_TYPE_REP_UNIVERSAL],
|
|
366
366
|
[constants.TNS_DATA_TYPE_XSATTOP, constants.TNS_DATA_TYPE_XSATTOP, constants.TNS_TYPE_REP_UNIVERSAL],
|
|
@@ -388,8 +388,11 @@ const dataTypes = [
|
|
|
388
388
|
[constants.TNS_DATA_TYPE_SCN, constants.TNS_DATA_TYPE_SCN, constants.TNS_TYPE_REP_UNIVERSAL],
|
|
389
389
|
[constants.TNS_DATA_TYPE_SCN8, constants.TNS_DATA_TYPE_SCN8, constants.TNS_TYPE_REP_UNIVERSAL],
|
|
390
390
|
[constants.TNS_DATA_TYPE_CHUNKINFO, constants.TNS_DATA_TYPE_CHUNKINFO, constants.TNS_TYPE_REP_UNIVERSAL],
|
|
391
|
+
[constants.TNS_DATA_TYPE_UD21, constants.TNS_DATA_TYPE_UD21, constants.TNS_TYPE_REP_UNIVERSAL],
|
|
391
392
|
[constants.TNS_DATA_TYPE_UDS, constants.TNS_DATA_TYPE_UDS, constants.TNS_TYPE_REP_UNIVERSAL],
|
|
392
|
-
[constants.TNS_DATA_TYPE_TNP, constants.TNS_DATA_TYPE_TNP, constants.TNS_TYPE_REP_UNIVERSAL]
|
|
393
|
+
[constants.TNS_DATA_TYPE_TNP, constants.TNS_DATA_TYPE_TNP, constants.TNS_TYPE_REP_UNIVERSAL],
|
|
394
|
+
[constants.TNS_DATA_TYPE_OER, constants.TNS_DATA_TYPE_OER, constants.TNS_TYPE_REP_UNIVERSAL],
|
|
395
|
+
[constants.TNS_DATA_TYPE_OAC, constants.TNS_DATA_TYPE_OAC, constants.TNS_TYPE_REP_UNIVERSAL]
|
|
393
396
|
];
|
|
394
397
|
|
|
395
398
|
module.exports = DataTypeMessage;
|
|
@@ -169,7 +169,7 @@ class LobOpMessage extends Message {
|
|
|
169
169
|
processReturnParameter(buf) {
|
|
170
170
|
let lobArray;
|
|
171
171
|
let locator;
|
|
172
|
-
let
|
|
172
|
+
let temp8;
|
|
173
173
|
let numBytes;
|
|
174
174
|
if (this.sourceLobImpl !== null) {
|
|
175
175
|
numBytes = this.sourceLobImpl._locator.length;
|
|
@@ -184,15 +184,14 @@ class LobOpMessage extends Message {
|
|
|
184
184
|
locator.copy(this.destLobImpl._locator);
|
|
185
185
|
}
|
|
186
186
|
if (this.operation === constants.TNS_LOB_OP_CREATE_TEMP) {
|
|
187
|
-
buf.skipUB2();
|
|
188
|
-
|
|
189
|
-
if (this.sendAmount) {
|
|
187
|
+
buf.skipUB2(); // skip character set
|
|
188
|
+
buf.skipBytes(3); // skip trailing flags, amount
|
|
189
|
+
} else if (this.sendAmount) {
|
|
190
190
|
this.amount = buf.readSB8();
|
|
191
191
|
}
|
|
192
|
-
if (this.operation === constants.
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
this.boolFlag = temp16 > 0;
|
|
192
|
+
if (this.operation === constants.TNS_LOB_OP_IS_OPEN) {
|
|
193
|
+
temp8 = buf.readUB1();
|
|
194
|
+
this.boolFlag = temp8 > 0;
|
|
196
195
|
}
|
|
197
196
|
}
|
|
198
197
|
|
|
@@ -30,7 +30,7 @@ const { Buffer } = require('buffer');
|
|
|
30
30
|
const utils = require("../utils");
|
|
31
31
|
const constants = require("../constants.js");
|
|
32
32
|
const Message = require("./base.js");
|
|
33
|
-
const ThinDbObjectImpl = require("../../dbObject.js");
|
|
33
|
+
const { ThinDbObjectImpl, readXML } = require("../../dbObject.js");
|
|
34
34
|
const ThinLobImpl = require("../../lob.js");
|
|
35
35
|
const errors = require('../../../errors');
|
|
36
36
|
const types = require('../../../types.js');
|
|
@@ -57,6 +57,7 @@ class MessageWithData extends Message {
|
|
|
57
57
|
this.inFetch = false;
|
|
58
58
|
this.parseOnly = false;
|
|
59
59
|
this.resultSetsToSetup = [];
|
|
60
|
+
this.deferredErr = null;
|
|
60
61
|
}
|
|
61
62
|
|
|
62
63
|
/**
|
|
@@ -116,8 +117,8 @@ class MessageWithData extends Message {
|
|
|
116
117
|
this.errorOccurred = false;
|
|
117
118
|
this.statement.moreRowsToFetch = false;
|
|
118
119
|
} else if (this.errorInfo.num !== 0 && this.errorInfo.cursorId !== 0) {
|
|
119
|
-
this.connection._addCursorToClose(this.statement.cursorId);
|
|
120
120
|
this.connection.statementCache.delete(this.statement.sql);
|
|
121
|
+
this.statement.returnToCache = false;
|
|
121
122
|
}
|
|
122
123
|
if (this.errorInfo.batchErrors) {
|
|
123
124
|
this.errorOccurred = false;
|
|
@@ -176,19 +177,10 @@ class MessageWithData extends Message {
|
|
|
176
177
|
const dataType = buf.readUInt8();
|
|
177
178
|
buf.skipUB1(); // flags
|
|
178
179
|
const precision = buf.readInt8();
|
|
179
|
-
|
|
180
|
-
if (dataType === constants.TNS_DATA_TYPE_NUMBER ||
|
|
181
|
-
dataType === constants.TNS_DATA_TYPE_INTERVAL_DS ||
|
|
182
|
-
dataType === constants.TNS_DATA_TYPE_TIMESTAMP ||
|
|
183
|
-
dataType === constants.TNS_DATA_TYPE_TIMESTAMP_LTZ ||
|
|
184
|
-
dataType === constants.TNS_DATA_TYPE_TIMESTAMP_TZ) {
|
|
185
|
-
scale = buf.readSB2();
|
|
186
|
-
} else {
|
|
187
|
-
scale = buf.readInt8();
|
|
188
|
-
}
|
|
180
|
+
const scale = buf.readInt8();
|
|
189
181
|
const maxSize = buf.readUB4();
|
|
190
182
|
buf.skipUB4(); // max number of array elements
|
|
191
|
-
buf.
|
|
183
|
+
buf.skipUB8(); // cont flags
|
|
192
184
|
let oid;
|
|
193
185
|
let numBytes = buf.readUB4(); // OID
|
|
194
186
|
if (numBytes > 0) {
|
|
@@ -222,7 +214,7 @@ class MessageWithData extends Message {
|
|
|
222
214
|
typeName = buf.readStr(constants.CSFRM_IMPLICIT);
|
|
223
215
|
}
|
|
224
216
|
buf.skipUB2(); // column position
|
|
225
|
-
buf.
|
|
217
|
+
const udsFlags = buf.readUB4(); // uds flag
|
|
226
218
|
|
|
227
219
|
// build metadata
|
|
228
220
|
const fetchInfo = {
|
|
@@ -230,6 +222,39 @@ class MessageWithData extends Message {
|
|
|
230
222
|
dbType: types.getTypeByOraTypeNum(dataType, csfrm),
|
|
231
223
|
nullable: nullable
|
|
232
224
|
};
|
|
225
|
+
fetchInfo.isJson = Boolean(udsFlags & constants.TNS_UDS_FLAGS_IS_JSON);
|
|
226
|
+
if (buf.caps.ttcFieldVersion >= constants.TNS_CCAP_FIELD_VERSION_23_1) {
|
|
227
|
+
numBytes = buf.readUB4();
|
|
228
|
+
if (numBytes > 0) {
|
|
229
|
+
fetchInfo.domainSchema = buf.readStr(constants.CSFRM_IMPLICIT);
|
|
230
|
+
}
|
|
231
|
+
numBytes = buf.readUB4();
|
|
232
|
+
if (numBytes > 0) {
|
|
233
|
+
fetchInfo.domainName = buf.readStr(constants.CSFRM_IMPLICIT);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
if (buf.caps.ttcFieldVersion >= constants.TNS_CCAP_FIELD_VERSION_23_1_EXT_3) {
|
|
237
|
+
if (buf.readUB4() > 0) {
|
|
238
|
+
fetchInfo.annotations = {};
|
|
239
|
+
buf.skipUB1();
|
|
240
|
+
const numAnnotations = buf.readUB4();
|
|
241
|
+
buf.skipUB1();
|
|
242
|
+
let key, value;
|
|
243
|
+
for (let i = 0; i < numAnnotations; i++) {
|
|
244
|
+
buf.skipUB4();
|
|
245
|
+
value = "";
|
|
246
|
+
key = buf.readStr(constants.CSFRM_IMPLICIT);
|
|
247
|
+
numBytes = buf.readUB4();
|
|
248
|
+
if (numBytes > 0) {
|
|
249
|
+
value = buf.readStr(constants.CSFRM_IMPLICIT);
|
|
250
|
+
}
|
|
251
|
+
fetchInfo.annotations[key] = value;
|
|
252
|
+
buf.skipUB4(); // flags
|
|
253
|
+
}
|
|
254
|
+
buf.skipUB4(); // flags
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
|
|
233
258
|
switch (fetchInfo.dbType) {
|
|
234
259
|
case types.DB_TYPE_VARCHAR:
|
|
235
260
|
case types.DB_TYPE_NVARCHAR:
|
|
@@ -252,6 +277,9 @@ class MessageWithData extends Message {
|
|
|
252
277
|
if (fetchInfo.dbTypeClass.partial) {
|
|
253
278
|
this.connection._partialDbObjectTypes.push(fetchInfo.dbTypeClass);
|
|
254
279
|
}
|
|
280
|
+
if (fetchInfo.dbTypeClass.isXmlType) {
|
|
281
|
+
fetchInfo.dbType = types.DB_TYPE_XMLTYPE;
|
|
282
|
+
}
|
|
255
283
|
break;
|
|
256
284
|
default:
|
|
257
285
|
break;
|
|
@@ -458,9 +486,14 @@ class MessageWithData extends Message {
|
|
|
458
486
|
if (obj.packedData) {
|
|
459
487
|
const objType = (variable.fetchInfo) ? variable.fetchInfo.dbTypeClass :
|
|
460
488
|
variable.typeClass;
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
489
|
+
|
|
490
|
+
if (variable.type === types.DB_TYPE_XMLTYPE) {
|
|
491
|
+
colValue = readXML(this.connection, obj.packedData);
|
|
492
|
+
} else {
|
|
493
|
+
colValue = new ThinDbObjectImpl(objType, obj.packedData);
|
|
494
|
+
colValue.toid = obj.toid;
|
|
495
|
+
colValue.oid = obj.oid;
|
|
496
|
+
}
|
|
464
497
|
}
|
|
465
498
|
} else {
|
|
466
499
|
errors.throwErr(errors.ERR_UNSUPPORTED_DATA_TYPE, dbType.num,
|
|
@@ -471,8 +504,11 @@ class MessageWithData extends Message {
|
|
|
471
504
|
const actualNumBytes = buf.readSB4();
|
|
472
505
|
if (actualNumBytes < 0 && oraTypeNum === constants.TNS_DATA_TYPE_BOOLEAN) {
|
|
473
506
|
colValue = null;
|
|
474
|
-
|
|
475
|
-
|
|
507
|
+
|
|
508
|
+
// For objects, maxsize validation is skipped
|
|
509
|
+
} else if (actualNumBytes !== 0 && colValue !== null &&
|
|
510
|
+
oraTypeNum !== constants.TNS_DATA_TYPE_INT_NAMED) {
|
|
511
|
+
this.saveDeferredErr(errors.ERR_INSUFFICIENT_BUFFER_FOR_BINDS);
|
|
476
512
|
}
|
|
477
513
|
} else if (oraTypeNum === constants.TNS_DATA_TYPE_LONG || oraTypeNum === constants.TNS_DATA_TYPE_LONG_RAW || variable.maxSize > buf.caps.maxStringSize) {
|
|
478
514
|
buf.skipSB4(); // null indicator
|
|
@@ -525,11 +561,15 @@ class MessageWithData extends Message {
|
|
|
525
561
|
}
|
|
526
562
|
|
|
527
563
|
async postProcess() {
|
|
564
|
+
if (this.deferredErr) {
|
|
565
|
+
throw this.deferredErr;
|
|
566
|
+
}
|
|
567
|
+
|
|
528
568
|
if (this.outVariables) {
|
|
529
569
|
for (const variable of this.outVariables) {
|
|
530
570
|
if (variable.isArray) {
|
|
531
|
-
|
|
532
|
-
|
|
571
|
+
if (variable.outConverter) {
|
|
572
|
+
for (let pos = 0; pos < variable.numElementsInArray; pos++) {
|
|
533
573
|
variable.values[0][pos] = await variable.outConverter(variable.values[0][pos]);
|
|
534
574
|
}
|
|
535
575
|
}
|
|
@@ -689,7 +729,7 @@ class MessageWithData extends Message {
|
|
|
689
729
|
this.writeBindParamsColumn(buf, variable, variable.values[i]);
|
|
690
730
|
}
|
|
691
731
|
} else {
|
|
692
|
-
if (variable.maxSize > buf.caps.maxStringSize) {
|
|
732
|
+
if ((!this.statement.isPlSql) && variable.maxSize > buf.caps.maxStringSize) {
|
|
693
733
|
foundLong = true;
|
|
694
734
|
} else {
|
|
695
735
|
this.writeBindParamsColumn(buf, variable,
|
|
@@ -416,10 +416,11 @@ class OsonTreeSegment extends GrowableBuffer {
|
|
|
416
416
|
//---------------------------------------------------------------------------
|
|
417
417
|
_encodeArray(value, fnamesSeg) {
|
|
418
418
|
this._encodeContainer(constants.TNS_JSON_TYPE_ARRAY, value.length);
|
|
419
|
-
|
|
420
|
-
const
|
|
419
|
+
const len = value.length * 4;
|
|
420
|
+
const pos = this.reserveBytes(len);
|
|
421
|
+
let offsetsBufPos = pos;
|
|
421
422
|
for (const element of value) {
|
|
422
|
-
|
|
423
|
+
this.buf.writeUInt32BE(this.pos, offsetsBufPos);
|
|
423
424
|
offsetsBufPos += 4;
|
|
424
425
|
this.encodeNode(element, fnamesSeg);
|
|
425
426
|
}
|
|
@@ -456,19 +457,21 @@ class OsonTreeSegment extends GrowableBuffer {
|
|
|
456
457
|
_encodeObject(value, fnamesSeg) {
|
|
457
458
|
const numChildren = value.values.length;
|
|
458
459
|
this._encodeContainer(constants.TNS_JSON_TYPE_OBJECT, numChildren);
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
460
|
+
const len = numChildren * (fnamesSeg.fieldIdSize + 4);
|
|
461
|
+
const pos = this.reserveBytes(len);
|
|
462
|
+
let fieldIdOffset = pos;
|
|
463
|
+
let valueOffset = pos + (numChildren * fnamesSeg.fieldIdSize);
|
|
464
|
+
|
|
462
465
|
for (let i = 0; i < value.fields.length; i++) {
|
|
463
466
|
const fieldName = fnamesSeg.fieldNamesMap.get(value.fields[i]);
|
|
464
467
|
if (fnamesSeg.fieldIdSize == 1) {
|
|
465
|
-
buf[fieldIdOffset] = fieldName.fieldId;
|
|
468
|
+
this.buf[fieldIdOffset] = fieldName.fieldId;
|
|
466
469
|
} else if (fnamesSeg.fieldIdSize == 2) {
|
|
467
|
-
buf.writeUInt16BE(fieldName.fieldId, fieldIdOffset);
|
|
470
|
+
this.buf.writeUInt16BE(fieldName.fieldId, fieldIdOffset);
|
|
468
471
|
} else {
|
|
469
|
-
buf.writeUInt32BE(fieldName.fieldId, fieldIdOffset);
|
|
472
|
+
this.buf.writeUInt32BE(fieldName.fieldId, fieldIdOffset);
|
|
470
473
|
}
|
|
471
|
-
buf.writeUInt32BE(this.pos, valueOffset);
|
|
474
|
+
this.buf.writeUInt32BE(this.pos, valueOffset);
|
|
472
475
|
fieldIdOffset += fnamesSeg.fieldIdSize;
|
|
473
476
|
valueOffset += 4;
|
|
474
477
|
this.encodeNode(value.values[i], fnamesSeg);
|
|
@@ -35,7 +35,6 @@ const errors = require("../../errors.js");
|
|
|
35
35
|
|
|
36
36
|
const TNS_BASE64_ALPHABET_ARRAY = Buffer.from("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", 'utf8');
|
|
37
37
|
|
|
38
|
-
|
|
39
38
|
/**
|
|
40
39
|
* Class used for byte chunks used in the ChunkedBytesBuffer.
|
|
41
40
|
*/
|
|
@@ -52,7 +51,7 @@ class BytesChunk {
|
|
|
52
51
|
if (remainder > 0) {
|
|
53
52
|
this.allocLen += (constants.CHUNKED_BYTES_CHUNK_SIZE - remainder);
|
|
54
53
|
}
|
|
55
|
-
this.buf = Buffer.
|
|
54
|
+
this.buf = Buffer.allocUnsafe(this.allocLen);
|
|
56
55
|
this.actualLen = 0;
|
|
57
56
|
}
|
|
58
57
|
|
|
@@ -133,6 +132,7 @@ class ChunkedBytesBuffer {
|
|
|
133
132
|
*
|
|
134
133
|
* @class ReadPacket
|
|
135
134
|
*/
|
|
135
|
+
|
|
136
136
|
class ReadPacket extends BaseBuffer {
|
|
137
137
|
|
|
138
138
|
/**
|
|
@@ -140,8 +140,9 @@ class ReadPacket extends BaseBuffer {
|
|
|
140
140
|
* @param {Object} adapter used for sending/receiving data
|
|
141
141
|
* @param {Object} capabilities
|
|
142
142
|
*/
|
|
143
|
+
|
|
143
144
|
constructor(nsi, caps) {
|
|
144
|
-
super(
|
|
145
|
+
super();
|
|
145
146
|
this.nsi = nsi;
|
|
146
147
|
this.caps = caps;
|
|
147
148
|
this.chunkedBytesBuf = new ChunkedBytesBuffer();
|
|
@@ -228,7 +229,7 @@ class ReadPacket extends BaseBuffer {
|
|
|
228
229
|
if (inChunkedRead) {
|
|
229
230
|
buf = this.chunkedBytesBuf.getBuf(numBytes);
|
|
230
231
|
} else {
|
|
231
|
-
buf = Buffer.
|
|
232
|
+
buf = Buffer.allocUnsafe(numBytes);
|
|
232
233
|
}
|
|
233
234
|
|
|
234
235
|
// copy the bytes to the buffer from the remainder of this packet
|
|
@@ -341,7 +342,7 @@ class ReadPacket extends BaseBuffer {
|
|
|
341
342
|
outputLen += 3;
|
|
342
343
|
}
|
|
343
344
|
|
|
344
|
-
const outputValue = Buffer.
|
|
345
|
+
const outputValue = Buffer.allocUnsafe(outputLen);
|
|
345
346
|
inputLen -= 1;
|
|
346
347
|
outputValue[0] = 42;
|
|
347
348
|
outputOffset += 1;
|
|
@@ -43,7 +43,7 @@ function _convertBase64(result, value, size, offset) {
|
|
|
43
43
|
function encodeRowID(rowID) {
|
|
44
44
|
let offset = 0;
|
|
45
45
|
if (rowID.rba !== 0 || rowID.partitionID !== 0 || rowID.blockNum !== 0 || rowID.slotNum != 0) {
|
|
46
|
-
const result = Buffer.
|
|
46
|
+
const result = Buffer.allocUnsafe(constants.TNS_MAX_ROWID_LENGTH);
|
|
47
47
|
offset = _convertBase64(result, rowID.rba, 6, offset);
|
|
48
48
|
offset = _convertBase64(result, rowID.partitionID, 3, offset);
|
|
49
49
|
offset = _convertBase64(result, rowID.blockNum, 6, offset);
|
|
@@ -64,7 +64,7 @@ function setObfuscatedValue(value) {
|
|
|
64
64
|
arr.push(buf[i] ^ bytes[i]);
|
|
65
65
|
}
|
|
66
66
|
bytes.fill(0);
|
|
67
|
-
return {obfuscatedValue
|
|
67
|
+
return {obfuscatedValue: buf, value: arr};
|
|
68
68
|
}
|
|
69
69
|
|
|
70
70
|
// returns the Deobfuscated value, after removing the obfuscation
|
|
@@ -53,16 +53,20 @@ class ConnectDescription {
|
|
|
53
53
|
*/
|
|
54
54
|
class ConnStrategy {
|
|
55
55
|
constructor() {
|
|
56
|
-
this.
|
|
57
|
-
this.reorderDescriptionList = 0;
|
|
56
|
+
this.reset();
|
|
58
57
|
this.retryCount = 0;
|
|
59
|
-
this.lastRetryCounter = 0;
|
|
60
|
-
this.lastRetryConnectDescription = 0;
|
|
61
58
|
this.currentDescription = null;
|
|
62
59
|
this.descriptionList = new Array();
|
|
63
60
|
this.sBuf = new Array();
|
|
64
61
|
}
|
|
65
62
|
|
|
63
|
+
reset() {
|
|
64
|
+
this.nextOptToTry = 0;
|
|
65
|
+
this.lastRetryCounter = 0;
|
|
66
|
+
this.lastRetryConnectDescription = 0;
|
|
67
|
+
this.reorderDescriptionList = 0;
|
|
68
|
+
}
|
|
69
|
+
|
|
66
70
|
hasMoreOptions() {
|
|
67
71
|
let cOptsSize = 0;
|
|
68
72
|
|