Adds initial progress
This commit is contained in:
commit
a0b668cb90
34 changed files with 2680 additions and 0 deletions
81
source/Database/DatabaseUpdater.ts
Normal file
81
source/Database/DatabaseUpdater.ts
Normal file
|
|
@ -0,0 +1,81 @@
|
|||
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<DatabaseDefinition>) {
|
||||
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>("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>("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);
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue