oracledb 6.2.0 → 6.4.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 (70) hide show
  1. package/LICENSE.txt +1 -1
  2. package/NOTICE.txt +1 -1
  3. package/README.md +3 -3
  4. package/build/Release/oracledb-6.4.0-darwin-x64.node +0 -0
  5. package/build/Release/oracledb-6.4.0-darwin-x64.node-buildinfo.txt +1 -0
  6. package/build/Release/oracledb-6.4.0-js-buildinfo.txt +1 -0
  7. package/build/Release/oracledb-6.4.0-linux-arm64.node +0 -0
  8. package/build/Release/oracledb-6.4.0-linux-arm64.node-buildinfo.txt +1 -0
  9. package/build/Release/oracledb-6.4.0-linux-x64.node +0 -0
  10. package/build/Release/oracledb-6.4.0-linux-x64.node-buildinfo.txt +1 -0
  11. package/build/Release/oracledb-6.4.0-win32-x64.node +0 -0
  12. package/build/Release/oracledb-6.4.0-win32-x64.node-buildinfo.txt +1 -0
  13. package/examples/README.md +29 -8
  14. package/examples/dbconfig.js +50 -26
  15. package/examples/example.js +6 -4
  16. package/lib/aqQueue.js +8 -8
  17. package/lib/connection.js +121 -9
  18. package/lib/constants.js +7 -1
  19. package/lib/dbObject.js +72 -1
  20. package/lib/errors.js +45 -8
  21. package/lib/future.js +53 -0
  22. package/lib/impl/connection.js +56 -0
  23. package/lib/{thin/protocol → impl/datahandlers}/buffer.js +51 -39
  24. package/lib/impl/datahandlers/constants.js +105 -0
  25. package/lib/{thin/protocol → impl/datahandlers}/oson.js +19 -1
  26. package/lib/impl/datahandlers/vector.js +156 -0
  27. package/lib/impl/pool.js +14 -3
  28. package/lib/impl/resultset.js +65 -11
  29. package/lib/lob.js +22 -6
  30. package/lib/oracledb.js +47 -8
  31. package/lib/pool.js +20 -1
  32. package/lib/poolStatistics.js +3 -1
  33. package/lib/settings.js +30 -6
  34. package/lib/sodaDocCursor.js +14 -1
  35. package/lib/thin/connection.js +146 -146
  36. package/lib/thin/dbObject.js +49 -3
  37. package/lib/thin/index.js +1 -1
  38. package/lib/thin/lob.js +6 -6
  39. package/lib/thin/pool.js +25 -6
  40. package/lib/thin/protocol/capabilities.js +6 -2
  41. package/lib/thin/protocol/constants.js +50 -65
  42. package/lib/thin/protocol/messages/auth.js +6 -2
  43. package/lib/thin/protocol/messages/base.js +50 -32
  44. package/lib/thin/protocol/messages/dataType.js +10 -6
  45. package/lib/thin/protocol/messages/lobOp.js +7 -8
  46. package/lib/thin/protocol/messages/withData.js +91 -24
  47. package/lib/thin/protocol/packet.js +58 -4
  48. package/lib/thin/protocol/utils.js +1 -1
  49. package/lib/thin/sqlnet/connStrategy.js +8 -4
  50. package/lib/thin/sqlnet/constants.js +138 -138
  51. package/lib/thin/sqlnet/navNodes.js +5 -5
  52. package/lib/thin/sqlnet/networkSession.js +22 -3
  53. package/lib/thin/sqlnet/ntTcp.js +7 -7
  54. package/lib/thin/statement.js +8 -8
  55. package/lib/thin/statementCache.js +167 -0
  56. package/lib/thin/util.js +15 -4
  57. package/lib/transformer.js +13 -4
  58. package/lib/types.js +17 -2
  59. package/lib/util.js +37 -0
  60. package/lib/version.js +2 -2
  61. package/package.json +1 -1
  62. package/build/Release/oracledb-6.2.0-darwin-x64.node +0 -0
  63. package/build/Release/oracledb-6.2.0-darwin-x64.node-buildinfo.txt +0 -1
  64. package/build/Release/oracledb-6.2.0-js-buildinfo.txt +0 -1
  65. package/build/Release/oracledb-6.2.0-linux-arm64.node +0 -0
  66. package/build/Release/oracledb-6.2.0-linux-arm64.node-buildinfo.txt +0 -1
  67. package/build/Release/oracledb-6.2.0-linux-x64.node +0 -0
  68. package/build/Release/oracledb-6.2.0-linux-x64.node-buildinfo.txt +0 -1
  69. package/build/Release/oracledb-6.2.0-win32-x64.node +0 -0
  70. package/build/Release/oracledb-6.2.0-win32-x64.node-buildinfo.txt +0 -1
