waffensachkunde

Waffensachkunde – Lernsoftware für die Sachkundeprüfung nach § 7 WaffG. Barrierefrei, offline, EUPL-1.2.

/ app src main datenbank.ts

2,5 KB Rohdatei
app/src/main/datenbank.ts — 72 Zeilen
1 /**
2 * better-sqlite3-Rauchtest.
3 *
4 * Bewusst noch OHNE Schema: das Datenmodell kommt aus einem anderen
5 * Arbeitsstrang. Hier wird nur nachgewiesen, dass das native Modul für die
6 * verwendete Electron-ABI geladen werden kann und eine Abfrage beantwortet.
7 *
8 * Das Laden erfolgt defensiv: schlägt es fehl (typischerweise ein
9 * `NODE_MODULE_VERSION`-Konflikt, weil `npm run rebuild` noch nicht lief),
10 * startet die Anwendung trotzdem und meldet den Zustand in der Oberfläche,
11 * statt beim Start abzustürzen.
12 */
13
14 import type BetterSqlite3 from 'better-sqlite3';
15
16 import type { DatenbankStatus } from '../shared/ipc';
17
18 /** Konstruktor-Signatur von better-sqlite3 (nur der hier genutzte Teil). */
19 type DatenbankKonstruktor = new (pfad: string) => BetterSqlite3.Database;
20
21 let zwischengespeichert: DatenbankStatus | null = null;
22
23 function fehlerText(fehler: unknown): string {
24 if (fehler instanceof Error) {
25 return fehler.message;
26 }
27 return String(fehler);
28 }
29
30 function pruefen(): DatenbankStatus {
31 try {
32 // Absichtlich `require` statt eines statischen Imports: so bleibt das
33 // Laden verzögert und ein Fehlschlag lässt sich hier abfangen, statt
34 // beim Start des Main-Prozesses durchzuschlagen. better-sqlite3 ist ein
35 // natives CommonJS-Modul und wird nicht mitgebündelt.
36 // eslint-disable-next-line @typescript-eslint/no-require-imports
37 const DatenbankKlasse = require('better-sqlite3') as DatenbankKonstruktor;
38
39 // In-Memory-Datenbank: es entsteht keine Datei auf der Platte.
40 const datenbank = new DatenbankKlasse(':memory:');
41 try {
42 const zeile = datenbank.prepare('SELECT sqlite_version() AS version').get() as
43 { version: string } | undefined;
44
45 const version = zeile?.version ?? null;
46 return {
47 verfuegbar: version !== null,
48 sqliteVersion: version,
49 meldung:
50 version !== null
51 ? `SQLite ${version} einsatzbereit.`
52 : 'SQLite antwortete, lieferte aber keine Version.',
53 };
54 } finally {
55 datenbank.close();
56 }
57 } catch (fehler) {
58 return {
59 verfuegbar: false,
60 sqliteVersion: null,
61 meldung:
62 `SQLite nicht verfügbar: ${fehlerText(fehler)} ` +
63 'Bitte "npm run rebuild" ausführen, um das native Modul für Electron neu zu bauen.',
64 };
65 }
66 }
67
68 /** Führt den Rauchtest einmalig aus und liefert danach das Ergebnis aus dem Cache. */
69 export function datenbankStatus(): DatenbankStatus {
70 zwischengespeichert ??= pruefen();
71 return zwischengespeichert;
72 }