import {DatabaseEnvironment, Environment} from "../Environment"; import Sqlite3 from "better-sqlite3"; import Database from "better-sqlite3"; import {Container} from "../Container/Container"; import {Logger} from "log4js"; export class DatabaseConnection { private static connection: DatabaseConnection; private database: Sqlite3.Database; constructor(private readonly env: DatabaseEnvironment) { this.database = new Database(env.path, { nativeBinding: "node_modules/better-sqlite3/build/Release/better_sqlite3.node", }) this.database.pragma('journal_mode = WAL'); } public execute(query: string, ...args: any[]): Sqlite3.RunResult { try { const preparedQuery = this.database.prepare(query); return preparedQuery.run(args); } catch (error) { Container.get("logger").error("Failed to execute database connection", error, query, args); throw error; } } public fetch(query: string, ...args: any[]): Result|undefined { const preparedQuery = this.database.prepare(query); return preparedQuery.get(args); } public fetchAll(query: string, ...args: any[]): Result[] { const preparedQuery = this.database.prepare(query); return preparedQuery.all(args); } public hasTable(tableName: string): boolean { const sql = "SELECT COUNT(*) as tableCount FROM sqlite_master WHERE type='table' AND name=? LIMIT 1;"; const result = this.fetch(sql, tableName); return result != undefined && result.tableCount > 0; } }