Files
rdb/CHANGELOG.md
T

10 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.

[Unveröffentlicht]

Hinzugefügt

  • doc/handbuch.md: das Handbuch als lesbares Markdown (Abschnitte, Überschriften, Absätze, Codeblöcke, Listen, Seitenmarken mit Anker je PDF-Seite), erzeugt mit tools/handbuch_md.rb aus doc/handbuch.txt. Die OCR-Fehler bleiben; die .txt bleibt die Quelle.

[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.txt hält Befehl und gedruckte Ausgabe, test/handbuch_test.rb vergleicht sie; mise run test führt ihn mit aus. Druckfehler des Buchs und Stellen, an denen wir abweichen, sind dort vermerkt.

Geändert

  • testall und die Tests setzen EDITOR=true, damit kein echter Editor startet.
  • search und seek ohne 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 -u schreibt den Monat ohne führende Null (6/01/89), wie im Handbuch.
  • mean schreibt einen ganzzahligen Mittelwert ohne .00 (4786, Handbuch S. 26).

Verbessert

  • Schnellzugriff: search, seek, delete und update.rdb lesen bei -mh, -mi und -mr nur noch den Indexeintrag und den einen Satz (Seek auf Byte-Positionen, bei .i Halbierung über die Datei), nicht mehr Tabelle und Index vollständig. Data liest 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, subtotal und die /act-Befehle rechnen exakt mit Rational statt Float: 0.1 + 0.2 + 0.7 ergibt 1.0, Beträge summieren sich auf den Rappen genau, und es wird kaufmännisch gerundet (halb auf).

  • bin/rdb startet mit ruby --disable-gems: jeder Befehl ist in etwa doppelt so schnell gestartet (ca. 85 statt 170 ms), weil RubyGems nicht geladen wird. rdb braucht nur die Standardbibliothek.

  • Die Tests laufen parallel (parallelize_me!; MT_CPU=1 für nacheinander). Zusammen mit dem schnelleren Start dauert die Suite 21 statt 70 Sekunden.

  • Intern: Hilfsfunktionen der Befehlsdateien liegen in Rdb::Helpers statt auf Object, die Konstanten (STATS, TERM_CAPS ...) in Rdb. Kopf- und Strichzeile entstehen an einer Stelle (Table.head_text, dash_cells, headed?), awk baut auf awk_text auf.

Sicherheit

  • report: Spaltenwerte in <!befehl <Spalte>!> wurden unmaskiert in einen Shell-Aufruf eingesetzt, eine Zelle konnte so Befehle ausführen. Sie werden jetzt mit Shellwords.escape eingesetzt.
  • 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 unter flock.
  • vilock: die Sperre wird atomar über einen Hardlink genommen (vorher exist? und rename mit Lücke dazwischen).

Behoben

  • EDITOR mit Argumenten (nvim -f) in vilock und update.rdb wurde als ein Programmname behandelt; der Editor startete nie. Scheitert der Editor, meldet update.rdb das, 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 sequence ab. 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=1 zeigt den Backtrace. Ein geschlossenes Pipe-Ende (| head) und Ctrl-C beenden still.
  • append, enter, replace und ve schrieben Werte mit Tab oder Zeilenumbruch und machten die Tabelle kaputt. Sie lehnen solche Werte jetzt ab.
  • Tabellen, Indexdateien und substitute werden über eine temporäre Datei mit rename geschrieben; ein Abbruch lässt die alte Datei statt einer halben neuen.
  • index -mb und -mi sortieren nach dem Schlüssel ohne umgebende Leerzeichen, so wie search vergleicht.
  • sorttable -r kehrte auch die Reihenfolge gleicher Schlüssel um; sie bleibt jetzt erhalten.
  • index -x vermerkt die Faltung im Kopf der .i-Datei (Offset-x). search bisektiert in der Ordnung des Index: ohne -x in einem gefalteten Index wurden Sätze übersehen, mit -x in einem ungefalteten ebenso (dort und bei -mb liest die Teilsuche jetzt alle Einträge). append hält einen gefalteten Index in seiner Ordnung.
  • jointable -n wurde stillschweigend ignoriert. Wie in der Man-Page vergleicht es die Schlüssel jetzt als Zahlen (01, 1 und 1.0 passen zusammen).
  • Spaltennamen, die justify mit Leerzeichen aufgefüllt hat, wurden nicht mehr gefunden: column Name lieferte eine leere Spalte, index brach ab. Leerraum um die Namen im Kopf zählt jetzt nicht mehr.

[0.7.0] - 2026-10-12

Hinzugefügt

  • column -d Spalte ... (und project -d) löscht Spalten: alle anderen bleiben in ihrer Reihenfolge. Fehler bei unbekannter Spalte oder wenn alle gelöscht würden. Dazu Abschnitt in man/column.man, Beispiel in testall.cmds und Tests.
  • Kantonstarife 2026 für tax: demo/taxCH_AI2026, taxCH_AR2026, taxCH_SG2026, taxCH_GR2026 (Präfix taxCH_ für die Schweiz; einfache Staatssteuer für Alleinstehende, vor Steuerfuss, Gemeinde und Kirche), erzeugt mit tools/gen_tax_tables.rb. Mit Tests, Beispiel in testall.cmds und Erklärung zum Steuerfuss im README.

Behoben

  • rdb man dashline (und headline, backup, dbase, accounting_ter) zeigte als Überschrift eine Makrozeile (dashline -- .PP). Themen-Seiten ohne Beschreibung nehmen jetzt den Titel aus der .TH-Zeile.
  • splittable -0 und 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 mit tools/gen_tax_tables.rb, mit Tests.

Geändert

  • record: 0 und 1 sind die erste Zeile, negative Zahlen zählen vom Ende (-1 letzte, -2 vorletzte ...). 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.cmds und man/record.man zeigen es.
  • README und man/row.man erklären, warum select in bash/zsh/ksh einen Syntaxfehler gibt und wie man es trotzdem aufruft.

Behoben

  • rdb man zeigte \\select in 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. -k nimmt die Tasten aus einem String. Dazu man/pick.man, Beispiele in testall.cmds und 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, -s zeigt das Bild ohne Terminal). Schreibt die Eingabe als Tabelle auf die Standardausgabe. Die Vorlage kommt wie bei screen von der Standardeingabe (mask < entry). Dazu man/mask.man, demo/maskform und Tests (auch mit Pseudo-Terminal).
  • demo/entry: beschriftete Eingabemaske für screen (README erklärt den Unterschied zu form).

[0.3.0] - 2026-10-11

Hinzugefügt

  • demo/testall.cmds enthä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

  • testall läuft in einer temporären Kopie von demo/; schreibende Beispiele (append, delete, close ...) verändern die Demodaten nicht mehr. Die Befehle lesen von einer leeren Standardeingabe.
  • sale nimmt das Datum aus NEXTDATE (wie getjournal, close), sonst von heute.
  • lock fü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=1 ignoriert 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, validate und rdb mit dem Abschnitt „Case of Column Names“.
  • rdb man -g: Man-Page mit groff formatiert, dazu man/rdb.tmac mit den MWC-Makros (.DM, .DE, .PC ...).
  • rdb --version, CHANGELOG.md.

Geändert

  • column schreibt den Kopf in der Schreibweise der Tabelle, wenn die Spalte existiert.
  • demo/ledger und demo/chart verwenden echte Tabs.

[0.1.0] - 2026-10-11

Hinzugefügt

  • Erster Nachbau von /rdb in Ruby: ein Programm bin/rdb mit Symlinks für alle dokumentierten Befehle (Relational, Text, Konvertierung, Schnellzugriff, Berichte, Terminal, /act), 137 Man-Pages, Demo-Daten, 76 Tests, mise-Setup.