44 lines
No EOL
1.8 KiB
TypeScript
44 lines
No EOL
1.8 KiB
TypeScript
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>("logger").error("Failed to execute database connection", error, query, args);
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
public fetch<BindParameters extends unknown[] | {} = unknown[], Result = unknown>(query: string, ...args: any[]): Result|undefined {
|
|
const preparedQuery = this.database.prepare<BindParameters, Result>(query);
|
|
return preparedQuery.get(args);
|
|
}
|
|
public fetchAll<BindParameters extends unknown[] | {} = unknown[], Result = unknown>(query: string, ...args: any[]): Result[] {
|
|
const preparedQuery = this.database.prepare<BindParameters, Result>(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<string[], {tableCount: number}>(sql, tableName);
|
|
return result != undefined && result.tableCount > 0;
|
|
}
|
|
} |