knex 3.2.3 → 3.2.4
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 +156 -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 +294 -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 +11 -0
- package/types/index.d.ts +3321 -3321
- package/types/result.d.ts +27 -27
- package/types/tables.d.ts +4 -4
|
@@ -1,61 +1,61 @@
|
|
|
1
|
-
const ColumnCompiler_Oracle = require('../../oracle/schema/oracle-columncompiler');
|
|
2
|
-
const { isObject } = require('../../../util/is');
|
|
3
|
-
|
|
4
|
-
class ColumnCompiler_Oracledb extends ColumnCompiler_Oracle {
|
|
5
|
-
constructor() {
|
|
6
|
-
super(...arguments);
|
|
7
|
-
this.modifiers = ['defaultTo', 'nullable', 'comment', 'checkJson'];
|
|
8
|
-
this._addCheckModifiers();
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
datetime(withoutTz) {
|
|
12
|
-
let useTz;
|
|
13
|
-
if (isObject(withoutTz)) {
|
|
14
|
-
({ useTz } = withoutTz);
|
|
15
|
-
} else {
|
|
16
|
-
useTz = !withoutTz;
|
|
17
|
-
}
|
|
18
|
-
return useTz ? 'timestamp with local time zone' : 'timestamp';
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
timestamp(withoutTz) {
|
|
22
|
-
let useTz;
|
|
23
|
-
if (isObject(withoutTz)) {
|
|
24
|
-
({ useTz } = withoutTz);
|
|
25
|
-
} else {
|
|
26
|
-
useTz = !withoutTz;
|
|
27
|
-
}
|
|
28
|
-
return useTz ? 'timestamp with local time zone' : 'timestamp';
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
checkRegex(regex, constraintName) {
|
|
32
|
-
return this._check(
|
|
33
|
-
`REGEXP_LIKE(${this.formatter.wrap(
|
|
34
|
-
this.getColumnName()
|
|
35
|
-
)},${this.client._escapeBinding(regex)})`,
|
|
36
|
-
constraintName
|
|
37
|
-
);
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
json() {
|
|
41
|
-
// implicitly add the check for json
|
|
42
|
-
this.columnBuilder._modifiers.checkJson = [
|
|
43
|
-
this.formatter.columnize(this.getColumnName()),
|
|
44
|
-
];
|
|
45
|
-
return 'varchar2(4000)';
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
jsonb() {
|
|
49
|
-
return this.json();
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
checkJson(column) {
|
|
53
|
-
return `check (${column} is json)`;
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
ColumnCompiler_Oracledb.prototype.time = 'timestamp with local time zone';
|
|
58
|
-
ColumnCompiler_Oracledb.prototype.uuid = ({ useBinaryUuid = false } = {}) =>
|
|
59
|
-
useBinaryUuid ? 'raw(16)' : 'char(36)';
|
|
60
|
-
|
|
61
|
-
module.exports = ColumnCompiler_Oracledb;
|
|
1
|
+
const ColumnCompiler_Oracle = require('../../oracle/schema/oracle-columncompiler');
|
|
2
|
+
const { isObject } = require('../../../util/is');
|
|
3
|
+
|
|
4
|
+
class ColumnCompiler_Oracledb extends ColumnCompiler_Oracle {
|
|
5
|
+
constructor() {
|
|
6
|
+
super(...arguments);
|
|
7
|
+
this.modifiers = ['defaultTo', 'nullable', 'comment', 'checkJson'];
|
|
8
|
+
this._addCheckModifiers();
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
datetime(withoutTz) {
|
|
12
|
+
let useTz;
|
|
13
|
+
if (isObject(withoutTz)) {
|
|
14
|
+
({ useTz } = withoutTz);
|
|
15
|
+
} else {
|
|
16
|
+
useTz = !withoutTz;
|
|
17
|
+
}
|
|
18
|
+
return useTz ? 'timestamp with local time zone' : 'timestamp';
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
timestamp(withoutTz) {
|
|
22
|
+
let useTz;
|
|
23
|
+
if (isObject(withoutTz)) {
|
|
24
|
+
({ useTz } = withoutTz);
|
|
25
|
+
} else {
|
|
26
|
+
useTz = !withoutTz;
|
|
27
|
+
}
|
|
28
|
+
return useTz ? 'timestamp with local time zone' : 'timestamp';
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
checkRegex(regex, constraintName) {
|
|
32
|
+
return this._check(
|
|
33
|
+
`REGEXP_LIKE(${this.formatter.wrap(
|
|
34
|
+
this.getColumnName()
|
|
35
|
+
)},${this.client._escapeBinding(regex)})`,
|
|
36
|
+
constraintName
|
|
37
|
+
);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
json() {
|
|
41
|
+
// implicitly add the check for json
|
|
42
|
+
this.columnBuilder._modifiers.checkJson = [
|
|
43
|
+
this.formatter.columnize(this.getColumnName()),
|
|
44
|
+
];
|
|
45
|
+
return 'varchar2(4000)';
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
jsonb() {
|
|
49
|
+
return this.json();
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
checkJson(column) {
|
|
53
|
+
return `check (${column} is json)`;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
ColumnCompiler_Oracledb.prototype.time = 'timestamp with local time zone';
|
|
58
|
+
ColumnCompiler_Oracledb.prototype.uuid = ({ useBinaryUuid = false } = {}) =>
|
|
59
|
+
useBinaryUuid ? 'raw(16)' : 'char(36)';
|
|
60
|
+
|
|
61
|
+
module.exports = ColumnCompiler_Oracledb;
|
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
const TableCompiler_Oracle = require('../../oracle/schema/oracle-tablecompiler');
|
|
2
|
-
|
|
3
|
-
class TableCompiler_Oracledb extends TableCompiler_Oracle {
|
|
4
|
-
constructor(client, tableBuilder) {
|
|
5
|
-
super(client, tableBuilder);
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
_setNullableState(column, isNullable) {
|
|
9
|
-
const nullability = isNullable ? 'NULL' : 'NOT NULL';
|
|
10
|
-
const sql = `alter table ${this.tableName()} modify (${this.formatter.wrap(
|
|
11
|
-
column
|
|
12
|
-
)} ${nullability})`;
|
|
13
|
-
return this.pushQuery({
|
|
14
|
-
sql: sql,
|
|
15
|
-
});
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
module.exports = TableCompiler_Oracledb;
|
|
1
|
+
const TableCompiler_Oracle = require('../../oracle/schema/oracle-tablecompiler');
|
|
2
|
+
|
|
3
|
+
class TableCompiler_Oracledb extends TableCompiler_Oracle {
|
|
4
|
+
constructor(client, tableBuilder) {
|
|
5
|
+
super(client, tableBuilder);
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
_setNullableState(column, isNullable) {
|
|
9
|
+
const nullability = isNullable ? 'NULL' : 'NOT NULL';
|
|
10
|
+
const sql = `alter table ${this.tableName()} modify (${this.formatter.wrap(
|
|
11
|
+
column
|
|
12
|
+
)} ${nullability})`;
|
|
13
|
+
return this.pushQuery({
|
|
14
|
+
sql: sql,
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
module.exports = TableCompiler_Oracledb;
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
const ViewBuilder = require('../../../schema/viewbuilder.js');
|
|
2
|
-
|
|
3
|
-
class ViewBuilder_Oracledb extends ViewBuilder {
|
|
4
|
-
constructor() {
|
|
5
|
-
super(...arguments);
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
checkOption() {
|
|
9
|
-
this._single.checkOption = 'default_option';
|
|
10
|
-
}
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
module.exports = ViewBuilder_Oracledb;
|
|
1
|
+
const ViewBuilder = require('../../../schema/viewbuilder.js');
|
|
2
|
+
|
|
3
|
+
class ViewBuilder_Oracledb extends ViewBuilder {
|
|
4
|
+
constructor() {
|
|
5
|
+
super(...arguments);
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
checkOption() {
|
|
9
|
+
this._single.checkOption = 'default_option';
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
module.exports = ViewBuilder_Oracledb;
|
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
/* eslint max-len: 0 */
|
|
2
|
-
|
|
3
|
-
const ViewCompiler = require('../../../schema/viewcompiler.js');
|
|
4
|
-
|
|
5
|
-
class ViewCompiler_Oracledb extends ViewCompiler {
|
|
6
|
-
constructor(client, viewCompiler) {
|
|
7
|
-
super(client, viewCompiler);
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
createOrReplace() {
|
|
11
|
-
this.createQuery(this.columns, this.selectQuery, false, true);
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
createMaterializedView() {
|
|
15
|
-
this.createQuery(this.columns, this.selectQuery, true);
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
module.exports = ViewCompiler_Oracledb;
|
|
1
|
+
/* eslint max-len: 0 */
|
|
2
|
+
|
|
3
|
+
const ViewCompiler = require('../../../schema/viewcompiler.js');
|
|
4
|
+
|
|
5
|
+
class ViewCompiler_Oracledb extends ViewCompiler {
|
|
6
|
+
constructor(client, viewCompiler) {
|
|
7
|
+
super(client, viewCompiler);
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
createOrReplace() {
|
|
11
|
+
this.createQuery(this.columns, this.selectQuery, false, true);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
createMaterializedView() {
|
|
15
|
+
this.createQuery(this.columns, this.selectQuery, true);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
module.exports = ViewCompiler_Oracledb;
|
|
@@ -1,98 +1,98 @@
|
|
|
1
|
-
const Transaction = require('../../execution/transaction');
|
|
2
|
-
const { timeout, KnexTimeoutError } = require('../../util/timeout');
|
|
3
|
-
const debugTx = require('debug')('knex:tx');
|
|
4
|
-
|
|
5
|
-
// There's also a "read only", but that's not really an "isolationLevel"
|
|
6
|
-
const supportedIsolationLevels = ['read committed', 'serializable'];
|
|
7
|
-
// Remove this if you make it work and set it to true
|
|
8
|
-
const isIsolationLevelEnabled = false;
|
|
9
|
-
|
|
10
|
-
module.exports = class Oracle_Transaction extends Transaction {
|
|
11
|
-
// disable autocommit to allow correct behavior (default is true)
|
|
12
|
-
begin(conn) {
|
|
13
|
-
if (this.isolationLevel) {
|
|
14
|
-
if (isIsolationLevelEnabled) {
|
|
15
|
-
if (!supportedIsolationLevels.includes(this.isolationLevel)) {
|
|
16
|
-
this.client.logger.warn(
|
|
17
|
-
'Oracle only supports read committed and serializable transactions, ignoring the isolation level param'
|
|
18
|
-
);
|
|
19
|
-
} else {
|
|
20
|
-
// I tried this, but it didn't work
|
|
21
|
-
// Doc here: https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/SET-TRANSACTION.html
|
|
22
|
-
return this.query(conn, `SET TRANSACTION ${this.isolationLevel}`);
|
|
23
|
-
}
|
|
24
|
-
} else {
|
|
25
|
-
this.client.logger.warn(
|
|
26
|
-
'Transaction isolation is not currently supported for Oracle'
|
|
27
|
-
);
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
return Promise.resolve();
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
async commit(conn, value) {
|
|
34
|
-
this._completed = true;
|
|
35
|
-
try {
|
|
36
|
-
await conn.commitAsync();
|
|
37
|
-
this._resolver(value);
|
|
38
|
-
} catch (err) {
|
|
39
|
-
this._rejecter(err);
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
release(conn, value) {
|
|
44
|
-
return this._resolver(value);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
rollback(conn, err) {
|
|
48
|
-
this._completed = true;
|
|
49
|
-
debugTx('%s: rolling back', this.txid);
|
|
50
|
-
return timeout(conn.rollbackAsync(), 5000)
|
|
51
|
-
.catch((e) => {
|
|
52
|
-
if (!(e instanceof KnexTimeoutError)) {
|
|
53
|
-
return Promise.reject(e);
|
|
54
|
-
}
|
|
55
|
-
this._rejecter(e);
|
|
56
|
-
})
|
|
57
|
-
.then(() => {
|
|
58
|
-
if (err === undefined) {
|
|
59
|
-
if (this.doNotRejectOnRollback) {
|
|
60
|
-
this._resolver();
|
|
61
|
-
return;
|
|
62
|
-
}
|
|
63
|
-
err = new Error(`Transaction rejected with non-error: ${err}`);
|
|
64
|
-
}
|
|
65
|
-
this._rejecter(err);
|
|
66
|
-
});
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
savepoint(conn) {
|
|
70
|
-
return this.query(conn, `SAVEPOINT ${this.txid}`);
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
async acquireConnection(config, cb) {
|
|
74
|
-
const configConnection = config && config.connection;
|
|
75
|
-
|
|
76
|
-
const connection =
|
|
77
|
-
configConnection || (await this.client.acquireConnection());
|
|
78
|
-
try {
|
|
79
|
-
connection.__knexTxId = this.txid;
|
|
80
|
-
connection.isTransaction = true;
|
|
81
|
-
return await cb(connection);
|
|
82
|
-
} finally {
|
|
83
|
-
debugTx('%s: releasing connection', this.txid);
|
|
84
|
-
connection.isTransaction = false;
|
|
85
|
-
try {
|
|
86
|
-
await connection.commitAsync();
|
|
87
|
-
} catch (err) {
|
|
88
|
-
this._rejecter(err);
|
|
89
|
-
} finally {
|
|
90
|
-
if (!configConnection) {
|
|
91
|
-
await this.client.releaseConnection(connection);
|
|
92
|
-
} else {
|
|
93
|
-
debugTx('%s: not releasing external connection', this.txid);
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
};
|
|
1
|
+
const Transaction = require('../../execution/transaction');
|
|
2
|
+
const { timeout, KnexTimeoutError } = require('../../util/timeout');
|
|
3
|
+
const debugTx = require('debug')('knex:tx');
|
|
4
|
+
|
|
5
|
+
// There's also a "read only", but that's not really an "isolationLevel"
|
|
6
|
+
const supportedIsolationLevels = ['read committed', 'serializable'];
|
|
7
|
+
// Remove this if you make it work and set it to true
|
|
8
|
+
const isIsolationLevelEnabled = false;
|
|
9
|
+
|
|
10
|
+
module.exports = class Oracle_Transaction extends Transaction {
|
|
11
|
+
// disable autocommit to allow correct behavior (default is true)
|
|
12
|
+
begin(conn) {
|
|
13
|
+
if (this.isolationLevel) {
|
|
14
|
+
if (isIsolationLevelEnabled) {
|
|
15
|
+
if (!supportedIsolationLevels.includes(this.isolationLevel)) {
|
|
16
|
+
this.client.logger.warn(
|
|
17
|
+
'Oracle only supports read committed and serializable transactions, ignoring the isolation level param'
|
|
18
|
+
);
|
|
19
|
+
} else {
|
|
20
|
+
// I tried this, but it didn't work
|
|
21
|
+
// Doc here: https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/SET-TRANSACTION.html
|
|
22
|
+
return this.query(conn, `SET TRANSACTION ${this.isolationLevel}`);
|
|
23
|
+
}
|
|
24
|
+
} else {
|
|
25
|
+
this.client.logger.warn(
|
|
26
|
+
'Transaction isolation is not currently supported for Oracle'
|
|
27
|
+
);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return Promise.resolve();
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
async commit(conn, value) {
|
|
34
|
+
this._completed = true;
|
|
35
|
+
try {
|
|
36
|
+
await conn.commitAsync();
|
|
37
|
+
this._resolver(value);
|
|
38
|
+
} catch (err) {
|
|
39
|
+
this._rejecter(err);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
release(conn, value) {
|
|
44
|
+
return this._resolver(value);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
rollback(conn, err) {
|
|
48
|
+
this._completed = true;
|
|
49
|
+
debugTx('%s: rolling back', this.txid);
|
|
50
|
+
return timeout(conn.rollbackAsync(), 5000)
|
|
51
|
+
.catch((e) => {
|
|
52
|
+
if (!(e instanceof KnexTimeoutError)) {
|
|
53
|
+
return Promise.reject(e);
|
|
54
|
+
}
|
|
55
|
+
this._rejecter(e);
|
|
56
|
+
})
|
|
57
|
+
.then(() => {
|
|
58
|
+
if (err === undefined) {
|
|
59
|
+
if (this.doNotRejectOnRollback) {
|
|
60
|
+
this._resolver();
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
err = new Error(`Transaction rejected with non-error: ${err}`);
|
|
64
|
+
}
|
|
65
|
+
this._rejecter(err);
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
savepoint(conn) {
|
|
70
|
+
return this.query(conn, `SAVEPOINT ${this.txid}`);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
async acquireConnection(config, cb) {
|
|
74
|
+
const configConnection = config && config.connection;
|
|
75
|
+
|
|
76
|
+
const connection =
|
|
77
|
+
configConnection || (await this.client.acquireConnection());
|
|
78
|
+
try {
|
|
79
|
+
connection.__knexTxId = this.txid;
|
|
80
|
+
connection.isTransaction = true;
|
|
81
|
+
return await cb(connection);
|
|
82
|
+
} finally {
|
|
83
|
+
debugTx('%s: releasing connection', this.txid);
|
|
84
|
+
connection.isTransaction = false;
|
|
85
|
+
try {
|
|
86
|
+
await connection.commitAsync();
|
|
87
|
+
} catch (err) {
|
|
88
|
+
this._rejecter(err);
|
|
89
|
+
} finally {
|
|
90
|
+
if (!configConnection) {
|
|
91
|
+
await this.client.releaseConnection(connection);
|
|
92
|
+
} else {
|
|
93
|
+
debugTx('%s: not releasing external connection', this.txid);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
};
|