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
|
@@ -1,263 +1,263 @@
|
|
|
1
|
-
// SQLite3
|
|
2
|
-
// -------
|
|
3
|
-
const defaults = require('lodash/defaults');
|
|
4
|
-
const map = require('lodash/map');
|
|
5
|
-
const { promisify } = require('util');
|
|
6
|
-
|
|
7
|
-
const Client = require('../../client');
|
|
8
|
-
|
|
9
|
-
const Raw = require('../../raw');
|
|
10
|
-
const Transaction_Sqlite = require('./execution/sqlite-transaction');
|
|
11
|
-
const SqliteQueryCompiler = require('./query/sqlite-querycompiler');
|
|
12
|
-
const SchemaCompiler = require('./schema/sqlite-compiler');
|
|
13
|
-
const ColumnCompiler = require('./schema/sqlite-columncompiler');
|
|
14
|
-
const TableCompiler = require('./schema/sqlite-tablecompiler');
|
|
15
|
-
const ViewCompiler = require('./schema/sqlite-viewcompiler');
|
|
16
|
-
const SQLite3_DDL = require('./schema/ddl');
|
|
17
|
-
const Formatter = require('../../formatter');
|
|
18
|
-
const QueryBuilder = require('./query/sqlite-querybuilder');
|
|
19
|
-
|
|
20
|
-
class Client_SQLite3 extends Client {
|
|
21
|
-
constructor(config) {
|
|
22
|
-
super(config);
|
|
23
|
-
|
|
24
|
-
if (config.connection && config.connection.filename === undefined) {
|
|
25
|
-
this.logger.warn(
|
|
26
|
-
'Could not find `connection.filename` in config. Please specify ' +
|
|
27
|
-
'the database path and name to avoid errors. ' +
|
|
28
|
-
'(see docs https://knexjs.org/guide/#configuration-options)'
|
|
29
|
-
);
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
if (config.useNullAsDefault === undefined) {
|
|
33
|
-
this.logger.warn(
|
|
34
|
-
'sqlite does not support inserting default values. Set the ' +
|
|
35
|
-
'`useNullAsDefault` flag to hide this warning. ' +
|
|
36
|
-
'(see docs https://knexjs.org/guide/query-builder.html#insert).'
|
|
37
|
-
);
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
this.strictForeignKeyPragma = false;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
_driver() {
|
|
44
|
-
return require('sqlite3');
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
/** @returns {Client_SQLite3 & {strictForeignKeyPragma: true}} */
|
|
48
|
-
_strict() {
|
|
49
|
-
// return an SQLite3 client that is opted-in to strict
|
|
50
|
-
// transaction pragma settings without mutating the base
|
|
51
|
-
// instance we started from
|
|
52
|
-
const strictClient = Object.create(this);
|
|
53
|
-
strictClient.strictForeignKeyPragma = true;
|
|
54
|
-
strictClient.transaction = strictClient.transaction.bind(strictClient);
|
|
55
|
-
return strictClient;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
schemaCompiler() {
|
|
59
|
-
return new SchemaCompiler(this, ...arguments);
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
transaction() {
|
|
63
|
-
return new Transaction_Sqlite(this, ...arguments);
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
queryCompiler(builder, formatter) {
|
|
67
|
-
return new SqliteQueryCompiler(this, builder, formatter);
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
queryBuilder() {
|
|
71
|
-
return new QueryBuilder(this);
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
viewCompiler(builder, formatter) {
|
|
75
|
-
return new ViewCompiler(this, builder, formatter);
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
columnCompiler() {
|
|
79
|
-
return new ColumnCompiler(this, ...arguments);
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
tableCompiler() {
|
|
83
|
-
return new TableCompiler(this, ...arguments);
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
ddl(compiler, pragma, connection) {
|
|
87
|
-
return new SQLite3_DDL(this._strict(), compiler, pragma, connection);
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
wrapIdentifierImpl(value) {
|
|
91
|
-
return value !== '*' ? `\`${value.replace(/`/g, '``')}\`` : '*';
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
// Get a raw connection from the database, returning a promise with the connection object.
|
|
95
|
-
acquireRawConnection() {
|
|
96
|
-
return new Promise((resolve, reject) => {
|
|
97
|
-
// the default mode for sqlite3
|
|
98
|
-
let flags = this.driver.OPEN_READWRITE | this.driver.OPEN_CREATE;
|
|
99
|
-
|
|
100
|
-
if (this.connectionSettings.flags) {
|
|
101
|
-
if (!Array.isArray(this.connectionSettings.flags)) {
|
|
102
|
-
throw new Error(`flags must be an array of strings`);
|
|
103
|
-
}
|
|
104
|
-
this.connectionSettings.flags.forEach((_flag) => {
|
|
105
|
-
if (!_flag.startsWith('OPEN_') || !this.driver[_flag]) {
|
|
106
|
-
throw new Error(`flag ${_flag} not supported by node-sqlite3`);
|
|
107
|
-
}
|
|
108
|
-
flags = flags | this.driver[_flag];
|
|
109
|
-
});
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
const db = new this.driver.Database(
|
|
113
|
-
this.connectionSettings.filename,
|
|
114
|
-
flags,
|
|
115
|
-
(err) => {
|
|
116
|
-
if (err) {
|
|
117
|
-
return reject(err);
|
|
118
|
-
}
|
|
119
|
-
resolve(db);
|
|
120
|
-
}
|
|
121
|
-
);
|
|
122
|
-
});
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
// Used to explicitly close a connection, called internally by the pool when
|
|
126
|
-
// a connection times out or the pool is shutdown.
|
|
127
|
-
async destroyRawConnection(connection) {
|
|
128
|
-
const close = promisify((cb) => connection.close(cb));
|
|
129
|
-
return close();
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
// Runs the query on the specified connection, providing the bindings and any
|
|
133
|
-
// other necessary prep work.
|
|
134
|
-
_query(connection, obj) {
|
|
135
|
-
if (!obj.sql) throw new Error('The query is empty');
|
|
136
|
-
|
|
137
|
-
const { method } = obj;
|
|
138
|
-
let callMethod;
|
|
139
|
-
switch (method) {
|
|
140
|
-
case 'insert':
|
|
141
|
-
case 'update':
|
|
142
|
-
callMethod = obj.returning ? 'all' : 'run';
|
|
143
|
-
break;
|
|
144
|
-
case 'counter':
|
|
145
|
-
case 'del':
|
|
146
|
-
callMethod = 'run';
|
|
147
|
-
break;
|
|
148
|
-
default:
|
|
149
|
-
callMethod = 'all';
|
|
150
|
-
}
|
|
151
|
-
return new Promise(function (resolver, rejecter) {
|
|
152
|
-
if (!connection || !connection[callMethod]) {
|
|
153
|
-
return rejecter(
|
|
154
|
-
new Error(`Error calling ${callMethod} on connection.`)
|
|
155
|
-
);
|
|
156
|
-
}
|
|
157
|
-
connection[callMethod](obj.sql, obj.bindings, function (err, response) {
|
|
158
|
-
if (err) return rejecter(err);
|
|
159
|
-
obj.response = response;
|
|
160
|
-
|
|
161
|
-
// We need the context here, as it contains
|
|
162
|
-
// the "this.lastID" or "this.changes"
|
|
163
|
-
obj.context = this;
|
|
164
|
-
|
|
165
|
-
return resolver(obj);
|
|
166
|
-
});
|
|
167
|
-
});
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
_stream(connection, obj, stream) {
|
|
171
|
-
if (!obj.sql) throw new Error('The query is empty');
|
|
172
|
-
|
|
173
|
-
const client = this;
|
|
174
|
-
return new Promise(function (resolver, rejecter) {
|
|
175
|
-
stream.on('error', rejecter);
|
|
176
|
-
stream.on('end', resolver);
|
|
177
|
-
|
|
178
|
-
return client
|
|
179
|
-
._query(connection, obj)
|
|
180
|
-
.then((obj) => obj.response)
|
|
181
|
-
.then((rows) => rows.forEach((row) => stream.write(row)))
|
|
182
|
-
.catch(function (err) {
|
|
183
|
-
stream.emit('error', err);
|
|
184
|
-
})
|
|
185
|
-
.then(function () {
|
|
186
|
-
stream.end();
|
|
187
|
-
});
|
|
188
|
-
});
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
// Ensures the response is returned in the same format as other clients.
|
|
192
|
-
processResponse(obj, runner) {
|
|
193
|
-
const ctx = obj.context;
|
|
194
|
-
const { response, returning } = obj;
|
|
195
|
-
if (obj.output) return obj.output.call(runner, response);
|
|
196
|
-
switch (obj.method) {
|
|
197
|
-
case 'select':
|
|
198
|
-
return response;
|
|
199
|
-
case 'first':
|
|
200
|
-
return response[0];
|
|
201
|
-
case 'pluck':
|
|
202
|
-
return map(response, obj.pluck);
|
|
203
|
-
case 'insert': {
|
|
204
|
-
if (returning) {
|
|
205
|
-
if (response) {
|
|
206
|
-
return response;
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
return [ctx.lastID];
|
|
210
|
-
}
|
|
211
|
-
case 'update': {
|
|
212
|
-
if (returning) {
|
|
213
|
-
if (response) {
|
|
214
|
-
return response;
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
return ctx.changes;
|
|
218
|
-
}
|
|
219
|
-
case 'del':
|
|
220
|
-
case 'counter':
|
|
221
|
-
return ctx.changes;
|
|
222
|
-
default: {
|
|
223
|
-
return response;
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
poolDefaults() {
|
|
229
|
-
return defaults({ min: 1, max: 1 }, super.poolDefaults());
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
formatter(builder) {
|
|
233
|
-
return new Formatter(this, builder);
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
values(values, builder, formatter) {
|
|
237
|
-
if (Array.isArray(values)) {
|
|
238
|
-
if (Array.isArray(values[0])) {
|
|
239
|
-
return `( values ${values
|
|
240
|
-
.map(
|
|
241
|
-
(value) =>
|
|
242
|
-
`(${this.parameterize(value, undefined, builder, formatter)})`
|
|
243
|
-
)
|
|
244
|
-
.join(', ')})`;
|
|
245
|
-
}
|
|
246
|
-
return `(${this.parameterize(values, undefined, builder, formatter)})`;
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
if (values instanceof Raw) {
|
|
250
|
-
return `(${this.parameter(values, builder, formatter)})`;
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
return this.parameter(values, builder, formatter);
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
Object.assign(Client_SQLite3.prototype, {
|
|
258
|
-
dialect: 'sqlite3',
|
|
259
|
-
|
|
260
|
-
driverName: 'sqlite3',
|
|
261
|
-
});
|
|
262
|
-
|
|
263
|
-
module.exports = Client_SQLite3;
|
|
1
|
+
// SQLite3
|
|
2
|
+
// -------
|
|
3
|
+
const defaults = require('lodash/defaults');
|
|
4
|
+
const map = require('lodash/map');
|
|
5
|
+
const { promisify } = require('util');
|
|
6
|
+
|
|
7
|
+
const Client = require('../../client');
|
|
8
|
+
|
|
9
|
+
const Raw = require('../../raw');
|
|
10
|
+
const Transaction_Sqlite = require('./execution/sqlite-transaction');
|
|
11
|
+
const SqliteQueryCompiler = require('./query/sqlite-querycompiler');
|
|
12
|
+
const SchemaCompiler = require('./schema/sqlite-compiler');
|
|
13
|
+
const ColumnCompiler = require('./schema/sqlite-columncompiler');
|
|
14
|
+
const TableCompiler = require('./schema/sqlite-tablecompiler');
|
|
15
|
+
const ViewCompiler = require('./schema/sqlite-viewcompiler');
|
|
16
|
+
const SQLite3_DDL = require('./schema/ddl');
|
|
17
|
+
const Formatter = require('../../formatter');
|
|
18
|
+
const QueryBuilder = require('./query/sqlite-querybuilder');
|
|
19
|
+
|
|
20
|
+
class Client_SQLite3 extends Client {
|
|
21
|
+
constructor(config) {
|
|
22
|
+
super(config);
|
|
23
|
+
|
|
24
|
+
if (config.connection && config.connection.filename === undefined) {
|
|
25
|
+
this.logger.warn(
|
|
26
|
+
'Could not find `connection.filename` in config. Please specify ' +
|
|
27
|
+
'the database path and name to avoid errors. ' +
|
|
28
|
+
'(see docs https://knexjs.org/guide/#configuration-options)'
|
|
29
|
+
);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
if (config.useNullAsDefault === undefined) {
|
|
33
|
+
this.logger.warn(
|
|
34
|
+
'sqlite does not support inserting default values. Set the ' +
|
|
35
|
+
'`useNullAsDefault` flag to hide this warning. ' +
|
|
36
|
+
'(see docs https://knexjs.org/guide/query-builder.html#insert).'
|
|
37
|
+
);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
this.strictForeignKeyPragma = false;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
_driver() {
|
|
44
|
+
return require('sqlite3');
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/** @returns {Client_SQLite3 & {strictForeignKeyPragma: true}} */
|
|
48
|
+
_strict() {
|
|
49
|
+
// return an SQLite3 client that is opted-in to strict
|
|
50
|
+
// transaction pragma settings without mutating the base
|
|
51
|
+
// instance we started from
|
|
52
|
+
const strictClient = Object.create(this);
|
|
53
|
+
strictClient.strictForeignKeyPragma = true;
|
|
54
|
+
strictClient.transaction = strictClient.transaction.bind(strictClient);
|
|
55
|
+
return strictClient;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
schemaCompiler() {
|
|
59
|
+
return new SchemaCompiler(this, ...arguments);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
transaction() {
|
|
63
|
+
return new Transaction_Sqlite(this, ...arguments);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
queryCompiler(builder, formatter) {
|
|
67
|
+
return new SqliteQueryCompiler(this, builder, formatter);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
queryBuilder() {
|
|
71
|
+
return new QueryBuilder(this);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
viewCompiler(builder, formatter) {
|
|
75
|
+
return new ViewCompiler(this, builder, formatter);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
columnCompiler() {
|
|
79
|
+
return new ColumnCompiler(this, ...arguments);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
tableCompiler() {
|
|
83
|
+
return new TableCompiler(this, ...arguments);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
ddl(compiler, pragma, connection) {
|
|
87
|
+
return new SQLite3_DDL(this._strict(), compiler, pragma, connection);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
wrapIdentifierImpl(value) {
|
|
91
|
+
return value !== '*' ? `\`${value.replace(/`/g, '``')}\`` : '*';
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// Get a raw connection from the database, returning a promise with the connection object.
|
|
95
|
+
acquireRawConnection() {
|
|
96
|
+
return new Promise((resolve, reject) => {
|
|
97
|
+
// the default mode for sqlite3
|
|
98
|
+
let flags = this.driver.OPEN_READWRITE | this.driver.OPEN_CREATE;
|
|
99
|
+
|
|
100
|
+
if (this.connectionSettings.flags) {
|
|
101
|
+
if (!Array.isArray(this.connectionSettings.flags)) {
|
|
102
|
+
throw new Error(`flags must be an array of strings`);
|
|
103
|
+
}
|
|
104
|
+
this.connectionSettings.flags.forEach((_flag) => {
|
|
105
|
+
if (!_flag.startsWith('OPEN_') || !this.driver[_flag]) {
|
|
106
|
+
throw new Error(`flag ${_flag} not supported by node-sqlite3`);
|
|
107
|
+
}
|
|
108
|
+
flags = flags | this.driver[_flag];
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
const db = new this.driver.Database(
|
|
113
|
+
this.connectionSettings.filename,
|
|
114
|
+
flags,
|
|
115
|
+
(err) => {
|
|
116
|
+
if (err) {
|
|
117
|
+
return reject(err);
|
|
118
|
+
}
|
|
119
|
+
resolve(db);
|
|
120
|
+
}
|
|
121
|
+
);
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// Used to explicitly close a connection, called internally by the pool when
|
|
126
|
+
// a connection times out or the pool is shutdown.
|
|
127
|
+
async destroyRawConnection(connection) {
|
|
128
|
+
const close = promisify((cb) => connection.close(cb));
|
|
129
|
+
return close();
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// Runs the query on the specified connection, providing the bindings and any
|
|
133
|
+
// other necessary prep work.
|
|
134
|
+
_query(connection, obj) {
|
|
135
|
+
if (!obj.sql) throw new Error('The query is empty');
|
|
136
|
+
|
|
137
|
+
const { method } = obj;
|
|
138
|
+
let callMethod;
|
|
139
|
+
switch (method) {
|
|
140
|
+
case 'insert':
|
|
141
|
+
case 'update':
|
|
142
|
+
callMethod = obj.returning ? 'all' : 'run';
|
|
143
|
+
break;
|
|
144
|
+
case 'counter':
|
|
145
|
+
case 'del':
|
|
146
|
+
callMethod = 'run';
|
|
147
|
+
break;
|
|
148
|
+
default:
|
|
149
|
+
callMethod = 'all';
|
|
150
|
+
}
|
|
151
|
+
return new Promise(function (resolver, rejecter) {
|
|
152
|
+
if (!connection || !connection[callMethod]) {
|
|
153
|
+
return rejecter(
|
|
154
|
+
new Error(`Error calling ${callMethod} on connection.`)
|
|
155
|
+
);
|
|
156
|
+
}
|
|
157
|
+
connection[callMethod](obj.sql, obj.bindings, function (err, response) {
|
|
158
|
+
if (err) return rejecter(err);
|
|
159
|
+
obj.response = response;
|
|
160
|
+
|
|
161
|
+
// We need the context here, as it contains
|
|
162
|
+
// the "this.lastID" or "this.changes"
|
|
163
|
+
obj.context = this;
|
|
164
|
+
|
|
165
|
+
return resolver(obj);
|
|
166
|
+
});
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
_stream(connection, obj, stream) {
|
|
171
|
+
if (!obj.sql) throw new Error('The query is empty');
|
|
172
|
+
|
|
173
|
+
const client = this;
|
|
174
|
+
return new Promise(function (resolver, rejecter) {
|
|
175
|
+
stream.on('error', rejecter);
|
|
176
|
+
stream.on('end', resolver);
|
|
177
|
+
|
|
178
|
+
return client
|
|
179
|
+
._query(connection, obj)
|
|
180
|
+
.then((obj) => obj.response)
|
|
181
|
+
.then((rows) => rows.forEach((row) => stream.write(row)))
|
|
182
|
+
.catch(function (err) {
|
|
183
|
+
stream.emit('error', err);
|
|
184
|
+
})
|
|
185
|
+
.then(function () {
|
|
186
|
+
stream.end();
|
|
187
|
+
});
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
// Ensures the response is returned in the same format as other clients.
|
|
192
|
+
processResponse(obj, runner) {
|
|
193
|
+
const ctx = obj.context;
|
|
194
|
+
const { response, returning } = obj;
|
|
195
|
+
if (obj.output) return obj.output.call(runner, response);
|
|
196
|
+
switch (obj.method) {
|
|
197
|
+
case 'select':
|
|
198
|
+
return response;
|
|
199
|
+
case 'first':
|
|
200
|
+
return response[0];
|
|
201
|
+
case 'pluck':
|
|
202
|
+
return map(response, obj.pluck);
|
|
203
|
+
case 'insert': {
|
|
204
|
+
if (returning) {
|
|
205
|
+
if (response) {
|
|
206
|
+
return response;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
return [ctx.lastID];
|
|
210
|
+
}
|
|
211
|
+
case 'update': {
|
|
212
|
+
if (returning) {
|
|
213
|
+
if (response) {
|
|
214
|
+
return response;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
return ctx.changes;
|
|
218
|
+
}
|
|
219
|
+
case 'del':
|
|
220
|
+
case 'counter':
|
|
221
|
+
return ctx.changes;
|
|
222
|
+
default: {
|
|
223
|
+
return response;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
poolDefaults() {
|
|
229
|
+
return defaults({ min: 1, max: 1 }, super.poolDefaults());
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
formatter(builder) {
|
|
233
|
+
return new Formatter(this, builder);
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
values(values, builder, formatter) {
|
|
237
|
+
if (Array.isArray(values)) {
|
|
238
|
+
if (Array.isArray(values[0])) {
|
|
239
|
+
return `( values ${values
|
|
240
|
+
.map(
|
|
241
|
+
(value) =>
|
|
242
|
+
`(${this.parameterize(value, undefined, builder, formatter)})`
|
|
243
|
+
)
|
|
244
|
+
.join(', ')})`;
|
|
245
|
+
}
|
|
246
|
+
return `(${this.parameterize(values, undefined, builder, formatter)})`;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
if (values instanceof Raw) {
|
|
250
|
+
return `(${this.parameter(values, builder, formatter)})`;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
return this.parameter(values, builder, formatter);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
Object.assign(Client_SQLite3.prototype, {
|
|
258
|
+
dialect: 'sqlite3',
|
|
259
|
+
|
|
260
|
+
driverName: 'sqlite3',
|
|
261
|
+
});
|
|
262
|
+
|
|
263
|
+
module.exports = Client_SQLite3;
|
|
@@ -1,33 +1,33 @@
|
|
|
1
|
-
const QueryBuilder = require('../../../query/querybuilder.js');
|
|
2
|
-
|
|
3
|
-
module.exports = class QueryBuilder_SQLite3 extends QueryBuilder {
|
|
4
|
-
withMaterialized(alias, statementOrColumnList, nothingOrStatement) {
|
|
5
|
-
this._validateWithArgs(
|
|
6
|
-
alias,
|
|
7
|
-
statementOrColumnList,
|
|
8
|
-
nothingOrStatement,
|
|
9
|
-
'with'
|
|
10
|
-
);
|
|
11
|
-
return this.withWrapped(
|
|
12
|
-
alias,
|
|
13
|
-
statementOrColumnList,
|
|
14
|
-
nothingOrStatement,
|
|
15
|
-
true
|
|
16
|
-
);
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
withNotMaterialized(alias, statementOrColumnList, nothingOrStatement) {
|
|
20
|
-
this._validateWithArgs(
|
|
21
|
-
alias,
|
|
22
|
-
statementOrColumnList,
|
|
23
|
-
nothingOrStatement,
|
|
24
|
-
'with'
|
|
25
|
-
);
|
|
26
|
-
return this.withWrapped(
|
|
27
|
-
alias,
|
|
28
|
-
statementOrColumnList,
|
|
29
|
-
nothingOrStatement,
|
|
30
|
-
false
|
|
31
|
-
);
|
|
32
|
-
}
|
|
33
|
-
};
|
|
1
|
+
const QueryBuilder = require('../../../query/querybuilder.js');
|
|
2
|
+
|
|
3
|
+
module.exports = class QueryBuilder_SQLite3 extends QueryBuilder {
|
|
4
|
+
withMaterialized(alias, statementOrColumnList, nothingOrStatement) {
|
|
5
|
+
this._validateWithArgs(
|
|
6
|
+
alias,
|
|
7
|
+
statementOrColumnList,
|
|
8
|
+
nothingOrStatement,
|
|
9
|
+
'with'
|
|
10
|
+
);
|
|
11
|
+
return this.withWrapped(
|
|
12
|
+
alias,
|
|
13
|
+
statementOrColumnList,
|
|
14
|
+
nothingOrStatement,
|
|
15
|
+
true
|
|
16
|
+
);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
withNotMaterialized(alias, statementOrColumnList, nothingOrStatement) {
|
|
20
|
+
this._validateWithArgs(
|
|
21
|
+
alias,
|
|
22
|
+
statementOrColumnList,
|
|
23
|
+
nothingOrStatement,
|
|
24
|
+
'with'
|
|
25
|
+
);
|
|
26
|
+
return this.withWrapped(
|
|
27
|
+
alias,
|
|
28
|
+
statementOrColumnList,
|
|
29
|
+
nothingOrStatement,
|
|
30
|
+
false
|
|
31
|
+
);
|
|
32
|
+
}
|
|
33
|
+
};
|