ISAM-Datenbankunterstuetzung
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>
This commit is contained in:
52
PLAN.md
52
PLAN.md
@@ -22,6 +22,12 @@ Konvention: `[ ]` offen · `[x]` erledigt · `[~]` in Arbeit
|
||||
Formatierung), nicht das, was „richtiger" wäre. Wo das Vorbild aber mit der
|
||||
heutigen Plattform kollidiert (Codepages, DOS-Hardware, Segmente), gewinnt
|
||||
die Plattform; solche Abweichungen werden in der Sprachreferenz dokumentiert.
|
||||
**Das gilt auch gegenüber den eigenen Spezifikationen** (2026-09-04): Weicht
|
||||
eine Delta-Spec bei Semantik oder Syntax vom Vorbild ab, ohne dass eine
|
||||
Plattformkollision sie dazu zwingt, wird die **Spec** angeglichen, nicht das
|
||||
Vorbild nachgebildet. Befund aus `phase-3-isam`, wo drei Festlegungen
|
||||
(Cursorlage nach `SETINDEX` und nach `DELETE`, Fehlercode der Suche über den
|
||||
NULL-Index) auf die Original-Hilfe zurückgeführt wurden.
|
||||
- **Vollständigkeit ist das Soll** (2026-09-02): Erwartet wird eine
|
||||
**100 % kompatible Sprachimplementierung und volle Standardbibliothek**
|
||||
des Vorbilds — abzüglich ausschließlich der in der Sprachreferenz
|
||||
@@ -247,8 +253,8 @@ Druckzonen sowie die Korpus-Stringfunktionen (`tb-runtime`).
|
||||
|
||||
## Phase 3 — Laufzeitbibliothek (`tb-runtime`) und Bildschirm
|
||||
|
||||
**Status: Kern abgeschlossen (2026-09-04), ISAM offen.** Umgesetzt im
|
||||
OpenSpec-Change `phase-3-runtime-bildschirm`; der Rest steckt im Change
|
||||
**Status: abgeschlossen (2026-09-04).** Umgesetzt in den OpenSpec-Changes
|
||||
`phase-3-runtime-bildschirm` (Kern), `phase-3-ortszeit` und
|
||||
`phase-3-isam`, mit dem Phase 3 endet.
|
||||
|
||||
Ziel ist die **vollständige** Standardbibliothek des Vorbilds (siehe
|
||||
@@ -260,9 +266,9 @@ Maßgeblich ist seit 2026-09-03 das Inventar, nicht diese Liste.
|
||||
`qb45advr.hlp` mit Status und Fundstelle. Ein Test
|
||||
(`crates/tb-frontend/tests/inventar.rs`) hält die Tabelle in beide
|
||||
Richtungen gegen den Code — der Abdeckungsstand kann nicht mehr
|
||||
veralten. **Stand: 195 implementiert · 37 offen · 53 Non-Feature.**
|
||||
Die 37 offenen sind 22 ISAM (`phase-3-isam`), 13 Forms und
|
||||
Ereignissteuerung (Phase 4), `RUN` und `$INCLUDE` (Phase 5).
|
||||
veralten. **Stand: 217 implementiert · 15 offen · 53 Non-Feature.**
|
||||
Die 15 offenen sind 13 Forms und Ereignissteuerung (Phase 4) sowie
|
||||
`RUN` und `$INCLUDE` (Phase 5).
|
||||
- [x] **Bildschirmpuffer in die Laufzeit** (Entscheidung 2026-09-03):
|
||||
`Cell`/`TextScreen` liegen ratatui-frei in `tb-runtime::screen`;
|
||||
`tb-ui` behält Farbabbildung, Widget und den Terminal-Host. Damit
|
||||
@@ -327,9 +333,14 @@ Maßgeblich ist seit 2026-09-03 das Inventar, nicht diese Liste.
|
||||
alle 22 Korpusprogramme laufen ohne Laufzeitfehler 73; der Fehler
|
||||
tritt nur noch bei bewusst offenen Elementen auf (ISAM, Forms,
|
||||
Ereignissteuerung).
|
||||
- [ ] **ISAM** (Change `phase-3-isam`): `OPEN … FOR ISAM`, Indizes,
|
||||
Cursor, Satzoperationen, Transaktionen. Speicherschicht `redb`
|
||||
(Entscheidung 2026-09-03). Damit endet Phase 3.
|
||||
- [x] **ISAM** (Change `phase-3-isam`): `OPEN … FOR ISAM`, Indizes
|
||||
(ein- und mehrspaltig, eindeutig/mehrdeutig, auf-/absteigend),
|
||||
Cursor mit `MOVE`- und `SEEK`-Familie, Satzoperationen,
|
||||
Transaktionen mit Sicherungspunkten und die Fehler 81–89.
|
||||
Speicherschicht `redb` (Entscheidung 2026-09-03), ISAM-Semantik
|
||||
und ordnungserhaltende Schlüsselkodierung in `tb-runtime::isam`.
|
||||
Alle 22 ISAM-Elemente des Inventars sind damit implementiert.
|
||||
**Damit endet Phase 3.**
|
||||
|
||||
**Befunde dieser Phase, die den Plan korrigiert haben**
|
||||
|
||||
@@ -353,8 +364,29 @@ Maßgeblich ist seit 2026-09-03 das Inventar, nicht diese Liste.
|
||||
Kalenderrechnung bleibt Eigenimplementierung.
|
||||
- `LPRINT` schreibt am Programmende nach `LPT1.TXT` im Arbeitsverzeichnis;
|
||||
einen plattformübergreifenden Druckerkanal gibt es nicht.
|
||||
- Neue Abhängigkeiten: `unicode-width` (Doppelzellen) und `jiff`
|
||||
(Zeitzonenversatz). Für ISAM kommt `redb` hinzu.
|
||||
- Neue Abhängigkeiten: `unicode-width` (Doppelzellen), `jiff`
|
||||
(Zeitzonenversatz) und `redb` (ISAM-Speicherschicht, auf
|
||||
`tb-runtime::isam` beschränkt).
|
||||
- Die Original-Hilfe kennt bei `CREATEINDEX` **keine** Sortierrichtung;
|
||||
absteigende Indexspalten sind die einzige dokumentierte Erweiterung
|
||||
(`-` vor dem Spaltennamen), festgehalten in der Sprachreferenz. Die
|
||||
Cursor-Semantik folgt sonst durchweg dem Vorbild: die Delta-Spec hatte
|
||||
nach `SETINDEX` und `DELETE` zunächst einen unpositionierten Cursor
|
||||
vorgesehen und wurde am 2026-09-04 an die Original-Hilfe angeglichen
|
||||
(siehe Leitplanke „Referenzverhalten schlägt Eleganz").
|
||||
- Die Argumentformen der ISAM-Elemente stammen erstmals aus den
|
||||
**Einzelseiten** der Original-Hilfe, nicht mehr nur aus der Themenliste.
|
||||
Das korrigierte eine Annahme des Entwurfs: die Spaltenliste von
|
||||
`CREATEINDEX` ist keine Zeichenkette mit Trennzeichen, sondern eine Folge
|
||||
einzelner Stringargumente. Belegt in der Change-Notiz
|
||||
`umfang-und-signaturen.md`; für spätere Phasen heißt das: die Themenliste
|
||||
klärt den *Umfang*, die Einzelseiten klären die *Form*.
|
||||
- `CLOSE` beendet **keine** laufende ISAM-Transaktion (Befund der
|
||||
Verifikation, 2026-09-04). Anfangs schrieb es sie fest, womit das
|
||||
Schließen irgendeiner Dateinummer die Transaktion aller anderen mit
|
||||
beendete. Über das Ende einer Transaktion entscheiden allein
|
||||
`COMMITTRANS` und `ROLLBACK ALL`; eine beim Programmende offene
|
||||
Transaktion verfällt.
|
||||
|
||||
## Phase 4 — Forms-Engine (`tb-ui::forms`)
|
||||
- [ ] Eingangsaufgabe (aus Phase 0 übernommen): Ereignisschleifen-
|
||||
|
||||
Reference in New Issue
Block a user