oracledb 5.4.0 → 6.0.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.
Files changed (108) hide show
  1. package/CHANGELOG.md +1 -1849
  2. package/LICENSE.txt +8 -222
  3. package/NOTICE.txt +1 -1
  4. package/README.md +38 -30
  5. package/SECURITY.md +38 -0
  6. package/THIRD_PARTY_LICENSES.txt +1 -1
  7. package/build/Release/oracledb-6.0.0-darwin-x64.node +0 -0
  8. package/build/Release/oracledb-6.0.0-darwin-x64.node-buildinfo.txt +1 -0
  9. package/build/Release/oracledb-6.0.0-js-buildinfo.txt +1 -0
  10. package/build/Release/oracledb-6.0.0-linux-arm64.node +0 -0
  11. package/build/Release/oracledb-6.0.0-linux-arm64.node-buildinfo.txt +1 -0
  12. package/build/Release/oracledb-6.0.0-linux-x64.node +0 -0
  13. package/build/Release/oracledb-6.0.0-linux-x64.node-buildinfo.txt +1 -0
  14. package/build/Release/oracledb-6.0.0-win32-x64.node +0 -0
  15. package/build/Release/oracledb-6.0.0-win32-x64.node-buildinfo.txt +1 -0
  16. package/examples/README.md +113 -0
  17. package/examples/dbconfig.js +100 -0
  18. package/examples/example.js +156 -0
  19. package/index.js +26 -0
  20. package/lib/aqDeqOptions.js +146 -7
  21. package/lib/aqEnqOptions.js +59 -7
  22. package/lib/aqMessage.js +118 -7
  23. package/lib/aqQueue.js +242 -53
  24. package/lib/connection.js +1324 -465
  25. package/lib/constants.js +203 -0
  26. package/lib/dbObject.js +346 -32
  27. package/lib/errors.js +781 -0
  28. package/lib/impl/aqDeqOptions.js +197 -0
  29. package/lib/impl/aqEnqOptions.js +89 -0
  30. package/lib/impl/aqMessage.js +134 -0
  31. package/lib/impl/aqQueue.js +81 -0
  32. package/lib/impl/connection.js +529 -0
  33. package/lib/impl/dbObject.js +159 -0
  34. package/lib/impl/index.js +59 -0
  35. package/lib/impl/lob.js +85 -0
  36. package/lib/impl/pool.js +195 -0
  37. package/lib/impl/resultset.js +223 -0
  38. package/lib/impl/sodaCollection.js +174 -0
  39. package/lib/impl/sodaDatabase.js +81 -0
  40. package/lib/impl/sodaDocCursor.js +63 -0
  41. package/lib/impl/sodaDocument.js +98 -0
  42. package/lib/impl/sodaOperation.js +109 -0
  43. package/lib/lob.js +156 -68
  44. package/lib/oracledb.js +1051 -257
  45. package/lib/pool.js +654 -465
  46. package/lib/poolStatistics.js +23 -9
  47. package/lib/queryStream.js +14 -7
  48. package/lib/resultset.js +292 -171
  49. package/lib/settings.js +191 -0
  50. package/lib/sodaCollection.js +214 -201
  51. package/lib/sodaDatabase.js +107 -71
  52. package/lib/sodaDocCursor.js +44 -32
  53. package/lib/sodaDocument.js +76 -14
  54. package/lib/sodaOperation.js +131 -118
  55. package/lib/thin/connection.js +1038 -0
  56. package/lib/thin/dbObject.js +629 -0
  57. package/lib/thin/index.js +40 -0
  58. package/lib/thin/lob.js +188 -0
  59. package/lib/thin/pool.js +481 -0
  60. package/lib/thin/protocol/buffer.js +1040 -0
  61. package/lib/thin/protocol/capabilities.js +116 -0
  62. package/lib/thin/protocol/constants.js +764 -0
  63. package/lib/thin/protocol/encryptDecrypt.js +185 -0
  64. package/lib/thin/protocol/messages/auth.js +348 -0
  65. package/lib/thin/protocol/messages/base.js +475 -0
  66. package/lib/thin/protocol/messages/commit.js +56 -0
  67. package/lib/thin/protocol/messages/dataType.js +382 -0
  68. package/lib/thin/protocol/messages/execute.js +312 -0
  69. package/lib/thin/protocol/messages/fetch.js +60 -0
  70. package/lib/thin/protocol/messages/index.js +53 -0
  71. package/lib/thin/protocol/messages/lobOp.js +200 -0
  72. package/lib/thin/protocol/messages/logOff.js +53 -0
  73. package/lib/thin/protocol/messages/ping.js +56 -0
  74. package/lib/thin/protocol/messages/protocol.js +78 -0
  75. package/lib/thin/protocol/messages/rollback.js +56 -0
  76. package/lib/thin/protocol/messages/sessionRelease.js +60 -0
  77. package/lib/thin/protocol/messages/withData.js +811 -0
  78. package/lib/thin/protocol/oson.js +660 -0
  79. package/lib/thin/protocol/packet.js +520 -0
  80. package/lib/thin/protocol/protocol.js +202 -0
  81. package/lib/thin/protocol/utils.js +88 -0
  82. package/lib/thin/resultSet.js +122 -0
  83. package/lib/thin/sqlnet/connStrategy.js +175 -0
  84. package/lib/thin/sqlnet/constants.js +199 -0
  85. package/lib/thin/sqlnet/ezConnectResolver.js +488 -0
  86. package/lib/thin/sqlnet/navNodes.js +870 -0
  87. package/lib/thin/sqlnet/networkSession.js +620 -0
  88. package/lib/thin/sqlnet/ntTcp.js +525 -0
  89. package/lib/thin/sqlnet/nvStrToNvPair.js +783 -0
  90. package/lib/thin/sqlnet/packet.js +405 -0
  91. package/lib/thin/sqlnet/paramParser.js +205 -0
  92. package/lib/thin/sqlnet/sessionAtts.js +160 -0
  93. package/lib/thin/statement.js +301 -0
  94. package/lib/thin/util.js +289 -0
  95. package/lib/transformer.js +250 -0
  96. package/lib/types.js +357 -0
  97. package/lib/util.js +194 -108
  98. package/lib/version.js +36 -0
  99. package/package/README.md +33 -30
  100. package/package/install.js +89 -64
  101. package/package/prunebinaries.js +60 -12
  102. package/package.json +3 -3
  103. package/build/Release/oracledb-5.4.0-darwin-x64.node +0 -0
  104. package/build/Release/oracledb-5.4.0-darwin-x64.node-buildinfo.txt +0 -1
  105. package/build/Release/oracledb-5.4.0-linux-x64.node +0 -0
  106. package/build/Release/oracledb-5.4.0-linux-x64.node-buildinfo.txt +0 -1
  107. package/build/Release/oracledb-5.4.0-win32-x64.node +0 -0
  108. package/build/Release/oracledb-5.4.0-win32-x64.node-buildinfo.txt +0 -1
