knex/lib/dialects/sqlite3/schema/sqlite-compiler.js

81 lines
2.1 KiB
JavaScript

// SQLite3: Column Builder & Compiler
// -------
const SchemaCompiler = require('../../../schema/compiler');
const some = require('lodash/some');
// Schema Compiler
// -------
class SchemaCompiler_SQLite3 extends SchemaCompiler {
constructor(client, builder) {
super(client, builder);
}
// Compile the query to determine if a table exists.
hasTable(tableName) {
const sql =
`select * from sqlite_master ` +
`where type = 'table' and name = ${this.client.parameter(
this.formatter.wrap(tableName).replace(/`/g, ''),
this.builder,
this.bindingsHolder
)}`;
this.pushQuery({ sql, output: (resp) => resp.length > 0 });
}
// Compile the query to determine if a column exists.
hasColumn(tableName, column) {
this.pushQuery({
sql: `PRAGMA table_info(${this.formatter.wrap(tableName)})`,
output(resp) {
return some(resp, (col) => {
return (
this.client.wrapIdentifier(col.name.toLowerCase()) ===
this.client.wrapIdentifier(column.toLowerCase())
);
});
},
});
}
// Compile a rename table command.
renameTable(from, to) {
this.pushQuery(
`alter table ${this.formatter.wrap(from)} rename to ${this.formatter.wrap(
to
)}`
);
}
async generateDdlCommands() {
const sequence = this.builder._sequence;
for (let i = 0, l = sequence.length; i < l; i++) {
const query = sequence[i];
this[query.method].apply(this, query.args);
}
const commandSources = this.sequence;
if (commandSources.length === 1 && commandSources[0].statementsProducer) {
return commandSources[0].statementsProducer();
} else {
const result = [];
for (const commandSource of commandSources) {
const command = commandSource.sql;
if (Array.isArray(command)) {
result.push(...command);
} else {
result.push(command);
}
}
return { pre: [], sql: result, check: null, post: [] };
}
}
}
module.exports = SchemaCompiler_SQLite3;