knex 2.4.1 → 2.4.2

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.
Files changed (187) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/CONTRIBUTING.md +194 -194
  3. package/LICENSE +22 -22
  4. package/README.md +148 -148
  5. package/UPGRADING.md +233 -233
  6. package/bin/cli.js +473 -472
  7. package/bin/utils/cli-config-utils.js +210 -210
  8. package/bin/utils/constants.js +7 -7
  9. package/bin/utils/migrationsLister.js +37 -37
  10. package/knex.js +23 -23
  11. package/lib/builder-interface-augmenter.js +120 -120
  12. package/lib/client.js +475 -475
  13. package/lib/constants.js +61 -61
  14. package/lib/dialects/better-sqlite3/index.js +72 -72
  15. package/lib/dialects/cockroachdb/crdb-columncompiler.js +14 -14
  16. package/lib/dialects/cockroachdb/crdb-querybuilder.js +11 -11
  17. package/lib/dialects/cockroachdb/crdb-querycompiler.js +122 -122
  18. package/lib/dialects/cockroachdb/crdb-tablecompiler.js +37 -37
  19. package/lib/dialects/cockroachdb/crdb-viewcompiler.js +15 -15
  20. package/lib/dialects/cockroachdb/index.js +86 -86
  21. package/lib/dialects/mssql/index.js +495 -495
  22. package/lib/dialects/mssql/mssql-formatter.js +34 -34
  23. package/lib/dialects/mssql/query/mssql-querycompiler.js +600 -600
  24. package/lib/dialects/mssql/schema/mssql-columncompiler.js +185 -185
  25. package/lib/dialects/mssql/schema/mssql-compiler.js +91 -91
  26. package/lib/dialects/mssql/schema/mssql-tablecompiler.js +378 -378
  27. package/lib/dialects/mssql/schema/mssql-viewcompiler.js +55 -55
  28. package/lib/dialects/mssql/transaction.js +176 -176
  29. package/lib/dialects/mysql/index.js +201 -201
  30. package/lib/dialects/mysql/query/mysql-querycompiler.js +274 -274
  31. package/lib/dialects/mysql/schema/mysql-columncompiler.js +193 -193
  32. package/lib/dialects/mysql/schema/mysql-compiler.js +60 -60
  33. package/lib/dialects/mysql/schema/mysql-tablecompiler.js +381 -381
  34. package/lib/dialects/mysql/schema/mysql-viewbuilder.js +21 -21
  35. package/lib/dialects/mysql/schema/mysql-viewcompiler.js +15 -15
  36. package/lib/dialects/mysql/transaction.js +46 -46
  37. package/lib/dialects/mysql2/index.js +33 -33
  38. package/lib/dialects/mysql2/transaction.js +44 -44
  39. package/lib/dialects/oracle/DEAD_CODE.md +5 -5
  40. package/lib/dialects/oracle/index.js +92 -92
  41. package/lib/dialects/oracle/query/oracle-querycompiler.js +342 -342
  42. package/lib/dialects/oracle/schema/internal/incrementUtils.js +20 -20
  43. package/lib/dialects/oracle/schema/internal/trigger.js +135 -135
  44. package/lib/dialects/oracle/schema/oracle-columnbuilder.js +17 -17
  45. package/lib/dialects/oracle/schema/oracle-columncompiler.js +126 -126
  46. package/lib/dialects/oracle/schema/oracle-compiler.js +122 -122
  47. package/lib/dialects/oracle/schema/oracle-tablecompiler.js +190 -190
  48. package/lib/dialects/oracle/utils.js +87 -87
  49. package/lib/dialects/oracledb/index.js +327 -327
  50. package/lib/dialects/oracledb/query/oracledb-querycompiler.js +481 -481
  51. package/lib/dialects/oracledb/schema/oracledb-columncompiler.js +55 -55
  52. package/lib/dialects/oracledb/schema/oracledb-tablecompiler.js +19 -19
  53. package/lib/dialects/oracledb/schema/oracledb-viewbuilder.js +13 -13
  54. package/lib/dialects/oracledb/schema/oracledb-viewcompiler.js +19 -19
  55. package/lib/dialects/oracledb/transaction.js +98 -98
  56. package/lib/dialects/oracledb/utils.js +208 -208
  57. package/lib/dialects/pgnative/index.js +60 -60
  58. package/lib/dialects/postgres/execution/pg-transaction.js +12 -12
  59. package/lib/dialects/postgres/index.js +358 -358
  60. package/lib/dialects/postgres/query/pg-querybuilder.js +38 -38
  61. package/lib/dialects/postgres/query/pg-querycompiler.js +395 -395
  62. package/lib/dialects/postgres/schema/pg-columncompiler.js +156 -156
  63. package/lib/dialects/postgres/schema/pg-compiler.js +138 -136
  64. package/lib/dialects/postgres/schema/pg-tablecompiler.js +299 -299
  65. package/lib/dialects/postgres/schema/pg-viewbuilder.js +21 -21
  66. package/lib/dialects/postgres/schema/pg-viewcompiler.js +35 -35
  67. package/lib/dialects/redshift/index.js +86 -86
  68. package/lib/dialects/redshift/query/redshift-querycompiler.js +163 -163
  69. package/lib/dialects/redshift/schema/redshift-columnbuilder.js +22 -22
  70. package/lib/dialects/redshift/schema/redshift-columncompiler.js +67 -67
  71. package/lib/dialects/redshift/schema/redshift-compiler.js +14 -14
  72. package/lib/dialects/redshift/schema/redshift-tablecompiler.js +122 -122
  73. package/lib/dialects/redshift/schema/redshift-viewcompiler.js +11 -11
  74. package/lib/dialects/redshift/transaction.js +25 -25
  75. package/lib/dialects/sqlite3/execution/sqlite-transaction.js +18 -18
  76. package/lib/dialects/sqlite3/index.js +250 -250
  77. package/lib/dialects/sqlite3/query/sqlite-querybuilder.js +33 -33
  78. package/lib/dialects/sqlite3/query/sqlite-querycompiler.js +334 -334
  79. package/lib/dialects/sqlite3/schema/ddl.js +400 -400
  80. package/lib/dialects/sqlite3/schema/internal/compiler.js +327 -327
  81. package/lib/dialects/sqlite3/schema/internal/parser-combinator.js +161 -161
  82. package/lib/dialects/sqlite3/schema/internal/parser.js +638 -638
  83. package/lib/dialects/sqlite3/schema/internal/sqlite-ddl-operations.js +41 -41
  84. package/lib/dialects/sqlite3/schema/internal/tokenizer.js +38 -38
  85. package/lib/dialects/sqlite3/schema/internal/utils.js +12 -12
  86. package/lib/dialects/sqlite3/schema/sqlite-columncompiler.js +50 -50
  87. package/lib/dialects/sqlite3/schema/sqlite-compiler.js +80 -80
  88. package/lib/dialects/sqlite3/schema/sqlite-tablecompiler.js +347 -347
  89. package/lib/dialects/sqlite3/schema/sqlite-viewcompiler.js +40 -40
  90. package/lib/execution/batch-insert.js +51 -51
  91. package/lib/execution/internal/delay.js +6 -6
  92. package/lib/execution/internal/ensure-connection-callback.js +41 -41
  93. package/lib/execution/internal/query-executioner.js +62 -62
  94. package/lib/execution/runner.js +307 -307
  95. package/lib/execution/transaction.js +401 -401
  96. package/lib/formatter/formatterUtils.js +42 -42
  97. package/lib/formatter/rawFormatter.js +84 -84
  98. package/lib/formatter/wrappingFormatter.js +250 -250
  99. package/lib/formatter.js +25 -25
  100. package/lib/index.js +3 -3
  101. package/lib/knex-builder/FunctionHelper.js +54 -54
  102. package/lib/knex-builder/Knex.js +59 -59
  103. package/lib/knex-builder/internal/config-resolver.js +57 -57
  104. package/lib/knex-builder/internal/parse-connection.js +87 -87
  105. package/lib/knex-builder/make-knex.js +340 -340
  106. package/lib/logger.js +76 -76
  107. package/lib/migrations/common/MigrationsLoader.js +36 -36
  108. package/lib/migrations/migrate/MigrationGenerator.js +84 -82
  109. package/lib/migrations/migrate/Migrator.js +598 -598
  110. package/lib/migrations/migrate/migrate-stub.js +17 -17
  111. package/lib/migrations/migrate/migration-list-resolver.js +33 -33
  112. package/lib/migrations/migrate/migrator-configuration-merger.js +58 -58
  113. package/lib/migrations/migrate/sources/fs-migrations.js +74 -74
  114. package/lib/migrations/migrate/stub/cjs.stub +15 -15
  115. package/lib/migrations/migrate/stub/coffee.stub +13 -13
  116. package/lib/migrations/migrate/stub/eg.stub +14 -14
  117. package/lib/migrations/migrate/stub/js-schema.stub +22 -22
  118. package/lib/migrations/migrate/stub/js.stub +22 -22
  119. package/lib/migrations/migrate/stub/knexfile-coffee.stub +34 -34
  120. package/lib/migrations/migrate/stub/knexfile-eg.stub +43 -43
  121. package/lib/migrations/migrate/stub/knexfile-js.stub +47 -47
  122. package/lib/migrations/migrate/stub/knexfile-ls.stub +35 -35
  123. package/lib/migrations/migrate/stub/knexfile-ts.stub +47 -47
  124. package/lib/migrations/migrate/stub/ls.stub +14 -14
  125. package/lib/migrations/migrate/stub/mjs.stub +23 -23
  126. package/lib/migrations/migrate/stub/ts-schema.stub +21 -21
  127. package/lib/migrations/migrate/stub/ts.stub +21 -21
  128. package/lib/migrations/migrate/table-creator.js +77 -77
  129. package/lib/migrations/migrate/table-resolver.js +27 -27
  130. package/lib/migrations/seed/Seeder.js +137 -137
  131. package/lib/migrations/seed/seed-stub.js +13 -13
  132. package/lib/migrations/seed/seeder-configuration-merger.js +60 -60
  133. package/lib/migrations/seed/sources/fs-seeds.js +65 -65
  134. package/lib/migrations/seed/stub/coffee.stub +9 -9
  135. package/lib/migrations/seed/stub/eg.stub +11 -11
  136. package/lib/migrations/seed/stub/js.stub +13 -13
  137. package/lib/migrations/seed/stub/ls.stub +11 -11
  138. package/lib/migrations/seed/stub/mjs.stub +12 -12
  139. package/lib/migrations/seed/stub/ts.stub +13 -13
  140. package/lib/migrations/util/fs.js +86 -86
  141. package/lib/migrations/util/import-file.js +12 -12
  142. package/lib/migrations/util/is-module-type.js +9 -9
  143. package/lib/migrations/util/template.js +52 -52
  144. package/lib/migrations/util/timestamp.js +14 -14
  145. package/lib/query/analytic.js +52 -52
  146. package/lib/query/constants.js +15 -15
  147. package/lib/query/joinclause.js +270 -270
  148. package/lib/query/method-constants.js +135 -135
  149. package/lib/query/querybuilder.js +1794 -1794
  150. package/lib/query/querycompiler.js +1580 -1580
  151. package/lib/raw.js +139 -139
  152. package/lib/ref.js +39 -39
  153. package/lib/schema/builder.js +115 -114
  154. package/lib/schema/columnbuilder.js +146 -145
  155. package/lib/schema/columncompiler.js +307 -307
  156. package/lib/schema/compiler.js +187 -187
  157. package/lib/schema/internal/helpers.js +55 -55
  158. package/lib/schema/tablebuilder.js +376 -375
  159. package/lib/schema/tablecompiler.js +433 -433
  160. package/lib/schema/viewbuilder.js +92 -93
  161. package/lib/schema/viewcompiler.js +138 -138
  162. package/lib/util/finally-mixin.js +13 -13
  163. package/lib/util/helpers.js +95 -95
  164. package/lib/util/is.js +32 -32
  165. package/lib/util/nanoid.js +40 -40
  166. package/lib/util/noop.js +1 -1
  167. package/lib/util/save-async-stack.js +14 -14
  168. package/lib/util/string.js +190 -190
  169. package/lib/util/timeout.js +29 -29
  170. package/package.json +8 -6
  171. package/scripts/build.js +125 -125
  172. package/scripts/clean.js +31 -29
  173. package/scripts/docker-compose.yml +152 -152
  174. package/scripts/next-release-howto.md +24 -24
  175. package/scripts/oracledb-install-driver-libs.sh +82 -82
  176. package/scripts/release.sh +34 -34
  177. package/scripts/runkit-example.js +34 -34
  178. package/scripts/stress-test/README.txt +18 -18
  179. package/scripts/stress-test/docker-compose.yml +57 -57
  180. package/scripts/stress-test/knex-stress-test.js +208 -208
  181. package/scripts/stress-test/mysql2-random-hanging-every-now-and-then.js +145 -145
  182. package/scripts/stress-test/mysql2-sudden-exit-without-error.js +100 -100
  183. package/scripts/stress-test/reconnect-test-mysql-based-drivers.js +184 -184
  184. package/scripts/update_gitignore_for_tsc_output.js +90 -86
  185. package/types/index.d.ts +3233 -3233
  186. package/types/result.d.ts +27 -27
  187. package/types/tables.d.ts +4 -4