package/lib/util.js CHANGED
@@ -1,17 +1,24 @@
1
- // Copyright (c) 2016, 2022, Oracle and/or its affiliates.
1
+ // Copyright (c) 2016, 2023, Oracle and/or its affiliates.
2
2
 
3
3
  //-----------------------------------------------------------------------------
4
4
  //
5
- // You may not use the identified files except in compliance with the Apache
6
- // License, Version 2.0 (the "License.")
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.
7
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.
8
15
  // You may obtain a copy of the License at
9
- // http://www.apache.org/licenses/LICENSE-2.0.
10
16
  //
11
- // Unless required by applicable law or agreed to in writing, software
12
- // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
13
- // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17
+ // https://www.apache.org/licenses/LICENSE-2.0
14
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.
15
22
  // See the License for the specific language governing permissions and
16
23
  // limitations under the License.
17
24
  //
@@ -19,65 +26,33 @@
19
26
 
20
27
  'use strict';
21
28
 
29
+ const errors = require('./errors.js');
22
30
  const util = require('util');
31
+ const types = require('./types.js');
23
32
 
24
33
  // node-oracledb version number
25
34
  let packageJSON;
26
35
  try {
27
36
  packageJSON = require('../package.json');
28
37
  } catch (err) {
29
- throw new Error('package.json is missing');
38
+ errors.throwErr(errors.ERR_MISSING_FILE, 'package.json');
30
39
  }