@@ -1,4 +1,4 @@
1
- // Copyright (c) 2022, 2023, Oracle and/or its affiliates.
1
+ // Copyright (c) 2022, 2024, Oracle and/or its affiliates.
2
2
 
3
3
  //-----------------------------------------------------------------------------
4
4
  //
@@ -89,7 +89,9 @@ class Capabilities {
89
89
  this.compileCaps[constants.TNS_CCAP_DBF_VERSION] =
90
90
  constants.TNS_CCAP_DBF_VERSION_MAX;
91
91
  this.compileCaps[constants.TNS_CCAP_LOB] =
92
- constants.TNS_CCAP_LOB_UB8_SIZE | constants.TNS_CCAP_LOB_ENCS | constants.TNS_CCAP_LOB_PREFETCH;
92
+ constants.TNS_CCAP_LOB_UB8_SIZE | constants.TNS_CCAP_LOB_ENCS
93
+ | constants.TNS_CCAP_LOB_PREFETCH | constants.TNS_CCAP_LOB_TEMP_SIZE
94
+ | constants.TNS_CCAP_LOB_12C | constants.TNS_CCAP_LOB_PREFETCH_DATA;
93
95
  this.compileCaps[constants.TNS_CCAP_UB2_DTY] = 1;
94
96
  this.compileCaps[constants.TNS_CCAP_LOB2] =
95
97
  constants.TNS_CCAP_LOB2_QUASI | constants.TNS_CCAP_LOB2_2GB_PREFETCH;
@@ -102,6 +104,8 @@ class Capabilities {
102
104
  constants.TNS_CCAP_CLIENT_FN_MAX;
103
105
  this.compileCaps[constants.TNS_CCAP_TTC4] =
104
106
  constants.TNS_CCAP_INBAND_NOTIFICATION;
107
+ this.compileCaps[constants.TNS_CCAP_TTC5] =
108
+ constants.TNS_CCAP_VECTOR_SUPPORT;
105
109
  }
106
110
 
107
111
  initRuntimeCaps() {
@@ -1,4 +1,4 @@
1
- // Copyright (c) 2022, 2023, Oracle and/or its affiliates.
1
+ // Copyright (c) 2022, 2024, Oracle and/or its affiliates.
2
2
 
3
3
  //-----------------------------------------------------------------------------
4
4
  //
@@ -28,6 +28,7 @@
28
28
 
29
29
  const { Buffer } = require('buffer');
30
30
  const constants = require('../../constants.js');
31
+ const dataHandlerConstants = require('../../impl/datahandlers/constants.js');
31
32
 
32
33
  module.exports = {
33
34
 
@@ -56,14 +57,14 @@ module.exports = {
56
57
 
57
58
  // authentication modes
58
59
  AUTH_MODE_DEFAULT: 0,
59
- AUTH_MODE_PRELIM : 0x00000008,
60
- AUTH_MODE_SYSASM : 0x00008000,
61
- AUTH_MODE_SYSBKP : 0x00020000,
62
- AUTH_MODE_SYSDBA : 0x00000002,
63
- AUTH_MODE_SYSDGD : 0x00040000,
64
- AUTH_MODE_SYSKMT : 0x00080000,
65
- AUTH_MODE_SYSOPER: 0x00000004,
66
- AUTH_MODE_SYSRAC : 0x00100000,
60
+ AUTH_MODE_PRELIM: 0x00000008,
61
+ AUTH_MODE_SYSASM: 0x00008000,
62
+ AUTH_MODE_SYSBKP: 0x00020000,
63
+ AUTH_MODE_SYSDBA: 0x00000002,
64
+ AUTH_MODE_SYSDGD: 0x00040000,
65
+ AUTH_MODE_SYSKMT: 0x00080000,
66
+ AUTH_MODE_SYSOPER: 0x00000004,
67
+ AUTH_MODE_SYSRAC: 0x00100000,
67
68
 
68
69
  // TTC authentication modes
69
70
  TNS_AUTH_MODE_LOGON: 0x00000001,
@@ -120,7 +121,7 @@ module.exports = {
120
121
  TNS_DATA_TYPE_AUA: 36 + 256,
121
122
  TNS_DATA_TYPE_RXH7: 37 + 256,
122
123
  TNS_DATA_TYPE_NA6: 38 + 256,
123
- TNS_DATA_TYPE_OAC: 39,
124
+ TNS_DATA_TYPE_OAC9: 39,
124
125
  TNS_DATA_TYPE_AMS: 40,
125
126
  TNS_DATA_TYPE_BRN: 41,
126
127
  TNS_DATA_TYPE_BRP: 42 + 256,
@@ -194,10 +195,11 @@ module.exports = {
194
195
  TNS_DATA_TYPE_RSET: 116,
195
196
  TNS_DATA_TYPE_CWD: 117,
196
197
  TNS_DATA_TYPE_JSON: 119,
197
- TNS_DATA_TYPE_NEW_OAC: 120,
198
+ TNS_DATA_TYPE_OAC122: 120,
198
199
  TNS_DATA_TYPE_UD12: 124 + 256,
199
200
  TNS_DATA_TYPE_AL8: 125 + 256,
200
201
  TNS_DATA_TYPE_LFOP: 126 + 256,
202
+ TNS_DATA_TYPE_VECTOR: 127,
201
203
  TNS_DATA_TYPE_FCRT: 127 + 256,
202
204
  TNS_DATA_TYPE_DNY: 128 + 256,
203
205
  TNS_DATA_TYPE_OPR: 129 + 256,
@@ -381,7 +383,7 @@ module.exports = {
381
383
  TNS_DATA_TYPE_XSNSOP2: 604,
382
384
  TNS_DATA_TYPE_XSNS2: 605,
383
385
  TNS_DATA_TYPE_IMPLRES: 611,
384
- TNS_DATA_TYPE_OER: 612,
386
+ TNS_DATA_TYPE_OER19: 612,
385
387
  TNS_DATA_TYPE_UB1ARRAY: 613,
386
388
  TNS_DATA_TYPE_SESSSTATE: 614,
387
389
  TNS_DATA_TYPE_AC_REPLAY: 615,
@@ -400,8 +402,11 @@ module.exports = {
400
402
  TNS_DATA_TYPE_CHUNKINFO: 636,
401
403
  TNS_DATA_TYPE_SCN: 637,
402
404
  TNS_DATA_TYPE_SCN8: 638,
403
- TNS_DATA_TYPE_UDS: 639,
405
+ TNS_DATA_TYPE_UD21: 639,
404
406
  TNS_DATA_TYPE_TNP: 640,
407
+ TNS_DATA_TYPE_OAC: 646,
408
+ TNS_DATA_TYPE_OER: 652,
409
+ TNS_DATA_TYPE_UDS: 663,
405
410
 
406
411
  // data type representations
407
412
  TNS_TYPE_REP_NATIVE: 0,
@@ -510,42 +515,6 @@ module.exports = {
510
515
 
511
516
  // base JSON constants
512
517
  TNS_JSON_MAX_LENGTH: 32 * 1024 * 1024,
513
- TNS_JSON_MAGIC_BYTE_1: 0xff,
514
- TNS_JSON_MAGIC_BYTE_2: 0x4a, // 'J'
515
- TNS_JSON_MAGIC_BYTE_3: 0x5a, // 'Z'
516
- TNS_JSON_VERSION: 1,
517
- TNS_JSON_FLAG_HASH_ID_UINT8: 0x0100,
518
- TNS_JSON_FLAG_HASH_ID_UINT16: 0x0200,
519
- TNS_JSON_FLAG_NUM_FNAMES_UINT16: 0x0400,
520
- TNS_JSON_FLAG_FNAMES_SEG_UINT32: 0x0800,
521
- TNS_JSON_FLAG_TINY_NODES_STAT: 0x2000,
522
- TNS_JSON_FLAG_TREE_SEG_UINT32: 0x1000,
523
- TNS_JSON_FLAG_REL_OFFSET_MODE: 0x01,
524
- TNS_JSON_FLAG_INLINE_LEAF: 0x02,
525
- TNS_JSON_FLAG_LEN_IN_PCODE: 0x04,
526
- TNS_JSON_FLAG_NUM_FNAMES_UINT32: 0x08,
527
- TNS_JSON_FLAG_IS_SCALAR: 0x10,
528
-
529
- // JSON data types
530
- TNS_JSON_TYPE_NULL: 0x30,
531
- TNS_JSON_TYPE_TRUE: 0x31,
532
- TNS_JSON_TYPE_FALSE: 0x32,
533
- TNS_JSON_TYPE_STRING_LENGTH_UINT8: 0x33,
534
- TNS_JSON_TYPE_NUMBER_LENGTH_UINT8: 0x34,
535
- TNS_JSON_TYPE_BINARY_DOUBLE: 0x36,
536
- TNS_JSON_TYPE_STRING_LENGTH_UINT16: 0x37,
537
- TNS_JSON_TYPE_STRING_LENGTH_UINT32: 0x38,
538
- TNS_JSON_TYPE_TIMESTAMP: 0x39,
539
- TNS_JSON_TYPE_BINARY_LENGTH_UINT16: 0x3a,
540
- TNS_JSON_TYPE_BINARY_LENGTH_UINT32: 0x3b,
541
- TNS_JSON_TYPE_DATE: 0x3c,
542
- TNS_JSON_TYPE_INTERVAL_YM: 0x3d,
543
- TNS_JSON_TYPE_INTERVAL_DS: 0x3e,
544
- TNS_JSON_TYPE_TIMESTAMP_TZ: 0x7c,
545
- TNS_JSON_TYPE_TIMESTAMP7: 0x7d,
546
- TNS_JSON_TYPE_BINARY_FLOAT: 0x7f,
547
- TNS_JSON_TYPE_OBJECT: 0x84,
548
- TNS_JSON_TYPE_ARRAY: 0xc0,
549
518
 
550
519
  // end-to-end metrics
551
520
  TNS_END_TO_END_ACTION: 0x0010,
@@ -605,7 +574,8 @@ module.exports = {
605
574
  TNS_CCAP_TTC3: 37,
606
575
  TNS_CCAP_TTC4: 40,
607
576
  TNS_CCAP_LOB2: 42,
608
- TNS_CCAP_MAX: 45,
577
+ TNS_CCAP_TTC5: 44,
578
+ TNS_CCAP_MAX: 51,
609
579
 
610
580
  // compile time capability values
611
581
  TNS_CCAP_SQL_VERSION_MAX: 6,
@@ -622,7 +592,13 @@ module.exports = {
622
592
  TNS_CCAP_FIELD_VERSION_21_1: 16,
623
593
  TNS_CCAP_FIELD_VERSION_23_1: 17,
624
594
  TNS_CCAP_FIELD_VERSION_23_1_EXT_1: 18,
625
- TNS_CCAP_FIELD_VERSION_MAX: 18,
595
+ TNS_CCAP_FIELD_VERSION_23_1_EXT_2: 19,
596
+ TNS_CCAP_FIELD_VERSION_23_1_EXT_3: 20,
597
+ TNS_CCAP_FIELD_VERSION_23_1_EXT_4: 21,
598
+ TNS_CCAP_FIELD_VERSION_23_1_EXT_5: 22,
599
+ TNS_CCAP_FIELD_VERSION_23_1_EXT_6: 23,
600
+ TNS_CCAP_FIELD_VERSION_23_4: 24,
601
+ TNS_CCAP_FIELD_VERSION_MAX: 24,
626
602
  TNS_CCAP_O5LOGON: 8,
627
603
  TNS_CCAP_O5LOGON_NP: 2,
628
604
  TNS_CCAP_O7LOGON: 32,
@@ -642,13 +618,17 @@ module.exports = {
642
618
  TNS_CCAP_KEEP_OUT_ORDER: 0x80,
643
619
  TNS_CCAP_LOB_UB8_SIZE: 0x01,
644
620
  TNS_CCAP_LOB_ENCS: 0x02,
621
+ TNS_CCAP_LOB_PREFETCH_DATA: 0x04,
622
+ TNS_CCAP_LOB_TEMP_SIZE: 0x08,
645
623
  TNS_CCAP_LOB_PREFETCH: 0x40,
624
+ TNS_CCAP_LOB_12C: 0x80,
646
625
  TNS_CCAP_DRCP: 0x10,
647
626
  TNS_CCAP_ZLNP: 0x04,
648
627
  TNS_CCAP_INBAND_NOTIFICATION: 0x04,
649
628
  TNS_CCAP_CLIENT_FN_MAX: 12,
650
629
  TNS_CCAP_LOB2_QUASI: 0x01,
651
630
  TNS_CCAP_LOB2_2GB_PREFETCH: 0x04,
631
+ TNS_CCAP_VECTOR_SUPPORT: 0x08,
652
632
 
653
633
  // runtime capability indices
654
634
  TNS_RCAP_COMPAT: 0,
@@ -667,27 +647,22 @@ module.exports = {
667
647
  /** MultiRound SHA-512. */
668
648
  TNS_VERIFIER_TYPE_12C: 0x4815,
669
649
 
650
+ // UDS flags
651
+ TNS_UDS_FLAGS_IS_JSON: 0x00000100,
652
+ TNS_UDS_FLAGS_IS_OSON: 0x00000800,
653
+
670
654
  // other constants
671
- TNS_MAX_SHORT_LENGTH: 252,
672
655
  TNS_ESCAPE_CHAR: 253,
673
- TNS_LONG_LENGTH_INDICATOR: 254,
674
- TNS_NULL_LENGTH_INDICATOR: 255,
656
+ TNS_LONG_LENGTH_INDICATOR: dataHandlerConstants.TNS_LONG_LENGTH_INDICATOR,
657
+ TNS_NULL_LENGTH_INDICATOR: dataHandlerConstants.TNS_NULL_LENGTH_INDICATOR,
675
658
  TNS_MAX_ROWID_LENGTH: 18,
676
- TNS_DURATION_MID: 0x80000000,
677
- TNS_DURATION_OFFSET: 60,
678
659
  TNS_DURATION_SESSION: 10,
679
660
  TNS_MAX_LONG_LENGTH: 0x7fffffff,
680
661
  TNS_SDU: 8192,
681
662
  TNS_TDU: 65535,
682
663
  TNS_TXN_IN_PROGRESS: 0x00000002,
683
664
  TNS_MAX_CONNECT_DATA: 230,
684
- TNS_CHUNK_SIZE: 32767,
685
665
  TNS_MAX_UROWID_LENGTH: 3950,
686
- TNS_HAS_REGION_ID: 0x80,
687
-
688
- // timezone offsets
689
- TZ_HOUR_OFFSET: 20,
690
- TZ_MINUTE_OFFSET: 60,
691
666
 
692
667
  // drcp release mode
693
668
  DRCP_DEAUTHENTICATE: 0x00000002,
@@ -728,6 +703,10 @@ module.exports = {
728
703
  TNS_OBJ_TDS_TYPE_BLOB: 30,
729
704
  TNS_OBJ_TDS_TYPE_TIMESTAMP_LTZ: 33,
730
705
  TNS_OBJ_TDS_TYPE_BINARY_FLOAT: 37,
706
+ TNS_OBJ_TDS_TYPE_START_EMBED_ADT: 39,
707
+ TNS_OBJ_TDS_TYPE_END_EMBED_ADT: 40,
708
+ TNS_OBJ_TDS_TYPE_SUBTYPE_MARKER: 43,
709
+ TNS_OBJ_TDS_TYPE_EMBED_ADT_INFO: 44,
731
710
  TNS_OBJ_TDS_TYPE_BINARY_DOUBLE: 45,
732
711
 
733
712
  // xml type constants
@@ -743,13 +722,19 @@ module.exports = {
743
722
  TNS_ERR_NO_DATA_FOUND: 1403,
744
723
  TNS_ERR_SESSION_SHUTDOWN: 12572,
745
724
 
725
+ // warnings
726
+ TNS_WARN_COMPILATION_CREATE: 0x20,
727
+
728
+ // vector constants
729
+ TNS_VECTOR_MAX_LENGTH: 1048576,
730
+ VECTOR_FORMAT_FLEX: 0,
731
+ VECTOR_META_FLAG_FLEXIBLE_DIM: 1,
732
+
746
733
  // other constants
747
734
  PACKET_HEADER_SIZE: 8,
748
735
  NUMBER_AS_TEXT_CHARS: 172,
749
- NUMBER_MAX_DIGITS: 40,
750
- BUFFER_CHUNK_SIZE: 65536,
751
736
  CHUNKED_BYTES_CHUNK_SIZE: 65536,
752
737
 
753
- TNS_BASE64_ALPHABET_ARRAY: Buffer.from('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'),
738
+ TNS_BASE64_ALPHABET_ARRAY: Buffer.from('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'),
754
739
  TNS_EXTENT_OID: Buffer.from('00000000000000000000000000010001', 'hex')
755
740
  };
@@ -98,8 +98,7 @@ class AuthMessage extends Message {
98
98
  this.functionCode = constants.TNS_FUNC_AUTH_PHASE_TWO;
99
99
  this.privateKey = config.privateKey;
100
100
  if (this.privateKey) {
101
- this.privateKey = '-----BEGIN PRIVATE KEY-----\n' + this.privateKey;
102
- this.privateKey = this.privateKey + '\n' + '-----END PRIVATE KEY-----';
101
+ this.privateKey = util.normalizePrivateKey(this.privateKey);
103
102
  }
104
103
  this.serviceName = this.conn.serviceName;
105
104
  this.remoteAddress = this.conn.remoteAddress;
@@ -321,9 +320,14 @@ class AuthMessage extends Message {
321
320
  let portReleaseNum;
322
321
  let portUpdateNum;
323
322
 
323
+ this.conn.dbDomain = this.sessionData['AUTH_SC_DB_DOMAIN'];
324
+ this.conn.dbName = this.sessionData['AUTH_SC_DBUNIQUE_NAME'];
325
+ this.conn.maxOpenCursors = Number(this.sessionData['AUTH_MAX_OPEN_CURSORS'] || 0);
326
+ this.conn.serviceName = this.sessionData['AUTH_SC_SERVICE_NAME'];
324
327
  this.conn.instanceName = this.sessionData['AUTH_INSTANCENAME'];
325
328
  const fullVersionNum = Number(this.sessionData['AUTH_VERSION_NO']);
326
329
  const versionNum = (fullVersionNum >> 24) & 0xFF;
330
+ this.conn.warning = this.warning;
327
331
  if (buf.caps.ttcFieldVersion >= constants.TNS_CCAP_FIELD_VERSION_18_1_EXT_1) {
328
332
  releaseNum = (fullVersionNum >> 16) & 0xFF;
329
333
  updateNum = (fullVersionNum >> 12) & 0x0F;
@@ -1,4 +1,4 @@
1
- // Copyright (c) 2022, 2023, Oracle and/or its affiliates.
1
+ // Copyright (c) 2022, 2024, Oracle and/or its affiliates.
2
2
 
3
3
  //-----------------------------------------------------------------------------
4
4
  //
@@ -44,9 +44,9 @@ class Message {
44
44
  this.flushOutBinds = false;
45
45
  this.endToEndSeqNum = 0;
46
46
  this.errorOccurred = false;
47
- this.isWarning = false;
48
47
  this.flushOutBinds = false;
49
48
  this.processedError = false;
49
+ this.warning = undefined;
50
50
  }
51
51
 
52
52
  preProcess() { }
@@ -69,13 +69,16 @@ class Message {
69
69
  buf.skipUB2(); // array elem error
70
70
  buf.skipUB2(); // array elem error
71
71
  this.errorInfo.cursorId = buf.readUB2(); // cursor id
72
- this.errorInfo.pos = buf.readUB2(); // error position
73
- buf.skipUB1(); // sql type
72
+ const errorPos = buf.readSB2(); // error position
73
+ buf.skipUB1(); // sql type (19c and earlier)
74
74
  buf.skipUB1(); // fatal ?
75
- buf.skipUB2(); // flags
76
- buf.skipUB2(); // user cursor options
75
+ buf.skipUB1(); // flags
76
+ buf.skipUB1(); // user cursor options
77
77
  buf.skipUB1(); // UPI parameter
78
- buf.skipUB1(); // warning flag
78
+ const warnFlag = buf.readUInt8(); // warning flag
79
+ if (warnFlag & constants.TNS_WARN_COMPILATION_CREATE) {
80
+ this.warning = errors.getErr(errors.WRN_COMPILATION_CREATE);
81
+ }
79
82
  this.errorInfo.rowID = buf.readRowID(); // rowid
80
83
  buf.skipUB4(); // OS error
81
84
  buf.skipUB1(); // statement error
@@ -87,11 +90,11 @@ class Message {
87
90
  buf.skipBytesChunked();
88
91
  }
89
92
  // batch error codes
90
- let numEntries = buf.readUB2(); // batch error codes array
91
- if (numEntries > 0) {
93
+ const numErrors = buf.readUB2(); // batch error codes array
94
+ if (numErrors > 0) {
92
95
  this.errorInfo.batchErrors = [];
93
96
  const firstByte = buf.readUInt8();
94
- for (let i = 0; i < numEntries; i++) {
97
+ for (let i = 0; i < numErrors; i++) {
95
98
  if (firstByte === constants.TNS_LONG_LENGTH_INDICATOR) {
96
99
  buf.skipUB4(); // chunk length ignored
97
100
  }
@@ -104,14 +107,21 @@ class Message {
104
107
  }
105
108
 
106
109
  // batch error offset
107
- numEntries = buf.readUB2(); // batch error row offset array
108
- if (numEntries > 0) {
110
+ const numOffsets = buf.readUB4(); // batch error row offset array
111
+ if (numOffsets > 0) {
112
+ if (numOffsets > 65535) {
113
+ errors.throwErr(errors.ERR_TOO_MANY_BATCH_ERRORS);
114
+ }
109
115
  const firstByte = buf.readUInt8();
110
- for (let i = 0; i < numEntries; i++) {
116
+ let offset;
117
+ for (let i = 0; i < numOffsets; i++) {
111
118
  if (firstByte === constants.TNS_LONG_LENGTH_INDICATOR) {
112
119
  buf.skipUB4(); // chunk length ignored
113
120
  }
114
- this.errorInfo.batchErrors[i].offset = buf.readUB4();
121
+ offset = buf.readUB4();
122
+ if (i < numErrors) {
123
+ this.errorInfo.batchErrors[i].offset = offset;
124
+ }
115
125
  }
116
126
  if (firstByte === constants.TNS_LONG_LENGTH_INDICATOR) {
117
127
  buf.skipBytes(1); // ignore end marker
@@ -119,10 +129,10 @@ class Message {
119
129
  }
120
130
 
121
131
  // batch error messages
122
- numEntries = buf.readUB2(); // batch error messages array
123
- if (numEntries > 0) {
132
+ const errMsgArr = buf.readUB2(); // batch error messages array
133
+ if (errMsgArr > 0) {
124
134
  buf.skipBytes(1); // ignore packed size
125
- for (let i = 0; i < numEntries; i++) {
135
+ for (let i = 0; i < errMsgArr; i++) {
126
136
  buf.skipUB2(); // skip chunk length
127
137
 
128
138
  this.errorInfo.batchErrors[i].message = buf.readStr(constants.CSFRM_IMPLICIT);
@@ -132,28 +142,40 @@ class Message {
132
142
 
133
143
  this.errorInfo.num = buf.readUB4(); // error number (extended)
134
144
  this.errorInfo.rowCount = buf.readUB8(); // row number (extended)
145
+
146
+ // fields added in Oracle Database 20c
147
+ if (buf.caps.ttcFieldVersion >= constants.TNS_CCAP_FIELD_VERSION_20_1) {
148
+ buf.skipUB4(); // sql type
149
+ buf.skipUB4(); // server checksum
150
+ }
151
+
152
+ // error message
135
153
  if (this.errorInfo.num !== 0) {
136
154
  this.errorOccurred = true;
155
+ if (errorPos >= 0) {
156
+ this.errorInfo.pos = errorPos;
157
+ }
137
158
  this.errorInfo.message = buf.readStr(constants.CSFRM_IMPLICIT);
138
159
  /*
139
160
  * Remove ending newline from ORA error message
140
161
  */
141
- this.errorInfo.message = this.errorInfo.message.replace(/\n+$/, "");
162
+ this.errorInfo.message = this.errorInfo.message.trim();
142
163
  }
143
- this.errorInfo.isWarning = false;
144
164
  this.processedError = true;
145
165
  }
146
166
 
147
167
  processReturnParameter() { }
148
168
 
149
169
  processWarningInfo(buf) {
150
- this.errorInfo.num = buf.readUB2(); // error number
151
- const numBytes = buf.readUB2(); // length of error message
152
- buf.skipUB2(); // flags
153
- if (this.errorInfo.num != 0 && numBytes > 0) {
154
- this.errorInfo.message = buf.readStr(constants.CSFRM_IMPLICIT);
170
+ const errNum = buf.readUB2(); // warning number
171
+ const numBytes = buf.readUB2(); // length of warning message
172
+ buf.skipUB2(); // flags
173
+ if (errNum != 0 && numBytes > 0) {
174
+ // get message string and remove the ending newline.
175
+ const message = buf.readStr(constants.CSFRM_IMPLICIT).trim();
176
+ this.warning = new Error(message);
177
+ this.warning.errorNum = errNum;
155
178
  }
156
- this.errorInfo.isWarning = true;
157
179
  }
158
180
 
159
181
  hasMoreData(buf) {
@@ -260,7 +282,7 @@ class Message {
260
282
  const flags = buf.readUB4(); // session flags
261
283
  if (flags & constants.TNS_SESSGET_SESSION_CHANGED) {
262
284
  if (this.connection._drcpEstablishSession) {
263
- this.connection.resetStatementCache();
285
+ this.connection.statementCache.clearOpenCursors();
264
286
  }
265
287
  }
266
288
  this.connection._drcpEstablishSession = false;
@@ -275,7 +297,7 @@ class Message {
275
297
  if (this.connection._currentSchemaModified) {
276
298
  this._writeCurrentSchemaPiggyback(buf);
277
299
  }
278
- if (this.connection._cursorsToClose.size > 0 && !this.connection._drcpEstablishSession) {
300
+ if (this.connection.statementCache._cursorsToClose.size > 0 && !this.connection._drcpEstablishSession) {
279
301
  this.writeCloseCursorsPiggyBack(buf);
280
302
  }
281
303
  if (
@@ -304,11 +326,7 @@ class Message {
304
326
  writeCloseCursorsPiggyBack(buf) {
305
327
  this.writePiggybackHeader(buf, constants.TNS_FUNC_CLOSE_CURSORS);
306
328
  buf.writeUInt8(1);
307
- buf.writeUB4(this.connection._cursorsToClose.size);
308
- for (const cursorNum of this.connection._cursorsToClose.keys()) {
309
- buf.writeUB4(cursorNum);
310
- }
311
- this.connection._cursorsToClose.clear();
329
+ this.connection.statementCache.writeCursorsToClose(buf);
312
330
  }
313
331
 
314
332
  writeCloseTempLobsPiggyback(buf) {
@@ -1,4 +1,4 @@
1
- // Copyright (c) 2022, 2023, Oracle and/or its affiliates.
1
+ // Copyright (c) 2022, 2024, Oracle and/or its affiliates.
2
2
 
3
3
  //-----------------------------------------------------------------------------
4
4
  //
@@ -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.TNS_TYPE_REP_UNIVERSAL],
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.TNS_DATA_TYPE_NEW_OAC, constants.TNS_DATA_TYPE_NEW_OAC, constants.TNS_TYPE_REP_UNIVERSAL],
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.TNS_DATA_TYPE_OAC, constants.TNS_DATA_TYPE_NEW_OAC, constants.TNS_TYPE_REP_UNIVERSAL],
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.TNS_DATA_TYPE_OER, constants.TNS_DATA_TYPE_OER, constants.TNS_TYPE_REP_UNIVERSAL],
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,12 @@ 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],
396
+ [constants.TNS_DATA_TYPE_VECTOR, constants.TNS_DATA_TYPE_VECTOR, constants.TNS_TYPE_REP_UNIVERSAL]
393
397
  ];
394
398
 
395
399
  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 temp16;
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.TNS_LOB_OP_CREATE_TEMP
193
- || this.operation === constants.TNS_LOB_OP_IS_OPEN) {
194
- temp16 = buf.readUB2();
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