@@ -1,41 +1,41 @@
1
- function copyData(sourceTable, targetTable, columns) {
2
- return `INSERT INTO "${targetTable}" SELECT ${
3
- columns === undefined
4
- ? '*'
5
- : columns.map((column) => `"${column}"`).join(', ')
6
- } FROM "${sourceTable}";`;
7
- }
8
-
9
- function dropOriginal(tableName) {
10
- return `DROP TABLE "${tableName}"`;
11
- }
12
-
13
- function renameTable(tableName, alteredName) {
14
- return `ALTER TABLE "${tableName}" RENAME TO "${alteredName}"`;
15
- }
16
-
17
- function getTableSql(tableName) {
18
- return `SELECT type, sql FROM sqlite_master WHERE (type='table' OR (type='index' AND sql IS NOT NULL)) AND tbl_name='${tableName}'`;
19
- }
20
-
21
- function isForeignCheckEnabled() {
22
- return `PRAGMA foreign_keys`;
23
- }
24
-
25
- function setForeignCheck(enable) {
26
- return `PRAGMA foreign_keys = ${enable ? 'ON' : 'OFF'}`;
27
- }
28
-
29
- function executeForeignCheck() {
30
- return `PRAGMA foreign_key_check`;
31
- }
32
-
33
- module.exports = {
34
- copyData,
35
- dropOriginal,
36
- renameTable,
37
- getTableSql,
38
- isForeignCheckEnabled,
39
- setForeignCheck,
40
- executeForeignCheck,
41
- };
1
+ function copyData(sourceTable, targetTable, columns) {
2
+ return `INSERT INTO "${targetTable}" SELECT ${
3
+ columns === undefined
4
+ ? '*'
5
+ : columns.map((column) => `"${column}"`).join(', ')
6
+ } FROM "${sourceTable}";`;
7
+ }
8
+
9
+ function dropOriginal(tableName) {
10
+ return `DROP TABLE "${tableName}"`;
11
+ }
12
+
13
+ function renameTable(tableName, alteredName) {
14
+ return `ALTER TABLE "${tableName}" RENAME TO "${alteredName}"`;
15
+ }
16
+
17
+ function getTableSql(tableName) {
18
+ return `SELECT type, sql FROM sqlite_master WHERE (type='table' OR (type='index' AND sql IS NOT NULL)) AND tbl_name='${tableName}'`;
19
+ }
20
+
21
+ function isForeignCheckEnabled() {
22
+ return `PRAGMA foreign_keys`;
23
+ }
24
+
25
+ function setForeignCheck(enable) {
26
+ return `PRAGMA foreign_keys = ${enable ? 'ON' : 'OFF'}`;
27
+ }
28
+
29
+ function executeForeignCheck() {
30
+ return `PRAGMA foreign_key_check`;
31
+ }
32
+
33
+ module.exports = {
34
+ copyData,
35
+ dropOriginal,
36
+ renameTable,
37
+ getTableSql,
38
+ isForeignCheckEnabled,
39
+ setForeignCheck,
40
+ executeForeignCheck,
41
+ };
@@ -1,38 +1,38 @@
1
- function tokenize(text, tokens) {
2
- const compiledRegex = new RegExp(
3
- Object.entries(tokens)
4
- .map(([type, regex]) => `(?<${type}>${regex.source})`)
5
- .join('|'),
6
- 'yi'
7
- );
8
-
9
- let index = 0;
10
- const ast = [];
11
-
12
- while (index < text.length) {
13
- compiledRegex.lastIndex = index;
14
- const result = text.match(compiledRegex);
15
-
16
- if (result !== null) {
17
- const [type, text] = Object.entries(result.groups).find(
18
- ([name, group]) => group !== undefined
19
- );
20
-
21
- index += text.length;
22
-
23
- if (!type.startsWith('_')) {
24
- ast.push({ type, text });
25
- }
26
- } else {
27
- throw new Error(
28
- `No matching tokenizer rule found at: [${text.substring(index)}]`
29
- );
30
- }
31
- }
32
-
33
- return ast;
34
- }
35
-
36
- module.exports = {
37
- tokenize,
38
- };
1
+ function tokenize(text, tokens) {
2
+ const compiledRegex = new RegExp(
3
+ Object.entries(tokens)
4
+ .map(([type, regex]) => `(?<${type}>${regex.source})`)
5
+ .join('|'),
6
+ 'yi'
7
+ );
8
+
9
+ let index = 0;
10
+ const ast = [];
11
+
12
+ while (index < text.length) {
13
+ compiledRegex.lastIndex = index;
14
+ const result = text.match(compiledRegex);
15
+
16
+ if (result !== null) {
17
+ const [type, text] = Object.entries(result.groups).find(
18
+ ([name, group]) => group !== undefined
19
+ );
20
+
21
+ index += text.length;
22
+
23
+ if (!type.startsWith('_')) {
24
+ ast.push({ type, text });
25
+ }
26
+ } else {
27
+ throw new Error(
28
+ `No matching tokenizer rule found at: [${text.substring(index)}]`
29
+ );
30
+ }
31
+ }
32
+
33
+ return ast;
34
+ }
35
+
36
+ module.exports = {
37
+ tokenize,
38
+ };
@@ -1,12 +1,12 @@
1
- function isEqualId(first, second) {
2
- return first.toLowerCase() === second.toLowerCase();
3
- }
4
-
5
- function includesId(list, id) {
6
- return list.some((item) => isEqualId(item, id));
7
- }
8
-
9
- module.exports = {
10
- isEqualId,
11
- includesId,
12
- };
1
+ function isEqualId(first, second) {
2
+ return first.toLowerCase() === second.toLowerCase();
3
+ }
4
+
5
+ function includesId(list, id) {
6
+ return list.some((item) => isEqualId(item, id));
7
+ }
8
+
9
+ module.exports = {
10
+ isEqualId,
11
+ includesId,
12
+ };
@@ -1,50 +1,50 @@
1
- const ColumnCompiler = require('../../../schema/columncompiler');
2
-
3
- // Column Compiler
4
- // -------
5
-
6
- class ColumnCompiler_SQLite3 extends ColumnCompiler {
7
- constructor() {
8
- super(...arguments);
9
- this.modifiers = ['nullable', 'defaultTo'];
10
- this._addCheckModifiers();
11
- }
12
-
13
- // Types
14
- // -------
15
-
16
- enu(allowed) {
17
- return `text check (${this.formatter.wrap(
18
- this.args[0]
19
- )} in ('${allowed.join("', '")}'))`;
20
- }
21
-
22
- _pushAlterCheckQuery(checkPredicate, constraintName) {
23
- throw new Error(
24
- `Alter table with to add constraints is not permitted in SQLite`
25
- );
26
- }
27
-
28
- checkRegex(regexes, constraintName) {
29
- return this._check(
30
- `${this.formatter.wrap(
31
- this.getColumnName()
32
- )} REGEXP ${this.client._escapeBinding(regexes)}`,
33
- constraintName
34
- );
35
- }
36
- }
37
-
38
- ColumnCompiler_SQLite3.prototype.json = 'json';
39
- ColumnCompiler_SQLite3.prototype.jsonb = 'json';
40
- ColumnCompiler_SQLite3.prototype.double =
41
- ColumnCompiler_SQLite3.prototype.decimal =
42
- ColumnCompiler_SQLite3.prototype.floating =
43
- 'float';
44
- ColumnCompiler_SQLite3.prototype.timestamp = 'datetime';
45
- // autoincrement without primary key is a syntax error in SQLite, so it's necessary
46
- ColumnCompiler_SQLite3.prototype.increments =
47
- ColumnCompiler_SQLite3.prototype.bigincrements =
48
- 'integer not null primary key autoincrement';
49
-
50
- module.exports = ColumnCompiler_SQLite3;
1
+ const ColumnCompiler = require('../../../schema/columncompiler');
2
+
3
+ // Column Compiler
4
+ // -------
5
+
6
+ class ColumnCompiler_SQLite3 extends ColumnCompiler {
7
+ constructor() {
8
+ super(...arguments);
9
+ this.modifiers = ['nullable', 'defaultTo'];
10
+ this._addCheckModifiers();
11
+ }
12
+
13
+ // Types
14
+ // -------
15
+
16
+ enu(allowed) {
17
+ return `text check (${this.formatter.wrap(
18
+ this.args[0]
19
+ )} in ('${allowed.join("', '")}'))`;
20
+ }
21
+
22
+ _pushAlterCheckQuery(checkPredicate, constraintName) {
23
+ throw new Error(
24
+ `Alter table with to add constraints is not permitted in SQLite`
25
+ );
26
+ }
27
+
28
+ checkRegex(regexes, constraintName) {
29
+ return this._check(
30
+ `${this.formatter.wrap(
31
+ this.getColumnName()
32
+ )} REGEXP ${this.client._escapeBinding(regexes)}`,
33
+ constraintName
34
+ );
35
+ }
36
+ }
37
+
38
+ ColumnCompiler_SQLite3.prototype.json = 'json';
39
+ ColumnCompiler_SQLite3.prototype.jsonb = 'json';
40
+ ColumnCompiler_SQLite3.prototype.double =
41
+ ColumnCompiler_SQLite3.prototype.decimal =
42
+ ColumnCompiler_SQLite3.prototype.floating =
43
+ 'float';
44
+ ColumnCompiler_SQLite3.prototype.timestamp = 'datetime';
45
+ // autoincrement without primary key is a syntax error in SQLite, so it's necessary
46
+ ColumnCompiler_SQLite3.prototype.increments =
47
+ ColumnCompiler_SQLite3.prototype.bigincrements =
48
+ 'integer not null primary key autoincrement';
49
+
50
+ module.exports = ColumnCompiler_SQLite3;
@@ -1,80 +1,80 @@
1
- // SQLite3: Column Builder & Compiler
2
- // -------
3
- const SchemaCompiler = require('../../../schema/compiler');
4
-
5
- const some = require('lodash/some');
6
-
7
- // Schema Compiler
8
- // -------
9
-
10
- class SchemaCompiler_SQLite3 extends SchemaCompiler {
11
- constructor(client, builder) {
12
- super(client, builder);
13
- }
14
-
15
- // Compile the query to determine if a table exists.
16
- hasTable(tableName) {
17
- const sql =
18
- `select * from sqlite_master ` +
19
- `where type = 'table' and name = ${this.client.parameter(
20
- this.formatter.wrap(tableName).replace(/`/g, ''),
21
- this.builder,
22
- this.bindingsHolder
23
- )}`;
24
- this.pushQuery({ sql, output: (resp) => resp.length > 0 });
25
- }
26
-
27
- // Compile the query to determine if a column exists.
28
- hasColumn(tableName, column) {
29
- this.pushQuery({
30
- sql: `PRAGMA table_info(${this.formatter.wrap(tableName)})`,
31
- output(resp) {
32
- return some(resp, (col) => {
33
- return (
34
- this.client.wrapIdentifier(col.name.toLowerCase()) ===
35
- this.client.wrapIdentifier(column.toLowerCase())
36
- );
37
- });
38
- },
39
- });
40
- }
41
-
42
- // Compile a rename table command.
43
- renameTable(from, to) {
44
- this.pushQuery(
45
- `alter table ${this.formatter.wrap(from)} rename to ${this.formatter.wrap(
46
- to
47
- )}`
48
- );
49
- }
50
-
51
- async generateDdlCommands() {
52
- const sequence = this.builder._sequence;
53
- for (let i = 0, l = sequence.length; i < l; i++) {
54
- const query = sequence[i];
55
- this[query.method].apply(this, query.args);
56
- }
57
-
58
- const commandSources = this.sequence;
59
-
60
- if (commandSources.length === 1 && commandSources[0].statementsProducer) {
61
- return commandSources[0].statementsProducer();
62
- } else {
63
- const result = [];
64
-
65
- for (const commandSource of commandSources) {
66
- const command = commandSource.sql;
67
-
68
- if (Array.isArray(command)) {
69
- result.push(...command);
70
- } else {
71
- result.push(command);
72
- }
73
- }
74
-
75
- return { pre: [], sql: result, check: null, post: [] };
76
- }
77
- }
78
- }
79
-
80
- module.exports = SchemaCompiler_SQLite3;
1
+ // SQLite3: Column Builder & Compiler
2
+ // -------
3
+ const SchemaCompiler = require('../../../schema/compiler');
4
+
5
+ const some = require('lodash/some');
6
+
7
+ // Schema Compiler
8
+ // -------
9
+
10
+ class SchemaCompiler_SQLite3 extends SchemaCompiler {
11
+ constructor(client, builder) {
12
+ super(client, builder);
13
+ }
14
+
15
+ // Compile the query to determine if a table exists.
16
+ hasTable(tableName) {
17
+ const sql =
18
+ `select * from sqlite_master ` +
19
+ `where type = 'table' and name = ${this.client.parameter(
20
+ this.formatter.wrap(tableName).replace(/`/g, ''),
21
+ this.builder,
22
+ this.bindingsHolder
23
+ )}`;
24
+ this.pushQuery({ sql, output: (resp) => resp.length > 0 });
25
+ }
26
+
27
+ // Compile the query to determine if a column exists.
28
+ hasColumn(tableName, column) {
29
+ this.pushQuery({
30
+ sql: `PRAGMA table_info(${this.formatter.wrap(tableName)})`,
31
+ output(resp) {
32
+ return some(resp, (col) => {
33
+ return (
34
+ this.client.wrapIdentifier(col.name.toLowerCase()) ===
35
+ this.client.wrapIdentifier(column.toLowerCase())
36
+ );
37
+ });
38
+ },
39
+ });
40
+ }
41
+
42
+ // Compile a rename table command.
43
+ renameTable(from, to) {
44
+ this.pushQuery(
45
+ `alter table ${this.formatter.wrap(from)} rename to ${this.formatter.wrap(
46
+ to
47
+ )}`
48
+ );
49
+ }
50
+
51
+ async generateDdlCommands() {
52
+ const sequence = this.builder._sequence;
53
+ for (let i = 0, l = sequence.length; i < l; i++) {
54
+ const query = sequence[i];
55
+ this[query.method].apply(this, query.args);
56
+ }
57
+
58
+ const commandSources = this.sequence;
59
+
60
+ if (commandSources.length === 1 && commandSources[0].statementsProducer) {
61
+ return commandSources[0].statementsProducer();
62
+ } else {
63
+ const result = [];
64
+
65
+ for (const commandSource of commandSources) {
66
+ const command = commandSource.sql;
67
+
68
+ if (Array.isArray(command)) {
69
+ result.push(...command);
70
+ } else {
71
+ result.push(command);
72
+ }
73
+ }
74
+
75
+ return { pre: [], sql: result, check: null, post: [] };
76
+ }
77
+ }
78
+ }
79
+
80
+ module.exports = SchemaCompiler_SQLite3;