|
@@ -2,14 +2,14 @@ import fs from 'fs';
|
|
|
import fsp from 'fs/promises';
|
|
import fsp from 'fs/promises';
|
|
|
import moment from 'moment';
|
|
import moment from 'moment';
|
|
|
import path from 'path';
|
|
import path from 'path';
|
|
|
-import { Database as SQLiteDB, OPEN_CREATE, OPEN_READWRITE, RunResult } from 'sqlite3';
|
|
|
|
|
|
|
+import { Database as SQLiteDB, OPEN_CREATE, OPEN_READWRITE } from 'sqlite3';
|
|
|
|
|
|
|
|
-import { Logger } from '../../common/util/logger.class';
|
|
|
|
|
|
|
+import { Logger } from '../../../common/util/logger.class';
|
|
|
|
|
+import { DBMigration } from './db-migration.class';
|
|
|
|
|
+import { SQLiteController } from './sqlite-controller.base';
|
|
|
|
|
|
|
|
-export class Database {
|
|
|
|
|
- private db?: SQLiteDB;
|
|
|
|
|
-
|
|
|
|
|
- public async open() {
|
|
|
|
|
|
|
+export class Database extends SQLiteController {
|
|
|
|
|
+ public async open(migrate = false) {
|
|
|
try {
|
|
try {
|
|
|
const DATA_DIR = process.env.DATA_DIR || 'data';
|
|
const DATA_DIR = process.env.DATA_DIR || 'data';
|
|
|
|
|
|
|
@@ -75,6 +75,12 @@ export class Database {
|
|
|
Logger.debug(`[DEBUG] Created Server #${serverID}`);
|
|
Logger.debug(`[DEBUG] Created Server #${serverID}`);
|
|
|
result = await this.run(`INSERT INTO ServerConfig(ServerID, Key, Value) VALUES(?, ?, ?);`, [serverID, 'syncInterval', 300]);
|
|
result = await this.run(`INSERT INTO ServerConfig(ServerID, Key, Value) VALUES(?, ?, ?);`, [serverID, 'syncInterval', 300]);
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ if (migrate) {
|
|
|
|
|
+ // RUN DB MIGRATIONS
|
|
|
|
|
+ const mig = new DBMigration(this.db);
|
|
|
|
|
+ await mig.update();
|
|
|
|
|
+ }
|
|
|
} catch (err) {
|
|
} catch (err) {
|
|
|
Logger.error('[FATAL] Initializing Database failed:', err);
|
|
Logger.error('[FATAL] Initializing Database failed:', err);
|
|
|
Logger.error('[EXITING]');
|
|
Logger.error('[EXITING]');
|
|
@@ -215,37 +221,4 @@ export class Database {
|
|
|
|
|
|
|
|
return result.rows.map(r => ({ time: new Date(r.Timegroup), avg: r.avg, peak: r.peak, max: r.max }));
|
|
return result.rows.map(r => ({ time: new Date(r.Timegroup), avg: r.avg, peak: r.peak, max: r.max }));
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
- public async run(sql: string, params: any): Promise<RunResult> {
|
|
|
|
|
- return new Promise<RunResult>((res, rej) => {
|
|
|
|
|
- if (!this.db) return rej(new Error('Database not opened.'));
|
|
|
|
|
- this.db.run(sql, params, function (err) {
|
|
|
|
|
- if (err) return rej(err);
|
|
|
|
|
- res(this);
|
|
|
|
|
- });
|
|
|
|
|
- });
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- public async stmt(sql: string, params: any[]) {
|
|
|
|
|
- return new Promise<{ result: RunResult; rows: any[] }>((res, rej) => {
|
|
|
|
|
- if (!this.db) return rej(new Error('Database not opened.'));
|
|
|
|
|
- const stmt = this.db.prepare(sql);
|
|
|
|
|
- stmt.all(params, function (err, rows) {
|
|
|
|
|
- if (err) return rej(err);
|
|
|
|
|
- res({ result: this, rows });
|
|
|
|
|
- });
|
|
|
|
|
- });
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- public async beginTransaction() {
|
|
|
|
|
- await this.run('BEGIN TRANSACTION;', []);
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- public async commit() {
|
|
|
|
|
- await this.run('COMMIT;', []);
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- public async rollback() {
|
|
|
|
|
- await this.run('ROLLBACK;', []);
|
|
|
|
|
- }
|
|
|
|
|
}
|
|
}
|