 |
Ein eigenes Datenbanksystem zu programmieren ist immer mühselig. Wie trenne ich Datensätze? Und wie trenne ich einzelne Datenfelder? Beliebt und immer wieder gerne gesehen: Datensatz-Trennung mit einem Zeilenumbruch, Datenfeld-Trennung mit einem |. Doch leider ziemlich kompliziert zu verarbeiten...
Aus meiner Sicht einfacher ist da eine kleine XML-Datenbank der Struktur
<datensatz> <name>dsatz1</name> <feld1>irgendein wert</feld1> </datensatz> <datensatz> <name>dsatz2</name> <feld1>irgendein anderer wert</feld1> </datensatz>
Wirklich einfach die dazugehörige Parsing-Routine:
sub readdb { my %rg; my $dbfile = "pfad//db/accounts.dat"; open(DATEI, "<$dbfile") || die("$dbfile kann nicht geöffnet werden"); flock(DATEI, 1) || &error("Kann $dbfile nicht sperren"); my $content = join('', <DATEI>); close(DATEI);
my $b; while($content =~ s/<datensatz>(.+?)<\/datensatz>//s) { my $data = $1; my %heredata;
while ($data =~ s/<(\S+?)>(.+?)<\/\1>//s) { my $tagname = $1; my $tagin = $2; $heredata{lc($tagname)} = $tagin; } $rg{$heredata{name}} = \%heredata; } return \%rg; }
Diese Routine gibt eine Hash-Referenz zurück. Die Hash-Keys entsprechen dabei den Datensatznamen, die zugehörigen Hash-Werte enthalten eine Referenz auf den zugehörigen Wert. Wer also auf das Datenfeld "feld1" des Datensatzes "dsatz2" zugreifen will, verwendet diesen Code:
my %dsaetze = %{&readdb()}; my $wert_von_feld1 = $dsaetze{'dsatz2'}->{'feld1'};
Wo ist hier nun der Vorteil gegenüber herkömmlichen, "normalen" Textfile-Datenbanken?
In meinen Augen entscheidend ist der reduzierte Verwaltungsaufwand. Man muss sich praktisch nicht um das Quoting von Meta-Zeichen kümmern, nur eine Überprüfung der Eingabedaten auf das Zeichen '<' sollte vorgenommen werden. Noch viel besser: das Hinzufügen eines Datenfeldes ist kein Problem. Wie Sie sicher schon bemerkt haben, werden die Datenfeldnamen nämlich direkt aus der Datenbank genommen. Eine separate Definition, und sei sie auch nur in der ersten Zeile der Datenbankdatei, ist nicht nötig.
Auch die Programmierung einer Schreib-Routine sollte den einigermaßen erfahrenen Programmierer vor kein allzu großes Problem stellen. Der Vorgang müsste so ablaufen, dass einer Prozedur der ausgelesene und veränderte Hash übergeben wird. Diese Prozedur schreibt dann die komplette Datei neu. Der folgende, nicht voll funktionsfähige Pseudocode könnte dabei helfen:
# %dsaetze wurde uebergeben, DATEI geöffnet foreach my $key (keys %dsaetze) { my $val = $dsaetze{$key}; print DATEI qq(<datensatz>\n); foreach my $key2 (keys %$val) { my $val2 = $val->{$key2}; print qq(\t<${key2}>${val2}</${key2}>); } print DATEI qq(</datensatz>\n); }
|
 |
|
|
Sie wollen diese Seite ausdrucken? Dafür haben wir eine spezielle Druckversion ohne grafische Elemente entwickelt! |
|
|
Einführung in CSS bei HTMLWorld.
|
|