oracledb 6.7.0 → 6.7.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.
Files changed (41) hide show
  1. package/README.md +2 -2
  2. package/build/Release/Linux_cmds.txt +972 -0
  3. package/build/Release/oracledb-6.7.1-darwin-arm64.node +0 -0
  4. package/build/Release/oracledb-6.7.1-darwin-arm64.node-buildinfo.txt +1 -0
  5. package/build/Release/oracledb-6.7.1-darwin-x64.node +0 -0
  6. package/build/Release/oracledb-6.7.1-darwin-x64.node-buildinfo.txt +1 -0
  7. package/build/Release/oracledb-6.7.1-js-buildinfo.txt +1 -0
  8. package/build/Release/oracledb-6.7.1-linux-arm64.node +0 -0
  9. package/build/Release/oracledb-6.7.1-linux-arm64.node-buildinfo.txt +1 -0
  10. package/build/Release/oracledb-6.7.1-linux-x64.node +0 -0
  11. package/build/Release/oracledb-6.7.1-linux-x64.node-buildinfo.txt +1 -0
  12. package/build/Release/oracledb-6.7.1-win32-x64.node +0 -0
  13. package/build/Release/oracledb-6.7.1-win32-x64.node-buildinfo.txt +1 -0
  14. package/examples/example.js +5 -5
  15. package/lib/connection.js +5 -0
  16. package/lib/errors.js +14 -9
  17. package/lib/oracledb.js +2 -2
  18. package/lib/thin/dbObject.js +13 -4
  19. package/lib/thin/protocol/constants.js +1 -1
  20. package/lib/thin/protocol/messages/withData.js +4 -6
  21. package/lib/thin/sqlnet/connStrategy.js +3 -2
  22. package/lib/thin/sqlnet/navNodes.js +16 -21
  23. package/lib/thin/sqlnet/networkSession.js +9 -5
  24. package/lib/thin/sqlnet/ntTcp.js +11 -5
  25. package/lib/thin/sqlnet/nvStrToNvPair.js +23 -26
  26. package/lib/thin/sqlnet/paramParser.js +42 -43
  27. package/lib/util.js +1 -3
  28. package/lib/version.js +1 -1
  29. package/package.json +1 -1
  30. package/build/Release/oracledb-6.7.0-darwin-arm64.node +0 -0
  31. package/build/Release/oracledb-6.7.0-darwin-arm64.node-buildinfo.txt +0 -1
  32. package/build/Release/oracledb-6.7.0-darwin-x64.node +0 -0
  33. package/build/Release/oracledb-6.7.0-darwin-x64.node-buildinfo.txt +0 -1
  34. package/build/Release/oracledb-6.7.0-js-buildinfo.txt +0 -1
  35. package/build/Release/oracledb-6.7.0-linux-arm64.node +0 -0
  36. package/build/Release/oracledb-6.7.0-linux-arm64.node-buildinfo.txt +0 -1
  37. package/build/Release/oracledb-6.7.0-linux-x64.node +0 -0
  38. package/build/Release/oracledb-6.7.0-linux-x64.node-buildinfo.txt +0 -1
  39. package/build/Release/oracledb-6.7.0-win32-x64.node +0 -0
  40. package/build/Release/oracledb-6.7.0-win32-x64.node-buildinfo.txt +0 -1
  41. package/examples/README.md +0 -140
@@ -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
  //
@@ -26,7 +26,7 @@
26
26
 
27
27
  'use strict';
28
28
 
29
- const {createNVPair, findValue} = require("./nvStrToNvPair.js");
29
+ const {createNVPair} = require("./nvStrToNvPair.js");
30
30
  const fs = require('fs');
31
31
  const process = require('process');
32
32
  const readline = require('readline');
@@ -59,12 +59,21 @@ function tnsnamesFilePath(configDir) {
59
59
  return filePathVal;
60
60
  }
61
61
  }
