oracledb 5.5.0 → 6.0.1
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/CHANGELOG.md +1 -1875
- package/LICENSE.txt +8 -222
- package/NOTICE.txt +1 -1
- package/README.md +38 -30
- package/SECURITY.md +38 -0
- package/build/Release/oracledb-6.0.1-darwin-x64.node +0 -0
- package/build/Release/oracledb-6.0.1-darwin-x64.node-buildinfo.txt +1 -0
- package/build/Release/oracledb-6.0.1-js-buildinfo.txt +1 -0
- package/build/Release/oracledb-6.0.1-linux-arm64.node +0 -0
- package/build/Release/oracledb-6.0.1-linux-arm64.node-buildinfo.txt +1 -0
- package/build/Release/oracledb-6.0.1-linux-x64.node +0 -0
- package/build/Release/oracledb-6.0.1-linux-x64.node-buildinfo.txt +1 -0
- package/build/Release/oracledb-6.0.1-win32-x64.node +0 -0
- package/build/Release/oracledb-6.0.1-win32-x64.node-buildinfo.txt +1 -0
- package/examples/README.md +113 -0
- package/examples/dbconfig.js +100 -0
- package/examples/example.js +156 -0
- package/index.js +26 -0
- package/lib/aqDeqOptions.js +148 -8
- package/lib/aqEnqOptions.js +59 -7
- package/lib/aqMessage.js +118 -7
- package/lib/aqQueue.js +243 -53
- package/lib/connection.js +1326 -465
- package/lib/constants.js +203 -0
- package/lib/dbObject.js +346 -32
- package/lib/errors.js +785 -0
- package/lib/impl/aqDeqOptions.js +197 -0
- package/lib/impl/aqEnqOptions.js +89 -0
- package/lib/impl/aqMessage.js +134 -0
- package/lib/impl/aqQueue.js +81 -0
- package/lib/impl/connection.js +529 -0
- package/lib/impl/dbObject.js +159 -0
- package/lib/impl/index.js +59 -0
- package/lib/impl/lob.js +85 -0
- package/lib/impl/pool.js +195 -0
- package/lib/impl/resultset.js +223 -0
- package/lib/impl/sodaCollection.js +174 -0
- package/lib/impl/sodaDatabase.js +81 -0
- package/lib/impl/sodaDocCursor.js +63 -0
- package/lib/impl/sodaDocument.js +98 -0
- package/lib/impl/sodaOperation.js +109 -0
- package/lib/lob.js +157 -68
- package/lib/oracledb.js +1047 -345
- package/lib/pool.js +654 -465
- package/lib/poolStatistics.js +24 -9
- package/lib/queryStream.js +16 -8
- package/lib/resultset.js +291 -183
- package/lib/settings.js +191 -0
- package/lib/sodaCollection.js +214 -201
- package/lib/sodaDatabase.js +108 -71
- package/lib/sodaDocCursor.js +44 -32
- package/lib/sodaDocument.js +76 -14
- package/lib/sodaOperation.js +131 -118
- package/lib/thin/connection.js +1043 -0
- package/lib/thin/dbObject.js +630 -0
- package/lib/thin/index.js +40 -0
- package/lib/thin/lob.js +189 -0
- package/lib/thin/pool.js +481 -0
- package/lib/thin/protocol/buffer.js +1043 -0
- package/lib/thin/protocol/capabilities.js +121 -0
- package/lib/thin/protocol/constants.js +765 -0
- package/lib/thin/protocol/encryptDecrypt.js +185 -0
- package/lib/thin/protocol/messages/auth.js +349 -0
- package/lib/thin/protocol/messages/base.js +476 -0
- package/lib/thin/protocol/messages/commit.js +56 -0
- package/lib/thin/protocol/messages/dataType.js +391 -0
- package/lib/thin/protocol/messages/execute.js +312 -0
- package/lib/thin/protocol/messages/fetch.js +60 -0
- package/lib/thin/protocol/messages/index.js +53 -0
- package/lib/thin/protocol/messages/lobOp.js +201 -0
- package/lib/thin/protocol/messages/logOff.js +53 -0
- package/lib/thin/protocol/messages/ping.js +56 -0
- package/lib/thin/protocol/messages/protocol.js +78 -0
- package/lib/thin/protocol/messages/rollback.js +56 -0
- package/lib/thin/protocol/messages/sessionRelease.js +60 -0
- package/lib/thin/protocol/messages/withData.js +812 -0
- package/lib/thin/protocol/oson.js +661 -0
- package/lib/thin/protocol/packet.js +519 -0
- package/lib/thin/protocol/protocol.js +202 -0
- package/lib/thin/protocol/utils.js +89 -0
- package/lib/thin/resultSet.js +122 -0
- package/lib/thin/sqlnet/connStrategy.js +175 -0
- package/lib/thin/sqlnet/constants.js +199 -0
- package/lib/thin/sqlnet/ezConnectResolver.js +488 -0
- package/lib/thin/sqlnet/navNodes.js +870 -0
- package/lib/thin/sqlnet/networkSession.js +621 -0
- package/lib/thin/sqlnet/ntTcp.js +527 -0
- package/lib/thin/sqlnet/nvStrToNvPair.js +783 -0
- package/lib/thin/sqlnet/packet.js +405 -0
- package/lib/thin/sqlnet/paramParser.js +206 -0
- package/lib/thin/sqlnet/sessionAtts.js +160 -0
- package/lib/thin/statement.js +300 -0
- package/lib/thin/util.js +289 -0
- package/lib/transformer.js +252 -0
- package/lib/types.js +357 -0
- package/lib/util.js +196 -110
- package/lib/version.js +36 -0
- package/package/README.md +33 -30
- package/package/install.js +89 -64
- package/package/prunebinaries.js +60 -12
- package/package.json +3 -3
- package/build/Release/oracledb-5.5.0-darwin-x64.node +0 -0
- package/build/Release/oracledb-5.5.0-darwin-x64.node-buildinfo.txt +0 -1
- package/build/Release/oracledb-5.5.0-linux-x64.node +0 -0
- package/build/Release/oracledb-5.5.0-linux-x64.node-buildinfo.txt +0 -1
- package/build/Release/oracledb-5.5.0-win32-x64.node +0 -0
- package/build/Release/oracledb-5.5.0-win32-x64.node-buildinfo.txt +0 -1
|
@@ -0,0 +1,812 @@
|
|
|
1
|
+
// Copyright (c) 2022, 2023, Oracle and/or its affiliates.
|
|
2
|
+
|
|
3
|
+
//-----------------------------------------------------------------------------
|
|
4
|
+
//
|
|
5
|
+
// This software is dual-licensed to you under the Universal Permissive License
|
|
6
|
+
// (UPL) 1.0 as shown at https://oss.oracle.com/licenses/upl and Apache License
|
|
7
|
+
// 2.0 as shown at http://www.apache.org/licenses/LICENSE-2.0. You may choose
|
|
8
|
+
// either license.
|
|
9
|
+
//
|
|
10
|
+
// If you elect to accept the software under the Apache License, Version 2.0,
|
|
11
|
+
// the following applies:
|
|
12
|
+
//
|
|
13
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
14
|
+
// you may not use this file except in compliance with the License.
|
|
15
|
+
// You may obtain a copy of the License at
|
|
16
|
+
//
|
|
17
|
+
// https://www.apache.org/licenses/LICENSE-2.0
|
|
18
|
+
//
|
|
19
|
+
// Unless required by applicable law or agreed to in writing, software
|
|
20
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
21
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
22
|
+
// See the License for the specific language governing permissions and
|
|
23
|
+
// limitations under the License.
|
|
24
|
+
//
|
|
25
|
+
//-----------------------------------------------------------------------------
|
|
26
|
+
|
|
27
|
+
'use strict';
|
|
28
|
+
|
|
29
|
+
const { Buffer } = require('buffer');
|
|
30
|
+
const utils = require("../utils");
|
|
31
|
+
const constants = require("../constants.js");
|
|
32
|
+
const Message = require("./base.js");
|
|
33
|
+
const ThinDbObjectImpl = require("../../dbObject.js");
|
|
34
|
+
const ThinLobImpl = require("../../lob.js");
|
|
35
|
+
const errors = require('../../../errors');
|
|
36
|
+
const types = require('../../../types.js');
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Handles data like row header, rowdata , ... recevied from an RPC Execute
|
|
40
|
+
*
|
|
41
|
+
* @class MessageWithData
|
|
42
|
+
* @extends {Message}
|
|
43
|
+
*/
|
|
44
|
+
class MessageWithData extends Message {
|
|
45
|
+
constructor(connection, statement = null, options = null) {
|
|
46
|
+
super(connection);
|
|
47
|
+
this.statement = statement;
|
|
48
|
+
this.options = options;
|
|
49
|
+
this.offset = 0;
|
|
50
|
+
this.numExecs = 1;
|
|
51
|
+
this.arrayDmlRowCounts = false;
|
|
52
|
+
this.requiresDefine = false;
|
|
53
|
+
this.rowIndex = statement.bufferRowCount || 0;
|
|
54
|
+
this.dmlRowCounts = [];
|
|
55
|
+
this.batchErrors = false;
|
|
56
|
+
this.outVariables = [];
|
|
57
|
+
this.inFetch = false;
|
|
58
|
+
this.parseOnly = false;
|
|
59
|
+
this.resultSetsToSetup = [];
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* processMessage() - Process the data type message
|
|
64
|
+
*/
|
|
65
|
+
processMessage(buf, messageType) {
|
|
66
|
+
if (messageType === constants.TNS_MSG_TYPE_DESCRIBE_INFO) {
|
|
67
|
+
buf.skipBytesChunked();
|
|
68
|
+
this.statement.queryVars = [];
|
|
69
|
+
this.statement.numQueryVars = 0;
|
|
70
|
+
this.statement.bufferRowCount = 0;
|
|
71
|
+
this.statement.bufferRowIndex = 0;
|
|
72
|
+
this.processDescribeInfo(buf, this.resultSet);
|
|
73
|
+
this.outVariables = this.statement.queryVars;
|
|
74
|
+
} else if (messageType === constants.TNS_MSG_TYPE_ROW_HEADER) {
|
|
75
|
+
this.processRowHeader(buf);
|
|
76
|
+
} else if (messageType === constants.TNS_MSG_TYPE_ROW_DATA) {
|
|
77
|
+
this.processRowData(buf);
|
|
78
|
+
} else if (messageType === constants.TNS_MSG_TYPE_IMPLICIT_RESULTSET) {
|
|
79
|
+
this.processImplicitResultSet(buf);
|
|
80
|
+
} else if (messageType === constants.TNS_MSG_TYPE_BIT_VECTOR) {
|
|
81
|
+
this.processBitVector(buf);
|
|
82
|
+
} else if (messageType === constants.TNS_MSG_TYPE_IO_VECTOR) {
|
|
83
|
+
this.processIOVector(buf);
|
|
84
|
+
} else if (messageType === constants.TNS_MSG_TYPE_FLUSH_OUT_BINDS) {
|
|
85
|
+
this.flushOutBinds = true;
|
|
86
|
+
} else if (messageType === constants.TNS_MSG_TYPE_ERROR) {
|
|
87
|
+
this.processErrorInfo(buf);
|
|
88
|
+
} else {
|
|
89
|
+
super.processMessage(buf, messageType);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
hasMoreData() {
|
|
94
|
+
return !this.processedError && !this.flushOutBinds;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
processErrorInfo(buf) {
|
|
98
|
+
super.processErrorInfo(buf);
|
|
99
|
+
if (this.errorInfo.cursorId !== 0) {
|
|
100
|
+
this.statement.cursorId = this.errorInfo.cursorId;
|
|
101
|
+
}
|
|
102
|
+
if (!this.statement.isPlSql) {
|
|
103
|
+
this.statement.rowCount = this.errorInfo.rowCount;
|
|
104
|
+
}
|
|
105
|
+
// we do not set the lastRowid if the rows affected is 0
|
|
106
|
+
if (this.errorInfo.rowCount > 0) {
|
|
107
|
+
this.statement.lastRowid = utils.encodeRowID(this.errorInfo.rowID);
|
|
108
|
+
}
|
|
109
|
+
this.options.batchErrors = this.errorInfo.batchErrors;
|
|
110
|
+
if (this.batchErrors && this.options.batchErrors === null) {
|
|
111
|
+
this.options.batchErrors = [];
|
|
112
|
+
}
|
|
113
|
+
if (this.errorInfo.num === constants.TNS_ERR_NO_DATA_FOUND && this.statement.isQuery) {
|
|
114
|
+
this.errorInfo.num = 0;
|
|
115
|
+
this.errorOccurred = false;
|
|
116
|
+
this.statement.moreRowsToFetch = false;
|
|
117
|
+
} else if (this.errorInfo.num !== 0 && this.errorInfo.cursorId !== 0) {
|
|
118
|
+
this.connection._addCursorToClose(this.statement.cursorId);
|
|
119
|
+
this.connection.statementCache.delete(this.statement.sql);
|
|
120
|
+
}
|
|
121
|
+
if (this.errorInfo.batchErrors) {
|
|
122
|
+
this.errorOccurred = false;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
processDescribeInfo(buf, resultSet) {
|
|
127
|
+
const statement = resultSet.statement;
|
|
128
|
+
buf.skipUB4(); // max row size
|
|
129
|
+
statement.numQueryVars = buf.readUB4();
|
|
130
|
+
if (statement.numQueryVars > 0) {
|
|
131
|
+
buf.skipUB1();
|
|
132
|
+
}
|
|
133
|
+
resultSet.metadata = [];
|
|
134
|
+
for (let i = 0; i < statement.numQueryVars; i++) {
|
|
135
|
+
const variable = this.processColumnInfo(buf, i + 1);
|
|
136
|
+
statement.queryVars.push(variable);
|
|
137
|
+
resultSet.metadata.push(variable.fetchInfo);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
let numBytes = buf.readUB4();
|
|
141
|
+
if (numBytes > 0) {
|
|
142
|
+
buf.skipBytes(numBytes + 1); // current date
|
|
143
|
+
}
|
|
144
|
+
buf.skipUB4(); // dcbflag
|
|
145
|
+
buf.skipUB4(); // dcbmdbz
|
|
146
|
+
buf.skipUB4(); // dcbmnpr
|
|
147
|
+
buf.skipUB4(); // dcbmxpr
|
|
148
|
+
numBytes = buf.readUB4();
|
|
149
|
+
if (numBytes > 0) {
|
|
150
|
+
buf.skipBytes(numBytes + 1);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
this.resultSetsToSetup.push(resultSet);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
processColumnInfo(buf, columnNum) {
|
|
157
|
+
const dataType = buf.readUInt8();
|
|
158
|
+
buf.skipUB1(); // flags
|
|
159
|
+
const precision = buf.readInt8();
|
|
160
|
+
let scale;
|
|
161
|
+
if (dataType === constants.TNS_DATA_TYPE_NUMBER ||
|
|
162
|
+
dataType === constants.TNS_DATA_TYPE_INTERVAL_DS ||
|
|
163
|
+
dataType === constants.TNS_DATA_TYPE_TIMESTAMP ||
|
|
164
|
+
dataType === constants.TNS_DATA_TYPE_TIMESTAMP_LTZ ||
|
|
165
|
+
dataType === constants.TNS_DATA_TYPE_TIMESTAMP_TZ) {
|
|
166
|
+
scale = buf.readSB2();
|
|
167
|
+
} else {
|
|
168
|
+
scale = buf.readInt8();
|
|
169
|
+
}
|
|
170
|
+
const maxSize = buf.readUB4();
|
|
171
|
+
buf.skipUB4(); // max number of array elements
|
|
172
|
+
buf.skipUB4(); // cont flags
|
|
173
|
+
let oid;
|
|
174
|
+
let numBytes = buf.readUB4(); // OID
|
|
175
|
+
if (numBytes > 0) {
|
|
176
|
+
oid = buf.readBytesWithLength();
|
|
177
|
+
}
|
|
178
|
+
buf.skipUB2(); // version
|
|
179
|
+
buf.skipUB2(); // character set id
|
|
180
|
+
const csfrm = buf.readUInt8(); // character set form
|
|
181
|
+
let size = buf.readUB4();
|
|
182
|
+
if (dataType === constants.TNS_DATA_TYPE_RAW) {
|
|
183
|
+
size = maxSize;
|
|
184
|
+
}
|
|
185
|
+
if (buf.caps.ttcFieldVersion >= constants.TNS_CCAP_FIELD_VERSION_12_2) {
|
|
186
|
+
buf.skipUB4(); // oaccolid
|
|
187
|
+
}
|
|
188
|
+
const nullable = Boolean(buf.readUInt8());
|
|
189
|
+
buf.skipUB1(); // v7 length of name
|
|
190
|
+
let name;
|
|
191
|
+
numBytes = buf.readUB4();
|
|
192
|
+
if (numBytes > 0) {
|
|
193
|
+
name = buf.readStr(constants.TNS_CS_IMPLICIT);
|
|
194
|
+
}
|
|
195
|
+
let schema;
|
|
196
|
+
numBytes = buf.readUB4();
|
|
197
|
+
if (numBytes > 0) {
|
|
198
|
+
schema = buf.readStr(constants.TNS_CS_IMPLICIT);
|
|
199
|
+
}
|
|
200
|
+
numBytes = buf.readUB4();
|
|
201
|
+
let typeName;
|
|
202
|
+
if (numBytes > 0) {
|
|
203
|
+
typeName = buf.readStr(constants.TNS_CS_IMPLICIT);
|
|
204
|
+
}
|
|
205
|
+
buf.skipUB2(); // column position
|
|
206
|
+
buf.skipUB4(); // uds flag
|
|
207
|
+
|
|
208
|
+
// build metadata
|
|
209
|
+
const fetchInfo = {
|
|
210
|
+
name: name,
|
|
211
|
+
dbType: types.getTypeByOraTypeNum(dataType, csfrm),
|
|
212
|
+
nullable: nullable
|
|
213
|
+
};
|
|
214
|
+
switch (fetchInfo.dbType) {
|
|
215
|
+
case types.DB_TYPE_VARCHAR:
|
|
216
|
+
case types.DB_TYPE_NVARCHAR:
|
|
217
|
+
case types.DB_TYPE_CHAR:
|
|
218
|
+
case types.DB_TYPE_NCHAR:
|
|
219
|
+
case types.DB_TYPE_RAW:
|
|
220
|
+
fetchInfo.byteSize = size;
|
|
221
|
+
break;
|
|
222
|
+
case types.DB_TYPE_NUMBER:
|
|
223
|
+
fetchInfo.precision = precision;
|
|
224
|
+
break;
|
|
225
|
+
case types.DB_TYPE_TIMESTAMP:
|
|
226
|
+
case types.DB_TYPE_TIMESTAMP_TZ:
|
|
227
|
+
case types.DB_TYPE_TIMESTAMP_LTZ:
|
|
228
|
+
fetchInfo.precision = scale;
|
|
229
|
+
break;
|
|
230
|
+
case types.DB_TYPE_OBJECT:
|
|
231
|
+
fetchInfo.dbTypeClass = this.connection._getDbObjectType(schema,
|
|
232
|
+
typeName, undefined, oid);
|
|
233
|
+
if (fetchInfo.dbTypeClass.partial) {
|
|
234
|
+
this.connection._partialDbObjectTypes.push(fetchInfo.dbTypeClass);
|
|
235
|
+
}
|
|
236
|
+
break;
|
|
237
|
+
default:
|
|
238
|
+
break;
|
|
239
|
+
}
|
|
240
|
+
if (fetchInfo.dbType === types.DB_TYPE_NUMBER) {
|
|
241
|
+
fetchInfo.scale = scale;
|
|
242
|
+
}
|
|
243
|
+
return {
|
|
244
|
+
fetchInfo: fetchInfo,
|
|
245
|
+
type: fetchInfo.dbType,
|
|
246
|
+
maxSize: maxSize,
|
|
247
|
+
columnNum: columnNum,
|
|
248
|
+
values: new Array(this.options.fetchArraySize)
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
processRowHeader(buf) {
|
|
253
|
+
buf.skipUB1(); // flags
|
|
254
|
+
buf.skipUB2(); // num requests
|
|
255
|
+
buf.skipUB4(); // iteration number
|
|
256
|
+
buf.skipUB4(); // num iters
|
|
257
|
+
buf.skipUB2(); // buffer length
|
|
258
|
+
let numBytes = buf.readUB4();
|
|
259
|
+
if (numBytes > 0) {
|
|
260
|
+
buf.skipUB1(); // skip repeated length
|
|
261
|
+
this.getBitVector(buf, numBytes);
|
|
262
|
+
}
|
|
263
|
+
numBytes = buf.readUB4();
|
|
264
|
+
if (numBytes > 0) {
|
|
265
|
+
buf.skipBytesChunked(); // rxhrid
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
isDuplicateData(columnName) {
|
|
270
|
+
if (this.bitVector === null || this.bitVector === undefined) {
|
|
271
|
+
return false;
|
|
272
|
+
}
|
|
273
|
+
let byteNum = Math.floor(columnName / 8);
|
|
274
|
+
let bitNum = columnName % 8;
|
|
275
|
+
return (this.bitVector[byteNum] & (1 << bitNum)) === 0;
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
processRowData(buf) {
|
|
279
|
+
let value;
|
|
280
|
+
for (let [col, variable] of this.outVariables.entries()) {
|
|
281
|
+
if (variable.isArray) {
|
|
282
|
+
variable.numElementsInArray = buf.readUB4();
|
|
283
|
+
let values = new Array(variable.numElementsInArray).fill(null);
|
|
284
|
+
for (let pos = 0; pos < variable.numElementsInArray; pos++) {
|
|
285
|
+
value = this.processColumnData(buf, variable, pos);
|
|
286
|
+
values[pos] = value;
|
|
287
|
+
}
|
|
288
|
+
variable.values[this.rowIndex] = values;
|
|
289
|
+
} else if (this.statement.isReturning) {
|
|
290
|
+
let numRows = buf.readUB4();
|
|
291
|
+
let values = Array(numRows).fill(null);
|
|
292
|
+
for (let j = 0; j < numRows; j++) {
|
|
293
|
+
values[j] = this.processColumnData(buf, variable, j);
|
|
294
|
+
}
|
|
295
|
+
variable.values[this.rowIndex] = values;
|
|
296
|
+
} else if (this.isDuplicateData(col)) {
|
|
297
|
+
if (this.rowIndex === 0 && variable.outConverter) {
|
|
298
|
+
value = variable.lastRawValue;
|
|
299
|
+
} else {
|
|
300
|
+
value = variable.values[this.statement.lastRowIndex];
|
|
301
|
+
}
|
|
302
|
+
variable.values[this.rowIndex] = value;
|
|
303
|
+
} else {
|
|
304
|
+
value = this.processColumnData(buf, variable, this.rowIndex);
|
|
305
|
+
variable.values[this.rowIndex] = value;
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
this.rowIndex++;
|
|
309
|
+
if (this.inFetch) {
|
|
310
|
+
this.statement.lastRowIndex = this.rowIndex - 1;
|
|
311
|
+
this.statement.bufferRowCount++;
|
|
312
|
+
this.bitVector = null;
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
processIOVector(buf) {
|
|
317
|
+
let numBytes;
|
|
318
|
+
buf.skipUB1(); // flag
|
|
319
|
+
const numBinds = buf.readUB2(); // num requests
|
|
320
|
+
this.rowIndex = buf.readUB4(); // iter num
|
|
321
|
+
buf.skipUB4(); // num iters this time
|
|
322
|
+
buf.readUB2(); // uac buffer length
|
|
323
|
+
numBytes = buf.readUB2(); // bit vector for fast fetch
|
|
324
|
+
if (numBytes > 0) {
|
|
325
|
+
buf.skipBytes(numBytes);
|
|
326
|
+
}
|
|
327
|
+
numBytes = buf.readUB2(); // rowid
|
|
328
|
+
if (numBytes > 0) {
|
|
329
|
+
buf.skipBytes(numBytes);
|
|
330
|
+
}
|
|
331
|
+
this.outVariables = [];
|
|
332
|
+
for (let i = 0; i < numBinds; i++) { // bind directions
|
|
333
|
+
let bindInfo = this.statement.bindInfoList[i];
|
|
334
|
+
bindInfo.bindDir = buf.readUInt8();
|
|
335
|
+
if (bindInfo.bindDir === constants.TNS_BIND_DIR_INPUT) {
|
|
336
|
+
continue;
|
|
337
|
+
}
|
|
338
|
+
this.outVariables.push(bindInfo.bindVar);
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
processColumnData(buf, variable) {
|
|
343
|
+
const dbType = variable.type;
|
|
344
|
+
const oraTypeNum = dbType._oraTypeNum;
|
|
345
|
+
const csfrm = dbType._csfrm;
|
|
346
|
+
const maxSize = variable.maxSize;
|
|
347
|
+
|
|
348
|
+
let colValue = null;
|
|
349
|
+
if (maxSize === 0 && oraTypeNum !== constants.TNS_DATA_TYPE_LONG
|
|
350
|
+
&& oraTypeNum !== constants.TNS_DATA_TYPE_LONG_RAW
|
|
351
|
+
&& oraTypeNum !== constants.TNS_DATA_TYPE_UROWID) {
|
|
352
|
+
colValue = null;
|
|
353
|
+
} else if (
|
|
354
|
+
oraTypeNum === constants.TNS_DATA_TYPE_VARCHAR ||
|
|
355
|
+
oraTypeNum === constants.TNS_DATA_TYPE_CHAR ||
|
|
356
|
+
oraTypeNum === constants.TNS_DATA_TYPE_LONG
|
|
357
|
+
) {
|
|
358
|
+
if (csfrm === constants.TNS_CS_NCHAR) {
|
|
359
|
+
buf.caps.checkNCharsetId();
|
|
360
|
+
}
|
|
361
|
+
colValue = buf.readStr(csfrm);
|
|
362
|
+
} else if (oraTypeNum === constants.TNS_DATA_TYPE_RAW ||
|
|
363
|
+
oraTypeNum === constants.TNS_DATA_TYPE_LONG_RAW) {
|
|
364
|
+
colValue = buf.readBytesWithLength();
|
|
365
|
+
if (colValue !== null) {
|
|
366
|
+
colValue = Buffer.from(colValue);
|
|
367
|
+
}
|
|
368
|
+
} else if (oraTypeNum === constants.TNS_DATA_TYPE_NUMBER) {
|
|
369
|
+
colValue = buf.readOracleNumber();
|
|
370
|
+
if (!this.inFetch && colValue !== null)
|
|
371
|
+
colValue = parseFloat(colValue);
|
|
372
|
+
} else if (
|
|
373
|
+
oraTypeNum === constants.TNS_DATA_TYPE_DATE ||
|
|
374
|
+
oraTypeNum === constants.TNS_DATA_TYPE_TIMESTAMP ||
|
|
375
|
+
oraTypeNum === constants.TNS_DATA_TYPE_TIMESTAMP_LTZ ||
|
|
376
|
+
oraTypeNum === constants.TNS_DATA_TYPE_TIMESTAMP_TZ
|
|
377
|
+
) {
|
|
378
|
+
const useLocalTime = (oraTypeNum === constants.TNS_DATA_TYPE_DATE ||
|
|
379
|
+
oraTypeNum === constants.TNS_DATA_TYPE_TIMESTAMP);
|
|
380
|
+
colValue = buf.readOracleDate(useLocalTime);
|
|
381
|
+
} else if (oraTypeNum === constants.TNS_DATA_TYPE_ROWID) {
|
|
382
|
+
if (!this.inFetch) {
|
|
383
|
+
colValue = buf.readStr(constants.TNS_CS_IMPLICIT);
|
|
384
|
+
} else {
|
|
385
|
+
let numBytes = buf.readUInt8();
|
|
386
|
+
if (isNullLength(numBytes)) {
|
|
387
|
+
colValue = null;
|
|
388
|
+
} else {
|
|
389
|
+
let rowid = buf.readRowID();
|
|
390
|
+
colValue = utils.encodeRowID(rowid);
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
} else if (oraTypeNum === constants.TNS_DATA_TYPE_UROWID) {
|
|
394
|
+
if (!this.inFetch) {
|
|
395
|
+
colValue = buf.readStr(constants.TNS_CS_IMPLICIT);
|
|
396
|
+
} else {
|
|
397
|
+
colValue = buf.readURowID();
|
|
398
|
+
}
|
|
399
|
+
} else if (oraTypeNum === constants.TNS_DATA_TYPE_BINARY_DOUBLE) {
|
|
400
|
+
colValue = buf.readBinaryDouble();
|
|
401
|
+
} else if (oraTypeNum === constants.TNS_DATA_TYPE_BINARY_FLOAT) {
|
|
402
|
+
colValue = buf.readBinaryFloat();
|
|
403
|
+
} else if (oraTypeNum === constants.TNS_DATA_TYPE_BINARY_INTEGER) {
|
|
404
|
+
colValue = buf.readOracleNumber();
|
|
405
|
+
if (colValue !== null)
|
|
406
|
+
colValue = parseFloat(colValue);
|
|
407
|
+
} else if (oraTypeNum === constants.TNS_DATA_TYPE_CURSOR) {
|
|
408
|
+
let numBytes = buf.readUInt8();
|
|
409
|
+
if (isNullLength(numBytes)) {
|
|
410
|
+
colValue = null;
|
|
411
|
+
} else {
|
|
412
|
+
colValue = this.createCursorFromDescribe(buf);
|
|
413
|
+
colValue.statement.cursorId = buf.readUB2();
|
|
414
|
+
// If the cursor ID is 0 for the returned ref cursor then
|
|
415
|
+
// it is an invalid cursor
|
|
416
|
+
if (colValue.statement.cursorId === 0 && variable.dir !== constants.BIND_IN) {
|
|
417
|
+
if (this.options.nullifyInvalidCursor) {
|
|
418
|
+
colValue = null;
|
|
419
|
+
} else {
|
|
420
|
+
errors.throwErr(errors.ERR_INVALID_REF_CURSOR);
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
} else if (oraTypeNum === constants.TNS_DATA_TYPE_BOOLEAN) {
|
|
425
|
+
colValue = buf.readBool();
|
|
426
|
+
} else if (oraTypeNum === constants.TNS_DATA_TYPE_CLOB || oraTypeNum === constants.TNS_DATA_TYPE_BLOB) {
|
|
427
|
+
let bvalue = buf.readUB4();
|
|
428
|
+
if (bvalue > 0) { // Non Null data in column
|
|
429
|
+
colValue = new ThinLobImpl();
|
|
430
|
+
const length = buf.readUB8();
|
|
431
|
+
const chunkSize = buf.readUB4();
|
|
432
|
+
const locator = Buffer.from(buf.readBytesWithLength());
|
|
433
|
+
colValue.init(this.connection, locator, dbType, length, chunkSize);
|
|
434
|
+
}
|
|
435
|
+
} else if (oraTypeNum === constants.TNS_DATA_TYPE_JSON) {
|
|
436
|
+
colValue = buf.readOson();
|
|
437
|
+
} else if (oraTypeNum === constants.TNS_DATA_TYPE_INT_NAMED) {
|
|
438
|
+
const obj = buf.readDbObject();
|
|
439
|
+
if (obj.packedData) {
|
|
440
|
+
const objType = (variable.fetchInfo) ? variable.fetchInfo.dbTypeClass :
|
|
441
|
+
variable.typeClass;
|
|
442
|
+
colValue = new ThinDbObjectImpl(objType, obj.packedData);
|
|
443
|
+
colValue.toid = obj.toid;
|
|
444
|
+
colValue.oid = obj.oid;
|
|
445
|
+
}
|
|
446
|
+
} else {
|
|
447
|
+
errors.throwErr(errors.ERR_UNSUPPORTED_DATA_TYPE, dbType.num,
|
|
448
|
+
variable.columnNum);
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
if (!this.inFetch) {
|
|
452
|
+
const actualNumBytes = buf.readSB4();
|
|
453
|
+
if (actualNumBytes < 0 && oraTypeNum === constants.TNS_DATA_TYPE_BOOLEAN) {
|
|
454
|
+
colValue = null;
|
|
455
|
+
} else if (actualNumBytes !== 0 && colValue !== null) {
|
|
456
|
+
errors.throwErr(errors.ERR_INSUFFICIENT_BUFFER_FOR_BINDS);
|
|
457
|
+
}
|
|
458
|
+
} else if (oraTypeNum === constants.TNS_DATA_TYPE_LONG || oraTypeNum === constants.TNS_DATA_TYPE_LONG_RAW || variable.maxSize > buf.caps.maxStringSize) {
|
|
459
|
+
buf.skipSB4(); // null indicator
|
|
460
|
+
buf.skipUB4(); // return code
|
|
461
|
+
}
|
|
462
|
+
return colValue;
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
processReturnParameter(buf) {
|
|
466
|
+
let keywordNum = 0;
|
|
467
|
+
let keyTextValue;
|
|
468
|
+
let numParams = buf.readUB2(); // al8o4l (ignored)
|
|
469
|
+
|
|
470
|
+
for (let i = 0; i < numParams; i++) {
|
|
471
|
+
buf.skipUB4();
|
|
472
|
+
}
|
|
473
|
+
let numBytes = buf.readUB2(); // al8txl (ignored)
|
|
474
|
+
if (numBytes > 0) {
|
|
475
|
+
buf.skipBytes(numBytes);
|
|
476
|
+
}
|
|
477
|
+
numParams = buf.readUB2(); // num key/value pairs
|
|
478
|
+
for (let i = 0; i < numParams; i++) {
|
|
479
|
+
numBytes = buf.readUB2(); // key
|
|
480
|
+
if (numBytes > 0) {
|
|
481
|
+
keyTextValue = buf.readStr(constants.TNS_CS_IMPLICIT);
|
|
482
|
+
}
|
|
483
|
+
numBytes = buf.readUB2(); // value
|
|
484
|
+
if (numBytes > 0) {
|
|
485
|
+
buf.skipBytesChunked();
|
|
486
|
+
}
|
|
487
|
+
keywordNum = buf.readUB2(); // keyword num
|
|
488
|
+
if (keywordNum === constants.TNS_KEYWORD_NUM_CURRENT_SCHEMA) {
|
|
489
|
+
this.connection.currentSchema = keyTextValue;
|
|
490
|
+
} else if (keywordNum === constants.TNS_KEYWORD_NUM_EDITION) {
|
|
491
|
+
this.connection._edition = keyTextValue;
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
numBytes = buf.readUB2(); // registration
|
|
495
|
+
if (numBytes > 0) {
|
|
496
|
+
buf.skip(numBytes);
|
|
497
|
+
}
|
|
498
|
+
if (this.arrayDmlRowCounts) {
|
|
499
|
+
let numRows = buf.readUB4();
|
|
500
|
+
let rowCounts = this.options.dmlRowCounts = [];
|
|
501
|
+
for (let i = 0; i < numRows; i++) {
|
|
502
|
+
let rowCount = buf.readUB8();
|
|
503
|
+
rowCounts.push(rowCount);
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
process(buf) {
|
|
509
|
+
this.bitVector = this.savedBitVector;
|
|
510
|
+
super.process(buf);
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
savePoint(buf) {
|
|
514
|
+
this.savedBitVector = this.bitVector;
|
|
515
|
+
super.savePoint(buf);
|
|
516
|
+
}
|
|
517
|
+
|
|
518
|
+
async postProcess() {
|
|
519
|
+
if (this.outVariables) {
|
|
520
|
+
for (const variable of this.outVariables) {
|
|
521
|
+
if (variable.isArray) {
|
|
522
|
+
for (let pos = 0; pos < variable.numElementsInArray; pos++) {
|
|
523
|
+
if (variable.outConverter) {
|
|
524
|
+
variable.values[0][pos] = await variable.outConverter(variable.values[0][pos]);
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
} else {
|
|
528
|
+
if (variable.outConverter) {
|
|
529
|
+
variable.values[0] = await variable.outConverter(variable.values[0]);
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
await this.connection._populatePartialDbObjectTypes();
|
|
535
|
+
for (const resultSet of this.resultSetsToSetup) {
|
|
536
|
+
resultSet._setup(this.options, resultSet.metadata);
|
|
537
|
+
// LOBs always require define and they change the type that is actually
|
|
538
|
+
// returned by the server
|
|
539
|
+
for (const variable of resultSet.statement.queryVars) {
|
|
540
|
+
if (variable.type === types.DB_TYPE_CLOB ||
|
|
541
|
+
variable.type === types.DB_TYPE_NCLOB ||
|
|
542
|
+
variable.type === types.DB_TYPE_BLOB ||
|
|
543
|
+
variable.type === types.DB_TYPE_JSON) {
|
|
544
|
+
if (variable.type !== variable.fetchInfo.fetchType) {
|
|
545
|
+
variable.type = variable.fetchInfo.fetchType;
|
|
546
|
+
variable.maxSize = constants.TNS_MAX_LONG_LENGTH;
|
|
547
|
+
}
|
|
548
|
+
resultSet.statement.requiresDefine = true;
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
preProcess() {
|
|
555
|
+
if (this.statement.isReturning && !this.parseOnly) {
|
|
556
|
+
this.outVariables = [];
|
|
557
|
+
for (const bindInfo of this.statement.bindInfoList) {
|
|
558
|
+
if (bindInfo.isReturnBind) {
|
|
559
|
+
this.outVariables.push(bindInfo.bindVar);
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
if (this.statement.isQuery) {
|
|
565
|
+
this.inFetch = true;
|
|
566
|
+
if (this.statement.queryVars) {
|
|
567
|
+
this.outVariables = [];
|
|
568
|
+
for (let i = 0; i < this.statement.queryVars.length; i++) {
|
|
569
|
+
this.outVariables.push(this.statement.queryVars[i]);
|
|
570
|
+
}
|
|
571
|
+
}
|
|
572
|
+
}
|
|
573
|
+
}
|
|
574
|
+
|
|
575
|
+
processBitVector(buf) {
|
|
576
|
+
this.numColumnsSent = buf.readUB2();
|
|
577
|
+
let numBytes = Math.floor(this.statement.numQueryVars / 8);
|
|
578
|
+
if (this.statement.numQueryVars % 8 > 0) {
|
|
579
|
+
numBytes += 1;
|
|
580
|
+
}
|
|
581
|
+
this.getBitVector(buf, numBytes);
|
|
582
|
+
}
|
|
583
|
+
|
|
584
|
+
getBitVector(buf, numBytes) {
|
|
585
|
+
this.bitVector = buf.readBytes(numBytes);
|
|
586
|
+
}
|
|
587
|
+
|
|
588
|
+
processBindParams(buf, params) {
|
|
589
|
+
const bindVars = [];
|
|
590
|
+
const nonReturningParams = [];
|
|
591
|
+
for (const bindInfo of params) {
|
|
592
|
+
if (!bindInfo.isReturnBind) {
|
|
593
|
+
nonReturningParams.push(bindInfo);
|
|
594
|
+
}
|
|
595
|
+
bindVars.push(bindInfo.bindVar);
|
|
596
|
+
}
|
|
597
|
+
this.writeColumnMetadata(buf, bindVars);
|
|
598
|
+
return nonReturningParams;
|
|
599
|
+
}
|
|
600
|
+
|
|
601
|
+
writeColumnMetadata(buf, bindVars) {
|
|
602
|
+
for (const variable of bindVars) {
|
|
603
|
+
let oraTypeNum = variable.type._oraTypeNum;
|
|
604
|
+
let maxSize = variable.maxSize || variable.type._bufferSizeFactor;
|
|
605
|
+
let lobPrefetchLength = 0;
|
|
606
|
+
|
|
607
|
+
// NCHAR, NVARCHAR reports ORA-01460: unimplemented or unreasonable
|
|
608
|
+
// conversion requested if maxSize is not multiplied by the
|
|
609
|
+
// bufferSizeFactor
|
|
610
|
+
if (variable.type._csfrm === constants.TNS_CS_NCHAR) {
|
|
611
|
+
maxSize *= variable.type._bufferSizeFactor;
|
|
612
|
+
}
|
|
613
|
+
if ([constants.TNS_DATA_TYPE_ROWID, constants.TNS_DATA_TYPE_UROWID].includes(oraTypeNum)) {
|
|
614
|
+
oraTypeNum = constants.TNS_DATA_TYPE_VARCHAR;
|
|
615
|
+
maxSize = constants.TNS_MAX_UROWID_LENGTH;
|
|
616
|
+
}
|
|
617
|
+
let flag = constants.TNS_BIND_USE_INDICATORS;
|
|
618
|
+
if (variable.isArray) {
|
|
619
|
+
flag |= constants.TNS_BIND_ARRAY;
|
|
620
|
+
}
|
|
621
|
+
let contFlag = 0;
|
|
622
|
+
if (variable.type === types.DB_TYPE_BLOB ||
|
|
623
|
+
variable.type === types.DB_TYPE_CLOB ||
|
|
624
|
+
variable.type === types.DB_TYPE_NCLOB) {
|
|
625
|
+
contFlag = constants.TNS_LOB_PREFETCH_FLAG;
|
|
626
|
+
} else if (variable.type === types.DB_TYPE_JSON) {
|
|
627
|
+
contFlag = constants.TNS_LOB_PREFETCH_FLAG;
|
|
628
|
+
maxSize = lobPrefetchLength = constants.TNS_JSON_MAX_LENGTH;
|
|
629
|
+
}
|
|
630
|
+
buf.writeUInt8(oraTypeNum);
|
|
631
|
+
buf.writeUInt8(flag);
|
|
632
|
+
// precision and scale are always written as zero as the server
|
|
633
|
+
// expects that and complains if any other value is sent!
|
|
634
|
+
buf.writeUInt8(0);
|
|
635
|
+
buf.writeUInt8(0);
|
|
636
|
+
if (maxSize > buf.caps.maxStringSize) {
|
|
637
|
+
buf.writeUB4(constants.TNS_MAX_LONG_LENGTH);
|
|
638
|
+
} else {
|
|
639
|
+
buf.writeUB4(maxSize);
|
|
640
|
+
}
|
|
641
|
+
|
|
642
|
+
if (variable.isArray) {
|
|
643
|
+
buf.writeUB4(variable.maxArraySize);
|
|
644
|
+
} else {
|
|
645
|
+
buf.writeUB4(0); // max num elements
|
|
646
|
+
}
|
|
647
|
+
buf.writeUB4(contFlag);
|
|
648
|
+
if (variable.objType) {
|
|
649
|
+
const objType = variable.objType;
|
|
650
|
+
buf.writeUB4(objType.oid.length);
|
|
651
|
+
buf.writeBytesWithLength(objType.oid);
|
|
652
|
+
buf.writeUB4(objType.version);
|
|
653
|
+
} else {
|
|
654
|
+
buf.writeUB4(0); // OID
|
|
655
|
+
buf.writeUB4(0); // version
|
|
656
|
+
}
|
|
657
|
+
if (variable.type._csfrm !== 0) {
|
|
658
|
+
buf.writeUB4(constants.TNS_CHARSET_UTF8);
|
|
659
|
+
} else {
|
|
660
|
+
buf.writeUB4(0);
|
|
661
|
+
}
|
|
662
|
+
buf.writeUInt8(variable.type._csfrm);
|
|
663
|
+
buf.writeUB4(lobPrefetchLength); // max chars (LOB prefetch)
|
|
664
|
+
if (buf.caps.ttcFieldVersion >= constants.TNS_CCAP_FIELD_VERSION_12_2) {
|
|
665
|
+
buf.writeUB4(0); // oaccolid
|
|
666
|
+
}
|
|
667
|
+
}
|
|
668
|
+
}
|
|
669
|
+
|
|
670
|
+
writeBindParamsRow(buf, params, pos) {
|
|
671
|
+
let offset = this.offset;
|
|
672
|
+
let foundLong = false;
|
|
673
|
+
for (const bindInfo of params) {
|
|
674
|
+
if (bindInfo.isReturnBind)
|
|
675
|
+
continue;
|
|
676
|
+
let variable = bindInfo.bindVar;
|
|
677
|
+
if (variable.isArray) {
|
|
678
|
+
let numElements = variable.values.length;
|
|
679
|
+
buf.writeUB4(numElements);
|
|
680
|
+
for (let i = 0; i < numElements; i++) {
|
|
681
|
+
this.writeBindParamsColumn(buf, variable, variable.values[i]);
|
|
682
|
+
}
|
|
683
|
+
} else {
|
|
684
|
+
if (variable.maxSize > buf.caps.maxStringSize) {
|
|
685
|
+
foundLong = true;
|
|
686
|
+
} else {
|
|
687
|
+
this.writeBindParamsColumn(buf, variable,
|
|
688
|
+
variable.values[pos + offset]);
|
|
689
|
+
}
|
|
690
|
+
}
|
|
691
|
+
}
|
|
692
|
+
if (foundLong) {
|
|
693
|
+
for (const bindInfo of params) {
|
|
694
|
+
if (bindInfo.isReturnBind)
|
|
695
|
+
continue;
|
|
696
|
+
const variable = bindInfo.bindVar;
|
|
697
|
+
if (variable.maxSize > buf.caps.maxStringSize) {
|
|
698
|
+
this.writeBindParamsColumn(buf, variable, variable.values[pos + offset]);
|
|
699
|
+
}
|
|
700
|
+
}
|
|
701
|
+
}
|
|
702
|
+
}
|
|
703
|
+
|
|
704
|
+
writeBindParamsColumn(buf, variable, value) {
|
|
705
|
+
const oraTypeNum = variable.type._oraTypeNum;
|
|
706
|
+
let tempVal;
|
|
707
|
+
if ((value === undefined || value === null) && oraTypeNum !== constants.TNS_DATA_TYPE_CURSOR && oraTypeNum !== constants.TNS_DATA_TYPE_JSON) {
|
|
708
|
+
if (oraTypeNum === constants.TNS_DATA_TYPE_BOOLEAN) {
|
|
709
|
+
buf.writeUInt8(constants.TNS_ESCAPE_CHAR);
|
|
710
|
+
buf.writeUInt8(1);
|
|
711
|
+
} else if (oraTypeNum === constants.TNS_DATA_TYPE_INT_NAMED) {
|
|
712
|
+
buf.writeUB4(0); // TOID
|
|
713
|
+
buf.writeUB4(0); // OID
|
|
714
|
+
buf.writeUB4(0); // snapshot
|
|
715
|
+
buf.writeUB4(0); // version
|
|
716
|
+
buf.writeUB4(0); // packed data length
|
|
717
|
+
buf.writeUB4(constants.TNS_OBJ_TOP_LEVEL); // flags
|
|
718
|
+
} else {
|
|
719
|
+
buf.writeUInt8(0);
|
|
720
|
+
}
|
|
721
|
+
} else if (oraTypeNum === constants.TNS_DATA_TYPE_NUMBER ||
|
|
722
|
+
oraTypeNum === constants.TNS_DATA_TYPE_BINARY_INTEGER) {
|
|
723
|
+
if (typeof value === 'boolean') {
|
|
724
|
+
tempVal = (value) ? "1" : "0";
|
|
725
|
+
} else {
|
|
726
|
+
tempVal = value.toString();
|
|
727
|
+
}
|
|
728
|
+
buf.writeOracleNumber(tempVal);
|
|
729
|
+
} else if (oraTypeNum === constants.TNS_DATA_TYPE_VARCHAR ||
|
|
730
|
+
oraTypeNum === constants.TNS_DATA_TYPE_CHAR ||
|
|
731
|
+
oraTypeNum === constants.TNS_DATA_TYPE_LONG ||
|
|
732
|
+
oraTypeNum === constants.TNS_DATA_TYPE_RAW ||
|
|
733
|
+
oraTypeNum === constants.TNS_DATA_TYPE_LONG_RAW) {
|
|
734
|
+
if (variable.type._csfrm === constants.TNS_CS_NCHAR) {
|
|
735
|
+
buf.caps.checkNCharsetId();
|
|
736
|
+
value = Buffer.from(value, constants.TNS_ENCODING_UTF16).swap16();
|
|
737
|
+
} else {
|
|
738
|
+
value = Buffer.from(value);
|
|
739
|
+
}
|
|
740
|
+
buf.writeBytesWithLength(value);
|
|
741
|
+
} else if (
|
|
742
|
+
oraTypeNum === constants.TNS_DATA_TYPE_DATE ||
|
|
743
|
+
oraTypeNum === constants.TNS_DATA_TYPE_TIMESTAMP ||
|
|
744
|
+
oraTypeNum === constants.TNS_DATA_TYPE_TIMESTAMP_TZ ||
|
|
745
|
+
oraTypeNum === constants.TNS_DATA_TYPE_TIMESTAMP_LTZ
|
|
746
|
+
) {
|
|
747
|
+
buf.writeOracleDate(value, variable.type);
|
|
748
|
+
} else if (oraTypeNum === constants.TNS_DATA_TYPE_BINARY_DOUBLE) {
|
|
749
|
+
buf.writeBinaryDouble(value);
|
|
750
|
+
} else if (oraTypeNum === constants.TNS_DATA_TYPE_BINARY_FLOAT) {
|
|
751
|
+
buf.writeBinaryFloat(value);
|
|
752
|
+
} else if (oraTypeNum === constants.TNS_DATA_TYPE_CURSOR) {
|
|
753
|
+
let cursor = value;
|
|
754
|
+
if (!value) {
|
|
755
|
+
cursor = this.connection._createResultSet();
|
|
756
|
+
}
|
|
757
|
+
if (cursor.statement.cursorId === 0) {
|
|
758
|
+
buf.writeUInt8(1);
|
|
759
|
+
buf.writeUInt8(0);
|
|
760
|
+
} else {
|
|
761
|
+
buf.writeUB4(1);
|
|
762
|
+
buf.writeUB4(cursor.statement.cursorId);
|
|
763
|
+
}
|
|
764
|
+
} else if (oraTypeNum === constants.TNS_DATA_TYPE_BOOLEAN) {
|
|
765
|
+
if (value) {
|
|
766
|
+
buf.writeUInt8(2);
|
|
767
|
+
buf.writeUInt16BE(0x0101);
|
|
768
|
+
} else {
|
|
769
|
+
buf.writeUInt16BE(0x0100);
|
|
770
|
+
}
|
|
771
|
+
} else if (oraTypeNum === constants.TNS_DATA_TYPE_CLOB || oraTypeNum === constants.TNS_DATA_TYPE_BLOB) {
|
|
772
|
+
buf.writeUB4(value._locator.length);
|
|
773
|
+
buf.writeBytesWithLength(value._locator);
|
|
774
|
+
} else if ([constants.TNS_DATA_TYPE_ROWID, constants.TNS_DATA_TYPE_UROWID].includes(oraTypeNum)) {
|
|
775
|
+
buf.writeBytesWithLength(Buffer.from(value));
|
|
776
|
+
} else if (oraTypeNum === constants.TNS_DATA_TYPE_JSON) {
|
|
777
|
+
buf.writeOson(value);
|
|
778
|
+
} else if (oraTypeNum === constants.TNS_DATA_TYPE_INT_NAMED) {
|
|
779
|
+
buf.writeDbObject(value);
|
|
780
|
+
} else {
|
|
781
|
+
const message = `Binding data of type ${variable.type}`;
|
|
782
|
+
errors.throwErr(errors.ERR_NOT_IMPLEMENTED, message);
|
|
783
|
+
}
|
|
784
|
+
}
|
|
785
|
+
|
|
786
|
+
createCursorFromDescribe(buf) {
|
|
787
|
+
const resultSet = this.connection._createResultSet(this.options);
|
|
788
|
+
resultSet.options.moreRowsToFetch = true;
|
|
789
|
+
resultSet.statement.isQuery = true;
|
|
790
|
+
resultSet.statement.requiresFullExecute = true;
|
|
791
|
+
this.processDescribeInfo(buf, resultSet);
|
|
792
|
+
return resultSet;
|
|
793
|
+
}
|
|
794
|
+
|
|
795
|
+
processImplicitResultSet(buf) {
|
|
796
|
+
this.options.implicitResultSet = [];
|
|
797
|
+
const numResults = buf.readUB4();
|
|
798
|
+
for (let i = 0; i < numResults; i++) {
|
|
799
|
+
const numBytes = buf.readUInt8();
|
|
800
|
+
buf.skipBytes(numBytes);
|
|
801
|
+
let childResultSet = this.createCursorFromDescribe(buf);
|
|
802
|
+
childResultSet.statement.cursorId = buf.readUB2();
|
|
803
|
+
this.options.implicitResultSet.push(childResultSet);
|
|
804
|
+
}
|
|
805
|
+
}
|
|
806
|
+
}
|
|
807
|
+
|
|
808
|
+
const isNullLength = (len) => {
|
|
809
|
+
return len === 0 || len === constants.TNS_NULL_LENGTH_INDICATOR;
|
|
810
|
+
};
|
|
811
|
+
|
|
812
|
+
module.exports = MessageWithData;
|