/** * better-sqlite3-Rauchtest. * * Bewusst noch OHNE Schema: das Datenmodell kommt aus einem anderen * Arbeitsstrang. Hier wird nur nachgewiesen, dass das native Modul für die * verwendete Electron-ABI geladen werden kann und eine Abfrage beantwortet. * * Das Laden erfolgt defensiv: schlägt es fehl (typischerweise ein * `NODE_MODULE_VERSION`-Konflikt, weil `npm run rebuild` noch nicht lief), * startet die Anwendung trotzdem und meldet den Zustand in der Oberfläche, * statt beim Start abzustürzen. */ import type BetterSqlite3 from 'better-sqlite3'; import type { DatenbankStatus } from '../shared/ipc'; /** Konstruktor-Signatur von better-sqlite3 (nur der hier genutzte Teil). */ type DatenbankKonstruktor = new (pfad: string) => BetterSqlite3.Database; let zwischengespeichert: DatenbankStatus | null = null; function fehlerText(fehler: unknown): string { if (fehler instanceof Error) { return fehler.message; } return String(fehler); } function pruefen(): DatenbankStatus { try { // Absichtlich `require` statt eines statischen Imports: so bleibt das // Laden verzögert und ein Fehlschlag lässt sich hier abfangen, statt // beim Start des Main-Prozesses durchzuschlagen. better-sqlite3 ist ein // natives CommonJS-Modul und wird nicht mitgebündelt. // eslint-disable-next-line @typescript-eslint/no-require-imports const DatenbankKlasse = require('better-sqlite3') as DatenbankKonstruktor; // In-Memory-Datenbank: es entsteht keine Datei auf der Platte. const datenbank = new DatenbankKlasse(':memory:'); try { const zeile = datenbank.prepare('SELECT sqlite_version() AS version').get() as { version: string } | undefined; const version = zeile?.version ?? null; return { verfuegbar: version !== null, sqliteVersion: version, meldung: version !== null ? `SQLite ${version} einsatzbereit.` : 'SQLite antwortete, lieferte aber keine Version.', }; } finally { datenbank.close(); } } catch (fehler) { return { verfuegbar: false, sqliteVersion: null, meldung: `SQLite nicht verfügbar: ${fehlerText(fehler)} ` + 'Bitte "npm run rebuild" ausführen, um das native Modul für Electron neu zu bauen.', }; } } /** Führt den Rauchtest einmalig aus und liefert danach das Ergebnis aus dem Cache. */ export function datenbankStatus(): DatenbankStatus { zwischengespeichert ??= pruefen(); return zwischengespeichert; }