DeWitt: Schreibschutz einer Datei

Beitrag lesen

Vielleicht solltest du lieber darlegen, was du da genau bauen willst - die Forumsteilnehmer sind kreativ, was das Erstellen von alternativen Lösungen angeht, solange die Möglichkeiten bekannt sind.

Im Endeffekt will ich eine Art eigenes "Datenbank-System" erstellen. Klar, mySQL ist heutzutage wohl das Non-Plus-Ultra, aber ich wollte das ganze eben mal selbst implementieren, in erster Linie zur Übung und aus Interesse bzw. um die auftretenden Problematiken zu verstehen.

Ich kann mein Modul gerne mal detailliert beschreiben, aber das wird natürlich ein bißchen länger ;). Ich stelle hier mal einen kleinen Auszug rein, der beschreibt, wie ich das Modul momentan verwende:

  
#Accounts auslesen  
$accounts = database -> openFile($db) || die $@;  
  
#Prüfen ob Account bereits existiert  
die $@ unless defined (my @accnames = $accounts->getAll("Accname eq \"$useracc\"",'Accname') );  
  
if ($#accnames >= 0) {$acc_exists = 1;}  
  
#Fehlermeldung wenn Account bereits existiert  
if ($acc_exists) {  
 $error = "Der gewünschte Accountname existiert bereits. Bitte wählen Sie einen anderen Account.";  
}  
  
unless ( defined($error) ) {  
  
 # Datensatz erstellen und schreben  
 my %data = (  
  Schlüssel1 => "Wert1",  
  Schlüssel2 => "Wert2",  
  #usw.  
 );  
  
 my $accno = $accounts -> newSet(%data) || die $@;  
 $accounts -> dbWrite() || die $@;  
}  

Beschreibung:

  • openFile() ist die Konstruktur-Funktion, die eine Instanz erstellt und die gewünschte Datei $db öffnet und den Dateiinhalt innerhalb der Funktion zur Verfügung stellt.
  • die anderen Funktionen greifen nur auf die Datei-Inhalte zu und fügen einen neuen Datensatz hinzu
  • dbWrite() aktualisiert die Datei (und soll den Schreibschutz wieder entfernen, siehe vorherige Postings)

Falls es jemand interessiert, hier eine HTML-Darstellung meiner POD-Dokumentation des Moduls.

Das ist also mein erster Ansatz. Allerdings habe ich eben das erwähnte Schreibschutz- und Flaschenhals-Problem.
Meine Überlegung ist jetzt, im Aufruf der Konstruktor-Funktion über einen zusätzlichen Parameter festzulegen, ob auf die Datenbank nur lesend oder auch schreiben zugegriffen werden soll. Auf diese Weise können beliebig viele Prozesse die Datei lesen, während nur ein Prozess zur selben Zeit Änderungen durchführen kann.
Kurze Frage an dieser Stelle: Habe ich das richtig verstanden, dass mittels FLOCK(DATA, 1) die Datei zum lesen weiterhin freigegeben ist, allerdings nur das aktuelle Script Schreibzugriff hat?

Beispiel:

  
# Auslesen nicht erfolgreich  
unless ( open(DATA,"+<$url") && flock(DATA, 1) ) {  
 $@ = "Die Datenbank '$url' konnte nicht geöffnet werden. Grund: $!";  
 return undef;  
}  
# Auslesen erfolgreich  
else {  
 # Auf Datei zugreifen...  
}  

--
selfcode ie:% fl:( br:< va:) ls:} fo:| rl:( n4:° ss:) de:] js:| ch:] sh:( mo:| zu:(
<< Life is just a moment in eternity, yet every life echoes there >>