import {DatabaseEnvironment} from "../Environment"; import Sqlite3 from "better-sqlite3"; import Database from "better-sqlite3"; import {Container} from "../Container/Container"; import {Logger} from "log4js"; import path from "node:path"; import * as fs from "node:fs"; export class DatabaseConnection { private database: Sqlite3.Database; constructor(private readonly env: DatabaseEnvironment) { } public connect() { const directory = path.dirname(this.env.path); fs.mkdirSync(directory, { recursive: true }) this.database = new Database(this.env.path, { nativeBinding: "node_modules/better-sqlite3/build/Release/better_sqlite3.node", }) this.database.pragma('journal_mode = WAL'); } public execute(query: string, ...args: unknown[]): 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: unknown[]): Result | undefined { const preparedQuery = this.database.prepare(query); return preparedQuery.get(args); } public fetchAll(query: string, ...args: unknown[]): 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; } }