Setzt den OpenSpec-Change phase-3-isam um (49/49 Aufgaben) und schliesst
damit Phase 3 ab. Alle 22 ISAM-Elemente des Inventars sind implementiert;
der Abdeckungsstand steigt auf 217 implementiert / 15 offen / 53
Non-Feature.
Frontend
- ISAM-Anweisungen als eigener Zweig im Parser: NAME [#]n [, arg ...],
Sonderform ROLLBACK ALL ueber eine Sentinel-Kennung
- 22 Signaturen in builtin_stmt/builtin_fn, neue Argumentart R
(Satzvariable eines benutzerdefinierten Typs)
- Satzargumente von INSERT/RETRIEVE/UPDATE werden gegen den Typ der
Dateinummer geprueft, sofern beide literal bekannt sind
- Die Unsupported-Absenkung von OPEN ... FOR ISAM entfaellt
Speicherschicht (tb-runtime::isam, einziger Ort mit redb)
- Je Tabelle eine Satztabelle satz-id -> Satzbytes, je Index eine Tabelle
Schluesselbytes -> satz-id. Satz-IDs sind monoton und werden nie
wiederverwendet: der Cursor merkt sich eine ID, eine neu vergebene
koennte still auf einen fremden Satz zeigen
- Satzbytes entstehen mit fileio::wert_schreiben/wert_lesen, also mit den
Recordpuffern und der UTF-32-Festtextkodierung aus datei-eio
- Ordnungserhaltende Schluesselkodierung je Spaltentyp; Text als UTF-8,
dessen Bytereihenfolge die Codepoint-Reihenfolge ist und damit dieselbe
Ordnung wie CmpStr der VM. Ein Eigenschaftstest ueber 5000 zufaellige
Wertepaare je Typ haelt fest, dass der Bytevergleich dem fachlichen
Vergleich entspricht -- eine Ordnungsverletzung faellt sonst erst bei
bestimmten Datenwerten auf
- Cursor als Wert (aktiver Index, letzte Satz-ID, unpositioniert), nicht
als gehaltener Iterator: er ueberlebt Satzaenderungen und
Transaktionsgrenzen
- Sicherungspunkte ueber ein eigenes Ruecknahmeprotokoll; ROLLBACK ALL
bricht die Bibliothekstransaktion direkt ab
Semantik durchweg aus der Original-Hilfe
- Die Argumentformen stammen erstmals aus den Einzelseiten, nicht nur aus
der Themenliste. Das korrigierte eine Annahme des Entwurfs: die
Spaltenliste von CREATEINDEX ist keine Zeichenkette mit Trennzeichen,
sondern eine Folge einzelner Stringargumente
- SEEKEQ mit unvollstaendigem Schluessel schlaegt immer fehl, SEEKGT mit
Teilschluessel positioniert wie SEEKGE
- Nach SETINDEX ist der erste Satz der neuen Ordnung aktuell, nach DELETE
der folgende
- Suche ueber den NULL-Index meldet 87, nicht 83; damit hat jeder Code von
81 bis 89 einen Ausloeser
- Einzige Erweiterung: ein - vor dem Spaltennamen ordnet absteigend. Die
Original-Hilfe kennt bei CREATEINDEX keine Sortierrichtung, die
Anforderung verlangt sie. Kollisionsfrei, weil ein TYPE-Feldname nie mit
- beginnen kann
CLOSE beendet keine Transaktion
- Erst schrieb es sie fest, womit das Schliessen irgendeiner Dateinummer
die Transaktion aller anderen mit beendete und ein folgendes ROLLBACK
ALL ins Leere lief. Ausstehende Aenderungen sind ohnehin festgeschrieben,
weil jede Operation ausserhalb einer Transaktion fuer sich eine ist
- Ueber das Ende entscheiden allein COMMITTRANS und ROLLBACK ALL; eine
beim Programmende offene Transaktion verfaellt, in beiden Wegen gleich
SETMEM und Fehler 89
- Ohne DOS-Speichermodell ist SETMEM die Obergrenze des ISAM-Puffers
(Vorgabe 65536 Bytes); ohne echte Grenze waere Code 89 nie erreichbar
und die Anweisung eine Attrappe
Tests
- 18 Einheitentests (Kodierung, Formatversion, Satz-IDs, Roundtrip ueber
alle Feldtypen, Indexordnung, Cursor, Protokoll)
- 6 Korpusprogramme: Tabellen, Indizes, Cursor, Saetze, Transaktionen,
Puffer und Vergleichsordnung -- je in einem temporaeren Arbeits-
verzeichnis, der Projektbaum bleibt sauber
- Der VM-Test zu Fehler 73 prueft ISAM nicht mehr, sondern SETUEVENT;
dafuer belegt ein neuer Test, dass OPEN ... FOR ISAM arbeitet
Dokumentation: Datenbankdateiformat in dateiformate.md, Abschnitt 10a
samt Sortierordnung und SETMEM-Abweichung in sprachreferenz.md,
ISAM-Abschnitt in bibliothek.md, Inventar auf implementiert, PLAN.md
schaerft die Leitplanke Referenzverhalten -- sie gilt auch gegenueber den
eigenen Spezifikationen.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>