knex 0.21.20 → 0.21.21
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 +6 -0
- package/CONTRIBUTING.md +184 -184
- package/LICENSE +22 -22
- package/README.md +95 -95
- package/bin/cli.js +414 -414
- package/bin/utils/cli-config-utils.js +151 -151
- package/bin/utils/constants.js +7 -7
- package/bin/utils/migrationsLister.js +37 -37
- package/knex.js +8 -8
- package/lib/client.js +413 -413
- package/lib/config-resolver.js +61 -61
- package/lib/constants.js +44 -44
- package/lib/dialects/mssql/index.js +390 -390
- package/lib/dialects/mssql/query/compiler.js +444 -444
- package/lib/dialects/mssql/schema/columncompiler.js +103 -103
- package/lib/dialects/mssql/schema/compiler.js +59 -59
- package/lib/dialects/mssql/schema/tablecompiler.js +245 -245
- package/lib/dialects/mssql/transaction.js +97 -97
- package/lib/dialects/mysql/index.js +191 -191
- package/lib/dialects/mysql/query/compiler.js +142 -142
- package/lib/dialects/mysql/schema/columncompiler.js +171 -171
- package/lib/dialects/mysql/schema/compiler.js +60 -60
- package/lib/dialects/mysql/schema/tablecompiler.js +262 -262
- package/lib/dialects/mysql/transaction.js +48 -48
- package/lib/dialects/mysql2/index.js +35 -35
- package/lib/dialects/mysql2/transaction.js +46 -46
- package/lib/dialects/oracle/DEAD_CODE.md +5 -5
- package/lib/dialects/oracle/formatter.js +20 -20
- package/lib/dialects/oracle/index.js +79 -79
- package/lib/dialects/oracle/query/compiler.js +327 -327
- package/lib/dialects/oracle/schema/columnbuilder.js +18 -18
- package/lib/dialects/oracle/schema/columncompiler.js +139 -139
- package/lib/dialects/oracle/schema/compiler.js +81 -81
- package/lib/dialects/oracle/schema/tablecompiler.js +165 -165
- package/lib/dialects/oracle/schema/trigger.js +126 -126
- package/lib/dialects/oracle/utils.js +86 -86
- package/lib/dialects/oracledb/index.js +489 -489
- package/lib/dialects/oracledb/query/compiler.js +363 -363
- package/lib/dialects/oracledb/schema/columncompiler.js +35 -35
- package/lib/dialects/oracledb/transaction.js +76 -76
- package/lib/dialects/oracledb/utils.js +14 -14
- package/lib/dialects/postgres/index.js +319 -319
- package/lib/dialects/postgres/query/compiler.js +206 -206
- package/lib/dialects/postgres/schema/columncompiler.js +125 -125
- package/lib/dialects/postgres/schema/compiler.js +109 -109
- package/lib/dialects/postgres/schema/tablecompiler.js +183 -183
- package/lib/dialects/redshift/index.js +73 -73
- package/lib/dialects/redshift/query/compiler.js +119 -119
- package/lib/dialects/redshift/schema/columnbuilder.js +20 -20
- package/lib/dialects/redshift/schema/columncompiler.js +60 -60
- package/lib/dialects/redshift/schema/compiler.js +14 -14
- package/lib/dialects/redshift/schema/tablecompiler.js +123 -123
- package/lib/dialects/redshift/transaction.js +18 -18
- package/lib/dialects/sqlite3/formatter.js +21 -21
- package/lib/dialects/sqlite3/index.js +169 -169
- package/lib/dialects/sqlite3/query/compiler.js +222 -222
- package/lib/dialects/sqlite3/schema/columncompiler.js +27 -27
- package/lib/dialects/sqlite3/schema/compiler.js +49 -49
- package/lib/dialects/sqlite3/schema/ddl.js +525 -525
- package/lib/dialects/sqlite3/schema/tablecompiler.js +238 -238
- package/lib/formatter.js +295 -295
- package/lib/functionhelper.js +14 -14
- package/lib/helpers.js +92 -92
- package/lib/index.js +3 -3
- package/lib/interface.js +115 -115
- package/lib/knex.js +42 -42
- package/lib/logger.js +76 -76
- package/lib/migrate/MigrationGenerator.js +82 -82
- package/lib/migrate/Migrator.js +611 -611
- package/lib/migrate/configuration-merger.js +60 -60
- package/lib/migrate/migrate-stub.js +17 -17
- package/lib/migrate/migration-list-resolver.js +36 -36
- package/lib/migrate/sources/fs-migrations.js +99 -99
- package/lib/migrate/stub/cjs.stub +15 -15
- package/lib/migrate/stub/coffee.stub +13 -13
- package/lib/migrate/stub/eg.stub +14 -14
- package/lib/migrate/stub/js.stub +15 -15
- package/lib/migrate/stub/knexfile-coffee.stub +34 -34
- package/lib/migrate/stub/knexfile-eg.stub +43 -43
- package/lib/migrate/stub/knexfile-js.stub +44 -44
- package/lib/migrate/stub/knexfile-ls.stub +35 -35
- package/lib/migrate/stub/knexfile-ts.stub +44 -44
- package/lib/migrate/stub/ls.stub +14 -14
- package/lib/migrate/stub/ts.stub +21 -21
- package/lib/migrate/table-creator.js +67 -67
- package/lib/migrate/table-resolver.js +27 -27
- package/lib/query/builder.js +1372 -1372
- package/lib/query/compiler.js +889 -889
- package/lib/query/constants.js +13 -13
- package/lib/query/joinclause.js +263 -263
- package/lib/query/methods.js +92 -92
- package/lib/query/string.js +190 -190
- package/lib/raw.js +188 -188
- package/lib/ref.js +39 -39
- package/lib/runner.js +285 -285
- package/lib/schema/builder.js +82 -82
- package/lib/schema/columnbuilder.js +117 -117
- package/lib/schema/columncompiler.js +177 -177
- package/lib/schema/compiler.js +101 -101
- package/lib/schema/helpers.js +51 -51
- package/lib/schema/tablebuilder.js +288 -288
- package/lib/schema/tablecompiler.js +296 -296
- package/lib/seed/Seeder.js +203 -203
- package/lib/seed/seed-stub.js +13 -13
- package/lib/seed/stub/coffee.stub +9 -9
- package/lib/seed/stub/eg.stub +11 -11
- package/lib/seed/stub/js.stub +13 -13
- package/lib/seed/stub/ls.stub +11 -11
- package/lib/seed/stub/ts.stub +13 -13
- package/lib/transaction.js +363 -363
- package/lib/util/batchInsert.js +59 -59
- package/lib/util/delay.js +6 -6
- package/lib/util/fake-client.js +9 -9
- package/lib/util/finally-mixin.js +13 -13
- package/lib/util/fs.js +76 -76
- package/lib/util/import-file.js +13 -13
- package/lib/util/is-module-type.js +14 -14
- package/lib/util/is.js +32 -32
- package/lib/util/make-knex.js +338 -338
- package/lib/util/nanoid.js +29 -29
- package/lib/util/noop.js +1 -1
- package/lib/util/parse-connection.js +66 -66
- package/lib/util/save-async-stack.js +14 -14
- package/lib/util/template.js +52 -52
- package/lib/util/timeout.js +29 -29
- package/lib/util/timestamp.js +16 -16
- package/package.json +1 -1
- package/scripts/build.js +125 -125
- package/scripts/docker-compose.yml +111 -111
- package/scripts/next-release-howto.md +24 -24
- package/scripts/release.sh +34 -34
- package/scripts/runkit-example.js +34 -34
- package/scripts/stress-test/README.txt +18 -18
- package/scripts/stress-test/docker-compose.yml +47 -47
- package/scripts/stress-test/knex-stress-test.js +196 -196
- package/scripts/stress-test/mysql2-random-hanging-every-now-and-then.js +145 -145
- package/scripts/stress-test/mysql2-sudden-exit-without-error.js +100 -100
- package/scripts/stress-test/reconnect-test-mysql-based-drivers.js +184 -184
- package/types/index.d.ts +2249 -2249
- package/types/result.d.ts +27 -27
- package/types/tables.d.ts +4 -4
|
@@ -1,123 +1,123 @@
|
|
|
1
|
-
/* eslint max-len: 0 */
|
|
2
|
-
|
|
3
|
-
// Redshift Table Builder & Compiler
|
|
4
|
-
// -------
|
|
5
|
-
|
|
6
|
-
const { inherits } = require('util');
|
|
7
|
-
const has = require('lodash/has');
|
|
8
|
-
const TableCompiler_PG = require('../../postgres/schema/tablecompiler');
|
|
9
|
-
|
|
10
|
-
function TableCompiler_Redshift() {
|
|
11
|
-
TableCompiler_PG.apply(this, arguments);
|
|
12
|
-
}
|
|
13
|
-
inherits(TableCompiler_Redshift, TableCompiler_PG);
|
|
14
|
-
|
|
15
|
-
TableCompiler_Redshift.prototype.index = function (
|
|
16
|
-
columns,
|
|
17
|
-
indexName,
|
|
18
|
-
indexType
|
|
19
|
-
) {
|
|
20
|
-
this.client.logger.warn('Redshift does not support the creation of indexes.');
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
TableCompiler_Redshift.prototype.dropIndex = function (columns, indexName) {
|
|
24
|
-
this.client.logger.warn('Redshift does not support the deletion of indexes.');
|
|
25
|
-
};
|
|
26
|
-
|
|
27
|
-
// TODO: have to disable setting not null on columns that already exist...
|
|
28
|
-
|
|
29
|
-
// Adds the "create" query to the query sequence.
|
|
30
|
-
TableCompiler_Redshift.prototype.createQuery = function (columns, ifNot) {
|
|
31
|
-
const createStatement = ifNot
|
|
32
|
-
? 'create table if not exists '
|
|
33
|
-
: 'create table ';
|
|
34
|
-
let sql =
|
|
35
|
-
createStatement + this.tableName() + ' (' + columns.sql.join(', ') + ')';
|
|
36
|
-
if (this.single.inherits)
|
|
37
|
-
sql += ` like (${this.formatter.wrap(this.single.inherits)})`;
|
|
38
|
-
this.pushQuery({
|
|
39
|
-
sql,
|
|
40
|
-
bindings: columns.bindings,
|
|
41
|
-
});
|
|
42
|
-
const hasComment = has(this.single, 'comment');
|
|
43
|
-
if (hasComment) this.comment(this.single.comment);
|
|
44
|
-
};
|
|
45
|
-
|
|
46
|
-
TableCompiler_Redshift.prototype.primary = function (columns, constraintName) {
|
|
47
|
-
const self = this;
|
|
48
|
-
constraintName = constraintName
|
|
49
|
-
? self.formatter.wrap(constraintName)
|
|
50
|
-
: self.formatter.wrap(`${this.tableNameRaw}_pkey`);
|
|
51
|
-
if (columns.constructor !== Array) {
|
|
52
|
-
columns = [columns];
|
|
53
|
-
}
|
|
54
|
-
const thiscolumns = self.grouped.columns;
|
|
55
|
-
|
|
56
|
-
if (thiscolumns) {
|
|
57
|
-
for (let i = 0; i < columns.length; i++) {
|
|
58
|
-
let exists = thiscolumns.find(
|
|
59
|
-
(tcb) =>
|
|
60
|
-
tcb.grouping === 'columns' &&
|
|
61
|
-
tcb.builder &&
|
|
62
|
-
tcb.builder._method === 'add' &&
|
|
63
|
-
tcb.builder._args &&
|
|
64
|
-
tcb.builder._args.indexOf(columns[i]) > -1
|
|
65
|
-
);
|
|
66
|
-
if (exists) {
|
|
67
|
-
exists = exists.builder;
|
|
68
|
-
}
|
|
69
|
-
const nullable = !(
|
|
70
|
-
exists &&
|
|
71
|
-
exists._modifiers &&
|
|
72
|
-
exists._modifiers['nullable'] &&
|
|
73
|
-
exists._modifiers['nullable'][0] === false
|
|
74
|
-
);
|
|
75
|
-
if (nullable) {
|
|
76
|
-
if (exists) {
|
|
77
|
-
return this.client.logger.warn(
|
|
78
|
-
'Redshift does not allow primary keys to contain nullable columns.'
|
|
79
|
-
);
|
|
80
|
-
} else {
|
|
81
|
-
return this.client.logger.warn(
|
|
82
|
-
'Redshift does not allow primary keys to contain nonexistent columns.'
|
|
83
|
-
);
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
return self.pushQuery(
|
|
89
|
-
`alter table ${self.tableName()} add constraint ${constraintName} primary key (${self.formatter.columnize(
|
|
90
|
-
columns
|
|
91
|
-
)})`
|
|
92
|
-
);
|
|
93
|
-
};
|
|
94
|
-
|
|
95
|
-
// Compiles column add. Redshift can only add one column per ALTER TABLE, so core addColumns doesn't work. #2545
|
|
96
|
-
TableCompiler_Redshift.prototype.addColumns = function (
|
|
97
|
-
columns,
|
|
98
|
-
prefix,
|
|
99
|
-
colCompilers
|
|
100
|
-
) {
|
|
101
|
-
if (prefix === this.alterColumnsPrefix) {
|
|
102
|
-
TableCompiler_PG.prototype.addColumns.call(
|
|
103
|
-
this,
|
|
104
|
-
columns,
|
|
105
|
-
prefix,
|
|
106
|
-
colCompilers
|
|
107
|
-
);
|
|
108
|
-
} else {
|
|
109
|
-
prefix = prefix || this.addColumnsPrefix;
|
|
110
|
-
colCompilers = colCompilers || this.getColumns();
|
|
111
|
-
for (const col of colCompilers) {
|
|
112
|
-
const quotedTableName = this.tableName();
|
|
113
|
-
const colCompiled = col.compileColumn();
|
|
114
|
-
|
|
115
|
-
this.pushQuery({
|
|
116
|
-
sql: `alter table ${quotedTableName} ${prefix}${colCompiled}`,
|
|
117
|
-
bindings: [],
|
|
118
|
-
});
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
};
|
|
122
|
-
|
|
123
|
-
module.exports = TableCompiler_Redshift;
|
|
1
|
+
/* eslint max-len: 0 */
|
|
2
|
+
|
|
3
|
+
// Redshift Table Builder & Compiler
|
|
4
|
+
// -------
|
|
5
|
+
|
|
6
|
+
const { inherits } = require('util');
|
|
7
|
+
const has = require('lodash/has');
|
|
8
|
+
const TableCompiler_PG = require('../../postgres/schema/tablecompiler');
|
|
9
|
+
|
|
10
|
+
function TableCompiler_Redshift() {
|
|
11
|
+
TableCompiler_PG.apply(this, arguments);
|
|
12
|
+
}
|
|
13
|
+
inherits(TableCompiler_Redshift, TableCompiler_PG);
|
|
14
|
+
|
|
15
|
+
TableCompiler_Redshift.prototype.index = function (
|
|
16
|
+
columns,
|
|
17
|
+
indexName,
|
|
18
|
+
indexType
|
|
19
|
+
) {
|
|
20
|
+
this.client.logger.warn('Redshift does not support the creation of indexes.');
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
TableCompiler_Redshift.prototype.dropIndex = function (columns, indexName) {
|
|
24
|
+
this.client.logger.warn('Redshift does not support the deletion of indexes.');
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
// TODO: have to disable setting not null on columns that already exist...
|
|
28
|
+
|
|
29
|
+
// Adds the "create" query to the query sequence.
|
|
30
|
+
TableCompiler_Redshift.prototype.createQuery = function (columns, ifNot) {
|
|
31
|
+
const createStatement = ifNot
|
|
32
|
+
? 'create table if not exists '
|
|
33
|
+
: 'create table ';
|
|
34
|
+
let sql =
|
|
35
|
+
createStatement + this.tableName() + ' (' + columns.sql.join(', ') + ')';
|
|
36
|
+
if (this.single.inherits)
|
|
37
|
+
sql += ` like (${this.formatter.wrap(this.single.inherits)})`;
|
|
38
|
+
this.pushQuery({
|
|
39
|
+
sql,
|
|
40
|
+
bindings: columns.bindings,
|
|
41
|
+
});
|
|
42
|
+
const hasComment = has(this.single, 'comment');
|
|
43
|
+
if (hasComment) this.comment(this.single.comment);
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
TableCompiler_Redshift.prototype.primary = function (columns, constraintName) {
|
|
47
|
+
const self = this;
|
|
48
|
+
constraintName = constraintName
|
|
49
|
+
? self.formatter.wrap(constraintName)
|
|
50
|
+
: self.formatter.wrap(`${this.tableNameRaw}_pkey`);
|
|
51
|
+
if (columns.constructor !== Array) {
|
|
52
|
+
columns = [columns];
|
|
53
|
+
}
|
|
54
|
+
const thiscolumns = self.grouped.columns;
|
|
55
|
+
|
|
56
|
+
if (thiscolumns) {
|
|
57
|
+
for (let i = 0; i < columns.length; i++) {
|
|
58
|
+
let exists = thiscolumns.find(
|
|
59
|
+
(tcb) =>
|
|
60
|
+
tcb.grouping === 'columns' &&
|
|
61
|
+
tcb.builder &&
|
|
62
|
+
tcb.builder._method === 'add' &&
|
|
63
|
+
tcb.builder._args &&
|
|
64
|
+
tcb.builder._args.indexOf(columns[i]) > -1
|
|
65
|
+
);
|
|
66
|
+
if (exists) {
|
|
67
|
+
exists = exists.builder;
|
|
68
|
+
}
|
|
69
|
+
const nullable = !(
|
|
70
|
+
exists &&
|
|
71
|
+
exists._modifiers &&
|
|
72
|
+
exists._modifiers['nullable'] &&
|
|
73
|
+
exists._modifiers['nullable'][0] === false
|
|
74
|
+
);
|
|
75
|
+
if (nullable) {
|
|
76
|
+
if (exists) {
|
|
77
|
+
return this.client.logger.warn(
|
|
78
|
+
'Redshift does not allow primary keys to contain nullable columns.'
|
|
79
|
+
);
|
|
80
|
+
} else {
|
|
81
|
+
return this.client.logger.warn(
|
|
82
|
+
'Redshift does not allow primary keys to contain nonexistent columns.'
|
|
83
|
+
);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return self.pushQuery(
|
|
89
|
+
`alter table ${self.tableName()} add constraint ${constraintName} primary key (${self.formatter.columnize(
|
|
90
|
+
columns
|
|
91
|
+
)})`
|
|
92
|
+
);
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
// Compiles column add. Redshift can only add one column per ALTER TABLE, so core addColumns doesn't work. #2545
|
|
96
|
+
TableCompiler_Redshift.prototype.addColumns = function (
|
|
97
|
+
columns,
|
|
98
|
+
prefix,
|
|
99
|
+
colCompilers
|
|
100
|
+
) {
|
|
101
|
+
if (prefix === this.alterColumnsPrefix) {
|
|
102
|
+
TableCompiler_PG.prototype.addColumns.call(
|
|
103
|
+
this,
|
|
104
|
+
columns,
|
|
105
|
+
prefix,
|
|
106
|
+
colCompilers
|
|
107
|
+
);
|
|
108
|
+
} else {
|
|
109
|
+
prefix = prefix || this.addColumnsPrefix;
|
|
110
|
+
colCompilers = colCompilers || this.getColumns();
|
|
111
|
+
for (const col of colCompilers) {
|
|
112
|
+
const quotedTableName = this.tableName();
|
|
113
|
+
const colCompiled = col.compileColumn();
|
|
114
|
+
|
|
115
|
+
this.pushQuery({
|
|
116
|
+
sql: `alter table ${quotedTableName} ${prefix}${colCompiled}`,
|
|
117
|
+
bindings: [],
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
|
|
123
|
+
module.exports = TableCompiler_Redshift;
|
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
const Transaction = require('../../transaction');
|
|
2
|
-
|
|
3
|
-
module.exports = class Redshift_Transaction extends Transaction {
|
|
4
|
-
savepoint(conn) {
|
|
5
|
-
this.trxClient.logger('Redshift does not support savepoints.');
|
|
6
|
-
return Promise.resolve();
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
release(conn, value) {
|
|
10
|
-
this.trxClient.logger('Redshift does not support savepoints.');
|
|
11
|
-
return Promise.resolve();
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
rollbackTo(conn, error) {
|
|
15
|
-
this.trxClient.logger('Redshift does not support savepoints.');
|
|
16
|
-
return Promise.resolve();
|
|
17
|
-
}
|
|
18
|
-
};
|
|
1
|
+
const Transaction = require('../../transaction');
|
|
2
|
+
|
|
3
|
+
module.exports = class Redshift_Transaction extends Transaction {
|
|
4
|
+
savepoint(conn) {
|
|
5
|
+
this.trxClient.logger('Redshift does not support savepoints.');
|
|
6
|
+
return Promise.resolve();
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
release(conn, value) {
|
|
10
|
+
this.trxClient.logger('Redshift does not support savepoints.');
|
|
11
|
+
return Promise.resolve();
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
rollbackTo(conn, error) {
|
|
15
|
+
this.trxClient.logger('Redshift does not support savepoints.');
|
|
16
|
+
return Promise.resolve();
|
|
17
|
+
}
|
|
18
|
+
};
|
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
const Formatter = require('../../formatter');
|
|
2
|
-
const Raw = require('../../raw');
|
|
3
|
-
|
|
4
|
-
module.exports = class SQlite3_Formatter extends Formatter {
|
|
5
|
-
values(values) {
|
|
6
|
-
if (Array.isArray(values)) {
|
|
7
|
-
if (Array.isArray(values[0])) {
|
|
8
|
-
return `( values ${values
|
|
9
|
-
.map((value) => `(${this.parameterize(value)})`)
|
|
10
|
-
.join(', ')})`;
|
|
11
|
-
}
|
|
12
|
-
return `(${this.parameterize(values)})`;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
if (values instanceof Raw) {
|
|
16
|
-
return `(${this.parameter(values)})`;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
return this.parameter(values);
|
|
20
|
-
}
|
|
21
|
-
};
|
|
1
|
+
const Formatter = require('../../formatter');
|
|
2
|
+
const Raw = require('../../raw');
|
|
3
|
+
|
|
4
|
+
module.exports = class SQlite3_Formatter extends Formatter {
|
|
5
|
+
values(values) {
|
|
6
|
+
if (Array.isArray(values)) {
|
|
7
|
+
if (Array.isArray(values[0])) {
|
|
8
|
+
return `( values ${values
|
|
9
|
+
.map((value) => `(${this.parameterize(value)})`)
|
|
10
|
+
.join(', ')})`;
|
|
11
|
+
}
|
|
12
|
+
return `(${this.parameterize(values)})`;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
if (values instanceof Raw) {
|
|
16
|
+
return `(${this.parameter(values)})`;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
return this.parameter(values);
|
|
20
|
+
}
|
|
21
|
+
};
|
|
@@ -1,169 +1,169 @@
|
|
|
1
|
-
// SQLite3
|
|
2
|
-
// -------
|
|
3
|
-
const defaults = require('lodash/defaults');
|
|
4
|
-
const map = require('lodash/map');
|
|
5
|
-
const { promisify, inherits } = require('util');
|
|
6
|
-
|
|
7
|
-
const Client = require('../../client');
|
|
8
|
-
|
|
9
|
-
const QueryCompiler = require('./query/compiler');
|
|
10
|
-
const SchemaCompiler = require('./schema/compiler');
|
|
11
|
-
const ColumnCompiler = require('./schema/columncompiler');
|
|
12
|
-
const TableCompiler = require('./schema/tablecompiler');
|
|
13
|
-
const SQLite3_DDL = require('./schema/ddl');
|
|
14
|
-
const SQLite3_Formatter = require('./formatter');
|
|
15
|
-
|
|
16
|
-
function Client_SQLite3(config) {
|
|
17
|
-
Client.call(this, config);
|
|
18
|
-
if (config.useNullAsDefault === undefined) {
|
|
19
|
-
this.logger.warn(
|
|
20
|
-
'sqlite does not support inserting default values. Set the ' +
|
|
21
|
-
'`useNullAsDefault` flag to hide this warning. ' +
|
|
22
|
-
'(see docs http://knexjs.org/#Builder-insert).'
|
|
23
|
-
);
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
inherits(Client_SQLite3, Client);
|
|
28
|
-
|
|
29
|
-
Object.assign(Client_SQLite3.prototype, {
|
|
30
|
-
dialect: 'sqlite3',
|
|
31
|
-
|
|
32
|
-
driverName: 'sqlite3',
|
|
33
|
-
|
|
34
|
-
_driver() {
|
|
35
|
-
return require('sqlite3');
|
|
36
|
-
},
|
|
37
|
-
|
|
38
|
-
schemaCompiler() {
|
|
39
|
-
return new SchemaCompiler(this, ...arguments);
|
|
40
|
-
},
|
|
41
|
-
|
|
42
|
-
queryCompiler() {
|
|
43
|
-
return new QueryCompiler(this, ...arguments);
|
|
44
|
-
},
|
|
45
|
-
|
|
46
|
-
columnCompiler() {
|
|
47
|
-
return new ColumnCompiler(this, ...arguments);
|
|
48
|
-
},
|
|
49
|
-
|
|
50
|
-
tableCompiler() {
|
|
51
|
-
return new TableCompiler(this, ...arguments);
|
|
52
|
-
},
|
|
53
|
-
|
|
54
|
-
ddl(compiler, pragma, connection) {
|
|
55
|
-
return new SQLite3_DDL(this, compiler, pragma, connection);
|
|
56
|
-
},
|
|
57
|
-
|
|
58
|
-
wrapIdentifierImpl(value) {
|
|
59
|
-
return value !== '*' ? `\`${value.replace(/`/g, '``')}\`` : '*';
|
|
60
|
-
},
|
|
61
|
-
|
|
62
|
-
// Get a raw connection from the database, returning a promise with the connection object.
|
|
63
|
-
acquireRawConnection() {
|
|
64
|
-
return new Promise((resolve, reject) => {
|
|
65
|
-
const db = new this.driver.Database(
|
|
66
|
-
this.connectionSettings.filename,
|
|
67
|
-
(err) => {
|
|
68
|
-
if (err) {
|
|
69
|
-
return reject(err);
|
|
70
|
-
}
|
|
71
|
-
resolve(db);
|
|
72
|
-
}
|
|
73
|
-
);
|
|
74
|
-
});
|
|
75
|
-
},
|
|
76
|
-
|
|
77
|
-
// Used to explicitly close a connection, called internally by the pool when
|
|
78
|
-
// a connection times out or the pool is shutdown.
|
|
79
|
-
async destroyRawConnection(connection) {
|
|
80
|
-
const close = promisify((cb) => connection.close(cb));
|
|
81
|
-
return close();
|
|
82
|
-
},
|
|
83
|
-
|
|
84
|
-
// Runs the query on the specified connection, providing the bindings and any
|
|
85
|
-
// other necessary prep work.
|
|
86
|
-
_query(connection, obj) {
|
|
87
|
-
const { method } = obj;
|
|
88
|
-
let callMethod;
|
|
89
|
-
switch (method) {
|
|
90
|
-
case 'insert':
|
|
91
|
-
case 'update':
|
|
92
|
-
case 'counter':
|
|
93
|
-
case 'del':
|
|
94
|
-
callMethod = 'run';
|
|
95
|
-
break;
|
|
96
|
-
default:
|
|
97
|
-
callMethod = 'all';
|
|
98
|
-
}
|
|
99
|
-
return new Promise(function (resolver, rejecter) {
|
|
100
|
-
if (!connection || !connection[callMethod]) {
|
|
101
|
-
return rejecter(
|
|
102
|
-
new Error(`Error calling ${callMethod} on connection.`)
|
|
103
|
-
);
|
|
104
|
-
}
|
|
105
|
-
connection[callMethod](obj.sql, obj.bindings, function (err, response) {
|
|
106
|
-
if (err) return rejecter(err);
|
|
107
|
-
obj.response = response;
|
|
108
|
-
|
|
109
|
-
// We need the context here, as it contains
|
|
110
|
-
// the "this.lastID" or "this.changes"
|
|
111
|
-
obj.context = this;
|
|
112
|
-
return resolver(obj);
|
|
113
|
-
});
|
|
114
|
-
});
|
|
115
|
-
},
|
|
116
|
-
|
|
117
|
-
_stream(connection, sql, stream) {
|
|
118
|
-
const client = this;
|
|
119
|
-
return new Promise(function (resolver, rejecter) {
|
|
120
|
-
stream.on('error', rejecter);
|
|
121
|
-
stream.on('end', resolver);
|
|
122
|
-
return client
|
|
123
|
-
._query(connection, sql)
|
|
124
|
-
.then((obj) => obj.response)
|
|
125
|
-
.then((rows) => rows.forEach((row) => stream.write(row)))
|
|
126
|
-
.catch(function (err) {
|
|
127
|
-
stream.emit('error', err);
|
|
128
|
-
})
|
|
129
|
-
.then(function () {
|
|
130
|
-
stream.end();
|
|
131
|
-
});
|
|
132
|
-
});
|
|
133
|
-
},
|
|
134
|
-
|
|
135
|
-
// Ensures the response is returned in the same format as other clients.
|
|
136
|
-
processResponse(obj, runner) {
|
|
137
|
-
const ctx = obj.context;
|
|
138
|
-
let { response } = obj;
|
|
139
|
-
if (obj.output) return obj.output.call(runner, response);
|
|
140
|
-
switch (obj.method) {
|
|
141
|
-
case 'select':
|
|
142
|
-
case 'pluck':
|
|
143
|
-
case 'first':
|
|
144
|
-
if (obj.method === 'pluck') response = map(response, obj.pluck);
|
|
145
|
-
return obj.method === 'first' ? response[0] : response;
|
|
146
|
-
case 'insert':
|
|
147
|
-
return [ctx.lastID];
|
|
148
|
-
case 'del':
|
|
149
|
-
case 'update':
|
|
150
|
-
case 'counter':
|
|
151
|
-
return ctx.changes;
|
|
152
|
-
default:
|
|
153
|
-
return response;
|
|
154
|
-
}
|
|
155
|
-
},
|
|
156
|
-
|
|
157
|
-
poolDefaults() {
|
|
158
|
-
return defaults(
|
|
159
|
-
{ min: 1, max: 1 },
|
|
160
|
-
Client.prototype.poolDefaults.call(this)
|
|
161
|
-
);
|
|
162
|
-
},
|
|
163
|
-
|
|
164
|
-
formatter() {
|
|
165
|
-
return new SQLite3_Formatter(this, ...arguments);
|
|
166
|
-
},
|
|
167
|
-
});
|
|
168
|
-
|
|
169
|
-
module.exports = Client_SQLite3;
|
|
1
|
+
// SQLite3
|
|
2
|
+
// -------
|
|
3
|
+
const defaults = require('lodash/defaults');
|
|
4
|
+
const map = require('lodash/map');
|
|
5
|
+
const { promisify, inherits } = require('util');
|
|
6
|
+
|
|
7
|
+
const Client = require('../../client');
|
|
8
|
+
|
|
9
|
+
const QueryCompiler = require('./query/compiler');
|
|
10
|
+
const SchemaCompiler = require('./schema/compiler');
|
|
11
|
+
const ColumnCompiler = require('./schema/columncompiler');
|
|
12
|
+
const TableCompiler = require('./schema/tablecompiler');
|
|
13
|
+
const SQLite3_DDL = require('./schema/ddl');
|
|
14
|
+
const SQLite3_Formatter = require('./formatter');
|
|
15
|
+
|
|
16
|
+
function Client_SQLite3(config) {
|
|
17
|
+
Client.call(this, config);
|
|
18
|
+
if (config.useNullAsDefault === undefined) {
|
|
19
|
+
this.logger.warn(
|
|
20
|
+
'sqlite does not support inserting default values. Set the ' +
|
|
21
|
+
'`useNullAsDefault` flag to hide this warning. ' +
|
|
22
|
+
'(see docs http://knexjs.org/#Builder-insert).'
|
|
23
|
+
);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
inherits(Client_SQLite3, Client);
|
|
28
|
+
|
|
29
|
+
Object.assign(Client_SQLite3.prototype, {
|
|
30
|
+
dialect: 'sqlite3',
|
|
31
|
+
|
|
32
|
+
driverName: 'sqlite3',
|
|
33
|
+
|
|
34
|
+
_driver() {
|
|
35
|
+
return require('sqlite3');
|
|
36
|
+
},
|
|
37
|
+
|
|
38
|
+
schemaCompiler() {
|
|
39
|
+
return new SchemaCompiler(this, ...arguments);
|
|
40
|
+
},
|
|
41
|
+
|
|
42
|
+
queryCompiler() {
|
|
43
|
+
return new QueryCompiler(this, ...arguments);
|
|
44
|
+
},
|
|
45
|
+
|
|
46
|
+
columnCompiler() {
|
|
47
|
+
return new ColumnCompiler(this, ...arguments);
|
|
48
|
+
},
|
|
49
|
+
|
|
50
|
+
tableCompiler() {
|
|
51
|
+
return new TableCompiler(this, ...arguments);
|
|
52
|
+
},
|
|
53
|
+
|
|
54
|
+
ddl(compiler, pragma, connection) {
|
|
55
|
+
return new SQLite3_DDL(this, compiler, pragma, connection);
|
|
56
|
+
},
|
|
57
|
+
|
|
58
|
+
wrapIdentifierImpl(value) {
|
|
59
|
+
return value !== '*' ? `\`${value.replace(/`/g, '``')}\`` : '*';
|
|
60
|
+
},
|
|
61
|
+
|
|
62
|
+
// Get a raw connection from the database, returning a promise with the connection object.
|
|
63
|
+
acquireRawConnection() {
|
|
64
|
+
return new Promise((resolve, reject) => {
|
|
65
|
+
const db = new this.driver.Database(
|
|
66
|
+
this.connectionSettings.filename,
|
|
67
|
+
(err) => {
|
|
68
|
+
if (err) {
|
|
69
|
+
return reject(err);
|
|
70
|
+
}
|
|
71
|
+
resolve(db);
|
|
72
|
+
}
|
|
73
|
+
);
|
|
74
|
+
});
|
|
75
|
+
},
|
|
76
|
+
|
|
77
|
+
// Used to explicitly close a connection, called internally by the pool when
|
|
78
|
+
// a connection times out or the pool is shutdown.
|
|
79
|
+
async destroyRawConnection(connection) {
|
|
80
|
+
const close = promisify((cb) => connection.close(cb));
|
|
81
|
+
return close();
|
|
82
|
+
},
|
|
83
|
+
|
|
84
|
+
// Runs the query on the specified connection, providing the bindings and any
|
|
85
|
+
// other necessary prep work.
|
|
86
|
+
_query(connection, obj) {
|
|
87
|
+
const { method } = obj;
|
|
88
|
+
let callMethod;
|
|
89
|
+
switch (method) {
|
|
90
|
+
case 'insert':
|
|
91
|
+
case 'update':
|
|
92
|
+
case 'counter':
|
|
93
|
+
case 'del':
|
|
94
|
+
callMethod = 'run';
|
|
95
|
+
break;
|
|
96
|
+
default:
|
|
97
|
+
callMethod = 'all';
|
|
98
|
+
}
|
|
99
|
+
return new Promise(function (resolver, rejecter) {
|
|
100
|
+
if (!connection || !connection[callMethod]) {
|
|
101
|
+
return rejecter(
|
|
102
|
+
new Error(`Error calling ${callMethod} on connection.`)
|
|
103
|
+
);
|
|
104
|
+
}
|
|
105
|
+
connection[callMethod](obj.sql, obj.bindings, function (err, response) {
|
|
106
|
+
if (err) return rejecter(err);
|
|
107
|
+
obj.response = response;
|
|
108
|
+
|
|
109
|
+
// We need the context here, as it contains
|
|
110
|
+
// the "this.lastID" or "this.changes"
|
|
111
|
+
obj.context = this;
|
|
112
|
+
return resolver(obj);
|
|
113
|
+
});
|
|
114
|
+
});
|
|
115
|
+
},
|
|
116
|
+
|
|
117
|
+
_stream(connection, sql, stream) {
|
|
118
|
+
const client = this;
|
|
119
|
+
return new Promise(function (resolver, rejecter) {
|
|
120
|
+
stream.on('error', rejecter);
|
|
121
|
+
stream.on('end', resolver);
|
|
122
|
+
return client
|
|
123
|
+
._query(connection, sql)
|
|
124
|
+
.then((obj) => obj.response)
|
|
125
|
+
.then((rows) => rows.forEach((row) => stream.write(row)))
|
|
126
|
+
.catch(function (err) {
|
|
127
|
+
stream.emit('error', err);
|
|
128
|
+
})
|
|
129
|
+
.then(function () {
|
|
130
|
+
stream.end();
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
},
|
|
134
|
+
|
|
135
|
+
// Ensures the response is returned in the same format as other clients.
|
|
136
|
+
processResponse(obj, runner) {
|
|
137
|
+
const ctx = obj.context;
|
|
138
|
+
let { response } = obj;
|
|
139
|
+
if (obj.output) return obj.output.call(runner, response);
|
|
140
|
+
switch (obj.method) {
|
|
141
|
+
case 'select':
|
|
142
|
+
case 'pluck':
|
|
143
|
+
case 'first':
|
|
144
|
+
if (obj.method === 'pluck') response = map(response, obj.pluck);
|
|
145
|
+
return obj.method === 'first' ? response[0] : response;
|
|
146
|
+
case 'insert':
|
|
147
|
+
return [ctx.lastID];
|
|
148
|
+
case 'del':
|
|
149
|
+
case 'update':
|
|
150
|
+
case 'counter':
|
|
151
|
+
return ctx.changes;
|
|
152
|
+
default:
|
|
153
|
+
return response;
|
|
154
|
+
}
|
|
155
|
+
},
|
|
156
|
+
|
|
157
|
+
poolDefaults() {
|
|
158
|
+
return defaults(
|
|
159
|
+
{ min: 1, max: 1 },
|
|
160
|
+
Client.prototype.poolDefaults.call(this)
|
|
161
|
+
);
|
|
162
|
+
},
|
|
163
|
+
|
|
164
|
+
formatter() {
|
|
165
|
+
return new SQLite3_Formatter(this, ...arguments);
|
|
166
|
+
},
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
module.exports = Client_SQLite3;
|