31
40
  const PACKAGE_JSON_VERSION = packageJSON.version;
32
- module.exports.PACKAGE_JSON_VERSION = PACKAGE_JSON_VERSION;
33
41
 
34
42
  // Directory containing the node-oracledb add-on binary
35
43
  const RELEASE_DIR = 'build/Release';
36
- module.exports.RELEASE_DIR = RELEASE_DIR;
37
44
 
38
45
  // The default node-oracledb add-on binary filename for this Node.js
39
46
  const BINARY_FILE = 'oracledb-' + PACKAGE_JSON_VERSION + '-' + process.platform + '-' + process.arch + '.node';
40
- module.exports.BINARY_FILE = BINARY_FILE;
41
47
 
42
48
  // Staging directory used by maintainers building the npm package
43
49
  const STAGING_DIR = 'package/Staging';
44
- module.exports.STAGING_DIR = STAGING_DIR;
45
-
46
- // errorMessages is for NJS error messages used in the JavaScript layer
47
- const errorMessages = {
48
- 'NJS-002': 'NJS-002: invalid pool',
49
- 'NJS-004': 'NJS-004: invalid value for property %s',
50
- 'NJS-005': 'NJS-005: invalid value for parameter %d',
51
- 'NJS-009': 'NJS-009: invalid number of parameters',
52
- 'NJS-017': 'NJS-017: concurrent operations on ResultSet are not allowed',
53
- 'NJS-023': 'NJS-023: concurrent operations on LOB are not allowed',
54
- 'NJS-037': 'NJS-037: incompatible type of value provided',
55
- 'NJS-040': 'NJS-040: connection request timeout. Request exceeded queueTimeout of %d',
56
- 'NJS-041': 'NJS-041: cannot convert ResultSet to QueryStream after invoking methods',
57
- 'NJS-042': 'NJS-042: cannot invoke ResultSet methods after converting to QueryStream',
58
- 'NJS-043': 'NJS-043: ResultSet already converted to QueryStream',
59
- 'NJS-045': 'NJS-045: cannot load a node-oracledb binary for Node.js ' + process.versions.node + ' (' + process.platform + ' ' + process.arch + ') %s',
60
- 'NJS-046': 'NJS-046: poolAlias "%s" already exists in the connection pool cache',
61
- 'NJS-047': 'NJS-047: poolAlias "%s" not found in the connection pool cache',
62
- 'NJS-064': 'NJS-064: connection pool is closing',
63
- 'NJS-065': 'NJS-065: connection pool was closed',
64
- 'NJS-067': 'NJS-067: a pre-built node-oracledb binary was not found for %s',
65
- 'NJS-069': 'NJS-069: node-oracledb %s requires Node.js %s or later',
66
- 'NJS-076': 'NJS-076: connection request rejected. Pool queue length queueMax %d reached',
67
- 'NJS-081': 'NJS-081: concurrent operations on a connection are disabled',
68
- 'NJS-082': 'NJS-082: connection pool is being reconfigured',
69
- 'NJS-083': 'NJS-083: pool statistics not enabled',
70
- 'NJS-084': 'NJS-084: invalid or missing parameter with token based authentication. The token and privateKey attributes must contain values. Other credentials cannot be specified',
71
- 'NJS-085': 'NJS-085: invalid connection pool configuration with token based authentication. The homogeneous and externalAuth attributes must be set to true',
72
- 'NJS-086': 'NJS-086: invalid standalone configuration with token based authentication. The externalAuth attribute must be set to true'
73
- };
74
50
 
