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,208 +1,208 @@
|
|
|
1
|
-
const Utils = require('../oracle/utils');
|
|
2
|
-
const { promisify } = require('util');
|
|
3
|
-
const stream = require('stream');
|
|
4
|
-
|
|
5
|
-
function BlobHelper(columnName, value) {
|
|
6
|
-
this.columnName = columnName;
|
|
7
|
-
this.value = value;
|
|
8
|
-
this.returning = false;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
BlobHelper.prototype.toString = function () {
|
|
12
|
-
return '[object BlobHelper:' + this.columnName + ']';
|
|
13
|
-
};
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* @param stream
|
|
17
|
-
* @param {'string' | 'buffer'} type
|
|
18
|
-
*/
|
|
19
|
-
function readStream(stream, type) {
|
|
20
|
-
return new Promise((resolve, reject) => {
|
|
21
|
-
let data = type === 'string' ? '' : Buffer.alloc(0);
|
|
22
|
-
|
|
23
|
-
stream.on('error', function (err) {
|
|
24
|
-
reject(err);
|
|
25
|
-
});
|
|
26
|
-
stream.on('data', function (chunk) {
|
|
27
|
-
if (type === 'string') {
|
|
28
|
-
data += chunk;
|
|
29
|
-
} else {
|
|
30
|
-
data = Buffer.concat([data, chunk]);
|
|
31
|
-
}
|
|
32
|
-
});
|
|
33
|
-
stream.on('end', function () {
|
|
34
|
-
resolve(data);
|
|
35
|
-
});
|
|
36
|
-
});
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
const lobProcessing = function (stream) {
|
|
40
|
-
const oracledb = require('oracledb');
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* @type 'string' | 'buffer'
|
|
44
|
-
*/
|
|
45
|
-
let type;
|
|
46
|
-
|
|
47
|
-
if (stream.type) {
|
|
48
|
-
// v1.2-v4
|
|
49
|
-
if (stream.type === oracledb.BLOB) {
|
|
50
|
-
type = 'buffer';
|
|
51
|
-
} else if (stream.type === oracledb.CLOB) {
|
|
52
|
-
type = 'string';
|
|
53
|
-
}
|
|
54
|
-
} else if (stream.iLob) {
|
|
55
|
-
// v1
|
|
56
|
-
if (stream.iLob.type === oracledb.CLOB) {
|
|
57
|
-
type = 'string';
|
|
58
|
-
} else if (stream.iLob.type === oracledb.BLOB) {
|
|
59
|
-
type = 'buffer';
|
|
60
|
-
}
|
|
61
|
-
} else {
|
|
62
|
-
throw new Error('Unrecognized oracledb lob stream type');
|
|
63
|
-
}
|
|
64
|
-
if (type === 'string') {
|
|
65
|
-
stream.setEncoding('utf-8');
|
|
66
|
-
}
|
|
67
|
-
return readStream(stream, type);
|
|
68
|
-
};
|
|
69
|
-
|
|
70
|
-
function monkeyPatchConnection(connection, client) {
|
|
71
|
-
// Connection is already monkey-patched
|
|
72
|
-
if (connection.executeAsync) {
|
|
73
|
-
return;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
connection.commitAsync = function () {
|
|
77
|
-
return new Promise((commitResolve, commitReject) => {
|
|
78
|
-
this.commit(function (err) {
|
|
79
|
-
if (err) {
|
|
80
|
-
return commitReject(err);
|
|
81
|
-
}
|
|
82
|
-
commitResolve();
|
|
83
|
-
});
|
|
84
|
-
});
|
|
85
|
-
};
|
|
86
|
-
connection.rollbackAsync = function () {
|
|
87
|
-
return new Promise((rollbackResolve, rollbackReject) => {
|
|
88
|
-
this.rollback(function (err) {
|
|
89
|
-
if (err) {
|
|
90
|
-
return rollbackReject(err);
|
|
91
|
-
}
|
|
92
|
-
rollbackResolve();
|
|
93
|
-
});
|
|
94
|
-
});
|
|
95
|
-
};
|
|
96
|
-
const fetchAsync = promisify(function (sql, bindParams, options, cb) {
|
|
97
|
-
options = options || {};
|
|
98
|
-
options.outFormat = client.driver.OUT_FORMAT_OBJECT || client.driver.OBJECT;
|
|
99
|
-
if (!options.outFormat) {
|
|
100
|
-
throw new Error('not found oracledb.outFormat constants');
|
|
101
|
-
}
|
|
102
|
-
if (options.resultSet) {
|
|
103
|
-
connection.execute(
|
|
104
|
-
sql,
|
|
105
|
-
bindParams || [],
|
|
106
|
-
options,
|
|
107
|
-
function (err, result) {
|
|
108
|
-
if (err) {
|
|
109
|
-
if (Utils.isConnectionError(err)) {
|
|
110
|
-
connection.close().catch(function (err) {});
|
|
111
|
-
connection.__knex__disposed = err;
|
|
112
|
-
}
|
|
113
|
-
return cb(err);
|
|
114
|
-
}
|
|
115
|
-
const fetchResult = { rows: [], resultSet: result.resultSet };
|
|
116
|
-
const numRows = 100;
|
|
117
|
-
const fetchRowsFromRS = function (connection, resultSet, numRows) {
|
|
118
|
-
resultSet.getRows(numRows, function (err, rows) {
|
|
119
|
-
if (err) {
|
|
120
|
-
if (Utils.isConnectionError(err)) {
|
|
121
|
-
connection.close().catch(function (err) {});
|
|
122
|
-
connection.__knex__disposed = err;
|
|
123
|
-
}
|
|
124
|
-
resultSet.close(function () {
|
|
125
|
-
return cb(err);
|
|
126
|
-
});
|
|
127
|
-
} else if (rows.length === 0) {
|
|
128
|
-
return cb(null, fetchResult);
|
|
129
|
-
} else if (rows.length > 0) {
|
|
130
|
-
if (rows.length === numRows) {
|
|
131
|
-
fetchResult.rows = fetchResult.rows.concat(rows);
|
|
132
|
-
fetchRowsFromRS(connection, resultSet, numRows);
|
|
133
|
-
} else {
|
|
134
|
-
fetchResult.rows = fetchResult.rows.concat(rows);
|
|
135
|
-
return cb(null, fetchResult);
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
});
|
|
139
|
-
};
|
|
140
|
-
fetchRowsFromRS(connection, result.resultSet, numRows);
|
|
141
|
-
}
|
|
142
|
-
);
|
|
143
|
-
} else {
|
|
144
|
-
connection.execute(
|
|
145
|
-
sql,
|
|
146
|
-
bindParams || [],
|
|
147
|
-
options,
|
|
148
|
-
function (err, result) {
|
|
149
|
-
if (err) {
|
|
150
|
-
// dispose the connection on connection error
|
|
151
|
-
if (Utils.isConnectionError(err)) {
|
|
152
|
-
connection.close().catch(function (err) {});
|
|
153
|
-
connection.__knex__disposed = err;
|
|
154
|
-
}
|
|
155
|
-
return cb(err);
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
return cb(null, result);
|
|
159
|
-
}
|
|
160
|
-
);
|
|
161
|
-
}
|
|
162
|
-
});
|
|
163
|
-
connection.executeAsync = function (sql, bindParams, options) {
|
|
164
|
-
// Read all lob
|
|
165
|
-
return fetchAsync(sql, bindParams, options).then(async (results) => {
|
|
166
|
-
const closeResultSet = () => {
|
|
167
|
-
return results.resultSet
|
|
168
|
-
? promisify(results.resultSet.close).call(results.resultSet)
|
|
169
|
-
: Promise.resolve();
|
|
170
|
-
};
|
|
171
|
-
|
|
172
|
-
// Collect LOBs to read
|
|
173
|
-
const lobs = [];
|
|
174
|
-
if (results.rows) {
|
|
175
|
-
if (Array.isArray(results.rows)) {
|
|
176
|
-
for (let i = 0; i < results.rows.length; i++) {
|
|
177
|
-
// Iterate through the rows
|
|
178
|
-
const row = results.rows[i];
|
|
179
|
-
for (const column in row) {
|
|
180
|
-
if (row[column] instanceof stream.Readable) {
|
|
181
|
-
lobs.push({ index: i, key: column, stream: row[column] });
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
try {
|
|
189
|
-
for (const lob of lobs) {
|
|
190
|
-
// todo should be fetchAsString/fetchAsBuffer polyfill only
|
|
191
|
-
results.rows[lob.index][lob.key] = await lobProcessing(lob.stream);
|
|
192
|
-
}
|
|
193
|
-
} catch (e) {
|
|
194
|
-
await closeResultSet().catch(() => {});
|
|
195
|
-
|
|
196
|
-
throw e;
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
await closeResultSet();
|
|
200
|
-
|
|
201
|
-
return results;
|
|
202
|
-
});
|
|
203
|
-
};
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
Utils.BlobHelper = BlobHelper;
|
|
207
|
-
Utils.monkeyPatchConnection = monkeyPatchConnection;
|
|
208
|
-
module.exports = Utils;
|
|
1
|
+
const Utils = require('../oracle/utils');
|
|
2
|
+
const { promisify } = require('util');
|
|
3
|
+
const stream = require('stream');
|
|
4
|
+
|
|
5
|
+
function BlobHelper(columnName, value) {
|
|
6
|
+
this.columnName = columnName;
|
|
7
|
+
this.value = value;
|
|
8
|
+
this.returning = false;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
BlobHelper.prototype.toString = function () {
|
|
12
|
+
return '[object BlobHelper:' + this.columnName + ']';
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* @param stream
|
|
17
|
+
* @param {'string' | 'buffer'} type
|
|
18
|
+
*/
|
|
19
|
+
function readStream(stream, type) {
|
|
20
|
+
return new Promise((resolve, reject) => {
|
|
21
|
+
let data = type === 'string' ? '' : Buffer.alloc(0);
|
|
22
|
+
|
|
23
|
+
stream.on('error', function (err) {
|
|
24
|
+
reject(err);
|
|
25
|
+
});
|
|
26
|
+
stream.on('data', function (chunk) {
|
|
27
|
+
if (type === 'string') {
|
|
28
|
+
data += chunk;
|
|
29
|
+
} else {
|
|
30
|
+
data = Buffer.concat([data, chunk]);
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
stream.on('end', function () {
|
|
34
|
+
resolve(data);
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const lobProcessing = function (stream) {
|
|
40
|
+
const oracledb = require('oracledb');
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* @type 'string' | 'buffer'
|
|
44
|
+
*/
|
|
45
|
+
let type;
|
|
46
|
+
|
|
47
|
+
if (stream.type) {
|
|
48
|
+
// v1.2-v4
|
|
49
|
+
if (stream.type === oracledb.BLOB) {
|
|
50
|
+
type = 'buffer';
|
|
51
|
+
} else if (stream.type === oracledb.CLOB) {
|
|
52
|
+
type = 'string';
|
|
53
|
+
}
|
|
54
|
+
} else if (stream.iLob) {
|
|
55
|
+
// v1
|
|
56
|
+
if (stream.iLob.type === oracledb.CLOB) {
|
|
57
|
+
type = 'string';
|
|
58
|
+
} else if (stream.iLob.type === oracledb.BLOB) {
|
|
59
|
+
type = 'buffer';
|
|
60
|
+
}
|
|
61
|
+
} else {
|
|
62
|
+
throw new Error('Unrecognized oracledb lob stream type');
|
|
63
|
+
}
|
|
64
|
+
if (type === 'string') {
|
|
65
|
+
stream.setEncoding('utf-8');
|
|
66
|
+
}
|
|
67
|
+
return readStream(stream, type);
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
function monkeyPatchConnection(connection, client) {
|
|
71
|
+
// Connection is already monkey-patched
|
|
72
|
+
if (connection.executeAsync) {
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
connection.commitAsync = function () {
|
|
77
|
+
return new Promise((commitResolve, commitReject) => {
|
|
78
|
+
this.commit(function (err) {
|
|
79
|
+
if (err) {
|
|
80
|
+
return commitReject(err);
|
|
81
|
+
}
|
|
82
|
+
commitResolve();
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
};
|
|
86
|
+
connection.rollbackAsync = function () {
|
|
87
|
+
return new Promise((rollbackResolve, rollbackReject) => {
|
|
88
|
+
this.rollback(function (err) {
|
|
89
|
+
if (err) {
|
|
90
|
+
return rollbackReject(err);
|
|
91
|
+
}
|
|
92
|
+
rollbackResolve();
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
};
|
|
96
|
+
const fetchAsync = promisify(function (sql, bindParams, options, cb) {
|
|
97
|
+
options = options || {};
|
|
98
|
+
options.outFormat = client.driver.OUT_FORMAT_OBJECT || client.driver.OBJECT;
|
|
99
|
+
if (!options.outFormat) {
|
|
100
|
+
throw new Error('not found oracledb.outFormat constants');
|
|
101
|
+
}
|
|
102
|
+
if (options.resultSet) {
|
|
103
|
+
connection.execute(
|
|
104
|
+
sql,
|
|
105
|
+
bindParams || [],
|
|
106
|
+
options,
|
|
107
|
+
function (err, result) {
|
|
108
|
+
if (err) {
|
|
109
|
+
if (Utils.isConnectionError(err)) {
|
|
110
|
+
connection.close().catch(function (err) {});
|
|
111
|
+
connection.__knex__disposed = err;
|
|
112
|
+
}
|
|
113
|
+
return cb(err);
|
|
114
|
+
}
|
|
115
|
+
const fetchResult = { rows: [], resultSet: result.resultSet };
|
|
116
|
+
const numRows = 100;
|
|
117
|
+
const fetchRowsFromRS = function (connection, resultSet, numRows) {
|
|
118
|
+
resultSet.getRows(numRows, function (err, rows) {
|
|
119
|
+
if (err) {
|
|
120
|
+
if (Utils.isConnectionError(err)) {
|
|
121
|
+
connection.close().catch(function (err) {});
|
|
122
|
+
connection.__knex__disposed = err;
|
|
123
|
+
}
|
|
124
|
+
resultSet.close(function () {
|
|
125
|
+
return cb(err);
|
|
126
|
+
});
|
|
127
|
+
} else if (rows.length === 0) {
|
|
128
|
+
return cb(null, fetchResult);
|
|
129
|
+
} else if (rows.length > 0) {
|
|
130
|
+
if (rows.length === numRows) {
|
|
131
|
+
fetchResult.rows = fetchResult.rows.concat(rows);
|
|
132
|
+
fetchRowsFromRS(connection, resultSet, numRows);
|
|
133
|
+
} else {
|
|
134
|
+
fetchResult.rows = fetchResult.rows.concat(rows);
|
|
135
|
+
return cb(null, fetchResult);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
};
|
|
140
|
+
fetchRowsFromRS(connection, result.resultSet, numRows);
|
|
141
|
+
}
|
|
142
|
+
);
|
|
143
|
+
} else {
|
|
144
|
+
connection.execute(
|
|
145
|
+
sql,
|
|
146
|
+
bindParams || [],
|
|
147
|
+
options,
|
|
148
|
+
function (err, result) {
|
|
149
|
+
if (err) {
|
|
150
|
+
// dispose the connection on connection error
|
|
151
|
+
if (Utils.isConnectionError(err)) {
|
|
152
|
+
connection.close().catch(function (err) {});
|
|
153
|
+
connection.__knex__disposed = err;
|
|
154
|
+
}
|
|
155
|
+
return cb(err);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
return cb(null, result);
|
|
159
|
+
}
|
|
160
|
+
);
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
connection.executeAsync = function (sql, bindParams, options) {
|
|
164
|
+
// Read all lob
|
|
165
|
+
return fetchAsync(sql, bindParams, options).then(async (results) => {
|
|
166
|
+
const closeResultSet = () => {
|
|
167
|
+
return results.resultSet
|
|
168
|
+
? promisify(results.resultSet.close).call(results.resultSet)
|
|
169
|
+
: Promise.resolve();
|
|
170
|
+
};
|
|
171
|
+
|
|
172
|
+
// Collect LOBs to read
|
|
173
|
+
const lobs = [];
|
|
174
|
+
if (results.rows) {
|
|
175
|
+
if (Array.isArray(results.rows)) {
|
|
176
|
+
for (let i = 0; i < results.rows.length; i++) {
|
|
177
|
+
// Iterate through the rows
|
|
178
|
+
const row = results.rows[i];
|
|
179
|
+
for (const column in row) {
|
|
180
|
+
if (row[column] instanceof stream.Readable) {
|
|
181
|
+
lobs.push({ index: i, key: column, stream: row[column] });
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
try {
|
|
189
|
+
for (const lob of lobs) {
|
|
190
|
+
// todo should be fetchAsString/fetchAsBuffer polyfill only
|
|
191
|
+
results.rows[lob.index][lob.key] = await lobProcessing(lob.stream);
|
|
192
|
+
}
|
|
193
|
+
} catch (e) {
|
|
194
|
+
await closeResultSet().catch(() => {});
|
|
195
|
+
|
|
196
|
+
throw e;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
await closeResultSet();
|
|
200
|
+
|
|
201
|
+
return results;
|
|
202
|
+
});
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
Utils.BlobHelper = BlobHelper;
|
|
207
|
+
Utils.monkeyPatchConnection = monkeyPatchConnection;
|
|
208
|
+
module.exports = Utils;
|
|
@@ -1,60 +1,60 @@
|
|
|
1
|
-
// PostgreSQL Native Driver (pg-native)
|
|
2
|
-
// -------
|
|
3
|
-
const Client_PG = require('../postgres');
|
|
4
|
-
|
|
5
|
-
class Client_PgNative extends Client_PG {
|
|
6
|
-
constructor(...args) {
|
|
7
|
-
super(...args);
|
|
8
|
-
this.driverName = 'pgnative';
|
|
9
|
-
this.canCancelQuery = true;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
_driver() {
|
|
13
|
-
return require('pg').native;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
_stream(connection, obj, stream, options) {
|
|
17
|
-
if (!obj.sql) throw new Error('The query is empty');
|
|
18
|
-
|
|
19
|
-
const client = this;
|
|
20
|
-
return new Promise((resolver, rejecter) => {
|
|
21
|
-
stream.on('error', rejecter);
|
|
22
|
-
stream.on('end', resolver);
|
|
23
|
-
|
|
24
|
-
return client
|
|
25
|
-
._query(connection, obj)
|
|
26
|
-
.then((obj) => obj.response)
|
|
27
|
-
.then(({ rows }) => rows.forEach((row) => stream.write(row)))
|
|
28
|
-
.catch(function (err) {
|
|
29
|
-
stream.emit('error', err);
|
|
30
|
-
})
|
|
31
|
-
.then(function () {
|
|
32
|
-
stream.end();
|
|
33
|
-
});
|
|
34
|
-
});
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
async cancelQuery(connectionToKill) {
|
|
38
|
-
try {
|
|
39
|
-
return await this._wrappedCancelQueryCall(null, connectionToKill);
|
|
40
|
-
} catch (err) {
|
|
41
|
-
this.logger.warn(`Connection Error: ${err}`);
|
|
42
|
-
throw err;
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
_wrappedCancelQueryCall(emptyConnection, connectionToKill) {
|
|
47
|
-
return new Promise(function (resolve, reject) {
|
|
48
|
-
connectionToKill.native.cancel(function (err) {
|
|
49
|
-
if (err) {
|
|
50
|
-
reject(err);
|
|
51
|
-
return;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
resolve(true);
|
|
55
|
-
});
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
module.exports = Client_PgNative;
|
|
1
|
+
// PostgreSQL Native Driver (pg-native)
|
|
2
|
+
// -------
|
|
3
|
+
const Client_PG = require('../postgres');
|
|
4
|
+
|
|
5
|
+
class Client_PgNative extends Client_PG {
|
|
6
|
+
constructor(...args) {
|
|
7
|
+
super(...args);
|
|
8
|
+
this.driverName = 'pgnative';
|
|
9
|
+
this.canCancelQuery = true;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
_driver() {
|
|
13
|
+
return require('pg').native;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
_stream(connection, obj, stream, options) {
|
|
17
|
+
if (!obj.sql) throw new Error('The query is empty');
|
|
18
|
+
|
|
19
|
+
const client = this;
|
|
20
|
+
return new Promise((resolver, rejecter) => {
|
|
21
|
+
stream.on('error', rejecter);
|
|
22
|
+
stream.on('end', resolver);
|
|
23
|
+
|
|
24
|
+
return client
|
|
25
|
+
._query(connection, obj)
|
|
26
|
+
.then((obj) => obj.response)
|
|
27
|
+
.then(({ rows }) => rows.forEach((row) => stream.write(row)))
|
|
28
|
+
.catch(function (err) {
|
|
29
|
+
stream.emit('error', err);
|
|
30
|
+
})
|
|
31
|
+
.then(function () {
|
|
32
|
+
stream.end();
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
async cancelQuery(connectionToKill) {
|
|
38
|
+
try {
|
|
39
|
+
return await this._wrappedCancelQueryCall(null, connectionToKill);
|
|
40
|
+
} catch (err) {
|
|
41
|
+
this.logger.warn(`Connection Error: ${err}`);
|
|
42
|
+
throw err;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
_wrappedCancelQueryCall(emptyConnection, connectionToKill) {
|
|
47
|
+
return new Promise(function (resolve, reject) {
|
|
48
|
+
connectionToKill.native.cancel(function (err) {
|
|
49
|
+
if (err) {
|
|
50
|
+
reject(err);
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
resolve(true);
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
module.exports = Client_PgNative;
|
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
const Transaction = require('../../../execution/transaction');
|
|
2
|
-
|
|
3
|
-
class Transaction_PG extends Transaction {
|
|
4
|
-
begin(conn) {
|
|
5
|
-
const trxMode = [
|
|
6
|
-
this.isolationLevel ? `ISOLATION LEVEL ${this.isolationLevel}` : '',
|
|
7
|
-
this.readOnly ? 'READ ONLY' : '',
|
|
8
|
-
]
|
|
9
|
-
.join(' ')
|
|
10
|
-
.trim();
|
|
11
|
-
|
|
12
|
-
if (trxMode.length === 0) {
|
|
13
|
-
return this.query(conn, 'BEGIN;');
|
|
14
|
-
}
|
|
15
|
-
return this.query(conn, `BEGIN TRANSACTION ${trxMode};`);
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
module.exports = Transaction_PG;
|
|
1
|
+
const Transaction = require('../../../execution/transaction');
|
|
2
|
+
|
|
3
|
+
class Transaction_PG extends Transaction {
|
|
4
|
+
begin(conn) {
|
|
5
|
+
const trxMode = [
|
|
6
|
+
this.isolationLevel ? `ISOLATION LEVEL ${this.isolationLevel}` : '',
|
|
7
|
+
this.readOnly ? 'READ ONLY' : '',
|
|
8
|
+
]
|
|
9
|
+
.join(' ')
|
|
10
|
+
.trim();
|
|
11
|
+
|
|
12
|
+
if (trxMode.length === 0) {
|
|
13
|
+
return this.query(conn, 'BEGIN;');
|
|
14
|
+
}
|
|
15
|
+
return this.query(conn, `BEGIN TRANSACTION ${trxMode};`);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
module.exports = Transaction_PG;
|