Files
Chili Palmer e49a231a68 OpenSpec: phase-3-isam archiviert, Delta-Specs gesynct
Neue Capability isam-datenbank mit 9 Anforderungen und 25 Szenarien:
Tabellenbindung an eine Dateinummer, Indexverwaltung, Cursorbewegung,
Schluesselsuche, Satzoperationen, Transaktionen mit Ruecknahme,
Vergleichsreihenfolge, Pufferverwaltung und das eigene Dateiformat.

sprach-frontend um eine Anforderung erweitert: ISAM-Anweisungen und
-Funktionen in Grammatik und Signaturpruefung.

Die Delta-Spec wurde vor dem Archivieren an die Original-Hilfe
angeglichen -- Cursorlage nach SETINDEX und DELETE, Fehlercode der Suche
ueber den NULL-Index. Die Change-Notiz umfang-und-signaturen.md haelt
Umfangsabgleich, Argumentformen mit Quellenangabe je Themenseite und die
Verifikationsbefunde fest.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-04 11:38:10 +02:00

8.1 KiB

1. Umfang festlegen

  • 1.1 ISAM-Abschnitt der Original-Hilfe auswerten und alle Anweisungen, Funktionen und Klauseln gegen die ISAM-Einträge in docs/inventar.md abgleichen; verifiziert dadurch, dass jedes gefundene Element im Inventar mit Status offen steht und im Change notiert ist, falls es über die Aufzählung im Proposal hinausgeht
  • 1.2 Argumentformen je Element aus der Original-Hilfe festhalten (insbesondere die Schreibweise der Spaltenliste bei CREATEINDEX); verifiziert durch die Notiz im Change, die jede Signatur mit ihrer Quelle nennt

2. Frontend: Grammatik und Signaturen

  • 2.1 ISAM-Anweisungen in die Parser-Grammatik aufnehmen; verifiziert durch Frontend-Test, dass SETINDEX #1, "Name" diagnose-frei parst
  • 2.2 Signaturen (Argumentanzahl und -typen) für alle ISAM-Elemente in der Semantik führen; verifiziert durch Frontend-Test, dass SEEKGT #1 ohne Schlüsselwert eine Diagnose erzeugt, die SEEKGT namentlich nennt
  • 2.3 Satzargumente gegen den Tabellentyp prüfen; verifiziert durch Frontend-Test, dass RETRIEVE #1, x$ „Type mismatch" meldet
  • 2.4 Unsupported-Absenkung von OPEN … FOR ISAM entfernen und durch die reguläre Absenkung ersetzen; verifiziert dadurch, dass ein ISAM-Programm nicht mehr mit Laufzeitfehler 73 endet
  • 2.5 Prüfen, dass kein ISAM-Element mehr als unbekannter Bezeichner behandelt wird; verifiziert durch Frontend-Test über ein Programm, das jedes Element einmal verwendet, ohne Diagnose „unbekannter Bezeichner"

3. Speicherschicht

  • 3.1 redb als Abhängigkeit aufnehmen, auf das ISAM-Modul in tb-runtime beschränkt; verifiziert dadurch, dass cargo build -p tb-runtime durchläuft
  • 3.2 Datenbankdatei mit Formatversion anlegen und öffnen; verifiziert durch Test, dass eine Datei mit höherer Formatversion mit benanntem Fehler abgewiesen und eine strukturell beschädigte Datei mit Laufzeitfehler 88 abgelehnt wird
  • 3.3 Satztabelle satz-id → Satzbytes mit monoton vergebenen, nie wiederverwendeten IDs; verifiziert durch Test, dass eine nach DELETE neu vergebene ID nicht vorkommt
  • 3.4 Satzserialisierung auf den Recordpuffern und der UTF-32-Festtextkodierung aus datei-eio aufsetzen; verifiziert durch Roundtrip-Test über alle Feldtypen des Satztyps
  • 3.5 Ordnungserhaltende Schlüsselkodierung je Spaltentyp (Zahlen vorzeichenrichtig fester Breite, Text nach Codepoints, mehrspaltig verkettet mit eindeutigem Trenner, absteigend durch Byte-Invertierung); verifiziert durch Eigenschaftstest über zufällige Wertepaare, dass der Byte-Vergleich der Kodierung dem fachlichen Vergleich entspricht
  • 3.6 Sortierordnung (Unicode-Codepoints, Groß-/Kleinschreibung unterschieden) in docs/sprachreferenz.md festhalten; verifiziert durch den Abschnittseintrag
  • 3.7 Datenbankdateiformat in docs/dateiformate.md beschreiben inklusive Formatversion und bewusster Inkompatibilität zum Vorbild; verifiziert durch den Abschnittseintrag

4. Tabellen

  • 4.1 OPEN … FOR ISAM typname tabellenname AS #n an die Dateitabelle binden, Satzlayout aus dem benannten Typ ableiten; verifiziert durch Korpustest, dass die Dateinummer danach nutzbar ist
  • 4.2 Tabelle beim ersten Öffnen anlegen; verifiziert durch Korpustest gegen eine Datenbank ohne diese Tabelle
  • 4.3 Layoutabgleich bei bestehender Tabelle mit Fehler 88 bei Abweichung; verifiziert durch Korpustest mit unpassendem Typ
  • 4.4 Ungültige Datenbank- und Tabellennamen mit Fehler 81 abweisen; verifiziert durch Korpustest
  • 4.5 CLOSE löst die Bindung und lässt eine laufende Transaktion unberührt; verifiziert durch Korpustest, dass die Sätze nach erneutem Öffnen vorhanden sind
  • 4.6 DELETETABLE entfernt Tabelle samt Indizes, Fehler 82 bei fehlender Tabelle; verifiziert durch Korpustest für beide Fälle

