import Database, { type Database as DatabaseT } from 'better-sqlite3'; import { SCHEMA_V5_SQL } from './schema-v5'; /** * Public DB-Handle. Schmaler Wrapper um better-sqlite3. */ export interface DbHandle { run(sql: string, params?: unknown[]): void; get(sql: string, params?: unknown[]): T | undefined; all(sql: string, params?: unknown[]): T[]; transaction(fn: () => R): R; runBatch(sql: string): void; close(): void; readonly raw: DatabaseT; } function splitStatements(sql: string): string[] { return sql .split(';') .map(s => s.trim()) .filter(s => s.length > 0); } function runMultiStatement(db: DatabaseT, sql: string): void { for (const stmt of splitStatements(sql)) { db.prepare(stmt).run(); } } export function openDatabase(filePath: string): DbHandle { const db = new Database(filePath); db.pragma('journal_mode = WAL'); db.pragma('busy_timeout = 5000'); db.pragma('foreign_keys = ON'); runMultiStatement(db, SCHEMA_V5_SQL); const handle: DbHandle = { run(sql, params) { db.prepare(sql).run(...(params ?? []) as unknown[]); }, get(sql: string, params?: unknown[]): T | undefined { return db.prepare(sql).get(...(params ?? []) as unknown[]) as T | undefined; }, all(sql: string, params?: unknown[]): T[] { return db.prepare(sql).all(...(params ?? []) as unknown[]) as T[]; }, transaction(fn: () => R): R { return db.transaction(fn)(); }, runBatch(sql) { runMultiStatement(db, sql); }, close() { db.close(); }, get raw() { return db; }, }; return handle; }