Setzt den OpenSpec-Change phase-3-runtime-bildschirm um (77/77 Aufgaben). Abdeckung laut Inventar: 195 implementiert, 37 offen, 53 Non-Feature. Vollstaendigkeits-Inventar - docs/inventar.md mit 285 Eintraegen aus den Themenlisten von bas7advr.hlp und qb45advr.hlp, je mit Status und Fundstelle - crates/tb-frontend/tests/inventar.rs haelt die Tabelle in beide Richtungen gegen den Code; der Abdeckungsstand kann nicht veralten Bruchschritt (Puffer, Host, Korpus) - Cell/TextScreen ziehen ratatui-frei nach tb-runtime::screen; tb-ui behaelt Farbabbildung, Widget und den neuen Terminal-Host - Host wechselt vom Zeichenstrom auf Anzeige des Zellenpuffers plus Ereignisse (Taste, Groessenaenderung, Abbruch) - Korpusvergleich auf getrimmten Bildschirm-Snapshot; die acht bestehenden Sollausgaben blieben dabei unveraendert Groessenunabhaengigkeit - 80x25 ist nirgends mehr eine feste Grenze; Groessenaenderungen waehrend der Ausfuehrung werden zugestellt (Inhalt oben links erhalten, Cursor und VIEW PRINT geklemmt) - Korpusnachweis: dasselbe Programm bei 80x25 und 120x40 mit je eigener Sollausgabe, plus ein Programm mit Groessenwechsel mitten im Lauf Bibliothek - Breite Unicode-Zeichen belegen zwei Zellen (Cursor, POS, Randumbruch) - Bildschirm: CLS, COLOR, LOCATE, WIDTH, VIEW PRINT, SCREEN, CSRLIN, POS - Tastatur: INKEY$, INPUT$, Funktionstasten-Makros (KEY n / LIST / ON) - PRINT USING, LPRINT USING, FORMAT$, SetFormatCC - Mathematik mit kompatiblem PRNG (gleiche Saat, gleiche Folge) - Datum und Zeit mit Serienwerten ab 1899 - Finanzmathematik: FV#, PV#, Pmt#, IPmt#, PPmt#, NPer#, Rate#, NPV#, IRR#, MIRR#, SLN#, SYD#, DDB# - Datei-E/A: sequenziell, RANDOM (Recordpuffer und UDT-Variablen), BINARY, FIELD/LSET/RSET, Statusfunktionen, Dateisystem, MK$/CV - System: ENVIRON, FRE, CLEAR, TRON/TROFF, STACK, ERDEV, ERR-Anweisung Altlasten aus Phase 2 - ON ERROR GOTO auf Modulebene ist aus Prozeduren ansprechbar (prozeduruebergreifender Fixup im Codegenerator) - DATA behaelt seinen Rohtext (Gross-/Kleinschreibung, innerer Leerraum) - Die vier TODO-verify-Zellen der Konvertierungsmatrix sind aufgeloest Vom Inventar aufgedeckte Fehler - Zwoelf Non-Features wies der Compiler entgegen der Phase-1-Spec nicht ab (CALLS, SSEG, POINT, VIEW, COM, PEN, STRIG, STICK, die String*-Routinen, LINE und OPEN "COMn:") -- geschlossen - Drei Gruppen fehlten im urspruenglichen Umfang: Finanzmathematik, Record-Konvertierung, Rest der Dateisystemfunktionen - bas7advr.hlp allein ist keine vollstaendige Quelle; das Inventar bildet die Vereinigung mit qb45advr.hlp Neue Changes - phase-3-isam: schliesst Phase 3 ab (Speicherschicht redb) - phase-3-ortszeit: zieht die UTC-Abweichung zurueck Neue Abhaengigkeit: unicode-width. Dokumentiert: sprachreferenz.md und tbvm-design.md sind TODO-frei, docs/bibliothek.md neu, PLAN.md fortgeschrieben. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
105 lines
5.4 KiB
Markdown
105 lines
5.4 KiB
Markdown
# Phase 3 (Abschluss) — ISAM-Datenbankunterstützung
|
||
|
||
## Why
|
||
|
||
Die Leitplanke „Vollständigkeit ist das Soll" und die Entscheidung vom
|
||
2026-09-02 legen fest: ISAM wird implementiert, es ist kein Non-Feature.
|
||
Heute existiert davon nur eine Parser-Klausel — `OPEN … FOR ISAM typname
|
||
tabellenname AS #n` wird erkannt und auf den „nicht verfügbar"-Marker
|
||
abgesenkt. Die eigentlichen ISAM-Anweisungen und -Funktionen
|
||
(`CREATEINDEX`, `SETINDEX`, `INSERT`, `RETRIEVE`, `UPDATE`, `DELETE`, die
|
||
`MOVE`- und `SEEK`-Familien, die Transaktionsanweisungen) besitzen im
|
||
Frontend **keine Signatur**. Sie enden damit in „unbekannter Bezeichner"
|
||
bzw. einem generischen Syntaxfehler — genau der Fall, den der Guiding
|
||
Principle als Bug definiert: ein dokumentiertes Feature wird still und
|
||
ohne Namensnennung abgewiesen.
|
||
|
||
Die Laufzeitfehler 81–89 des ISAM-Bereichs sind bereits als
|
||
`tb_runtime::errors` implementiert und warten auf ihre Auslöser.
|
||
|
||
Dieser Change schließt Phase 3 ab. Der vorausgehende Change
|
||
`phase-3-runtime-bildschirm` liefert die Datei-E/A-Grundlage
|
||
(Dateitabelle, Recordpuffer, UTF-32-Festtextfelder), auf der ISAM
|
||
aufsetzt, sowie das Inventar, in dem die ISAM-Elemente ihren Status
|
||
führen.
|
||
|
||
## What Changes
|
||
|
||
- **ISAM-Elemente erhalten Frontend-Signaturen**: Sämtliche in der
|
||
Original-Hilfe dokumentierten ISAM-Anweisungen und -Funktionen werden
|
||
in Grammatik und Signaturprüfung aufgenommen, damit ihre Verwendung
|
||
namentlich diagnostiziert statt als unbekannter Bezeichner behandelt
|
||
wird. Den maßgeblichen Umfang bestimmt das Sprachinventar aus
|
||
`phase-3-runtime-bildschirm`; nach heutigem Stand umfasst er
|
||
mindestens `CREATEINDEX`, `DELETEINDEX`, `SETINDEX`, `GETINDEX$`,
|
||
`INSERT`, `RETRIEVE`, `UPDATE`, `DELETE`, `DELETETABLE`, `MOVEFIRST`,
|
||
`MOVELAST`, `MOVENEXT`, `MOVEPREVIOUS`, `SEEKEQ`, `SEEKGT`, `SEEKGE`,
|
||
`BEGINTRANS`, `COMMITTRANS`, `ROLLBACK`/`ROLLBACK ALL`, `SAVEPOINT`
|
||
(Funktion), `SETMEM` (Funktion), `BOF` sowie das ISAM-Verhalten von
|
||
`EOF`, `DELETE`, `LOF` und `LOC`.
|
||
- **ISAM-Datenbanken und Tabellen**: `OPEN … FOR ISAM typname
|
||
tabellenname AS #n` bindet eine Tabelle einer Datenbankdatei an eine
|
||
Dateinummer; das Satzlayout ergibt sich aus dem benannten
|
||
benutzerdefinierten Typ. Tabellen entstehen beim ersten Öffnen,
|
||
`DELETETABLE` entfernt sie.
|
||
- **Indizes**: benannte Indizes über eine oder mehrere Spalten, eindeutig
|
||
oder mehrdeutig, mit auf- und absteigender Ordnung; `SETINDEX` wählt
|
||
den aktiven Index und bestimmt damit die Satzreihenfolge, `GETINDEX$`
|
||
liefert ihn zurück.
|
||
- **Satzoperationen und Cursor**: `INSERT`, `RETRIEVE`, `UPDATE`,
|
||
`DELETE` arbeiten auf dem aktuellen Satz; die `MOVE`-Familie bewegt den
|
||
Cursor in der Ordnung des aktiven Index, die `SEEK`-Familie positioniert
|
||
über Schlüsselvergleiche (gleich, größer, größer-gleich). `EOF` und
|
||
`BOF` melden das Überlaufen des Cursors am Ende bzw. am Anfang.
|
||
- **Transaktionen**: `BEGINTRANS`, `COMMITTRANS`, `ROLLBACK` und
|
||
`ROLLBACK ALL` mit Rücknahme aller Änderungen seit Transaktionsbeginn
|
||
bzw. seit einem Sicherungspunkt; `SAVEPOINT` ist eine **Funktion** und
|
||
liefert die Kennung des gesetzten Sicherungspunkts.
|
||
- **Vergleichsreihenfolge**: Die Sortierordnung der Indizes wird unter
|
||
Unicode festgelegt und dokumentiert.
|
||
- **ISAM-Fehlersemantik**: Die vorhandenen Fehlercodes 81–89 werden von
|
||
den entsprechenden Situationen ausgelöst (ungültiger Name, Tabelle
|
||
nicht gefunden, Index nicht gefunden, ungültige Spalte, kein aktueller
|
||
Satz, Verstoß gegen einen eindeutigen Index, ungültige Operation auf
|
||
NULL-Index, inkonsistente Datenbank, zu wenig Puffer).
|
||
- **Eigenes Datenbankdateiformat**: Die Datenbankdatei ist bewusst nicht
|
||
binärkompatibel zum Vorbild — dieselbe Linie wie bei den UTF-32-
|
||
Records. Das Format wird in `docs/dateiformate.md` beschrieben.
|
||
|
||
**Non-Goals:** Ein Konvertierungswerkzeug für Datenbankdateien des
|
||
Vorbilds; die eingebettete SQL-Erweiterung samt `WHILE SELECT`
|
||
(Stufe 2, Ideenspeicher); Mehrprozess-Zugriff über
|
||
Betriebssystemgrenzen hinweg jenseits der Satzsperren aus `datei-eio`.
|
||
|
||
## Capabilities
|
||
|
||
### New Capabilities
|
||
|
||
- `isam-datenbank`: indizierter Satzzugriff — Datenbank- und
|
||
Tabellenbindung an Dateinummern, Indexverwaltung, Cursorbewegung und
|
||
Schlüsselsuche, Satzoperationen, Transaktionen, Vergleichsreihenfolge
|
||
und die ISAM-Fehlersemantik (Codes 81–89).
|
||
|
||
### Modified Capabilities
|
||
|
||
- `sprach-frontend`: Die Grammatik und die Signaturprüfung SHALL die
|
||
ISAM-Anweisungen und -Funktionen umfassen, sodass ihre Verwendung
|
||
namentlich diagnostiziert wird statt als unbekannter Bezeichner.
|
||
|
||
## Impact
|
||
|
||
- `crates/tb-frontend`: neue Anweisungsgrammatik und Signaturen für die
|
||
ISAM-Elemente; die bisherige `Unsupported`-Absenkung von `OPEN … FOR
|
||
ISAM` entfällt.
|
||
- `crates/tb-runtime`: neues ISAM-Modul (Speicher, Indizes, Cursor,
|
||
Transaktionen) auf der Dateitabelle und den Recordpuffern aus
|
||
`phase-3-runtime-bildschirm`.
|
||
- `crates/tb-vm`: neue Builtin-Indizes für die ISAM-Anweisungen.
|
||
- `tests/compat`: neue Korpusprogramme für Indexordnung, Schlüsselsuche,
|
||
Eindeutigkeitsverletzung, Cursorenden und Transaktionsrücknahme.
|
||
- `docs/`: `docs/dateiformate.md` um das Datenbankdateiformat erweitert;
|
||
`docs/bibliothek.md` um die ISAM-Elemente; `docs/inventar.md` wechselt
|
||
deren Status auf `implementiert`; `docs/sprachreferenz.md` hält die
|
||
Sortierordnung und die Inkompatibilität des Dateiformats fest.
|
||
- PLAN.md: Phase 3 gilt mit diesem Change als abgeschlossen.
|