OpenSpec-Review dokumentieren und ISAM-Vertragsabweichungen beheben
This commit is contained in:
@@ -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).
|
||||
|
||||
Reference in New Issue
Block a user