knex 3.2.2 → 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 -296
- 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
package/lib/constants.js
CHANGED
|
@@ -1,61 +1,61 @@
|
|
|
1
|
-
// The client names we'll allow in the `{name: lib}` pairing.
|
|
2
|
-
const CLIENT_ALIASES = Object.freeze({
|
|
3
|
-
pg: 'postgres',
|
|
4
|
-
postgresql: 'postgres',
|
|
5
|
-
sqlite: 'sqlite3',
|
|
6
|
-
});
|
|
7
|
-
|
|
8
|
-
const SUPPORTED_CLIENTS = Object.freeze(
|
|
9
|
-
[
|
|
10
|
-
'mssql',
|
|
11
|
-
'mysql',
|
|
12
|
-
'mysql2',
|
|
13
|
-
'oracledb',
|
|
14
|
-
'postgres',
|
|
15
|
-
'pgnative',
|
|
16
|
-
'redshift',
|
|
17
|
-
'sqlite3',
|
|
18
|
-
'cockroachdb',
|
|
19
|
-
'better-sqlite3',
|
|
20
|
-
].concat(Object.keys(CLIENT_ALIASES))
|
|
21
|
-
);
|
|
22
|
-
|
|
23
|
-
const DRIVER_NAMES = Object.freeze({
|
|
24
|
-
MsSQL: 'mssql',
|
|
25
|
-
MySQL: 'mysql',
|
|
26
|
-
MySQL2: 'mysql2',
|
|
27
|
-
Oracle: 'oracledb',
|
|
28
|
-
PostgreSQL: 'pg',
|
|
29
|
-
PgNative: 'pgnative',
|
|
30
|
-
Redshift: 'pg-redshift',
|
|
31
|
-
SQLite: 'sqlite3',
|
|
32
|
-
CockroachDB: 'cockroachdb',
|
|
33
|
-
BetterSQLite3: 'better-sqlite3',
|
|
34
|
-
});
|
|
35
|
-
|
|
36
|
-
const POOL_CONFIG_OPTIONS = Object.freeze([
|
|
37
|
-
'maxWaitingClients',
|
|
38
|
-
'testOnBorrow',
|
|
39
|
-
'fifo',
|
|
40
|
-
'priorityRange',
|
|
41
|
-
'autostart',
|
|
42
|
-
'evictionRunIntervalMillis',
|
|
43
|
-
'numTestsPerRun',
|
|
44
|
-
'softIdleTimeoutMillis',
|
|
45
|
-
'Promise',
|
|
46
|
-
]);
|
|
47
|
-
|
|
48
|
-
/**
|
|
49
|
-
* Regex that only matches comma's in strings that aren't wrapped in parentheses. Can be used to
|
|
50
|
-
* safely split strings like `id int, name string, body text, primary key (id, name)` into definition
|
|
51
|
-
* rows
|
|
52
|
-
*/
|
|
53
|
-
const COMMA_NO_PAREN_REGEX = /,[\s](?![^(]*\))/g;
|
|
54
|
-
|
|
55
|
-
module.exports = {
|
|
56
|
-
CLIENT_ALIASES,
|
|
57
|
-
SUPPORTED_CLIENTS,
|
|
58
|
-
POOL_CONFIG_OPTIONS,
|
|
59
|
-
COMMA_NO_PAREN_REGEX,
|
|
60
|
-
DRIVER_NAMES,
|
|
61
|
-
};
|
|
1
|
+
// The client names we'll allow in the `{name: lib}` pairing.
|
|
2
|
+
const CLIENT_ALIASES = Object.freeze({
|
|
3
|
+
pg: 'postgres',
|
|
4
|
+
postgresql: 'postgres',
|
|
5
|
+
sqlite: 'sqlite3',
|
|
6
|
+
});
|
|
7
|
+
|
|
8
|
+
const SUPPORTED_CLIENTS = Object.freeze(
|
|
9
|
+
[
|
|
10
|
+
'mssql',
|
|
11
|
+
'mysql',
|
|
12
|
+
'mysql2',
|
|
13
|
+
'oracledb',
|
|
14
|
+
'postgres',
|
|
15
|
+
'pgnative',
|
|
16
|
+
'redshift',
|
|
17
|
+
'sqlite3',
|
|
18
|
+
'cockroachdb',
|
|
19
|
+
'better-sqlite3',
|
|
20
|
+
].concat(Object.keys(CLIENT_ALIASES))
|
|
21
|
+
);
|
|
22
|
+
|
|
23
|
+
const DRIVER_NAMES = Object.freeze({
|
|
24
|
+
MsSQL: 'mssql',
|
|
25
|
+
MySQL: 'mysql',
|
|
26
|
+
MySQL2: 'mysql2',
|
|
27
|
+
Oracle: 'oracledb',
|
|
28
|
+
PostgreSQL: 'pg',
|
|
29
|
+
PgNative: 'pgnative',
|
|
30
|
+
Redshift: 'pg-redshift',
|
|
31
|
+
SQLite: 'sqlite3',
|
|
32
|
+
CockroachDB: 'cockroachdb',
|
|
33
|
+
BetterSQLite3: 'better-sqlite3',
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
const POOL_CONFIG_OPTIONS = Object.freeze([
|
|
37
|
+
'maxWaitingClients',
|
|
38
|
+
'testOnBorrow',
|
|
39
|
+
'fifo',
|
|
40
|
+
'priorityRange',
|
|
41
|
+
'autostart',
|
|
42
|
+
'evictionRunIntervalMillis',
|
|
43
|
+
'numTestsPerRun',
|
|
44
|
+
'softIdleTimeoutMillis',
|
|
45
|
+
'Promise',
|
|
46
|
+
]);
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Regex that only matches comma's in strings that aren't wrapped in parentheses. Can be used to
|
|
50
|
+
* safely split strings like `id int, name string, body text, primary key (id, name)` into definition
|
|
51
|
+
* rows
|
|
52
|
+
*/
|
|
53
|
+
const COMMA_NO_PAREN_REGEX = /,[\s](?![^(]*\))/g;
|
|
54
|
+
|
|
55
|
+
module.exports = {
|
|
56
|
+
CLIENT_ALIASES,
|
|
57
|
+
SUPPORTED_CLIENTS,
|
|
58
|
+
POOL_CONFIG_OPTIONS,
|
|
59
|
+
COMMA_NO_PAREN_REGEX,
|
|
60
|
+
DRIVER_NAMES,
|
|
61
|
+
};
|
|
@@ -1,101 +1,101 @@
|
|
|
1
|
-
// better-sqlite3 Client
|
|
2
|
-
// -------
|
|
3
|
-
const Client_SQLite3 = require('../sqlite3');
|
|
4
|
-
|
|
5
|
-
class Client_BetterSQLite3 extends Client_SQLite3 {
|
|
6
|
-
_driver() {
|
|
7
|
-
return require('better-sqlite3');
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
// Get a raw connection from the database, returning a promise with the connection object.
|
|
11
|
-
async acquireRawConnection() {
|
|
12
|
-
const options = this.connectionSettings.options || {};
|
|
13
|
-
|
|
14
|
-
const db = new this.driver(this.connectionSettings.filename, {
|
|
15
|
-
nativeBinding: options.nativeBinding,
|
|
16
|
-
readonly: !!options.readonly,
|
|
17
|
-
});
|
|
18
|
-
|
|
19
|
-
const safeIntegers = this._optSafeIntegers(options);
|
|
20
|
-
if (safeIntegers !== undefined) {
|
|
21
|
-
db.defaultSafeIntegers(safeIntegers);
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
return db;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
// Used to explicitly close a connection, called internally by the pool when
|
|
28
|
-
// a connection times out or the pool is shutdown.
|
|
29
|
-
async destroyRawConnection(connection) {
|
|
30
|
-
return connection.close();
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
// Runs the query on the specified connection, providing the bindings and any
|
|
34
|
-
// other necessary prep work.
|
|
35
|
-
async _query(connection, obj) {
|
|
36
|
-
if (!obj.sql) throw new Error('The query is empty');
|
|
37
|
-
|
|
38
|
-
if (!connection) {
|
|
39
|
-
throw new Error('No connection provided');
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
const statement = connection.prepare(obj.sql);
|
|
43
|
-
|
|
44
|
-
const safeIntegers = this._optSafeIntegers(obj.options);
|
|
45
|
-
if (safeIntegers !== undefined) {
|
|
46
|
-
statement.safeIntegers(safeIntegers);
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
const bindings = this._formatBindings(obj.bindings);
|
|
50
|
-
|
|
51
|
-
if (statement.reader) {
|
|
52
|
-
const response = await statement.all(bindings);
|
|
53
|
-
obj.response = response;
|
|
54
|
-
return obj;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
const response = await statement.run(bindings);
|
|
58
|
-
obj.response = response;
|
|
59
|
-
obj.context = {
|
|
60
|
-
lastID: response.lastInsertRowid,
|
|
61
|
-
changes: response.changes,
|
|
62
|
-
};
|
|
63
|
-
|
|
64
|
-
return obj;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
_formatBindings(bindings) {
|
|
68
|
-
if (!bindings) {
|
|
69
|
-
return [];
|
|
70
|
-
}
|
|
71
|
-
return bindings.map((binding) => {
|
|
72
|
-
if (binding instanceof Date) {
|
|
73
|
-
return binding.valueOf();
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
if (typeof binding === 'boolean') {
|
|
77
|
-
return Number(binding);
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
return binding;
|
|
81
|
-
});
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
_optSafeIntegers(options) {
|
|
85
|
-
if (
|
|
86
|
-
options &&
|
|
87
|
-
typeof options === 'object' &&
|
|
88
|
-
typeof options.safeIntegers === 'boolean'
|
|
89
|
-
) {
|
|
90
|
-
return options.safeIntegers;
|
|
91
|
-
}
|
|
92
|
-
return undefined;
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
Object.assign(Client_BetterSQLite3.prototype, {
|
|
97
|
-
// The "dialect", for reference .
|
|
98
|
-
driverName: 'better-sqlite3',
|
|
99
|
-
});
|
|
100
|
-
|
|
101
|
-
module.exports = Client_BetterSQLite3;
|
|
1
|
+
// better-sqlite3 Client
|
|
2
|
+
// -------
|
|
3
|
+
const Client_SQLite3 = require('../sqlite3');
|
|
4
|
+
|
|
5
|
+
class Client_BetterSQLite3 extends Client_SQLite3 {
|
|
6
|
+
_driver() {
|
|
7
|
+
return require('better-sqlite3');
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
// Get a raw connection from the database, returning a promise with the connection object.
|
|
11
|
+
async acquireRawConnection() {
|
|
12
|
+
const options = this.connectionSettings.options || {};
|
|
13
|
+
|
|
14
|
+
const db = new this.driver(this.connectionSettings.filename, {
|
|
15
|
+
nativeBinding: options.nativeBinding,
|
|
16
|
+
readonly: !!options.readonly,
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
const safeIntegers = this._optSafeIntegers(options);
|
|
20
|
+
if (safeIntegers !== undefined) {
|
|
21
|
+
db.defaultSafeIntegers(safeIntegers);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
return db;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// Used to explicitly close a connection, called internally by the pool when
|
|
28
|
+
// a connection times out or the pool is shutdown.
|
|
29
|
+
async destroyRawConnection(connection) {
|
|
30
|
+
return connection.close();
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// Runs the query on the specified connection, providing the bindings and any
|
|
34
|
+
// other necessary prep work.
|
|
35
|
+
async _query(connection, obj) {
|
|
36
|
+
if (!obj.sql) throw new Error('The query is empty');
|
|
37
|
+
|
|
38
|
+
if (!connection) {
|
|
39
|
+
throw new Error('No connection provided');
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const statement = connection.prepare(obj.sql);
|
|
43
|
+
|
|
44
|
+
const safeIntegers = this._optSafeIntegers(obj.options);
|
|
45
|
+
if (safeIntegers !== undefined) {
|
|
46
|
+
statement.safeIntegers(safeIntegers);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const bindings = this._formatBindings(obj.bindings);
|
|
50
|
+
|
|
51
|
+
if (statement.reader) {
|
|
52
|
+
const response = await statement.all(bindings);
|
|
53
|
+
obj.response = response;
|
|
54
|
+
return obj;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const response = await statement.run(bindings);
|
|
58
|
+
obj.response = response;
|
|
59
|
+
obj.context = {
|
|
60
|
+
lastID: response.lastInsertRowid,
|
|
61
|
+
changes: response.changes,
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
return obj;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
_formatBindings(bindings) {
|
|
68
|
+
if (!bindings) {
|
|
69
|
+
return [];
|
|
70
|
+
}
|
|
71
|
+
return bindings.map((binding) => {
|
|
72
|
+
if (binding instanceof Date) {
|
|
73
|
+
return binding.valueOf();
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
if (typeof binding === 'boolean') {
|
|
77
|
+
return Number(binding);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
return binding;
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
_optSafeIntegers(options) {
|
|
85
|
+
if (
|
|
86
|
+
options &&
|
|
87
|
+
typeof options === 'object' &&
|
|
88
|
+
typeof options.safeIntegers === 'boolean'
|
|
89
|
+
) {
|
|
90
|
+
return options.safeIntegers;
|
|
91
|
+
}
|
|
92
|
+
return undefined;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
Object.assign(Client_BetterSQLite3.prototype, {
|
|
97
|
+
// The "dialect", for reference .
|
|
98
|
+
driverName: 'better-sqlite3',
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
module.exports = Client_BetterSQLite3;
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
const ColumnCompiler_PG = require('../postgres/schema/pg-columncompiler.js');
|
|
2
|
-
|
|
3
|
-
class ColumnCompiler_CRDB extends ColumnCompiler_PG {
|
|
4
|
-
uuid(options = { primaryKey: false }) {
|
|
5
|
-
return (
|
|
6
|
-
'uuid' +
|
|
7
|
-
(this.tableCompiler._canBeAddPrimaryKey(options)
|
|
8
|
-
? ' primary key default gen_random_uuid()'
|
|
9
|
-
: '')
|
|
10
|
-
);
|
|
11
|
-
}
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
module.exports = ColumnCompiler_CRDB;
|
|
1
|
+
const ColumnCompiler_PG = require('../postgres/schema/pg-columncompiler.js');
|
|
2
|
+
|
|
3
|
+
class ColumnCompiler_CRDB extends ColumnCompiler_PG {
|
|
4
|
+
uuid(options = { primaryKey: false }) {
|
|
5
|
+
return (
|
|
6
|
+
'uuid' +
|
|
7
|
+
(this.tableCompiler._canBeAddPrimaryKey(options)
|
|
8
|
+
? ' primary key default gen_random_uuid()'
|
|
9
|
+
: '')
|
|
10
|
+
);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
module.exports = ColumnCompiler_CRDB;
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
const QueryBuilder = require('../../query/querybuilder');
|
|
2
|
-
const isEmpty = require('lodash/isEmpty');
|
|
3
|
-
|
|
4
|
-
module.exports = class QueryBuilder_CockroachDB extends QueryBuilder {
|
|
5
|
-
upsert(values, returning, options) {
|
|
6
|
-
this._method = 'upsert';
|
|
7
|
-
if (!isEmpty(returning)) this.returning(returning, options);
|
|
8
|
-
this._single.upsert = values;
|
|
9
|
-
return this;
|
|
10
|
-
}
|
|
11
|
-
};
|
|
1
|
+
const QueryBuilder = require('../../query/querybuilder');
|
|
2
|
+
const isEmpty = require('lodash/isEmpty');
|
|
3
|
+
|
|
4
|
+
module.exports = class QueryBuilder_CockroachDB extends QueryBuilder {
|
|
5
|
+
upsert(values, returning, options) {
|
|
6
|
+
this._method = 'upsert';
|
|
7
|
+
if (!isEmpty(returning)) this.returning(returning, options);
|
|
8
|
+
this._single.upsert = values;
|
|
9
|
+
return this;
|
|
10
|
+
}
|
|
11
|
+
};
|
|
@@ -1,122 +1,122 @@
|
|
|
1
|
-
const QueryCompiler_PG = require('../postgres/query/pg-querycompiler');
|
|
2
|
-
const {
|
|
3
|
-
columnize: columnize_,
|
|
4
|
-
wrap: wrap_,
|
|
5
|
-
operator: operator_,
|
|
6
|
-
} = require('../../formatter/wrappingFormatter');
|
|
7
|
-
|
|
8
|
-
class QueryCompiler_CRDB extends QueryCompiler_PG {
|
|
9
|
-
truncate() {
|
|
10
|
-
return `truncate ${this.tableName}`;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
upsert() {
|
|
14
|
-
let sql = this._upsert();
|
|
15
|
-
if (sql === '') return sql;
|
|
16
|
-
const { returning } = this.single;
|
|
17
|
-
if (returning) sql += this._returning(returning);
|
|
18
|
-
return {
|
|
19
|
-
sql: sql,
|
|
20
|
-
returning,
|
|
21
|
-
};
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
_upsert() {
|
|
25
|
-
const upsertValues = this.single.upsert || [];
|
|
26
|
-
const sql = this.with() + `upsert into ${this.tableName} `;
|
|
27
|
-
const body = this._insertBody(upsertValues);
|
|
28
|
-
return body === '' ? '' : sql + body;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
_groupOrder(item, type) {
|
|
32
|
-
// CockroachDB don't support PostgreSQL order nulls first/last syntax, we take the generic one.
|
|
33
|
-
return this._basicGroupOrder(item, type);
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
whereJsonPath(statement) {
|
|
37
|
-
let castValue = '';
|
|
38
|
-
if (!isNaN(statement.value) && parseInt(statement.value)) {
|
|
39
|
-
castValue = '::int';
|
|
40
|
-
} else if (!isNaN(statement.value) && parseFloat(statement.value)) {
|
|
41
|
-
castValue = '::float';
|
|
42
|
-
} else {
|
|
43
|
-
castValue = " #>> '{}'";
|
|
44
|
-
}
|
|
45
|
-
return `json_extract_path(${this._columnClause(
|
|
46
|
-
statement
|
|
47
|
-
)}, ${this.client.toArrayPathFromJsonPath(
|
|
48
|
-
statement.jsonPath,
|
|
49
|
-
this.builder,
|
|
50
|
-
this.bindingsHolder
|
|
51
|
-
)})${castValue} ${operator_(
|
|
52
|
-
statement.operator,
|
|
53
|
-
this.builder,
|
|
54
|
-
this.client,
|
|
55
|
-
this.bindingsHolder
|
|
56
|
-
)} ${this._jsonValueClause(statement)}`;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
// Json common functions
|
|
60
|
-
_jsonExtract(nameFunction, params) {
|
|
61
|
-
let extractions;
|
|
62
|
-
if (Array.isArray(params.column)) {
|
|
63
|
-
extractions = params.column;
|
|
64
|
-
} else {
|
|
65
|
-
extractions = [params];
|
|
66
|
-
}
|
|
67
|
-
return extractions
|
|
68
|
-
.map((extraction) => {
|
|
69
|
-
const jsonCol = `json_extract_path(${columnize_(
|
|
70
|
-
extraction.column || extraction[0],
|
|
71
|
-
this.builder,
|
|
72
|
-
this.client,
|
|
73
|
-
this.bindingsHolder
|
|
74
|
-
)}, ${this.client.toArrayPathFromJsonPath(
|
|
75
|
-
extraction.path || extraction[1],
|
|
76
|
-
this.builder,
|
|
77
|
-
this.bindingsHolder
|
|
78
|
-
)})`;
|
|
79
|
-
const alias = extraction.alias || extraction[2];
|
|
80
|
-
return alias
|
|
81
|
-
? this.client.alias(jsonCol, this.formatter.wrap(alias))
|
|
82
|
-
: jsonCol;
|
|
83
|
-
})
|
|
84
|
-
.join(', ');
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
_onJsonPathEquals(nameJoinFunction, clause) {
|
|
88
|
-
return (
|
|
89
|
-
'json_extract_path(' +
|
|
90
|
-
wrap_(
|
|
91
|
-
clause.columnFirst,
|
|
92
|
-
undefined,
|
|
93
|
-
this.builder,
|
|
94
|
-
this.client,
|
|
95
|
-
this.bindingsHolder
|
|
96
|
-
) +
|
|
97
|
-
', ' +
|
|
98
|
-
this.client.toArrayPathFromJsonPath(
|
|
99
|
-
clause.jsonPathFirst,
|
|
100
|
-
this.builder,
|
|
101
|
-
this.bindingsHolder
|
|
102
|
-
) +
|
|
103
|
-
') = json_extract_path(' +
|
|
104
|
-
wrap_(
|
|
105
|
-
clause.columnSecond,
|
|
106
|
-
undefined,
|
|
107
|
-
this.builder,
|
|
108
|
-
this.client,
|
|
109
|
-
this.bindingsHolder
|
|
110
|
-
) +
|
|
111
|
-
', ' +
|
|
112
|
-
this.client.toArrayPathFromJsonPath(
|
|
113
|
-
clause.jsonPathSecond,
|
|
114
|
-
this.builder,
|
|
115
|
-
this.bindingsHolder
|
|
116
|
-
) +
|
|
117
|
-
')'
|
|
118
|
-
);
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
module.exports = QueryCompiler_CRDB;
|
|
1
|
+
const QueryCompiler_PG = require('../postgres/query/pg-querycompiler');
|
|
2
|
+
const {
|
|
3
|
+
columnize: columnize_,
|
|
4
|
+
wrap: wrap_,
|
|
5
|
+
operator: operator_,
|
|
6
|
+
} = require('../../formatter/wrappingFormatter');
|
|
7
|
+
|
|
8
|
+
class QueryCompiler_CRDB extends QueryCompiler_PG {
|
|
9
|
+
truncate() {
|
|
10
|
+
return `truncate ${this.tableName}`;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
upsert() {
|
|
14
|
+
let sql = this._upsert();
|
|
15
|
+
if (sql === '') return sql;
|
|
16
|
+
const { returning } = this.single;
|
|
17
|
+
if (returning) sql += this._returning(returning);
|
|
18
|
+
return {
|
|
19
|
+
sql: sql,
|
|
20
|
+
returning,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
_upsert() {
|
|
25
|
+
const upsertValues = this.single.upsert || [];
|
|
26
|
+
const sql = this.with() + `upsert into ${this.tableName} `;
|
|
27
|
+
const body = this._insertBody(upsertValues);
|
|
28
|
+
return body === '' ? '' : sql + body;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
_groupOrder(item, type) {
|
|
32
|
+
// CockroachDB don't support PostgreSQL order nulls first/last syntax, we take the generic one.
|
|
33
|
+
return this._basicGroupOrder(item, type);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
whereJsonPath(statement) {
|
|
37
|
+
let castValue = '';
|
|
38
|
+
if (!isNaN(statement.value) && parseInt(statement.value)) {
|
|
39
|
+
castValue = '::int';
|
|
40
|
+
} else if (!isNaN(statement.value) && parseFloat(statement.value)) {
|
|
41
|
+
castValue = '::float';
|
|
42
|
+
} else {
|
|
43
|
+
castValue = " #>> '{}'";
|
|
44
|
+
}
|
|
45
|
+
return `json_extract_path(${this._columnClause(
|
|
46
|
+
statement
|
|
47
|
+
)}, ${this.client.toArrayPathFromJsonPath(
|
|
48
|
+
statement.jsonPath,
|
|
49
|
+
this.builder,
|
|
50
|
+
this.bindingsHolder
|
|
51
|
+
)})${castValue} ${operator_(
|
|
52
|
+
statement.operator,
|
|
53
|
+
this.builder,
|
|
54
|
+
this.client,
|
|
55
|
+
this.bindingsHolder
|
|
56
|
+
)} ${this._jsonValueClause(statement)}`;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// Json common functions
|
|
60
|
+
_jsonExtract(nameFunction, params) {
|
|
61
|
+
let extractions;
|
|
62
|
+
if (Array.isArray(params.column)) {
|
|
63
|
+
extractions = params.column;
|
|
64
|
+
} else {
|
|
65
|
+
extractions = [params];
|
|
66
|
+
}
|
|
67
|
+
return extractions
|
|
68
|
+
.map((extraction) => {
|
|
69
|
+
const jsonCol = `json_extract_path(${columnize_(
|
|
70
|
+
extraction.column || extraction[0],
|
|
71
|
+
this.builder,
|
|
72
|
+
this.client,
|
|
73
|
+
this.bindingsHolder
|
|
74
|
+
)}, ${this.client.toArrayPathFromJsonPath(
|
|
75
|
+
extraction.path || extraction[1],
|
|
76
|
+
this.builder,
|
|
77
|
+
this.bindingsHolder
|
|
78
|
+
)})`;
|
|
79
|
+
const alias = extraction.alias || extraction[2];
|
|
80
|
+
return alias
|
|
81
|
+
? this.client.alias(jsonCol, this.formatter.wrap(alias))
|
|
82
|
+
: jsonCol;
|
|
83
|
+
})
|
|
84
|
+
.join(', ');
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
_onJsonPathEquals(nameJoinFunction, clause) {
|
|
88
|
+
return (
|
|
89
|
+
'json_extract_path(' +
|
|
90
|
+
wrap_(
|
|
91
|
+
clause.columnFirst,
|
|
92
|
+
undefined,
|
|
93
|
+
this.builder,
|
|
94
|
+
this.client,
|
|
95
|
+
this.bindingsHolder
|
|
96
|
+
) +
|
|
97
|
+
', ' +
|
|
98
|
+
this.client.toArrayPathFromJsonPath(
|
|
99
|
+
clause.jsonPathFirst,
|
|
100
|
+
this.builder,
|
|
101
|
+
this.bindingsHolder
|
|
102
|
+
) +
|
|
103
|
+
') = json_extract_path(' +
|
|
104
|
+
wrap_(
|
|
105
|
+
clause.columnSecond,
|
|
106
|
+
undefined,
|
|
107
|
+
this.builder,
|
|
108
|
+
this.client,
|
|
109
|
+
this.bindingsHolder
|
|
110
|
+
) +
|
|
111
|
+
', ' +
|
|
112
|
+
this.client.toArrayPathFromJsonPath(
|
|
113
|
+
clause.jsonPathSecond,
|
|
114
|
+
this.builder,
|
|
115
|
+
this.bindingsHolder
|
|
116
|
+
) +
|
|
117
|
+
')'
|
|
118
|
+
);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
module.exports = QueryCompiler_CRDB;
|