index -x schreibt Offset-x in den Kopf der .i-Datei, search bisektiert in der Ordnung des Index. Beim Umstieg .h- und mit -x gebaute .i-Indizes neu bauen.
9.7 KiB
Changelog
Alle wichtigen Änderungen stehen hier. Das Format folgt
Keep a Changelog, die Versionsnummern
folgen Semantic Versioning. Die Version steht in
lib/rdb/version.rb; rdb --version zeigt sie an.
[0.8.0] - 2026-10-30
Beim Umstieg: Hashindizes (.h) und mit index -x gebaute Indizes (.i) neu bauen.
Hinzugefügt
doc/handbuch.txt: der Text des gedruckten Handbuchs „COHERENT /rdb Relational Database Manager“ (346 Seiten), per OCR aus dem Scan, mit PDF- und Buchseiten.demo/handbuch/: die Beispiele aus dem Lehrbuchteil (Kapitel 2, 3, 6, 7, 10, 11, 15) mit ihren Tabellen.beispiele.txthält Befehl und gedruckte Ausgabe,test/handbuch_test.rbvergleicht sie;mise run testführt ihn mit aus. Druckfehler des Buchs und Stellen, an denen wir abweichen, sind dort vermerkt.
Geändert
testallund die Tests setzenEDITOR=true, damit kein echter Editor startet.searchundseekohne Schlüsselspalte nehmen die Spaltennamen aus dem Kopf einer Schlüsseltabelle auf der Standardeingabe (search -mh mailtable < name, Handbuch S. 105). Vorher galt immer die erste Spalte der Datentabelle.gregorian -uschreibt den Monat ohne führende Null (6/01/89), wie im Handbuch.meanschreibt einen ganzzahligen Mittelwert ohne.00(4786, Handbuch S. 26).
Verbessert
-
Schnellzugriff:
search,seek,deleteundupdate.rdblesen bei-mh,-miund-mrnur noch den Indexeintrag und den einen Satz (Seek auf Byte-Positionen, bei.iHalbierung über die Datei), nicht mehr Tabelle und Index vollständig.Dataliest die Zeilen erst, wenn eine Methode alle braucht. -
Die Hashfunktion ist FNV-1a statt der Bytesumme. Vorher fielen 3000 fünfstellige Nummern in 30 Plätze (größter Eimer 223), jetzt liegt der größte Eimer bei etwa 4. Hashindizes (
.h) müssen neu gebaut werden (index -mh). -
total,mean,subtotalund die /act-Befehle rechnen exakt mitRationalstattFloat:0.1 + 0.2 + 0.7ergibt1.0, Beträge summieren sich auf den Rappen genau, und es wird kaufmännisch gerundet (halb auf). -
bin/rdbstartet mitruby --disable-gems: jeder Befehl ist in etwa doppelt so schnell gestartet (ca. 85 statt 170 ms), weil RubyGems nicht geladen wird.rdbbraucht nur die Standardbibliothek. -
Die Tests laufen parallel (
parallelize_me!;MT_CPU=1für nacheinander). Zusammen mit dem schnelleren Start dauert die Suite 21 statt 70 Sekunden. -
Intern: Hilfsfunktionen der Befehlsdateien liegen in
Rdb::Helpersstatt aufObject, die Konstanten (STATS,TERM_CAPS...) inRdb. Kopf- und Strichzeile entstehen an einer Stelle (Table.head_text,dash_cells,headed?),awkbaut aufawk_textauf.
Sicherheit
report: Spaltenwerte in<!befehl <Spalte>!>wurden unmaskiert in einen Shell-Aufruf eingesetzt, eine Zelle konnte so Befehle ausführen. Sie werden jetzt mitShellwords.escapeeingesetzt.screen: Spaltennamen, die keine gültigen Shell-Variablennamen sind, brechen mit einer Meldung ab, statt ins erzeugte Skript zu gelangen.lock/unlock: Sperrdateien liegen in/tmp/rdb-locks-<UID>/(Modus 0700, Besitzer und Symlinks geprüft) statt lose in/tmp; Lesen und Schreiben laufen unterflock.vilock: die Sperre wird atomar über einen Hardlink genommen (vorherexist?undrenamemit Lücke dazwischen).
Behoben
EDITORmit Argumenten (nvim -f) invilockundupdate.rdbwurde als ein Programmname behandelt; der Editor startete nie. Scheitert der Editor, meldetupdate.rdbdas, statt „record replaced“ zu schreiben.update.rdb e: Der Satz blieb leer, wenn der Editor scheiterte oder abgebrochen wurde. Er wird jetzt in jedem Fall zurückgeschrieben.- Spaltennamen mit Umlauten (
row 'Über > 3') scheiterten mit einem awk-Fehler. Der Ausdrucksumsetzer kennt jetzt Unicode-Buchstaben. - Dateien, die kein UTF-8 sind (Latin-1 aus COHERENT-Zeiten), brachen mit
invalid byte sequenceab. Sie werden als Latin-1 gelesen und als UTF-8 ausgegeben. - Fehler wie ungültige Regex, ungültiges Datum oder Ein-/Ausgabefehler endeten mit einem Ruby-Backtrace. Jetzt eine Zeile;
RDB_DEBUG=1zeigt den Backtrace. Ein geschlossenes Pipe-Ende (| head) und Ctrl-C beenden still. append,enter,replaceundveschrieben Werte mit Tab oder Zeilenumbruch und machten die Tabelle kaputt. Sie lehnen solche Werte jetzt ab.- Tabellen, Indexdateien und
substitutewerden über eine temporäre Datei mitrenamegeschrieben; ein Abbruch lässt die alte Datei statt einer halben neuen. index -mbund-misortieren nach dem Schlüssel ohne umgebende Leerzeichen, so wiesearchvergleicht.sorttable -rkehrte auch die Reihenfolge gleicher Schlüssel um; sie bleibt jetzt erhalten.index -xvermerkt die Faltung im Kopf der.i-Datei (Offset-x).searchbisektiert in der Ordnung des Index: ohne-xin einem gefalteten Index wurden Sätze übersehen, mit-xin einem ungefalteten ebenso (dort und bei-mbliest die Teilsuche jetzt alle Einträge).appendhält einen gefalteten Index in seiner Ordnung.jointable -nwurde stillschweigend ignoriert. Wie in der Man-Page vergleicht es die Schlüssel jetzt als Zahlen (01,1und1.0passen zusammen).- Spaltennamen, die
justifymit Leerzeichen aufgefüllt hat, wurden nicht mehr gefunden:column Namelieferte eine leere Spalte,indexbrach ab. Leerraum um die Namen im Kopf zählt jetzt nicht mehr.
[0.7.0] - 2026-10-12
Hinzugefügt
column -d Spalte ...(undproject -d) löscht Spalten: alle anderen bleiben in ihrer Reihenfolge. Fehler bei unbekannter Spalte oder wenn alle gelöscht würden. Dazu Abschnitt inman/column.man, Beispiel intestall.cmdsund Tests.- Kantonstarife 2026 für
tax:demo/taxCH_AI2026,taxCH_AR2026,taxCH_SG2026,taxCH_GR2026(PräfixtaxCH_für die Schweiz; einfache Staatssteuer für Alleinstehende, vor Steuerfuss, Gemeinde und Kirche), erzeugt mittools/gen_tax_tables.rb. Mit Tests, Beispiel intestall.cmdsund Erklärung zum Steuerfuss im README.
Behoben
rdb man dashline(undheadline,backup,dbase,accounting_ter) zeigte als Überschrift eine Makrozeile (dashline -- .PP). Themen-Seiten ohne Beschreibung nehmen jetzt den Titel aus der.TH-Zeile.splittable -0und mehr als 676 Stücke endeten mit einem Ruby-Abbruch (im zweiten Fall nach 676 geschriebenen Dateien). Jetzt eine Fehlermeldung, und es wird vorher geprüft, damit nichts halb geschrieben wird.
[0.6.0] - 2026-10-11
Hinzugefügt
- Steuertabellen 2026 für
tax:demo/taxDE2026,taxAT2026,taxCH2026(nur Bundessteuer),taxLI2026(nur Landessteuer), erzeugt mittools/gen_tax_tables.rb, mit Tests.
Geändert
record: 0 und 1 sind die erste Zeile, negative Zahlen zählen vom Ende (-1letzte,-2vorletzte ...). Außerhalb der Tabelle kommt eine leere Tabelle, Text und Dezimalzahlen sind ein Fehler. (Vorher lieferten 0, -1 und Text ungewollt Zeilen vom Ende.)testall.cmdsundman/record.manzeigen es.- README und
man/row.manerklären, warumselectin bash/zsh/ksh einen Syntaxfehler gibt und wie man es trotzdem aufruft.
Behoben
rdb manzeigte\\selectin den Man-Pages als\elect: ein doppelter Backslash wird jetzt zuerst geschützt.
[0.5.0] - 2026-10-11
Hinzugefügt
pick: Tabelle auf dem Terminal durchblättern, filtern und eine oder mehrere Zeilen (-m) auswählen; die Auswahl geht als Tabelle auf die Standardausgabe.-knimmt die Tasten aus einem String. Dazuman/pick.man, Beispiele intestall.cmdsund Tests (auch mit Pseudo-Terminal).
[0.4.0] - 2026-10-11
Hinzugefügt
mask: Eingabemaske mit eigener Oberfläche (Felder mit Breite, Schaltflächen, Rahmen-b,-szeigt das Bild ohne Terminal). Schreibt die Eingabe als Tabelle auf die Standardausgabe. Die Vorlage kommt wie beiscreenvon der Standardeingabe (mask < entry). Dazuman/mask.man,demo/maskformund Tests (auch mit Pseudo-Terminal).demo/entry: beschriftete Eingabemaske fürscreen(README erklärt den Unterschied zuform).
[0.3.0] - 2026-10-11
Hinzugefügt
demo/testall.cmdsenthält zu jedem der 134 Befehle ein ausführbares Beispiel, gegliedert durch Überschriften (##-Zeilen werden mit ausgegeben,#-Zeilen sind stille Kommentare). Ein Test prüft, dass kein Befehl fehlt.
Geändert
testallläuft in einer temporären Kopie vondemo/; schreibende Beispiele (append,delete,close...) verändern die Demodaten nicht mehr. Die Befehle lesen von einer leeren Standardeingabe.salenimmt das Datum ausNEXTDATE(wiegetjournal,close), sonst von heute.lockführt die Sperrdatei pro Pfad statt pro Dateiname, so stören sich gleichnamige Tabellen in verschiedenen Ordnern nicht.
[0.2.0] - 2026-10-11
Hinzugefügt
RDB_ICASE=1ignoriert Groß-/Kleinschreibung bei Spaltennamen. Ein exakter Treffer gewinnt, mehrere Treffer sind ein Fehler; awk-Wörter und Funktionsaufrufe bleiben unberührt.- Man-Pages von
row,compute,column,sorttable,jointable,rename,validateundrdbmit dem Abschnitt „Case of Column Names“. rdb man -g: Man-Page mit groff formatiert, dazuman/rdb.tmacmit den MWC-Makros (.DM,.DE,.PC...).rdb --version,CHANGELOG.md.
Geändert
columnschreibt den Kopf in der Schreibweise der Tabelle, wenn die Spalte existiert.demo/ledgerunddemo/chartverwenden echte Tabs.
[0.1.0] - 2026-10-11
Hinzugefügt
- Erster Nachbau von /rdb in Ruby: ein Programm
bin/rdbmit Symlinks für alle dokumentierten Befehle (Relational, Text, Konvertierung, Schnellzugriff, Berichte, Terminal, /act), 137 Man-Pages, Demo-Daten, 76 Tests, mise-Setup.