knex 3.2.3 → 3.2.5
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 +2447 -2441
- package/CONTRIBUTING.md +190 -190
- package/LICENSE +22 -22
- package/README.md +177 -156
- package/UPGRADING.md +245 -245
- package/bin/cli.js +516 -516
- package/bin/knexfile-runtime-error.js +27 -27
- package/bin/utils/cli-config-utils.js +217 -217
- package/bin/utils/constants.js +7 -7
- package/bin/utils/migrationsLister.js +37 -37
- package/knex.js +23 -23
- package/knex.mjs +11 -11
- package/lib/builder-interface-augmenter.js +120 -120
- package/lib/client.js +585 -585
- package/lib/constants.js +61 -61
- package/lib/dialects/better-sqlite3/index.js +101 -101
- package/lib/dialects/cockroachdb/crdb-columncompiler.js +14 -14
- package/lib/dialects/cockroachdb/crdb-querybuilder.js +11 -11
- package/lib/dialects/cockroachdb/crdb-querycompiler.js +122 -122
- package/lib/dialects/cockroachdb/crdb-tablecompiler.js +46 -46
- package/lib/dialects/cockroachdb/crdb-viewcompiler.js +15 -15
- package/lib/dialects/cockroachdb/index.js +86 -86
- package/lib/dialects/index.js +34 -34
- package/lib/dialects/mssql/index.js +498 -498
- package/lib/dialects/mssql/mssql-formatter.js +34 -34
- package/lib/dialects/mssql/query/mssql-querycompiler.js +601 -601
- package/lib/dialects/mssql/schema/mssql-columncompiler.js +185 -185
- package/lib/dialects/mssql/schema/mssql-compiler.js +91 -91
- package/lib/dialects/mssql/schema/mssql-tablecompiler.js +393 -393
- package/lib/dialects/mssql/schema/mssql-viewcompiler.js +55 -55
- package/lib/dialects/mssql/transaction.js +176 -176
- package/lib/dialects/mysql/index.js +317 -317
- package/lib/dialects/mysql/query/mysql-querybuilder.js +14 -14
- package/lib/dialects/mysql/query/mysql-querycompiler.js +292 -292
- package/lib/dialects/mysql/schema/mysql-columncompiler.js +193 -193
- package/lib/dialects/mysql/schema/mysql-compiler.js +60 -60
- package/lib/dialects/mysql/schema/mysql-tablecompiler.js +426 -426
- package/lib/dialects/mysql/schema/mysql-viewbuilder.js +21 -21
- package/lib/dialects/mysql/schema/mysql-viewcompiler.js +15 -15
- package/lib/dialects/mysql/transaction.js +46 -46
- package/lib/dialects/mysql2/index.js +53 -53
- package/lib/dialects/mysql2/transaction.js +44 -44
- package/lib/dialects/oracle/DEAD_CODE.md +5 -5
- package/lib/dialects/oracle/index.js +92 -92
- package/lib/dialects/oracle/query/oracle-querycompiler.js +343 -343
- package/lib/dialects/oracle/schema/internal/incrementUtils.js +22 -22
- package/lib/dialects/oracle/schema/internal/trigger.js +155 -155
- package/lib/dialects/oracle/schema/oracle-columnbuilder.js +17 -17
- package/lib/dialects/oracle/schema/oracle-columncompiler.js +126 -126
- package/lib/dialects/oracle/schema/oracle-compiler.js +124 -124
- package/lib/dialects/oracle/schema/oracle-tablecompiler.js +210 -210
- package/lib/dialects/oracle/utils.js +107 -107
- package/lib/dialects/oracledb/index.js +381 -381
- package/lib/dialects/oracledb/query/oracledb-querycompiler.js +481 -481
- package/lib/dialects/oracledb/schema/oracledb-columncompiler.js +61 -61
- package/lib/dialects/oracledb/schema/oracledb-tablecompiler.js +19 -19
- package/lib/dialects/oracledb/schema/oracledb-viewbuilder.js +13 -13
- package/lib/dialects/oracledb/schema/oracledb-viewcompiler.js +19 -19
- package/lib/dialects/oracledb/transaction.js +98 -98
- package/lib/dialects/oracledb/utils.js +208 -208
- package/lib/dialects/pgnative/index.js +60 -60
- package/lib/dialects/postgres/execution/pg-transaction.js +19 -19
- package/lib/dialects/postgres/index.js +373 -373
- package/lib/dialects/postgres/query/pg-querybuilder.js +43 -43
- package/lib/dialects/postgres/query/pg-querycompiler.js +400 -400
- package/lib/dialects/postgres/schema/pg-columncompiler.js +162 -162
- package/lib/dialects/postgres/schema/pg-compiler.js +138 -138
- package/lib/dialects/postgres/schema/pg-tablecompiler.js +331 -331
- package/lib/dialects/postgres/schema/pg-viewbuilder.js +21 -21
- package/lib/dialects/postgres/schema/pg-viewcompiler.js +35 -35
- package/lib/dialects/redshift/index.js +86 -86
- package/lib/dialects/redshift/query/redshift-querycompiler.js +163 -163
- package/lib/dialects/redshift/schema/redshift-columnbuilder.js +22 -22
- package/lib/dialects/redshift/schema/redshift-columncompiler.js +67 -67
- package/lib/dialects/redshift/schema/redshift-compiler.js +14 -14
- package/lib/dialects/redshift/schema/redshift-tablecompiler.js +134 -134
- package/lib/dialects/redshift/schema/redshift-viewcompiler.js +11 -11
- package/lib/dialects/redshift/transaction.js +32 -32
- package/lib/dialects/sqlite3/execution/sqlite-transaction.js +172 -172
- package/lib/dialects/sqlite3/index.js +263 -263
- package/lib/dialects/sqlite3/query/sqlite-querybuilder.js +33 -33
- package/lib/dialects/sqlite3/query/sqlite-querycompiler.js +341 -341
- package/lib/dialects/sqlite3/schema/ddl.js +380 -380
- package/lib/dialects/sqlite3/schema/internal/compiler.js +327 -327
- package/lib/dialects/sqlite3/schema/internal/parser-combinator.js +161 -161
- package/lib/dialects/sqlite3/schema/internal/parser.js +638 -638
- package/lib/dialects/sqlite3/schema/internal/sqlite-ddl-operations.js +41 -41
- package/lib/dialects/sqlite3/schema/internal/tokenizer.js +38 -38
- package/lib/dialects/sqlite3/schema/internal/utils.js +12 -12
- package/lib/dialects/sqlite3/schema/sqlite-columncompiler.js +50 -50
- package/lib/dialects/sqlite3/schema/sqlite-compiler.js +80 -80
- package/lib/dialects/sqlite3/schema/sqlite-tablecompiler.js +364 -364
- package/lib/dialects/sqlite3/schema/sqlite-viewcompiler.js +40 -40
- package/lib/execution/batch-insert.js +51 -51
- package/lib/execution/internal/delay.js +6 -6
- package/lib/execution/internal/ensure-connection-callback.js +41 -41
- package/lib/execution/internal/query-executioner.js +62 -62
- package/lib/execution/runner.js +325 -325
- package/lib/execution/transaction.js +417 -417
- package/lib/formatter/formatterUtils.js +42 -42
- package/lib/formatter/rawFormatter.js +84 -84
- package/lib/formatter/wrappingFormatter.js +253 -253
- package/lib/formatter.js +25 -25
- package/lib/index.js +3 -3
- package/lib/knex-builder/FunctionHelper.js +80 -80
- package/lib/knex-builder/Knex.js +59 -59
- package/lib/knex-builder/internal/config-resolver.js +57 -57
- package/lib/knex-builder/internal/parse-connection.js +87 -87
- package/lib/knex-builder/make-knex.js +345 -345
- package/lib/logger.js +76 -76
- package/lib/migrations/common/MigrationsLoader.js +36 -36
- package/lib/migrations/migrate/MigrationGenerator.js +84 -84
- package/lib/migrations/migrate/Migrator.js +632 -632
- package/lib/migrations/migrate/migrate-stub.js +17 -17
- package/lib/migrations/migrate/migration-list-resolver.js +33 -33
- package/lib/migrations/migrate/migrator-configuration-merger.js +58 -58
- package/lib/migrations/migrate/sources/fs-migrations.js +74 -74
- package/lib/migrations/migrate/stub/cjs.stub +15 -15
- package/lib/migrations/migrate/stub/coffee.stub +13 -13
- package/lib/migrations/migrate/stub/eg.stub +14 -14
- package/lib/migrations/migrate/stub/js-schema.stub +22 -22
- package/lib/migrations/migrate/stub/js.stub +22 -22
- package/lib/migrations/migrate/stub/knexfile-coffee.stub +34 -34
- package/lib/migrations/migrate/stub/knexfile-eg.stub +43 -43
- package/lib/migrations/migrate/stub/knexfile-js.stub +47 -47
- package/lib/migrations/migrate/stub/knexfile-ls.stub +35 -35
- package/lib/migrations/migrate/stub/knexfile-ts.stub +47 -47
- package/lib/migrations/migrate/stub/ls.stub +14 -14
- package/lib/migrations/migrate/stub/mjs.stub +23 -23
- package/lib/migrations/migrate/stub/ts-schema.stub +21 -21
- package/lib/migrations/migrate/stub/ts.stub +21 -21
- package/lib/migrations/migrate/table-creator.js +77 -77
- package/lib/migrations/migrate/table-resolver.js +27 -27
- package/lib/migrations/seed/Seeder.js +137 -137
- package/lib/migrations/seed/seed-stub.js +13 -13
- package/lib/migrations/seed/seeder-configuration-merger.js +60 -60
- package/lib/migrations/seed/sources/fs-seeds.js +65 -65
- package/lib/migrations/seed/stub/coffee.stub +9 -9
- package/lib/migrations/seed/stub/eg.stub +11 -11
- package/lib/migrations/seed/stub/js.stub +13 -13
- package/lib/migrations/seed/stub/ls.stub +11 -11
- package/lib/migrations/seed/stub/mjs.stub +12 -12
- package/lib/migrations/seed/stub/ts.stub +13 -13
- package/lib/migrations/util/fs.js +86 -86
- package/lib/migrations/util/import-file.js +12 -12
- package/lib/migrations/util/is-module-type.js +9 -9
- package/lib/migrations/util/template.js +52 -52
- package/lib/migrations/util/timestamp.js +14 -14
- package/lib/query/analytic.js +52 -52
- package/lib/query/constants.js +15 -15
- package/lib/query/joinclause.js +270 -270
- package/lib/query/method-constants.js +136 -136
- package/lib/query/querybuilder.js +1793 -1793
- package/lib/query/querycompiler.js +1634 -1634
- package/lib/raw.js +139 -139
- package/lib/ref.js +39 -39
- package/lib/schema/builder.js +115 -115
- package/lib/schema/columnbuilder.js +146 -146
- package/lib/schema/columncompiler.js +307 -307
- package/lib/schema/compiler.js +187 -187
- package/lib/schema/internal/helpers.js +55 -55
- package/lib/schema/tablebuilder.js +379 -379
- package/lib/schema/tablecompiler.js +450 -450
- package/lib/schema/viewbuilder.js +92 -92
- package/lib/schema/viewcompiler.js +138 -138
- package/lib/util/finally-mixin.js +13 -13
- package/lib/util/helpers.js +95 -95
- package/lib/util/is.js +32 -32
- package/lib/util/nanoid.js +40 -40
- package/lib/util/noop.js +1 -1
- package/lib/util/save-async-stack.js +14 -14
- package/lib/util/security.js +32 -32
- package/lib/util/string.js +190 -190
- package/lib/util/timeout.js +29 -29
- package/package.json +295 -293
- package/scripts/act-testing/act.sh +19 -19
- package/scripts/act-testing/merged-no-label.json +11 -11
- package/scripts/act-testing/merged-patch-labeled.json +12 -12
- package/scripts/act-testing/merged-skip-labeled.json +12 -12
- package/scripts/act-testing/not-merged-patch-labeled.json +12 -12
- package/scripts/build-for-release.sh +121 -121
- package/scripts/build.js +125 -125
- package/scripts/clean.js +31 -31
- package/scripts/docker-compose.yml +150 -150
- package/scripts/format-changelog.js +55 -55
- package/scripts/next-release-howto.md +24 -24
- package/scripts/oracledb-install-driver-libs.sh +82 -82
- package/scripts/release.sh +36 -36
- package/scripts/runkit-example.js +35 -35
- package/scripts/stress-test/README.txt +18 -18
- package/scripts/stress-test/docker-compose.yml +55 -55
- package/scripts/stress-test/knex-stress-test.js +212 -212
- package/scripts/stress-test/mysql2-random-hanging-every-now-and-then.js +149 -149
- package/scripts/stress-test/mysql2-sudden-exit-without-error.js +101 -101
- package/scripts/stress-test/reconnect-test-mysql-based-drivers.js +188 -188
- package/types/index.d.mts +14 -0
- package/types/index.d.ts +3321 -3321
- package/types/result.d.ts +27 -27
- package/types/tables.d.ts +4 -4
|
@@ -1,381 +1,381 @@
|
|
|
1
|
-
// Oracledb Client
|
|
2
|
-
// -------
|
|
3
|
-
const each = require('lodash/each');
|
|
4
|
-
const flatten = require('lodash/flatten');
|
|
5
|
-
const isEmpty = require('lodash/isEmpty');
|
|
6
|
-
const map = require('lodash/map');
|
|
7
|
-
|
|
8
|
-
const Formatter = require('../../formatter');
|
|
9
|
-
const QueryCompiler = require('./query/oracledb-querycompiler');
|
|
10
|
-
const TableCompiler = require('./schema/oracledb-tablecompiler');
|
|
11
|
-
const ColumnCompiler = require('./schema/oracledb-columncompiler');
|
|
12
|
-
const {
|
|
13
|
-
BlobHelper,
|
|
14
|
-
ReturningHelper,
|
|
15
|
-
monkeyPatchConnection,
|
|
16
|
-
} = require('./utils');
|
|
17
|
-
const ViewCompiler = require('./schema/oracledb-viewcompiler');
|
|
18
|
-
const ViewBuilder = require('./schema/oracledb-viewbuilder');
|
|
19
|
-
const Transaction = require('./transaction');
|
|
20
|
-
const Client_Oracle = require('../oracle');
|
|
21
|
-
const { isString } = require('../../util/is');
|
|
22
|
-
const { outputQuery, unwrapRaw } = require('../../formatter/wrappingFormatter');
|
|
23
|
-
const { compileCallback } = require('../../formatter/formatterUtils');
|
|
24
|
-
|
|
25
|
-
class Client_Oracledb extends Client_Oracle {
|
|
26
|
-
constructor(config) {
|
|
27
|
-
super(config);
|
|
28
|
-
|
|
29
|
-
if (this.version) {
|
|
30
|
-
// Normalize version format; null bad format
|
|
31
|
-
// to trigger fallback to auto-detect.
|
|
32
|
-
this.version = parseVersion(this.version);
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
if (this.driver) {
|
|
36
|
-
process.env.UV_THREADPOOL_SIZE = process.env.UV_THREADPOOL_SIZE || 1;
|
|
37
|
-
process.env.UV_THREADPOOL_SIZE =
|
|
38
|
-
parseInt(process.env.UV_THREADPOOL_SIZE) + this.driver.poolMax;
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
_driver() {
|
|
43
|
-
const client = this;
|
|
44
|
-
const oracledb = require('oracledb');
|
|
45
|
-
client.fetchAsString = [];
|
|
46
|
-
if (this.config.fetchAsString && Array.isArray(this.config.fetchAsString)) {
|
|
47
|
-
this.config.fetchAsString.forEach(function (type) {
|
|
48
|
-
if (!isString(type)) return;
|
|
49
|
-
type = type.toUpperCase();
|
|
50
|
-
if (oracledb[type]) {
|
|
51
|
-
if (
|
|
52
|
-
type !== 'NUMBER' &&
|
|
53
|
-
type !== 'DATE' &&
|
|
54
|
-
type !== 'CLOB' &&
|
|
55
|
-
type !== 'BUFFER'
|
|
56
|
-
) {
|
|
57
|
-
this.logger.warn(
|
|
58
|
-
'Only "date", "number", "clob" and "buffer" are supported for fetchAsString'
|
|
59
|
-
);
|
|
60
|
-
}
|
|
61
|
-
client.fetchAsString.push(oracledb[type]);
|
|
62
|
-
}
|
|
63
|
-
});
|
|
64
|
-
}
|
|
65
|
-
return oracledb;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
queryCompiler(builder, formatter) {
|
|
69
|
-
return new QueryCompiler(this, builder, formatter);
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
tableCompiler() {
|
|
73
|
-
return new TableCompiler(this, ...arguments);
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
columnCompiler() {
|
|
77
|
-
return new ColumnCompiler(this, ...arguments);
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
viewBuilder() {
|
|
81
|
-
return new ViewBuilder(this, ...arguments);
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
viewCompiler() {
|
|
85
|
-
return new ViewCompiler(this, ...arguments);
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
formatter(builder) {
|
|
89
|
-
return new Formatter(this, builder);
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
transaction() {
|
|
93
|
-
return new Transaction(this, ...arguments);
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
prepBindings(bindings) {
|
|
97
|
-
return map(bindings, (value) => {
|
|
98
|
-
if (value instanceof BlobHelper && this.driver) {
|
|
99
|
-
return { type: this.driver.BLOB, dir: this.driver.BIND_OUT };
|
|
100
|
-
// Returning helper always use ROWID as string
|
|
101
|
-
} else if (value instanceof ReturningHelper && this.driver) {
|
|
102
|
-
return { type: this.driver.STRING, dir: this.driver.BIND_OUT };
|
|
103
|
-
} else if (typeof value === 'boolean') {
|
|
104
|
-
return value ? 1 : 0;
|
|
105
|
-
}
|
|
106
|
-
return value;
|
|
107
|
-
});
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
// Checks whether a value is a function... if it is, we compile it
|
|
111
|
-
// otherwise we check whether it's a raw
|
|
112
|
-
parameter(value, builder, formatter) {
|
|
113
|
-
if (typeof value === 'function') {
|
|
114
|
-
return outputQuery(
|
|
115
|
-
compileCallback(value, undefined, this, formatter),
|
|
116
|
-
true,
|
|
117
|
-
builder,
|
|
118
|
-
this
|
|
119
|
-
);
|
|
120
|
-
} else if (value instanceof BlobHelper) {
|
|
121
|
-
formatter.bindings.push(value.value);
|
|
122
|
-
return '?';
|
|
123
|
-
}
|
|
124
|
-
return unwrapRaw(value, true, builder, this, formatter) || '?';
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
// Get a raw connection, called by the `pool` whenever a new
|
|
128
|
-
// connection needs to be added to the pool.
|
|
129
|
-
acquireRawConnection() {
|
|
130
|
-
return new Promise((resolver, rejecter) => {
|
|
131
|
-
// If external authentication don't have to worry about username/password and
|
|
132
|
-
// if not need to set the username and password
|
|
133
|
-
const oracleDbConfig = this.connectionSettings.externalAuth
|
|
134
|
-
? { externalAuth: this.connectionSettings.externalAuth }
|
|
135
|
-
: {
|
|
136
|
-
user: this.connectionSettings.user,
|
|
137
|
-
password: this.connectionSettings.password,
|
|
138
|
-
};
|
|
139
|
-
|
|
140
|
-
// In the case of external authentication connection string will be given
|
|
141
|
-
oracleDbConfig.connectString = resolveConnectString(
|
|
142
|
-
this.connectionSettings
|
|
143
|
-
);
|
|
144
|
-
|
|
145
|
-
if (this.connectionSettings.prefetchRowCount) {
|
|
146
|
-
oracleDbConfig.prefetchRows = this.connectionSettings.prefetchRowCount;
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
if (this.connectionSettings.stmtCacheSize !== undefined) {
|
|
150
|
-
oracleDbConfig.stmtCacheSize = this.connectionSettings.stmtCacheSize;
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
this.driver.fetchAsString = this.fetchAsString;
|
|
154
|
-
|
|
155
|
-
this.driver.getConnection(oracleDbConfig, (err, connection) => {
|
|
156
|
-
if (err) {
|
|
157
|
-
return rejecter(err);
|
|
158
|
-
}
|
|
159
|
-
monkeyPatchConnection(connection, this);
|
|
160
|
-
|
|
161
|
-
resolver(connection);
|
|
162
|
-
});
|
|
163
|
-
});
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
// Used to explicitly close a connection, called internally by the pool
|
|
167
|
-
// when a connection times out or the pool is shutdown.
|
|
168
|
-
destroyRawConnection(connection) {
|
|
169
|
-
return connection.release();
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
// Handle oracle version resolution on acquiring connection from pool instead of connection creation.
|
|
173
|
-
// Must do this here since only the client used to create a connection would be updated with version
|
|
174
|
-
// information on creation. Poses a problem when knex instance is cloned since instances share the
|
|
175
|
-
// connection pool while having their own client instances.
|
|
176
|
-
async acquireConnection() {
|
|
177
|
-
const connection = await super.acquireConnection();
|
|
178
|
-
this.checkVersion(connection);
|
|
179
|
-
return connection;
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
// In Oracle, we need to check the version to dynamically determine
|
|
183
|
-
// certain limits. If user did not specify a version, get it from the connection.
|
|
184
|
-
checkVersion(connection) {
|
|
185
|
-
// Already determined version before?
|
|
186
|
-
if (this.version) {
|
|
187
|
-
return this.version;
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
const detectedVersion = parseVersion(connection.oracleServerVersionString);
|
|
191
|
-
if (!detectedVersion) {
|
|
192
|
-
// When original version is set to null, user-provided version was invalid and we fell-back to auto-detect.
|
|
193
|
-
// Otherwise, we couldn't auto-detect at all. Set error message accordingly.
|
|
194
|
-
throw new Error(
|
|
195
|
-
this.version === null
|
|
196
|
-
? 'Invalid Oracledb version number format passed to knex. Unable to successfully auto-detect as fallback. Please specify a valid oracledb version.'
|
|
197
|
-
: 'Unable to detect Oracledb version number automatically. Please specify the version in knex configuration.'
|
|
198
|
-
);
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
this.version = detectedVersion;
|
|
202
|
-
return detectedVersion;
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
// Runs the query on the specified connection, providing the bindings
|
|
206
|
-
// and any other necessary prep work.
|
|
207
|
-
_query(connection, obj) {
|
|
208
|
-
if (!obj.sql) throw new Error('The query is empty');
|
|
209
|
-
|
|
210
|
-
const options = Object.assign({}, obj.options, { autoCommit: false });
|
|
211
|
-
if (obj.method === 'select') {
|
|
212
|
-
options.resultSet = true;
|
|
213
|
-
}
|
|
214
|
-
return connection
|
|
215
|
-
.executeAsync(obj.sql, obj.bindings, options)
|
|
216
|
-
.then(async function (response) {
|
|
217
|
-
// Flatten outBinds
|
|
218
|
-
let outBinds = flatten(response.outBinds);
|
|
219
|
-
obj.response = response.rows || [];
|
|
220
|
-
obj.rowsAffected = response.rows
|
|
221
|
-
? response.rows.rowsAffected
|
|
222
|
-
: response.rowsAffected;
|
|
223
|
-
|
|
224
|
-
//added for outBind parameter
|
|
225
|
-
if (obj.method === 'raw' && outBinds.length > 0) {
|
|
226
|
-
return {
|
|
227
|
-
response: outBinds,
|
|
228
|
-
};
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
if (obj.method === 'update') {
|
|
232
|
-
const modifiedRowsCount = obj.rowsAffected.length || obj.rowsAffected;
|
|
233
|
-
const updatedObjOutBinding = [];
|
|
234
|
-
const updatedOutBinds = [];
|
|
235
|
-
const updateOutBinds = (i) =>
|
|
236
|
-
function (value, index) {
|
|
237
|
-
const OutBindsOffset = index * modifiedRowsCount;
|
|
238
|
-
updatedOutBinds.push(outBinds[i + OutBindsOffset]);
|
|
239
|
-
};
|
|
240
|
-
|
|
241
|
-
for (let i = 0; i < modifiedRowsCount; i++) {
|
|
242
|
-
updatedObjOutBinding.push(obj.outBinding[0]);
|
|
243
|
-
each(obj.outBinding[0], updateOutBinds(i));
|
|
244
|
-
}
|
|
245
|
-
outBinds = updatedOutBinds;
|
|
246
|
-
obj.outBinding = updatedObjOutBinding;
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
if (!obj.returning && outBinds.length === 0) {
|
|
250
|
-
if (!connection.isTransaction) {
|
|
251
|
-
await connection.commitAsync();
|
|
252
|
-
}
|
|
253
|
-
return obj;
|
|
254
|
-
}
|
|
255
|
-
const rowIds = [];
|
|
256
|
-
let offset = 0;
|
|
257
|
-
|
|
258
|
-
for (let line = 0; line < obj.outBinding.length; line++) {
|
|
259
|
-
const ret = obj.outBinding[line];
|
|
260
|
-
|
|
261
|
-
offset =
|
|
262
|
-
offset +
|
|
263
|
-
(obj.outBinding[line - 1] ? obj.outBinding[line - 1].length : 0);
|
|
264
|
-
|
|
265
|
-
for (let index = 0; index < ret.length; index++) {
|
|
266
|
-
const out = ret[index];
|
|
267
|
-
|
|
268
|
-
await new Promise(function (bindResolver, bindRejecter) {
|
|
269
|
-
if (out instanceof BlobHelper) {
|
|
270
|
-
const blob = outBinds[index + offset];
|
|
271
|
-
if (out.returning) {
|
|
272
|
-
obj.response[line] = obj.response[line] || {};
|
|
273
|
-
obj.response[line][out.columnName] = out.value;
|
|
274
|
-
}
|
|
275
|
-
blob.on('error', function (err) {
|
|
276
|
-
bindRejecter(err);
|
|
277
|
-
});
|
|
278
|
-
blob.on('finish', function () {
|
|
279
|
-
bindResolver();
|
|
280
|
-
});
|
|
281
|
-
blob.write(out.value);
|
|
282
|
-
blob.end();
|
|
283
|
-
} else if (obj.outBinding[line][index] === 'ROWID') {
|
|
284
|
-
rowIds.push(outBinds[index + offset]);
|
|
285
|
-
bindResolver();
|
|
286
|
-
} else {
|
|
287
|
-
obj.response[line] = obj.response[line] || {};
|
|
288
|
-
obj.response[line][out] = outBinds[index + offset];
|
|
289
|
-
bindResolver();
|
|
290
|
-
}
|
|
291
|
-
});
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
if (obj.returningSql) {
|
|
295
|
-
const response = await connection.executeAsync(
|
|
296
|
-
obj.returningSql(),
|
|
297
|
-
rowIds,
|
|
298
|
-
{ resultSet: true }
|
|
299
|
-
);
|
|
300
|
-
obj.response = response.rows;
|
|
301
|
-
}
|
|
302
|
-
if (connection.isTransaction) {
|
|
303
|
-
return obj;
|
|
304
|
-
}
|
|
305
|
-
await connection.commitAsync();
|
|
306
|
-
return obj;
|
|
307
|
-
});
|
|
308
|
-
}
|
|
309
|
-
|
|
310
|
-
// Process the response as returned from the query.
|
|
311
|
-
processResponse(obj, runner) {
|
|
312
|
-
const { response } = obj;
|
|
313
|
-
if (obj.output) {
|
|
314
|
-
return obj.output.call(runner, response);
|
|
315
|
-
}
|
|
316
|
-
switch (obj.method) {
|
|
317
|
-
case 'select':
|
|
318
|
-
return response;
|
|
319
|
-
case 'first':
|
|
320
|
-
return response[0];
|
|
321
|
-
case 'pluck':
|
|
322
|
-
return map(response, obj.pluck);
|
|
323
|
-
case 'insert':
|
|
324
|
-
case 'del':
|
|
325
|
-
case 'update':
|
|
326
|
-
case 'counter':
|
|
327
|
-
if ((obj.returning && !isEmpty(obj.returning)) || obj.returningSql) {
|
|
328
|
-
return response;
|
|
329
|
-
} else if (obj.rowsAffected !== undefined) {
|
|
330
|
-
return obj.rowsAffected;
|
|
331
|
-
} else {
|
|
332
|
-
return 1;
|
|
333
|
-
}
|
|
334
|
-
default:
|
|
335
|
-
return response;
|
|
336
|
-
}
|
|
337
|
-
}
|
|
338
|
-
|
|
339
|
-
processPassedConnection(connection) {
|
|
340
|
-
this.checkVersion(connection);
|
|
341
|
-
monkeyPatchConnection(connection, this);
|
|
342
|
-
}
|
|
343
|
-
}
|
|
344
|
-
|
|
345
|
-
Client_Oracledb.prototype.driverName = 'oracledb';
|
|
346
|
-
|
|
347
|
-
function parseVersion(versionString) {
|
|
348
|
-
try {
|
|
349
|
-
// We only care about first two version components at most
|
|
350
|
-
const versionParts = versionString.split('.').slice(0, 2);
|
|
351
|
-
// Strip off any character suffixes in version number (ex. 12c => 12, 12.2c => 12.2)
|
|
352
|
-
versionParts.forEach((versionPart, idx) => {
|
|
353
|
-
versionParts[idx] = versionPart.replace(/\D$/, '');
|
|
354
|
-
});
|
|
355
|
-
const version = versionParts.join('.');
|
|
356
|
-
return version.match(/^\d+\.?\d*$/) ? version : null;
|
|
357
|
-
} catch (err) {
|
|
358
|
-
// Non-string versionString passed in.
|
|
359
|
-
return null;
|
|
360
|
-
}
|
|
361
|
-
}
|
|
362
|
-
|
|
363
|
-
function resolveConnectString(connectionSettings) {
|
|
364
|
-
if (connectionSettings.connectString) {
|
|
365
|
-
return connectionSettings.connectString;
|
|
366
|
-
}
|
|
367
|
-
|
|
368
|
-
if (!connectionSettings.port) {
|
|
369
|
-
return connectionSettings.host + '/' + connectionSettings.database;
|
|
370
|
-
}
|
|
371
|
-
|
|
372
|
-
return (
|
|
373
|
-
connectionSettings.host +
|
|
374
|
-
':' +
|
|
375
|
-
connectionSettings.port +
|
|
376
|
-
'/' +
|
|
377
|
-
connectionSettings.database
|
|
378
|
-
);
|
|
379
|
-
}
|
|
380
|
-
|
|
381
|
-
module.exports = Client_Oracledb;
|
|
1
|
+
// Oracledb Client
|
|
2
|
+
// -------
|
|
3
|
+
const each = require('lodash/each');
|
|
4
|
+
const flatten = require('lodash/flatten');
|
|
5
|
+
const isEmpty = require('lodash/isEmpty');
|
|
6
|
+
const map = require('lodash/map');
|
|
7
|
+
|
|
8
|
+
const Formatter = require('../../formatter');
|
|
9
|
+
const QueryCompiler = require('./query/oracledb-querycompiler');
|
|
10
|
+
const TableCompiler = require('./schema/oracledb-tablecompiler');
|
|
11
|
+
const ColumnCompiler = require('./schema/oracledb-columncompiler');
|
|
12
|
+
const {
|
|
13
|
+
BlobHelper,
|
|
14
|
+
ReturningHelper,
|
|
15
|
+
monkeyPatchConnection,
|
|
16
|
+
} = require('./utils');
|
|
17
|
+
const ViewCompiler = require('./schema/oracledb-viewcompiler');
|
|
18
|
+
const ViewBuilder = require('./schema/oracledb-viewbuilder');
|
|
19
|
+
const Transaction = require('./transaction');
|
|
20
|
+
const Client_Oracle = require('../oracle');
|
|
21
|
+
const { isString } = require('../../util/is');
|
|
22
|
+
const { outputQuery, unwrapRaw } = require('../../formatter/wrappingFormatter');
|
|
23
|
+
const { compileCallback } = require('../../formatter/formatterUtils');
|
|
24
|
+
|
|
25
|
+
class Client_Oracledb extends Client_Oracle {
|
|
26
|
+
constructor(config) {
|
|
27
|
+
super(config);
|
|
28
|
+
|
|
29
|
+
if (this.version) {
|
|
30
|
+
// Normalize version format; null bad format
|
|
31
|
+
// to trigger fallback to auto-detect.
|
|
32
|
+
this.version = parseVersion(this.version);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
if (this.driver) {
|
|
36
|
+
process.env.UV_THREADPOOL_SIZE = process.env.UV_THREADPOOL_SIZE || 1;
|
|
37
|
+
process.env.UV_THREADPOOL_SIZE =
|
|
38
|
+
parseInt(process.env.UV_THREADPOOL_SIZE) + this.driver.poolMax;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
_driver() {
|
|
43
|
+
const client = this;
|
|
44
|
+
const oracledb = require('oracledb');
|
|
45
|
+
client.fetchAsString = [];
|
|
46
|
+
if (this.config.fetchAsString && Array.isArray(this.config.fetchAsString)) {
|
|
47
|
+
this.config.fetchAsString.forEach(function (type) {
|
|
48
|
+
if (!isString(type)) return;
|
|
49
|
+
type = type.toUpperCase();
|
|
50
|
+
if (oracledb[type]) {
|
|
51
|
+
if (
|
|
52
|
+
type !== 'NUMBER' &&
|
|
53
|
+
type !== 'DATE' &&
|
|
54
|
+
type !== 'CLOB' &&
|
|
55
|
+
type !== 'BUFFER'
|
|
56
|
+
) {
|
|
57
|
+
this.logger.warn(
|
|
58
|
+
'Only "date", "number", "clob" and "buffer" are supported for fetchAsString'
|
|
59
|
+
);
|
|
60
|
+
}
|
|
61
|
+
client.fetchAsString.push(oracledb[type]);
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
return oracledb;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
queryCompiler(builder, formatter) {
|
|
69
|
+
return new QueryCompiler(this, builder, formatter);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
tableCompiler() {
|
|
73
|
+
return new TableCompiler(this, ...arguments);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
columnCompiler() {
|
|
77
|
+
return new ColumnCompiler(this, ...arguments);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
viewBuilder() {
|
|
81
|
+
return new ViewBuilder(this, ...arguments);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
viewCompiler() {
|
|
85
|
+
return new ViewCompiler(this, ...arguments);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
formatter(builder) {
|
|
89
|
+
return new Formatter(this, builder);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
transaction() {
|
|
93
|
+
return new Transaction(this, ...arguments);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
prepBindings(bindings) {
|
|
97
|
+
return map(bindings, (value) => {
|
|
98
|
+
if (value instanceof BlobHelper && this.driver) {
|
|
99
|
+
return { type: this.driver.BLOB, dir: this.driver.BIND_OUT };
|
|
100
|
+
// Returning helper always use ROWID as string
|
|
101
|
+
} else if (value instanceof ReturningHelper && this.driver) {
|
|
102
|
+
return { type: this.driver.STRING, dir: this.driver.BIND_OUT };
|
|
103
|
+
} else if (typeof value === 'boolean') {
|
|
104
|
+
return value ? 1 : 0;
|
|
105
|
+
}
|
|
106
|
+
return value;
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// Checks whether a value is a function... if it is, we compile it
|
|
111
|
+
// otherwise we check whether it's a raw
|
|
112
|
+
parameter(value, builder, formatter) {
|
|
113
|
+
if (typeof value === 'function') {
|
|
114
|
+
return outputQuery(
|
|
115
|
+
compileCallback(value, undefined, this, formatter),
|
|
116
|
+
true,
|
|
117
|
+
builder,
|
|
118
|
+
this
|
|
119
|
+
);
|
|
120
|
+
} else if (value instanceof BlobHelper) {
|
|
121
|
+
formatter.bindings.push(value.value);
|
|
122
|
+
return '?';
|
|
123
|
+
}
|
|
124
|
+
return unwrapRaw(value, true, builder, this, formatter) || '?';
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// Get a raw connection, called by the `pool` whenever a new
|
|
128
|
+
// connection needs to be added to the pool.
|
|
129
|
+
acquireRawConnection() {
|
|
130
|
+
return new Promise((resolver, rejecter) => {
|
|
131
|
+
// If external authentication don't have to worry about username/password and
|
|
132
|
+
// if not need to set the username and password
|
|
133
|
+
const oracleDbConfig = this.connectionSettings.externalAuth
|
|
134
|
+
? { externalAuth: this.connectionSettings.externalAuth }
|
|
135
|
+
: {
|
|
136
|
+
user: this.connectionSettings.user,
|
|
137
|
+
password: this.connectionSettings.password,
|
|
138
|
+
};
|
|
139
|
+
|
|
140
|
+
// In the case of external authentication connection string will be given
|
|
141
|
+
oracleDbConfig.connectString = resolveConnectString(
|
|
142
|
+
this.connectionSettings
|
|
143
|
+
);
|
|
144
|
+
|
|
145
|
+
if (this.connectionSettings.prefetchRowCount) {
|
|
146
|
+
oracleDbConfig.prefetchRows = this.connectionSettings.prefetchRowCount;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
if (this.connectionSettings.stmtCacheSize !== undefined) {
|
|
150
|
+
oracleDbConfig.stmtCacheSize = this.connectionSettings.stmtCacheSize;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
this.driver.fetchAsString = this.fetchAsString;
|
|
154
|
+
|
|
155
|
+
this.driver.getConnection(oracleDbConfig, (err, connection) => {
|
|
156
|
+
if (err) {
|
|
157
|
+
return rejecter(err);
|
|
158
|
+
}
|
|
159
|
+
monkeyPatchConnection(connection, this);
|
|
160
|
+
|
|
161
|
+
resolver(connection);
|
|
162
|
+
});
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
// Used to explicitly close a connection, called internally by the pool
|
|
167
|
+
// when a connection times out or the pool is shutdown.
|
|
168
|
+
destroyRawConnection(connection) {
|
|
169
|
+
return connection.release();
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// Handle oracle version resolution on acquiring connection from pool instead of connection creation.
|
|
173
|
+
// Must do this here since only the client used to create a connection would be updated with version
|
|
174
|
+
// information on creation. Poses a problem when knex instance is cloned since instances share the
|
|
175
|
+
// connection pool while having their own client instances.
|
|
176
|
+
async acquireConnection() {
|
|
177
|
+
const connection = await super.acquireConnection();
|
|
178
|
+
this.checkVersion(connection);
|
|
179
|
+
return connection;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// In Oracle, we need to check the version to dynamically determine
|
|
183
|
+
// certain limits. If user did not specify a version, get it from the connection.
|
|
184
|
+
checkVersion(connection) {
|
|
185
|
+
// Already determined version before?
|
|
186
|
+
if (this.version) {
|
|
187
|
+
return this.version;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
const detectedVersion = parseVersion(connection.oracleServerVersionString);
|
|
191
|
+
if (!detectedVersion) {
|
|
192
|
+
// When original version is set to null, user-provided version was invalid and we fell-back to auto-detect.
|
|
193
|
+
// Otherwise, we couldn't auto-detect at all. Set error message accordingly.
|
|
194
|
+
throw new Error(
|
|
195
|
+
this.version === null
|
|
196
|
+
? 'Invalid Oracledb version number format passed to knex. Unable to successfully auto-detect as fallback. Please specify a valid oracledb version.'
|
|
197
|
+
: 'Unable to detect Oracledb version number automatically. Please specify the version in knex configuration.'
|
|
198
|
+
);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
this.version = detectedVersion;
|
|
202
|
+
return detectedVersion;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
// Runs the query on the specified connection, providing the bindings
|
|
206
|
+
// and any other necessary prep work.
|
|
207
|
+
_query(connection, obj) {
|
|
208
|
+
if (!obj.sql) throw new Error('The query is empty');
|
|
209
|
+
|
|
210
|
+
const options = Object.assign({}, obj.options, { autoCommit: false });
|
|
211
|
+
if (obj.method === 'select') {
|
|
212
|
+
options.resultSet = true;
|
|
213
|
+
}
|
|
214
|
+
return connection
|
|
215
|
+
.executeAsync(obj.sql, obj.bindings, options)
|
|
216
|
+
.then(async function (response) {
|
|
217
|
+
// Flatten outBinds
|
|
218
|
+
let outBinds = flatten(response.outBinds);
|
|
219
|
+
obj.response = response.rows || [];
|
|
220
|
+
obj.rowsAffected = response.rows
|
|
221
|
+
? response.rows.rowsAffected
|
|
222
|
+
: response.rowsAffected;
|
|
223
|
+
|
|
224
|
+
//added for outBind parameter
|
|
225
|
+
if (obj.method === 'raw' && outBinds.length > 0) {
|
|
226
|
+
return {
|
|
227
|
+
response: outBinds,
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
if (obj.method === 'update') {
|
|
232
|
+
const modifiedRowsCount = obj.rowsAffected.length || obj.rowsAffected;
|
|
233
|
+
const updatedObjOutBinding = [];
|
|
234
|
+
const updatedOutBinds = [];
|
|
235
|
+
const updateOutBinds = (i) =>
|
|
236
|
+
function (value, index) {
|
|
237
|
+
const OutBindsOffset = index * modifiedRowsCount;
|
|
238
|
+
updatedOutBinds.push(outBinds[i + OutBindsOffset]);
|
|
239
|
+
};
|
|
240
|
+
|
|
241
|
+
for (let i = 0; i < modifiedRowsCount; i++) {
|
|
242
|
+
updatedObjOutBinding.push(obj.outBinding[0]);
|
|
243
|
+
each(obj.outBinding[0], updateOutBinds(i));
|
|
244
|
+
}
|
|
245
|
+
outBinds = updatedOutBinds;
|
|
246
|
+
obj.outBinding = updatedObjOutBinding;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
if (!obj.returning && outBinds.length === 0) {
|
|
250
|
+
if (!connection.isTransaction) {
|
|
251
|
+
await connection.commitAsync();
|
|
252
|
+
}
|
|
253
|
+
return obj;
|
|
254
|
+
}
|
|
255
|
+
const rowIds = [];
|
|
256
|
+
let offset = 0;
|
|
257
|
+
|
|
258
|
+
for (let line = 0; line < obj.outBinding.length; line++) {
|
|
259
|
+
const ret = obj.outBinding[line];
|
|
260
|
+
|
|
261
|
+
offset =
|
|
262
|
+
offset +
|
|
263
|
+
(obj.outBinding[line - 1] ? obj.outBinding[line - 1].length : 0);
|
|
264
|
+
|
|
265
|
+
for (let index = 0; index < ret.length; index++) {
|
|
266
|
+
const out = ret[index];
|
|
267
|
+
|
|
268
|
+
await new Promise(function (bindResolver, bindRejecter) {
|
|
269
|
+
if (out instanceof BlobHelper) {
|
|
270
|
+
const blob = outBinds[index + offset];
|
|
271
|
+
if (out.returning) {
|
|
272
|
+
obj.response[line] = obj.response[line] || {};
|
|
273
|
+
obj.response[line][out.columnName] = out.value;
|
|
274
|
+
}
|
|
275
|
+
blob.on('error', function (err) {
|
|
276
|
+
bindRejecter(err);
|
|
277
|
+
});
|
|
278
|
+
blob.on('finish', function () {
|
|
279
|
+
bindResolver();
|
|
280
|
+
});
|
|
281
|
+
blob.write(out.value);
|
|
282
|
+
blob.end();
|
|
283
|
+
} else if (obj.outBinding[line][index] === 'ROWID') {
|
|
284
|
+
rowIds.push(outBinds[index + offset]);
|
|
285
|
+
bindResolver();
|
|
286
|
+
} else {
|
|
287
|
+
obj.response[line] = obj.response[line] || {};
|
|
288
|
+
obj.response[line][out] = outBinds[index + offset];
|
|
289
|
+
bindResolver();
|
|
290
|
+
}
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
if (obj.returningSql) {
|
|
295
|
+
const response = await connection.executeAsync(
|
|
296
|
+
obj.returningSql(),
|
|
297
|
+
rowIds,
|
|
298
|
+
{ resultSet: true }
|
|
299
|
+
);
|
|
300
|
+
obj.response = response.rows;
|
|
301
|
+
}
|
|
302
|
+
if (connection.isTransaction) {
|
|
303
|
+
return obj;
|
|
304
|
+
}
|
|
305
|
+
await connection.commitAsync();
|
|
306
|
+
return obj;
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
// Process the response as returned from the query.
|
|
311
|
+
processResponse(obj, runner) {
|
|
312
|
+
const { response } = obj;
|
|
313
|
+
if (obj.output) {
|
|
314
|
+
return obj.output.call(runner, response);
|
|
315
|
+
}
|
|
316
|
+
switch (obj.method) {
|
|
317
|
+
case 'select':
|
|
318
|
+
return response;
|
|
319
|
+
case 'first':
|
|
320
|
+
return response[0];
|
|
321
|
+
case 'pluck':
|
|
322
|
+
return map(response, obj.pluck);
|
|
323
|
+
case 'insert':
|
|
324
|
+
case 'del':
|
|
325
|
+
case 'update':
|
|
326
|
+
case 'counter':
|
|
327
|
+
if ((obj.returning && !isEmpty(obj.returning)) || obj.returningSql) {
|
|
328
|
+
return response;
|
|
329
|
+
} else if (obj.rowsAffected !== undefined) {
|
|
330
|
+
return obj.rowsAffected;
|
|
331
|
+
} else {
|
|
332
|
+
return 1;
|
|
333
|
+
}
|
|
334
|
+
default:
|
|
335
|
+
return response;
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
processPassedConnection(connection) {
|
|
340
|
+
this.checkVersion(connection);
|
|
341
|
+
monkeyPatchConnection(connection, this);
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
Client_Oracledb.prototype.driverName = 'oracledb';
|
|
346
|
+
|
|
347
|
+
function parseVersion(versionString) {
|
|
348
|
+
try {
|
|
349
|
+
// We only care about first two version components at most
|
|
350
|
+
const versionParts = versionString.split('.').slice(0, 2);
|
|
351
|
+
// Strip off any character suffixes in version number (ex. 12c => 12, 12.2c => 12.2)
|
|
352
|
+
versionParts.forEach((versionPart, idx) => {
|
|
353
|
+
versionParts[idx] = versionPart.replace(/\D$/, '');
|
|
354
|
+
});
|
|
355
|
+
const version = versionParts.join('.');
|
|
356
|
+
return version.match(/^\d+\.?\d*$/) ? version : null;
|
|
357
|
+
} catch (err) {
|
|
358
|
+
// Non-string versionString passed in.
|
|
359
|
+
return null;
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
function resolveConnectString(connectionSettings) {
|
|
364
|
+
if (connectionSettings.connectString) {
|
|
365
|
+
return connectionSettings.connectString;
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
if (!connectionSettings.port) {
|
|
369
|
+
return connectionSettings.host + '/' + connectionSettings.database;
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
return (
|
|
373
|
+
connectionSettings.host +
|
|
374
|
+
':' +
|
|
375
|
+
connectionSettings.port +
|
|
376
|
+
'/' +
|
|
377
|
+
connectionSettings.database
|
|
378
|
+
);
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
module.exports = Client_Oracledb;
|