6.0 KiB
rdb
Ein Nachbau von /rdb, dem relationalen Datenbanksystem der Mark Williams Company für COHERENT (um 1991), in Ruby. Das Original-Handbuch und die Man-Pages stammen aus den freigegebenen MWC-Quellen (nesssoftware.com/home/mwc/source.php). Der Programmcode von /rdb selbst war darin nicht enthalten. Alle Befehle hier sind nach dem Handbuch neu geschrieben.
Einrichten
mise install # Ruby 3.4
mise run install # legt die Symlinks row, column, total ... in bin/ an
mise run test # 76 Tests
Danach steht bin/ im PATH, solange man im Projektordner ist (mise.toml).
Jeder Befehl ist ein Symlink auf bin/rdb, das am Aufrufnamen erkennt, was zu
tun ist. Es geht auch ohne Symlinks: rdb row 'Cost > 5' < demo/inventory.
Vier Namen verdecken im Projektordner Systembefehle: column, rename,
display und whatis.
Das Prinzip
Eine Tabelle ist eine Textdatei: Kopfzeile mit Spaltennamen, Strichzeile, dann eine Zeile pro Datensatz, Spalten durch Tabulator getrennt. Jeder Befehl liest eine Tabelle von stdin und schreibt eine Tabelle nach stdout. Befehle lassen sich mit Pipes kombinieren.
cd demo
row 'Cost > 5' < inventory | column Description Cost | sorttable -nr Cost
compute 'Value = Cost * Amount' < inventory | total Value
jointable inventory owners
Dasselbe gilt für Listen (ein Datensatz als Spalte<Tab>Wert-Zeilen, die
Datei beginnt mit einer Leerzeile). tabletolist und listtotable wandeln um,
die meisten Befehle lesen beides.
row, compute und validate übergeben ihren Ausdruck an awk, nachdem sie
Spaltennamen durch $N ersetzt haben. Es gilt also awk-Syntax.
Hilfe
rdb alle Befehle
rdb man search die Original-Man-Page als Text (auch Themen: backup, dbase, dashline ...)
rdb man -g search dieselbe Seite mit groff formatiert (Beispiele sauber eingerückt)
whatis column Beschreibung und Syntax
whatwill total Befehle, die zu einem Stichwort passen
commands Tabelle aller Befehle
Befehle
| Gruppe | Befehle |
|---|---|
| Auswahl | row select column project sorttable record number Number |
| Spalten | compute addcol rename |
| Mengen, Verbund | jointable union intersect difference paste.rdb splittable |
| Auswertung | total mean maximum minimum subtotal width widest precision datatype schema dbdict |
| Schnellzugriff | index search seek append delete replace enter lock unlock vilock update.rdb ve vindex |
| Prüfen | check.rdb domain validate fd searchtree tableorlist |
| Format | justify trim compresss pad rmblank blank headon headoff insertdash display see |
| Text | cap uppercase lowercase substitute trimblank padstring length filesize ascii chr word prompt not path |
| Umwandeln | tabletolist listtotable listtosh tabletofix fixtotable tabletostruct tabletotbl tabletofact tabletorule tabletom4 tabletosed translate uniondict |
| Datum, Namen | julian gregorian computedate todaysdate soundex like hashkey |
| Berichte | report reportwriter screen label letter |
| Terminal, Hilfe | termput tset clear.rdb cursor menu rdb commands helpme whatis whatwill howmany man |
| Betrieb | testall testsearch timesearch rmcore cpdir.rdb |
| Buchhaltung (/act) | act chartdup foot adjust balance close consolidate getjournal fillform calculate tax cashflow calcpay w2 bom explode sale invoice cstate update.inv |
Schnellzugriff
Wie im Original sucht search über Byte-Offsets. Indizes bauen:
| Option | Methode | Datei |
|---|---|---|
-ms |
sequentiell (Vorgabe) | keine |
-mb |
binär: index sortiert die Tabelle selbst |
keine |
-mr |
Datensatznummer | tabelle.r |
-mi |
invertiert (Schlüssel und Offset, sortiert) | tabelle.i |
-mh |
Hash, doppelt so viele Plätze wie Zeilen | tabelle.h |
index -mi inventory Description
echo scales | search -mi inventory Description
echo cl | search -mi -x inventory Description # Teiltreffer, Groß/klein egal
echo 5 | seek -mi inventory Item # von bis xvon xbis
delete überschreibt einen Satz mit Leerzeichen, ohne die Datei zu verschieben.
replace schreibt an dieselbe Stelle zurück und hängt den Satz hinten an, wenn
er nicht mehr passt (außer mit -a). Beide halten die Indizes aktuell.
rmblank räumt später auf.
Unterschiede zum Original
- Es gibt kein COHERENT-Programmmaterial, daher sind die Ausgaben nur anhand der
Man-Pages geprüft, nicht gegen das echte /rdb. Die Beispiele aus dem
Handbuch sind als Tests enthalten (
test/rdb_test.rb). - Die Indexdateien haben ein eigenes, einfaches Format (das Original ist nicht dokumentiert). Sie sind nicht mit alten /rdb-Dateien austauschbar.
jointablebraucht keine vorsortierten Tabellen.veist ein zeilenorientierter Editor, kein Bildschirmeditor.soundexnutzt den Standard-Algorithmus. Die Beispielwerte im Handbuch weichen davon ab.- Die /act-Befehle arbeiten auf Tabellen im aktuellen Ordner. Welche das sind
und welche Spalten sie brauchen, steht jeweils in der Man-Page. Das Paket ist
wie im Original nur ein Beispiel für Datenbankprogrammierung. Die Befehle, zu
denen das Handbuch nichts sagt (
post,purchase,ship...), fehlen.
Aufbau
bin/rdb das eine Programm (und die Symlinks darauf)
lib/rdb.rb Registry der Befehle
lib/rdb/table.rb Tabellen und Listen lesen und schreiben
lib/rdb/fast.rb Schnellzugriff über Byte-Offsets
lib/rdb/cmd/*.rb die Befehle, nach Gruppen
man/ Man-Pages (troff-Quellen aus den MWC-Archiven)
demo/ Beispieltabellen, testall.cmds und testall.old
test/ Tests
Die Man-Pages und die Beispieltabellen stammen aus den MWC-Quellen. Lizenz der Originale: BSD, Copyright 1977-1995 Robert Swartz.