Ohne Umwege
Textdatei-basiertes Datenbanksystem Recutils
Reguläre Ausdrücke
Die Recutils unterstützen in Abfragen als Argumente von -e Muster aus regulären Ausdrücken, analog zu denen, die Egrep oder grep -e zulassen. Eine Besonderheit der Recfiles stellen die Statements mit einem vorangestellten Prozentzeichen (Tabelle "Spezielle Datensätze") dar: Mit ihnen organisieren Sie die Datenbank.
Spezielle Datensätze
| Statement | Wirkung |
|---|---|
%rec
|
definiert den Typ eines Datensatzes und kennzeichnet Datensatzbeschreibungen (Record Descriptors) |
%mandatory, %prohibit
|
legt fest, welche Felder in Datensätzen auftreten dürfen und welche nicht |
%unique, %key
|
definiert eindeutige (Primär-)Schlüssel |
%auto
|
bewirkt das automatische Erzeugen von Felder |
%doc
|
erlaubt, zusätzliche Informationen zu Datensätzen aufzunehmen |
%typedef, %type
|
erzeugt Typnamen und ordnet Typen und Felder zu |
%sort
|
sortiert Datensätze nach vorgegebenen Feldern |
%size
|
ermöglicht, die Größe von Datensätzen einzustellen |
%confidential
|
verschlüsselt Informationen |
In Emacs
Im Prinzip eignet sich jeder Editor zum Bearbeiten von Recfiles, doch außer Emacs bietet keiner spezielle Funktionen, die Ihnen die Arbeit erleichtern. Die Recutils bringen einen speziellen (Major-)Modus für Emacs mit, der sich in der Datei rec-mode.el verbirgt. Dieser entstand speziell zum Bearbeiten von Recfiles. Steht in der ersten Zeile einer geladenen Datei die Zeichenkette # -*- mode: rec -*-, interpretiert Emacs diese als Recfile und aktiviert automatisch den passenden Modus.
Datensätze erscheinen nun eingefärbt: Schlüsselwörter sind blau, Werte schwarz und Kommentare grün. Weiterhin gibt es nun eine Reihe spezieller Tastenbindungen, mit denen Sie Funktionen zum Bearbeiten direkt aufrufen. Die Tabelle "Tastenbindungen im Emacs" fasst die wichtigsten davon zusammen.
Tastenbindungen im Emacs
| Taste | Funktion |
|---|---|
| [Tab] | zum nächsten Feld wechseln |
| [Eingabe] | weiter springen |
| [Leertaste] | Sichtbarkeit umschalten |
| [#] | Datensätze zählen |
| [Umschalt]+[A] | Daten an aktuelles Feld anhängen |
| [Umschalt]+[B] | Editiermodus umschalten |
| [Umschalt]+[I] | Informationen zur Datenbank zeigen |
| [Umschalt]+[R] | aktuellen Datensatz bearbeiten |
| [Umschalt]+[T] | Feldtyp bearbeiten |
| [B] | zurück springen |
| [E] | Datensatz bearbeiten |
| [L] | Datensätze suchen |
| [M] | Feld trimmen |
| [N] | zum nächsten Datensatz wechseln |
| [P] | zum vorigen Datensatz wechseln |
| [S] | Suchfunktion |
| [T] | Datensatzbeschreibung zeigen |
| [Strg]+[C],[T] | Datensatztypen suchen |
Im Rec-Modus beschränkt Emacs die Darstellung der Datensätze durch sogenanntes "Narrowing" auf die momentan relevanten Teile, beispielsweise den aktuellen Datensatz. Das erhöht die Übersicht, wenn Sie genau wissen, was Sie gerade bearbeiten. Falls dieses Verhalten Sie irritiert, heben Sie es durch [Strg]+[X],[N],[W] auf. Über [Strg]+[X],[N],[N] aktivieren Sie es erneut.
In der Emacs-typischen Schreibweise finden Sie diese Tastenkombination auch als C-x x n und C-x n n beschrieben. Das funktioniert auch über [Umschalt]+[B] und schaltet dabei den Buffer mit der Datenbank in den Editiermodus; voreingestellt öffnet der Emacs Recfiles schreibgeschützt.
Ein Teil der Emacs-Funktionen entspricht jenen, welche die Befehle der Recutils bereitstellen: So wirkt [Umschalt]+[I] wie recinf, [L] stellt eine interaktive Variante von recsel bereit. Gerade diese Funktion hilft, die Arbeitsweise der Recutils zu verstehen. Ein Beispiel verdeutlicht den Einsatz des Modus, der voreingestellten Tastenbindungen und der Befehle.
Nach dem Laden der Beispieldatenbank movies.rec zeigt der Emacs nur eine Zeile, sofern der Rec-Modus aktiv ist:
%rec: movies
Das Schlüsselwort %rec legt den Typ aller folgenden Datensätze fest, bis das Dateiende erreicht ist oder ein neues Statement dieser Art auftritt. Im obigen Beispiel haben die Datensätze also zunächst alle den Typ movies. Falls es weitere Typen im Recfile gibt, zeigt [Umschalt]+[I] sie in der Statuszeile an. Da hier nur 898 movies erscheint, kennen Sie den Umfang der Datenbank und den Typ der Einträge.
Um die Datenbank selbst im Detail zu sehen und zu editieren, wechseln Sie [Umschalt]+[B] in den Editiermodus (Edit buffer zeigt dies an). Alle üblichen Editierbefehle stehen nun bereit. Insbesondere aktiviert [Strg]+[S] die inkrementelle (Volltext-)Suche über alle Felder, mit der Sie in allen Datensätzen suchen. Auch Suchen und Ersetzen steht hier zur Verfügung, ebenso wie das Einfügen oder Löschen von Zeilen (sprich: Feldern) in den Datensätzen. Es lohnt sich aber, dafür die speziellen Befehle des Rec-Modus zu nutzen.
Mit [Strg]+[C],[Strg]+[C] beenden Sie diesen Modus und sehen dann den Datensatz an, in dem sich der Cursor gerade befand. Über [Umschalt]+[A] haben Sie nun die Möglichkeit, ein neues Feld anzulegen, beispielsweise ein Genre, oder etwas zu ergänzen. Auch lassen sich die angezeigten Felder und ihre Werte nun für diesen ausgewählten Datensatz verändern, bis [Strg]+[C],[Strg]+[C] wieder den Modus beendet.
Über [Tab] wechseln Sie zum nächsten Feld. [Umschalt]+[T] erlaubt es, neue Datensatztypen in Recfiles anzulegen. Diese Datensatztypen strukturieren Recfiles auf einer Ebene über den Datensätzen und erlauben es, unterschiedliche Datensatztypen in einem Recfile aufzunehmen.
Beim Betätigen der Taste springt der Cursor zur aktuellen Definition, die mittels %rec: erfolgt. Bei movies.rec definiert in der ersten Zeile %rec: movies den Typ. Bei Bedarf kopieren Sie einfach die Zeile und fügen sie an anderer Stelle im Recfile – etwa vor dem gewünschten Datensatz oder am Ende der Datei – erneut ein, wobei Sie den Typ anpassen.
Es gibt in der Beispieldatenbank drei Einträge zum Film mit dem Titel "Mr. Nice Guy". Wenn Sie nun zwischen dem zweiten und dritten Eintrag den Typ wechseln, haben Sie die Möglichkeit, die drei Datensätze trotz gleicher Titel unterschiedlichen Typen zuzuordnen und entsprechend zu verwalten (Listing 4). Sichern Sie diese veränderte Datenbank unter einem neuen Namen, etwa als movies1.rec.
Listing 4
Id: 539 Title: Mr. Nice Guy Alternative_titles: Yatgo ho yan Add_date: 16.07.2002 Audio: German Identifier: 883 Location: Box 1 Media: (DivX) Amount_of_Media: 1 Video_format: (DivX);-) V3.11 LOW MOTION Viewed: 0 %rec: movies1 Id: 540 Title: Mr. Nice Guy - Uncut Alternative_titles: Yatgo ho yan Add_date: 16.07.2002 Audio: English Identifier: 147 Location: Box 2 Media: (DivX) Amount_of_Media: 1 Subtitles: English [SubRip] Video_format: (DivX);-) MPEG4 v3 Viewed: 0
Die Auswirkungen dieser Modifikation zeigen sich bei Abfragen an die Datenbank. In der Shell dient recsel zum Suchen von Datensätzen. recsel -e "Title ~ 'Nice'" sucht alle Datensätze, die im Titel-Feld das Wort "Nice" enthalten (Listing 5). Die Tilde zwischen dem Schlüsselwort Title und der Zeichenkette Nice, die in Hochkommata stehen muss, bewirkt, dass jedes Auftreten der Zeichenkette als Treffer gilt ("soft match"). Mit einem Gleichheitszeichen finden Sie nur exakte, vollständige Übereinstimmungen ("hard match").
Listing 5
$ recsel -e "Title ~ 'Nice'" movies.rec Id: 538 Title: Mr. Nice Guy ... Id: 539 Title: Mr. Nice Guy ... Id: 540 Title: Mr. Nice Guy - Uncut ...
Bei der veränderten Datenbank movies1.rec findet recsel zwei unterschiedliche Datensatztypen und meldet dies (Listing 6). Nach der Angabe eines Typs liefert das Tool das korrekte Ergebnis.
Listing 6
$ recsel -e "Title ~ 'Nice'" movies.rec recsel: Fehler: Verschiedene Datensatztypen gefunden. Bitte mit -t einen angeben. $ recsel -t movies -e "Title ~ 'Nice'" movies1.rec Id: 538 Title: Mr. Nice Guy ... Id: 539 Title: Mr. Nice Guy ...
Für den Typ movies1 liefert die Abfrage aus Listing 7 den fehlenden Eintrag. Dieselbe Abfrage ließe sich übrigens direkt im Emacs bewerkstelligen: [L] aktiviert die Suchfunktion, [Umschalt]+[E] die Suchmethode. Alle weiteren Parameter fragt Emacs dann ab. [Eingabe] übernimmt die Angaben.
Listing 7
$ recsel -t movies1 -e "Title ~ 'Nice'" movies1.rec Id: 540 Title: Mr. Nice Guy - Uncut ...



