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<{}, {name: string, type: string}>( `PRAGMA table_info("${definition.name}")` ); if (!DBSQLColumns) { Container.get("logger").log("Request 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").log(`No new columns found for ${definition.name}`) return; } const columnsSQL = missingColumns.map((column: DatabaseColumnDefinition) => { const values = [ "ADD", column.name, column.type, column.primaryKey ? `PRIMARY KEY` : '', column.notNull ? 'NOT NULL' : '', column.autoIncrement ? 'AUTOINCREMENT' : '', ] return values.join(' '); }).join(', '); const sql = `ALTER TABLE ${definition.name} ${columnsSQL}`; this.database.execute(sql); } private createTable(definition: DatabaseDefinition) { const columnsSQL = definition.columns.map((column: DatabaseColumnDefinition) => { const values = [ column.name, column.type, column.primaryKey ? `PRIMARY KEY` : '', column.notNull ? 'NOT NULL' : '', column.autoIncrement ? 'AUTOINCREMENT' : '', ] return values.join(' '); }).join(', '); const sql = `CREATE TABLE IF NOT EXISTS ${definition.name} (${columnsSQL})`; const result = this.database.execute(sql); } }