import {DatabaseConnection} from "./DatabaseConnection"; import {DatabaseColumnDefinition, DatabaseDefinition} from "./DatabaseDefinition"; import {Container} from "../Container/Container"; import {Logger} from "log4js"; export class DatabaseUpdater { constructor(private readonly database: DatabaseConnection) { } public ensureAvaliablity(definitions: Iterable) { for (const definition of definitions) { this.ensureDefinition(definition); } } private ensureDefinition(definition: DatabaseDefinition) { if (this.database.hasTable(definition.name)) { this.ensureTableColumns(definition); return; } this.createTable(definition); } private ensureTableColumns(definition: DatabaseDefinition) { const DBSQLColumns = this.database.fetchAll( `PRAGMA table_info("${definition.name}")` ); if (!DBSQLColumns) { Container.get("logger").warn("Request for database columns failed!"); return; } const missingColumns = definition.columns.filter( (column: DatabaseColumnDefinition) => { return !DBSQLColumns.some((dbColumn: DatabaseColumnDefinition) => { return column.name === dbColumn.name }); } ) if (missingColumns.length < 1) { Container.get("logger").debug(`No new columns found for ${definition.name}`) return; } const columnsSQL = missingColumns.map((column: DatabaseColumnDefinition) => { const values = [ "ADD", this.getSQLColumnDefinition(column) ] return values.join(' '); }).join(', '); const sql = `ALTER TABLE ${definition.name} ${columnsSQL}`; console.log(sql); } private createTable(definition: DatabaseDefinition) { const columnsSQL = definition.columns.map((column: DatabaseColumnDefinition) => this.getSQLColumnDefinition(column) ).join(', '); const sql = `CREATE TABLE IF NOT EXISTS ${definition.name} ( ${columnsSQL} )`; this.database.execute(sql); } private getSQLColumnDefinition(column: DatabaseColumnDefinition) { const values = [ column.name, `${column.type}${column.size ? `(${column.size})` : ''}`, column.primaryKey ? `PRIMARY KEY` : '', column.notNull ? 'NOT NULL' : '', column.autoIncrement ? 'AUTOINCREMENT' : '', ]; return values.join(' ') } }