62
+ //Structure for each tnsnames.ora file
63
+ class tnsnamesElement {
62
64
 
65
+ constructor() {
66
+ this.readInProgress = false;
67
+ this.waiters = [];
68
+ this.aliasht = new Map(); // It will have key as alias and value as its aliases value
69
+ this.modTime = new Map(); // It will have tnsnames filename and also all its ifile and its modified time
70
+ }
71
+ }
63
72
  class NLParamParser {
64
73
 
65
74
  constructor() {
66
- this.waiters = [];
67
- this.readInProgress = false;
75
+ // key as tnsnames.ora(file_name) and value will be tnsnamesStruct<ht(alias key and value), modTime>
76
+ this.tnsnamesHT = new Map();
68
77
  }
69
78
  /**
70
79
  * Reads the given file line by line and stores the
@@ -73,29 +82,35 @@ class NLParamParser {
73
82
  * @returns {Promise}
74
83
  */
75
84
  async initializeNlpa(file_path) {
76
- if (this.readInProgress) {
85
+ let tnsFileStruct;
86
+ if (this.tnsnamesHT.has(file_path))
87
+ tnsFileStruct = this.tnsnamesHT.get(file_path);
88
+ else
89
+ tnsFileStruct = new tnsnamesElement();
90
+ if (tnsFileStruct.readInProgress) {
77
91
  await new Promise((resolve) => {
78
- this.waiters.push(resolve);
92
+ tnsFileStruct.waiters.push(resolve);
79
93
  });
80
94
  }
81
- if (!this.checkModfTime()) {
95
+ /* check modification time of all files in the cache
96
+ including the file_path */
97
+ if (!this.checkModfTime(tnsFileStruct)) {
82
98
  /* No File has been modified */
83
- return this.ht;
99
+ return tnsFileStruct.aliasht;
84
100
  }
85
- this.ht = new Map();
86
- this.modTime = new Map(); //stores modified time of each IFile
87
- this.readInProgress = true;
88
- await this.start(file_path, 0); //start with 0 depth (tnsnames.ora)
89
- return this.ht;
101
+ tnsFileStruct.readInProgress = true;
102
+ await this.start(file_path, 0, tnsFileStruct); //start with 0 depth (tnsnames.ora)
103
+ this.tnsnamesHT.set(file_path, tnsFileStruct);
104
+ return tnsFileStruct.aliasht;
90
105
  }
91
106
 
92
- async start(file_path, depth) {
107
+ async start(file_path, depth, tnsFileStruct) {
93
108
 
94
109
  if (depth > MAX_IFILE_DEPTH)
95
110
  return; //ignore after max depth
96
111
  const stat = fs.statSync(file_path);
97
112
  // store file path and its modified time.
98
- this.modTime.set(file_path, stat.mtime);
113
+ tnsFileStruct.modTime.set(file_path, stat.mtime);
99
114
  // Creating a readable stream from file
100
115
  // readline module reads line by line
101
116
  // but from a readable stream only.
@@ -129,7 +144,7 @@ class NLParamParser {
129
144
  nvElem = nvElem + line;
130
145
 
131
146
  } else if (nvElem.length != 0) {
132
- await this.addNLPListElement(nvElem, depth); // Add Parameter to Hashtable
147
+ await this.addNLPListElement(nvElem, depth, tnsFileStruct); // Add Parameter to Hashtable
133
148
  nvElem = ""; // Clear first, before storing current line
134
149
 
135
150
  line = this.checkNLPforComments(line);
@@ -138,12 +153,12 @@ class NLParamParser {
138
153
  }
139
154
  }
140
155
  if (nvElem.length != 0) { // at eof, still one more parameter to read
141
- await this.addNLPListElement(nvElem, depth);
156
+ await this.addNLPListElement(nvElem, depth, tnsFileStruct);
142
157
  nvElem = ""; // clear nvElem buffer after added
143
158
  }
144
- this.readInProgress = false;
159
+ tnsFileStruct.readInProgress = false;
145
160
  let waiter;
146
- while ((waiter = this.waiters.pop())) {
161
+ while ((waiter = tnsFileStruct.waiters.pop())) {
147
162
  waiter();
148
163
  }
149
164
  }
@@ -173,9 +188,11 @@ class NLParamParser {
173
188
  return str1.join('');
174
189
  }
175
190
  // check if any of the IFiles has been changed
176
- checkModfTime() {
177
- if (this.modTime) {
178
- for (const [key, value] of this.modTime) {
191
+ checkModfTime(tnsFileStruct) {
192
+ // There may be multiple tnsnames.ora files. So check if the tnsnames.ora
193
+ // in question is already cached
194
+ if (tnsFileStruct.modTime.size != 0) {
195
+ for (const [key, value] of tnsFileStruct.modTime) {
179
196
  if (fs.existsSync(key)) {
180
197
  const stat = fs.statSync(key);
181
198
  if ((stat.mtime - value > 0)) {
@@ -193,7 +210,7 @@ class NLParamParser {
193
210
  * adds name value pairs from the input buffer into the hash table.
194
211
  * @param {string} ibuf
195
212
  */
196
- async addNLPListElement(ibuf, depth) {
213
+ async addNLPListElement(ibuf, depth, tnsFileStruct) {
197
214
  const res = ibuf.split(/\r?\n/).filter(element => element);
198
215
  for (let i = 0; i < res.length; i++) {
199
216
  if (res[i].charAt(0) != '(') {
@@ -205,33 +222,15 @@ class NLParamParser {
205
222
  nvp.name = uname;
206
223
  // support for ifile
207
224
  if (uname == 'IFILE') {
208
- await this.start(nvp.atom, depth + 1);
225
+ await this.start(nvp.atom, depth + 1, tnsFileStruct);
209
226
  } else {
210
227
  const unames = uname.split(","); //multiple aliases (alias1, alias2, alias3)
211
228
  for (let i = 0; i < unames.length; i++) {
212
- this.ht.set(unames[i], nvp);
229
+ tnsFileStruct.aliasht.set(unames[i], nvp);
213
230
  }
214
231
  }
215
232
  }
216
233
  }
217
- toString() {
218
- let out = "";
219
- this.ht.forEach((value) => {
220
- out = out + value.toString() + "\n";
221
- });
222
- return out;
223
- }
224
- /**
225
- * if key is address/port then it returns the port value from the
226
- * address NVPAIR.
227
- * @param {string} key
228
- * @returns {string}
229
- */
230
- findValueOf(key) {
231
- const myarr = key.split('/');
232
- return (findValue(this.ht.get(myarr[0].toUpperCase()), myarr));
233
- }
234
-
235
234
  }
236
235
 
237
236
  module.exports = {
package/lib/util.js CHANGED
@@ -171,9 +171,7 @@ function traceExitFn(traceContext, result, err) {
171
171
  }
172
172
 
173
173
  // Fill the traceContext.
174
- if (err) {
175
- traceContext.error = Object.assign(({}, err));
176
- }
174
+ traceContext.error = err;
177
175
  traceContext.additionalConfig.result = result;
178
176
  if (this._impl) {
179
177
  // fill function call state.
package/lib/version.js CHANGED
@@ -31,6 +31,6 @@
31
31
  module.exports = {
32
32
  VERSION_MAJOR: 6,
33
33
  VERSION_MINOR: 7,
34
- VERSION_PATCH: 0,
34
+ VERSION_PATCH: 1,
35
35
  VERSION_SUFFIX: ''
36
36
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "oracledb",
3
- "version": "6.7.0",
3
+ "version": "6.7.1",
4
4
  "description": "A Node.js module for Oracle Database access from JavaScript and TypeScript",
5
5
  "license": "(Apache-2.0 OR UPL-1.0)",
6
6
  "homepage": "http://oracle.github.io/node-oracledb/",
@@ -1 +0,0 @@
1
- oracledb-6.7.0-darwin-arm64.node v22.2.0 29e0b9cfc2f22f3df1e6b746323fb5f1f95ba492 3f4e00888d20e313374cfe0fb148de2180eaf93f Thu, 07 Nov 2024 06:28:34 GMT
@@ -1 +0,0 @@
1
- oracledb-6.7.0-darwin-x64.node v20.11.1 29e0b9cfc2f22f3df1e6b746323fb5f1f95ba492 3f4e00888d20e313374cfe0fb148de2180eaf93f Thu, 07 Nov 2024 06:21:29 GMT
@@ -1 +0,0 @@
1
- 29e0b9cfc2f22f3df1e6b746323fb5f1f95ba492
@@ -1 +0,0 @@
1
- oracledb-6.7.0-linux-arm64.node v18.20.4 29e0b9cfc2f22f3df1e6b746323fb5f1f95ba492 3f4e00888d20e313374cfe0fb148de2180eaf93f Thu, 07 Nov 2024 16:48:12 GMT
@@ -1 +0,0 @@
1
- oracledb-6.7.0-linux-x64.node v16.20.2 29e0b9cfc2f22f3df1e6b746323fb5f1f95ba492 3f4e00888d20e313374cfe0fb148de2180eaf93f Thu, 07 Nov 2024 16:47:47 GMT
@@ -1 +0,0 @@
1
- oracledb-6.7.0-win32-x64.node v18.16.0 29e0b9cfc2f22f3df1e6b746323fb5f1f95ba492 3f4e00888d20e313374cfe0fb148de2180eaf93f Thu, 07 Nov 2024 16:23:47 GMT
@@ -1,140 +0,0 @@
1
- # Node-oracledb Examples
2
-
3
- The directory in node-oracledb's [Github repository](https://github.com/oracle/node-oracledb/tree/main/examples) contains a lot of [node-oracledb](https://www.npmjs.com/package/oracledb) examples.
4
- Documentation is [here](https://node-oracledb.readthedocs.io/en/latest/).
5
-
6
- To run the examples:
7
-
8
- - [Install node-oracledb](https://node-oracledb.readthedocs.io/en/latest/user_guide/installation.html#quickstart).
9
-
10
- - Ensure that you navigate to the `examples` directory in your terminal window
11
- or IDE, where you are running the samples.
12
-
13
- - Review `dbconfig.js`.
14
-
15
- In your terminal window or IDE, set the following environment variables to
16
- provide credentials for the `dbconfig.js` file.
17
-
18
- - `NODE_ORACLEDB_USER` must be set to the database user.
19
-
20
- - `NODE_ORACLEDB_PASSWORD` must be set to the database password.
21
-
22
- - `NODE_ORACLEDB_CONNECTIONSTRING` must be set to the connection string that points to your database's location.
23
-
24
- - `NODE_ORACLEDB_EXTERNALAUTH` provides the options for enabling external authentication. Setting this environment variable to "true" will enable external authentication. To ensure external authentication works, firstly make sure the Oracle external authentication service is correctly configured. See [Documentation for External Authentication](https://node-oracledb.readthedocs.io/en/latest/user_guide/connection_handling.html#extauth) for details.
25
-
26
- - `NODE_ORACLEDB_DRIVER_MODE` provides an option to set the 'Thin' or 'Thick' modes of node-oracledb. Setting this environment variable to "thick" will enable Thick mode.
27
- Setting it to "thin" will retain the Thin mode. The default mode is Thin.
28
-
29
- - `NODE_ORACLEDB_WALLET_LOCATION` must be set to the local directory name for the wallets that may be required for mutual TLS (mTLS) connections, especially to Oracle Cloud
30
- Autonomous Databases optionally. The wallet location can also be provided as a part of the database connect string.
31
-
32
- - `NODE_ORACLEDB_WALLET_PASSWORD` must set to the password for the wallets that may be required for mutual TLS (mTLS) connections, especially to Oracle Cloud Autonomous Databases.
33
-
34
- - `NODE_ORACLEDB_CLIENT_LIB_DIR` provides an optional path for the Oracle Client libraries to be used on Windows and macOS platforms, when using Thick mode in node-oracledb.
35
-
36
- Review the examples and then run them individually. For example, to see what
37
- the file `example.js` does, use:
38
-
39
- ```
40
- node example.js
41
- ```
42
-
43
- After running the examples, the demonstration objects can be dropped with
44
- `demodrop.js`:
45
-
46
- ```
47
- node demodrop.js
48
- ```
49
-
50
- Many examples can be run in either node-oracledb Thin (the default) or Thick
51
- modes. Thin mode is a pure JavaScript implementation of node-oracledb.
52
- Setting the environment variable `NODE_ORACLEDB_DRIVER_MODE` to `'thick'` will
53
- make examples use Thick mode.
54
-
55
- ## Example Overview
56
-
57
- If this is your first time with node-oracledb, start with
58
- [`example.js`](example.js).
59
-
60
- File Name | Description
61
- ----------------------------------------------------------|----------------------------------------------------------------------------------
62
- [`aqmulti.js`](aqmulti.js) | Oracle Advanced Queuing (AQ) example passing multiple messages
63
- [`aqobject.js`](aqobject.js) | Oracle Advanced Queuing (AQ) example passing an Oracle Database object
64
- [`aqoptions.js`](aqoptions.js) | Oracle Advanced Queuing (AQ) example setting options and message attributes
65
- [`aqraw.js`](aqraw.js) | Basic Oracle Advanced Queuing (AQ) example passing text messages
66
- [`aqutil.js`](aqutil.js) | Common file to setup the user credentials for all the Advanced Queuing (AQ) examples.
67
- [`blobhttp.js`](blobhttp.js) | Simple web app that streams an image
68
- [`azureConfigProvider.js`](azureConfigProvider.js) | Show how to connect to an Oracle Database using Azure Configuration Providers
69
- [`calltimeout.js`](calltimeout.js) | Shows how to cancel a SQL statement if it doesn't complete in a specified time
70
- [`connect.js`](connect.js) | Basic example for creating a standalone (non-pooled) connection
71
- [`connectionpool.js`](connectionpool.js) | Basic example creating a pool of connections
72
- [`cqn1.js`](cqn1.js) | Basic Continuous Query Notification (CQN) example
73
- [`cqn2.js`](cqn2.js) | Continuous Query Notification with notification grouping
74
- [`date_timestamp1.js`](date_timestamp1.js) | Show some basic DATE and TIMESTAMP behaviors
75
- [`date_timestamp2.js`](date_timestamp2.js) | Show some DATE and TIMESTAMP behaviors with timezones
76
- [`dbconfig.js`](dbconfig.js) | Common file used by examples for setting connection credentials
77
- [`dbmsoutputgetline.js`](dbmsoutputgetline.js) | Show fetching DBMS_OUTPUT by binding buffers
78
- [`dbmsoutputpipe.js`](dbmsoutputpipe.js) | Show fetching DBMS_OUTPUT by using a pipelined table
79
- [`demodrop.js`](demodrop.js) | Drops the schema objects created by the examples
80
- [`demosetup.js`](demosetup.js) | Used to create common schema objects for the examples
81
- [`dmlrupd.js`](dmlrupd.js) | Example of DML RETURNING where multiple rows are matched
82
- [`em_batcherrors.js`](em_batcherrors.js) | `executeMany()` example showing handling data errors
83
- [`em_dmlreturn1.js`](em_dmlreturn1.js) | `executeMany()` example of DML RETURNING that returns single values
84
- [`em_dmlreturn2.js`](em_dmlreturn2.js) | `executeMany()` example of DML RETURNING that returns multiple values
85
- [`em_insert1.js`](em_insert1.js) | Array DML example using `executeMany()` with bind-by-name syntax
86
- [`em_insert2.js`](em_insert2.js) | Array DML example using `executeMany()` with bind by position
87
- [`em_plsql.js`](em_plsql.js) | `executeMany()` example calling PL/SQL multiple times with one call
88
- [`em_rowcounts.js`](em_rowcounts.js) | `executeMany()` example showing how to find the number of rows affected by each input row
89
- [`endtoend.js`](endtoend.js) | Example showing setting tracing attributes
90
- [`example.js`](example.js) | Basic example showing creating a table, inserting multiple rows, and querying rows
91
- [`impres.js`](impres.js) | Shows PL/SQL 'Implict Results' returning multiple query results from PL/SQL code.
92
- [`insert1.js`](insert1.js) | Basic example creating a table and inserting data. Shows DDL and DML
93
- [`insert2.js`](insert2.js) | Basic example showing auto commit behavior
94
- [`lastinsertid.js`](lastinsertid.js) | Shows inserting a row and getting its ROWID.
95
- [`lobbinds.js`](lobbinds.js) | Demonstrates how to bind and query LOBs
96
- [`lobinsert1.js`](lobinsert1.js) | Shows inserting a file into a CLOB column
97
- [`lobinsert2.js`](lobinsert2.js) | Inserts text into a CLOB column using the RETURNING INTO method.
98
- [`lobinserttemp.js`](lobinserttemp.js) | Writes data to a Temporary CLOB and then inserts it into the database
99
- [`lobplsqltemp.js`](lobplsqltemp.js) | Streams data into a Temporary CLOB and then passes it to PL/SQL
100
- [`lobselect.js`](lobselect.js) | Shows basic, non-streaming CLOB and BLOB queries
101
- [`lobstream1.js`](lobstream1.js) | Shows how to stream LOBs to files
102
- [`lobstream2.js`](lobstream2.js) | Shows using Stream data events to fetch a CLOB
103
- [`lowercasecolumns.js`](lowercasecolumns.js) | Shows how a type handler can convert column names to lower case
104
- [`metadata.js`](metadata.js) | Shows the metadata available after executing SELECT statements
105
- [`ociConfigProvider.js`](ociConfigProvider.js) | Show how to connect to an Oracle Database using OCI Configuration Providers
106
- [`plsqlarray.js`](plsqlarray.js) | Examples of binding PL/SQL "INDEX BY" tables
107
- [`plsqlfunc.js`](plsqlfunc.js) | How to call a PL/SQL function
108
- [`plsqlproc.js`](plsqlproc.js) | How to call a PL/SQL procedure
109
- [`plsqlrecord.js`](plsqlrecord.js) | Shows binding of PL/SQL RECORDS
110
- [`plsqlvarrayrecord.js`](plsqlvarrayrecord.js) | Shows binding a VARRAY of RECORD in PL/SQL
111
- [`plsqlrowtype.js`](plsqlrowtype.js) | Shows binding of PL/SQL %ROWTYPE object
112
- [`raw.js`](raw.js) | Shows using a Buffer to insert and select a RAW
113
- [`refcursor.js`](refcursor.js) | Shows using a ResultSet to fetch rows from a REF CURSOR
114
- [`refcursortoquerystream.js`](refcursortoquerystream.js) | Converts a REF CURSOR returned from `execute()` to a query stream.
115
- [`resultset1.js`](resultset1.js) | Executes a query and uses a ResultSet to fetch rows with `getRow()`
116
- [`resultset2.js`](resultset2.js) | Executes a query and uses a ResultSet to fetch batches of rows with `getRows()`
117
- [`resultsettoquerystream.js`](resultsettoquerystream.js) | Converts a ResultSet returned from `execute()` into a Readable Stream.
118
- [`rowlimit.js`](rowlimit.js) | Shows ways to limit the number of records fetched by queries
119
- [`sampleazuretokenauth.js`](sampleazuretokenauth.js) | Shows connection pooling with Azure token based authentication.
120
- [`sampleocitokenauth.js`](sampleocitokenauth.js) | Shows connection pooling with OCI OAuth 2.0 token based authentication.
121
- [`select1.js`](select1.js) | Executes a basic query without using a connection pool or ResultSet
122
- [`select2.js`](select2.js) | Executes queries to show array and object output formats
123
- [`selectgeometry.js`](selectgeometry.js) | Insert and query Oracle Spatial geometries
124
- [`selectjson.js`](selectjson.js) | Shows some JSON features of Oracle Database 21c
125
- [`selectjsonblob.js`](selectjsonblob.js) | Shows how to use a BLOB as a JSON column store
126
- [`selectobject.js`](selectobject.js) | Insert and query a named Oracle database object
127
- [`selectnestedcursor.js`](selectnestedcursor.js) | Shows selecting from a nested cursor
128
- [`selectstream.js`](selectstream.js) | Executes a basic query using a Readable Stream
129
- [`selectvarray.js`](selectvarray.js) | Shows inserting and selecting from a VARRAY column
130
- [`sessionfixup.js`](sessionfixup.js) | Shows a pooled connection callback to efficiently set session state
131
- [`sessiontagging1.js`](sessiontagging1.js) | Simple pooled connection tagging for setting session state
132
- [`sessiontagging2.js`](sessiontagging2.js) | More complex example of pooled connection tagging for setting session state
133
- [`soda1.js`](soda1.js) | Basic Simple Oracle Document Access (SODA) example
134
- [`typehandlerdate.js`](typehandlerdate.js) | Show how a type handler can format a queried date in a locale-specific way
135
- [`typehandlernum.js`](typehandlernum.js) | Show how a type handler can alter queried numbers
136
- [`vectortype1.js`](vectortype1.js) | Insert and query VECTOR columns.
137
- [`vectortype2.js`](vectortype2.js) | Insert data into VECTOR columns and verify vector operations.
138
- [`version.js`](version.js) | Shows the node-oracledb version attributes
139
- [`webapp.js`](webapp.js) | A simple web application using a connection pool
140
- [`xmltypeInDbObject.js`](xmltypeInDbObject.js) | Work with XMLType data in DbObject (Thin mode only)