5. Indizes

  • 5.1 Indextabellen Schlüsselbytes → satz-id je Index anlegen; verifiziert durch Test, dass die Einträge in Schlüsselreihenfolge stehen
  • 5.2 CREATEINDEX mit einer und mit mehreren Spalten, eindeutig und mehrdeutig, auf- und absteigend; verifiziert durch Korpustest je Variante
  • 5.3 DELETEINDEX; verifiziert durch Korpustest, dass der Index danach nicht mehr gesetzt werden kann
  • 5.4 SETINDEX setzt den aktiven Index und stellt den Cursor auf den ersten Satz seiner Ordnung, GETINDEX$ liefert ihn zurück; verifiziert durch Korpustest
  • 5.5 Fehler 83 bei unbekanntem Index und Fehler 84 bei unbekannter Spalte; verifiziert durch Korpustest für beide Fälle

6. Cursor

  • 6.1 Cursor je Dateinummer als Wert führen (aktiver Index, letzte Satz-ID, Kennzeichen unpositioniert); verifiziert durch Unit-Test, dass der Cursor eine Satzänderung überlebt
  • 6.2 MOVEFIRST, MOVELAST, MOVENEXT, MOVEPREVIOUS in der Ordnung des aktiven Index; verifiziert durch Korpustest, dass ein Durchlauf die Sätze in Indexreihenfolge liefert
  • 6.3 Bewegung ohne aktiven Index folgt der Einfügereihenfolge; verifiziert durch Korpustest
  • 6.4 EOF am Ende und BOF am Anfang, Cursor danach jeweils unpositioniert; verifiziert durch je einen Korpustest für MOVENEXT am Ende und MOVEPREVIOUS am Anfang
  • 6.5 SEEKEQ, SEEKGT, SEEKGE inklusive Präfixsuche über einen mehrspaltigen Index; verifiziert durch Korpustest mit den Schlüsseln 10, 20, 30 und einer Präfixsuche
  • 6.6 Erfolglose Suche setzt EOF und lässt den Cursor unpositioniert; verifiziert durch Korpustest
  • 6.7 Suche über den NULL-Index löst Fehler 87 aus; verifiziert durch Korpustest

7. Satzoperationen

  • 7.1 INSERT und RETRIEVE; verifiziert durch Korpustest, dass ein eingefügter Satz per SEEKEQ gefunden und feldgleich gelesen wird
  • 7.2 UPDATE und DELETE, nach DELETE wird der folgende Satz der aktuelle (am Ende: kein aktueller Satz); verifiziert durch Korpustest
  • 7.3 Fehler 85 bei RETRIEVE/UPDATE/DELETE ohne positionierten Cursor; verifiziert durch je einen Korpustest
  • 7.4 Eindeutigkeitsprüfung mit Fehler 86 und unverändertem Satzbestand; verifiziert durch Korpustest, der nach dem Fehler den Bestand nachzählt
  • 7.5 Alle Indizes nach jeder Satzoperation nachführen; verifiziert durch Korpustest, dass ein Satz nach Änderung der indizierten Spalte an neuer Position im Durchlauf erscheint

8. Transaktionen

  • 8.1 BEGINTRANS/COMMITTRANS auf einer Schreibtransaktion; verifiziert durch Korpustest, dass die Änderungen nach erneutem Öffnen vorhanden sind
  • 8.2 Rücknahmeprotokoll der Änderungen innerhalb einer Transaktion; verifiziert durch Unit-Test, dass jede Satzoperation einen Protokolleintrag erzeugt
  • 8.3 ROLLBACK ALL stellt Sätze und Indizes wieder her, beendet die Transaktion und setzt den Cursor auf unpositioniert; verifiziert durch Korpustest mit Einfügen, Löschen und anschließendem Durchlauf
  • 8.4 SAVEPOINT als Funktion (liefert Kennung) und ROLLBACK kennung; verifiziert durch Korpustest, dass Änderungen vor dem Punkt erhalten bleiben

9. Übrige Elemente

  • 9.2 SETMEM als Funktion mit echter Puffergrenze und Fehler 89 beim Überschreiten; verifiziert durch Korpustest, der die Grenze niedrig setzt und den Fehler auslöst
  • 9.3 Vorgabewert und Bedeutung von SETMEM sowie die Abweichung vom DOS-Speichermodell in docs/sprachreferenz.md festhalten; verifiziert durch den Abschnittseintrag
  • 9.4 Indexordnung gegen den Stringvergleich des Dialekts prüfen; verifiziert durch Korpustest, dass Indexreihenfolge und <-Vergleich übereinstimmen

10. Abschluss

  • 10.1 ISAM-Einträge in docs/inventar.md auf implementiert setzen; verifiziert dadurch, dass der Abgleichstest aus phase-3-runtime-bildschirm grün bleibt
  • 10.2 docs/bibliothek.md um die ISAM-Elemente erweitern; verifiziert dadurch, dass jedes umgesetzte Element dort einen Eintrag hat
  • 10.3 Korpus-ISAM-Programme in einem temporären Arbeitsverzeichnis ausführen; verifiziert dadurch, dass nach cargo test git status sauber ist
  • 10.4 Vollständige Suite auf allen Zielplattformen ausführen; verifiziert dadurch, dass cargo test --workspace grün ist
  • 10.5 PLAN.md Phase 3 als abgeschlossen markieren; verifiziert durch den aktualisierten Planabschnitt