pnp-scheduler/source/Database/DatabaseConnection.ts

53 lines
No EOL
1.9 KiB
TypeScript

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>("logger").error("Failed to execute database connection", error, query, args);
throw error;
}
}
public fetch<BindParameters extends unknown[] | {} = unknown[], Result = unknown>(query: string, ...args: unknown[]): 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: unknown[]): 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;
}
}