import Database from "better-sqlite3"; import { existsSync, statSync } from "node:fs"; import path from "node:path"; // Base canonique Toveli, ouverte en lecture seule. Le fichier est remplacé atomiquement chaque nuit // par scripts/sync.ts : on rouvre le handle si l'inode a changé (sinon on lirait l'ancien fichier). const DB_PATH = process.env.TOVELI_DB ?? path.join(process.cwd(), "data", "toveli.db"); let handle: Database.Database | null = null; let inode = -1; export function dbAvailable(): boolean { return existsSync(/*turbopackIgnore: true*/ DB_PATH); } export function getDb(): Database.Database { if (!existsSync(/*turbopackIgnore: true*/ DB_PATH)) throw new Error(`Base Toveli absente : ${DB_PATH} — exécuter « pnpm sync »`); const ino = statSync(/*turbopackIgnore: true*/ DB_PATH).ino; if (!handle || ino !== inode) { handle?.close(); handle = new Database(DB_PATH, { readonly: true, fileMustExist: true }); handle.pragma("cache_size = -262144"); // 256 Mo handle.pragma("mmap_size = 2147483648"); inode = ino; } return handle; } export function meta(key: string): string | null { try { const r = getDb().prepare("SELECT value FROM meta WHERE key = ?").get(key) as { value: string } | undefined; return r?.value ?? null; } catch { return null; } }