75
51
  // getInstallURL returns a string with installation URL
76
52
  function getInstallURL() {
77
- return ('Node-oracledb installation instructions: https://oracle.github.io/node-oracledb/INSTALL.html');
53
+ return ('Node-oracledb installation instructions: https://node-oracledb.readthedocs.io/en/latest/user_guide/installation.html');
78
54
  }
79
55
 
80
- module.exports.getInstallURL = getInstallURL;
81
56
 
82
57
  // getInstallHelp returns a string with installation usage tips that may be helpful
83
58
  function getInstallHelp() {
@@ -94,7 +69,7 @@ function getInstallHelp() {
94
69
  url = 'https://www.oracle.com/database/technologies/instant-client.html\n';
95
70
  arch = process.arch;
96
71
  }
97
- mesg += 'You must have ' + arch + ' Oracle Client libraries configured with ldconfig, or in LD_LIBRARY_PATH.\n';
72
+ mesg += 'You must have Linux ' + arch + ' Oracle Client libraries configured with ldconfig, or in LD_LIBRARY_PATH.\n';
98
73
  mesg += 'If you do not have Oracle Database on this computer, then install the Instant Client Basic or Basic Light package from \n';
99
74
  mesg += url;
100
75
  } else if (process.platform === 'darwin') {
@@ -105,7 +80,7 @@ function getInstallHelp() {
105
80
  url = 'https://www.oracle.com/database/technologies/instant-client.html\n';
106
81
  arch = process.arch;
107
82
  }
108
- mesg += 'You must have the ' + arch + ' Oracle Instant Client Basic or Basic Light package libraries in\n';
83
+ mesg += 'You must have macOS ' + arch + ' Oracle Instant Client Basic or Basic Light package libraries in\n';
109
84
  mesg += '/usr/local/lib or set by calling oracledb.initOracleClient({libDir: "/my/instant_client_directory"}).\n';
110
85
  mesg += 'Oracle Instant Client can be downloaded from ' + url;
111
86
  } else if (process.platform === 'win32') {
@@ -119,7 +94,7 @@ function getInstallHelp() {
119
94
  url = 'https://www.oracle.com/database/technologies/instant-client.html\n';
120
95
  arch = process.arch;
121
96
  }
122
- mesg += 'You must have ' + arch + ' Oracle Client libraries in your PATH environment variable.\n';
97
+ mesg += 'You must have Windows ' + arch + ' Oracle Client libraries in your PATH environment variable.\n';
123
98
  mesg += 'If you do not have Oracle Database on this computer, then install the Instant Client Basic or Basic Light package from\n';
124
99
  mesg += url;
125
100
  mesg += 'A Microsoft Visual Studio Redistributable suitable for your Oracle client library version must be available.\n';
@@ -132,41 +107,6 @@ function getInstallHelp() {
132
107
  return mesg;
133
108
  }
134
109
 
135
- module.exports.getInstallHelp = getInstallHelp;
136
-
137
- // getErrorMessage is used to get and format error messages to make throwing
138
- // errors a little more convenient.
139
- function getErrorMessage(errorCode) {
140
- let args = Array.prototype.slice.call(arguments);
141
- args[0] = errorMessages[errorCode];
142
- return util.format.apply(util, args);
143
- }
144
-
145
- module.exports.getErrorMessage = getErrorMessage;
146
-
147
- // assert is typically used at the beginning of public functions to assert
148
- // preconditions for the function to execute. Most commonly it is used to
149
- // validate the number of arguments and their types and throw an error if they
150
- // don't match what is expected.
151
- function assert(condition, errorCode, messageArg1) {
152
- if (!condition) {
153
- throw new Error(getErrorMessage(errorCode, messageArg1));
154
- }
155
- }
156
-
157
- module.exports.assert = assert;
158
-
159
- // checkArgCount is used to validate the number of arguments, particularly with
160
- // optional parameters (range of number of parameters). If the number of
161
- // arguments is not within the given range, an error is thrown.
162
- function checkArgCount(args, minArgCount, maxArgCount) {
163
- if (args.length < minArgCount || args.length > maxArgCount)
164
- throw new Error(getErrorMessage('NJS-009'));
165
- }
166
-
167
- module.exports.checkArgCount = checkArgCount;
168
-
169
-
170
110
  // The callbackify function is used to wrap async methods to add optional
171
111
  // callback support. If the last parameter passed to a method is a function,
172
112
  // then it is assumed that the callback pattern is being used and the promise
@@ -178,9 +118,8 @@ function callbackify(func) {
178
118
  // if last argument is not a function, simply invoke the function as usual
179
119
  // and a promise will be returned
180
120
  if (typeof arguments[arguments.length - 1] !== 'function') {
181
- return func.apply(this, arguments).catch(function stackCapture(e) {
182
- Error.captureStackTrace(e, stackCapture);
183
- throw e;
121
+ return func.apply(this, arguments).catch(function stackCapture(err) {
122
+ throw errors.transformErr(err, stackCapture);
184
123
  });
185
124
  }
186
125
 
@@ -189,8 +128,9 @@ function callbackify(func) {
189
128
  const cb = arguments[arguments.length - 1];
190
129
  func.apply(this, args).then(function(result) {
191
130
  cb(null, result);
192
- }, cb);
193
-
131
+ }, function stackCapture(err) {
132
+ cb(errors.transformErr(err, stackCapture));
133
+ });
194
134
  };
195
135
  if (func.name) {
196
136
  Object.defineProperty(wrapper, 'name', { value: func.name });
@@ -198,36 +138,37 @@ function callbackify(func) {
198
138
  return wrapper;
199
139
  }
200
140
 
201
- module.exports.callbackify = callbackify;
202
-
203
141
  // The serialize function is used to wrap methods to ensure that the connection
204
142
  // is not used concurrently by multiple threads
205
143
  function serialize(func) {
206
144
  return async function() {
207
145
 
208
- // determine the connection associated with the object
209
- const connection = this._getConnection();
146
+ let connImpl;
210
147
 
211
- // acquire the "lock"; this simply checks to see if another operation is in
212
- // progress, and if so, waits for it to complete
213
- await connection._acquireLock();
148
+ // determine the connection implementation associated with the object, if
149
+ // one currently exists and acquire the "lock"; this simply checks to see
150
+ // if another operation is in progress, and if so, waits for it to complete
151
+ if (this._impl) {
152
+ connImpl = this._impl._getConnImpl();
153
+ await connImpl._acquireLock();
154
+ }
214
155
 
215
156
  // call the function and ensure that the lock is "released" once the
216
- // function has completed -- either successfully or in failure
157
+ // function has completed -- either successfully or in failure -- but only
158
+ // if a connection implementation is currently associated with this object
217
159
  try {
218
160
  return await func.apply(this, arguments);
219
161
  } finally {
220
- connection._releaseLock();
162
+ if (connImpl)
163
+ connImpl._releaseLock();
221
164
  }
222
165
  };
223
166
  }
224
167
 
225
- module.exports.serialize = serialize;
226
-
227
168
  function preventConcurrent(func, errorCode) {
228
169
  return async function() {
229
170
  if (this._isActive)
230
- throw new Error(getErrorMessage(errorCode));
171
+ errors.throwErr(errorCode);
231
172
  this._isActive = true;
232
173
  try {
233
174
  return await func.apply(this, arguments);
@@ -237,31 +178,176 @@ function preventConcurrent(func, errorCode) {
237
178
  };
238
179
  }
239
180
 
240
- module.exports.preventConcurrent = preventConcurrent;
181
+ // The wrapFns() function is used to wrap the named methods on the prototype
182
+ // in multiple ways (serialize, preventConcurrent and callbackify); the
183
+ // arguments following the formal arguments contain the names of methods to
184
+ // wrap on the prototype; if the first extra argument is an error code, it is
185
+ // used to wrap to prevent concurrent access
186
+ function wrapFns(proto) {
187
+ let nameIndex = 1;
188
+ let preventConcurrentErrorCode;
189
+ if (typeof arguments[1] === 'number') {
190
+ nameIndex = 2;
191
+ preventConcurrentErrorCode = arguments[1];
192
+ }
193
+ for (let i = nameIndex; i < arguments.length; i++) {
194
+ const name = arguments[i];
195
+ const f = proto[name];
196
+ if (preventConcurrentErrorCode) {
197
+ proto[name] = callbackify(preventConcurrent(serialize(f),
198
+ preventConcurrentErrorCode));
199
+ } else
200
+ proto[name] = callbackify(serialize(f));
201
+ }
202
+ }
203
+
204
+ function isArrayOfStrings(value) {
205
+ if (!Array.isArray(value))
206
+ return false;
207
+ for (let i = 0; i < value.length; i++) {
208
+ if (typeof value[i] !== 'string')
209
+ return false;
210
+ }
211
+ return true;
212
+ }
241
213
 
242
214
  function isObject(value) {
243
215
  return value !== null && typeof value === 'object';
244
216
  }
245
217
 
246
- module.exports.isObject = isObject;
247
-
248
218
  function isObjectOrArray(value) {
249
219
  return (value !== null && typeof value === 'object') || Array.isArray(value);
250
220
  }
251
221
 
252
- module.exports.isObjectOrArray = isObjectOrArray;
222
+ function isShardingKey(value) {
223
+ if (!Array.isArray(value))
224
+ return false;
225
+ for (let i = 0; i < value.length; i++) {
226
+ const element = value[i];
227
+ const ok = typeof element === 'string' ||
228
+ typeof element === 'number' || Buffer.isBuffer(element) ||
229
+ util.isDate(element);
230
+ if (!ok)
231
+ return false;
232
+ }
233
+ return true;
234
+ }
253
235
 
254
236
  function isSodaDocument(value) {
255
237
  return (value != null && value._sodaDocumentMarker);
256
238
  }
257
239
 
258
240
  function isXid(value) {
259
- return (isObject(value) &&
260
- (value.formatId !== undefined) &&
261
- (value.globalTransactionId !== undefined) &&
262
- (value.branchQualifier !== undefined));
241
+ return (isObject(value) && Number.isInteger(value.formatId) &&
242
+ (Buffer.isBuffer(value.globalTransactionId) ||
243
+ typeof value.globalTransactionId === 'string') &&
244
+ (Buffer.isBuffer(value.branchQualifier) ||
245
+ typeof value.branchQualifier === 'string'));
263
246
  }
264
247
 
265
- module.exports.isXid = isXid;
248
+ function verifySodaDoc(content) {
249
+ if (isSodaDocument(content))
250
+ return content._impl;
251
+ errors.assertParamValue(isObject(content), 1);
252
+ return Buffer.from(JSON.stringify(content));
253
+ }
254
+
255
+ function isTokenExpired(token) {
256
+ errors.assert(typeof token === 'string', errors.ERR_TOKEN_BASED_AUTH);
257
+ if (token.split('.')[1] === undefined) {
258
+ errors.throwErr(errors.ERR_TOKEN_BASED_AUTH);
259
+ }
260
+
261
+ const base64Url = token.split('.')[1];
262
+ const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');
263
+ const buff = Buffer.from(base64, 'base64');
264
+ const payloadInit = buff.toString('ascii');
265
+
266
+ let expiry = JSON.parse(payloadInit).exp;
267
+ errors.assert(expiry != undefined, errors.ERR_TOKEN_BASED_AUTH);
268
+ expiry = expiry * 1000;
269
+
270
+ return (new Date().getTime() > expiry);
271
+ }
272
+
273
+ function isTokenValid(accessToken) {
274
+ switch (typeof accessToken) {
275
+ case 'string':
276
+ if (accessToken === '') {
277
+ errors.throwErr(errors.ERR_TOKEN_BASED_AUTH);
278
+ }
279
+
280
+ return !isTokenExpired(accessToken);
281
+ case 'object':
282
+ if (accessToken.token === undefined ||
283
+ accessToken.token === '' ||
284
+ accessToken.privateKey === undefined ||
285
+ accessToken.privateKey === '') {
286
+ errors.throwErr(errors.ERR_TOKEN_BASED_AUTH);
287
+ }
288
+
289
+ return !isTokenExpired(accessToken.token);
290
+ default:
291
+ errors.throwErr(errors.ERR_TOKEN_BASED_AUTH);
292
+ }
293
+ }
266
294
 
267
- module.exports.isSodaDocument = isSodaDocument;
295
+ function isPrivateKeyValid(accessToken) {
296
+ errors.assert(typeof accessToken.privateKey === 'string',
297
+ errors.ERR_TOKEN_BASED_AUTH);
298
+
299
+ if (accessToken.privateKey.startsWith("-----BEGIN PRIVATE KEY-----") ||
300
+ accessToken.privateKey.endsWith("-----END PRIVATE KEY-----")) {
301
+ return false;
302
+ }
303
+
304
+ return true;
305
+ }
306
+
307
+ //-----------------------------------------------------------------------------
308
+ // addTypeProperties()
309
+ //
310
+ // Adds derived properties about the type as a convenience to the user.
311
+ // Currently this is only the name of type, which is either the name of the
312
+ // database object type (if the value refers to a database object) or the name
313
+ // of the Oracle database type.
314
+ // -----------------------------------------------------------------------------
315
+ function addTypeProperties(obj, attrName) {
316
+ const clsAttrName = attrName + "Class";
317
+ const nameAttrName = attrName + "Name";
318
+ const cls = obj[clsAttrName];
319
+ let dbType = obj[attrName];
320
+ if (typeof dbType === 'number') {
321
+ dbType = obj[attrName] = types.getTypeByNum(dbType);
322
+ }
323
+ if (cls) {
324
+ obj[nameAttrName] = cls.prototype.fqn;
325
+ } else if (dbType) {
326
+ obj[nameAttrName] = dbType.columnTypeName;
327
+ }
328
+ }
329
+
330
+ // define exports
331
+ module.exports = {
332
+ BINARY_FILE,
333
+ PACKAGE_JSON_VERSION,
334
+ RELEASE_DIR,
335
+ STAGING_DIR,
336
+ addTypeProperties,
337
+ callbackify,
338
+ getInstallURL,
339
+ getInstallHelp,
340
+ isArrayOfStrings,
341
+ isObject,
342
+ isObjectOrArray,
343
+ isPrivateKeyValid,
344
+ isShardingKey,
345
+ isSodaDocument,
346
+ isTokenExpired,
347
+ isTokenValid,
348
+ isXid,
349
+ preventConcurrent,
350
+ serialize,
351
+ verifySodaDoc,
352
+ wrapFns
353
+ };
package/lib/version.js ADDED
@@ -0,0 +1,36 @@
1
+ // Copyright (c) 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
+ // Version information.
28
+ // Keep in sync with package.json.
29
+ // Leave the suffix an empty string for production releases.
30
+
31
+ module.exports = {
32
+ VERSION_MAJOR: 6,
33
+ VERSION_MINOR: 0,
34
+ VERSION_PATCH: 0,
35
+ VERSION_SUFFIX: ''
36
+ };
package/package/README.md CHANGED
@@ -6,46 +6,49 @@ to create a custom package for hosting on a local server.
6
6
 
7
7
  Most users do not need to use anything in this directory.
8
8
 
9
- # Maintainers
9
+ # Building an Install Package
10
10
 
11
11
  In a clone or copy of the repository:
12
12
 
13
- - Run `npm run buildbinary`. This calls `buildbinary.js` to create a
14
- node-oracledb binary for the current operating system. Depending how Node.js
15
- was installed, you may need to run `npm install node-gyp -g` first.
13
+ - If you want to build a package that installs node-oracledb with both 'Thin'
14
+ and 'Thick' modes, then run `npm run buildbinary`. This calls
15
+ `buildbinary.js` to create a node-oracledb 'Thick' mode binary for the
16
+ current operating system. Depending on how Node.js was installed, you may
17
+ need to run `npm install node-gyp -g` first.
16
18
 
17
19
  You can run `npm run buildbinary` on each operating system architecture that
18
- you want to include in your package. Copy the node-oracledb binaries and
19
- related build metadata information files from all `package/Staging`
20
- directories to the `package/Staging` directory on one machine.
21
-
22
- - Run `npm run buildpackage`. This calls `buildpackage.js` to make the
23
- node-oracledb package containing the node-oracledb JavaScript files, the
24
- available binaries, and a `package.json` that has `install` and `prune` script
25
- targets. The package will be created in the top level directory. It can be
26
- uploaded to npmjs.com, or to your own local server, and then used as a
27
- dependency in your projects.
20
+ you want to include in your package. Copy the node-oracledb Thick mode
21
+ binaries and related build metadata information files from all
22
+ `package/Staging` directories to the `package/Staging` directory on one
23
+ machine.
24
+
25
+ - On the machine with any (or no) desired Thick mode binaries in
26
+ `package/Staging`, run `npm run buildpackage`. This calls `buildpackage.js`
27
+ to make the node-oracledb package containing the node-oracledb JavaScript
28
+ files, the available Thick mode binaries, and a `package.json` that has
29
+ `install` and `prune` script targets. The package will be created in the top
30
+ level directory. It can be uploaded to npmjs.com by maintainers of
31
+ node-oracledb, or you can upload to your own local server and then use it as
32
+ a dependency in your projects.
28
33
 
29
34
  # Package Installation
30
35
 
31
- - When running `npm install` with the created package, the `package.json`
32
- install script runs `install.js` to check the availability of a binary module
33
- for the current Node.js version and operating system architecture.
36
+ - Running `npm install` with the created package always installs node-oracledb
37
+ Thin mode. The installation script also runs `install.js` to check the
38
+ availability of the optional Thick mode binary module. A warning will be
39
+ displayed if the binary is not found for the current Node.js version and
40
+ operating system architecture.
34
41
 
35
- - If installation succeeds, space conscious users can then run `npm run prune`
36
- which removes pre-built binaries for all other architectures.
42
+ - If you are space-conscious, then run `npm run prune` after installation.
43
+ This removes pre-built binaries for all other architectures.
37
44
 
38
- - If `npm install` fails because a suitable binary is not available, users must
39
- then compile node-oracledb using source code from GitHub. Alternatively a
40
- different version of node-oracledb, Node.js, or different operating system may
41
- have a suitable pre-built binary available. See
42
- https://github.com/oracle/node-oracledb/releases for information about Node.js
43
- versions and pre-built node-oracledb binaries.
45
+ If you only ever want Thin mode, then remove all the Thick mode binaries by
46
+ running `npm run prune all`.
44
47
 
45
- The
48
+ Note the
46
49
  [`package.json`](https://github.com/oracle/node-oracledb/blob/main/package.json)
47
50
  in GitHub doesn't have an `install` script target by default. This means that
48
- node-gyp will be invoked to compile node-oracledb. This allows installation
49
- from GitHub [source
50
- code](https://oracle.github.io/node-oracledb/INSTALL.html#github) when no
51
- suitable pre-built binary is available.
51
+ node-gyp will be invoked to compile the optional node-oracledb Thick mode
52
+ binary. This allows installation of Thick mode from GitHub [source
53
+ code](https://node-oracledb.readthedocs.io/en/latest/user_guide/installation.html#github)
54
+ when no suitable pre-built binary is available.