OpenSpec-Review dokumentieren und ISAM-Vertragsabweichungen beheben

This commit is contained in:
2026-09-05 17:55:09 +02:00
parent 19804e0e2d
commit 57d6386a5a
61 changed files with 3087 additions and 86 deletions

View File

@@ -203,6 +203,54 @@ An jeden Indexschlüssel sind acht Bytes Satz-ID (Big-Endian) angehängt.
Das macht auch Einträge eines mehrdeutigen Index eindeutig, hält Dubletten
in Einfügereihenfolge und macht die Präfixsuche zur Bereichsabfrage.
**Datenbankidentität und Tabellenlöschung.** ISAM löst bestehende Datenbankpfade
kanonisch auf; bei einer Neuanlage wird zuerst der Elternpfad aufgelöst.
Nach der Anlage wird die endgültige Dateiidentität erneut bestimmt, sodass
auch Symlinks auf zuvor fehlende Zieldateien korrekt gebunden bleiben.
Relative Pfade beziehen sich auf das aktuelle Arbeitsverzeichnis. Ein späteres
`CHDIR` ändert bestehende Bindungen nicht. Relative, absolute und über Symlinks
auflösbare Aliase derselben vorhandenen Datei teilen einen Schreibkontext.
`DELETETABLE` schließt alle Bindungen der entfernten Tabelle. Zugriffe über die
alten Nummern melden Fehler 52. Nach Rücknahme der Löschung ist der Bestand
wieder vorhanden, muss aber mit `OPEN` neu gebunden werden.
**Transaktionen und Sicherungspunkte.** Außerhalb von `BEGINTRANS` wird
jede Änderung einzeln festgeschrieben. Innerhalb einer Transaktion teilen
alle Bindungen derselben Datenbank einen Schreibkontext; auch ein weiteres
`OPEN` sieht die bisherigen Änderungen und schreibt sie nicht fest.
`CLOSE #n`, `CLOSE` und `RESET` lösen nur Bindungen. `COMMITTRANS` schreibt
fest, `ROLLBACK ALL` bricht die Transaktion ab; eine beim Programmende
offene Transaktion verfällt. Bei mehreren Datenbankdateien erfolgt die
Festschreibung je Datei, ohne datenbankübergreifende Atomaritätsgarantie.
`SAVEPOINT` liefert eine Kennung. `ROLLBACK kennung` nimmt die danach
erfolgten Satzänderungen, Indexanlagen/-löschungen und Tabellenanlagen/-löschungen
einschließlich Layout, Indexdefinitionen und gelöschtem Tabellenbestand zurück.
Die Transaktion bleibt offen; der gewählte und alle jüngeren Sicherungspunkte
werden verbraucht. `ROLLBACK` ohne Kennung verwendet den letzten
Sicherungspunkt oder, wenn keiner besteht, den Transaktionsbeginn.
Die Rücknahme funktioniert auch nach dem Schließen aller Bindungen.
Bei Satz-Rücknahmen bleibt die ID-Vergabe monoton; das Wiederherstellen
einer gelöschten Tabelle stellt auch ihren gespeicherten ID-Zähler wieder her.
Nach einer Rücknahme sind Cursor unpositioniert; nicht mehr vorhandene aktive
Indizes werden auf den NULL-Index zurückgesetzt. Bindungen an zurückgenommene
Tabellenanlagen oder an ein zurückgenommenes Layout werden gelöst. Ein erneutes
`OPEN` bindet den wiederhergestellten Bestand beziehungsweise legt eine fehlende
Tabelle neu an. Die von `FREEFILE` gelieferten Nummern berücksichtigen gemeinsam
gewöhnliche Dateien und ISAM-Bindungen; doppelte Nummern werden mit Fehler 55
abgewiesen.
Das Rücknahmeprotokoll hält Layouts unabhängig von offenen Bindungen.
Für Strukturänderungen speichert es die betroffenen Metadaten und, bei Löschungen,
den gelöschten Index beziehungsweise Tabellenbestand, keine vollständige
Datenbankkopie je Sicherungspunkt. Diese gespeicherten Daten zählen zum
ISAM-Puffer (`SETMEM`); reicht er nicht, scheitert die Strukturänderung vor
dem Schreiben mit Fehler 89. Rücknahme und Transaktionsende geben diesen
Puffer wieder frei. Auch DELETE prüft seine Satzbytes vor der Änderung gegen
die verfügbare Grenze; Fehler 89 lässt Sätze, Indizes und Cursor unverändert.
Das Dateiformat bleibt Version 1.
## Kompilat: `.tbc` (neu, eigenes Format)
Container für TBVM-Bytecode, Entwurf in [tbvm-design.md](tbvm-design.md).