I/O · Κλάσεις και αντικειμενοστρέφεια
dbmopen#
Συνδέει ένα αρχείο DBM στον δίσκο με έναν κατακερματισμό, ώστε οι αναγνώσεις και εγγραφές του κατακερματισμού να γίνονται αναζητήσεις και αποθηκεύσεις στη βάση δεδομένων.
Η dbmopen είναι ο παλιού τύπου τρόπος να δέσει κανείς (tie) έναν κατακερματισμό με ένα αρχείο dbm, ndbm, sdbm, gdbm ή Berkeley DB. Έχει σε μεγάλο βαθμό αντικατασταθεί από την tie με ρητό άρθρωμα backend DBM (DB_File, GDBM_File, SDBM_File, NDBM_File, AnyDBM_File), που σας δίνει έλεγχο επί του ποια υλοποίηση χρησιμοποιείται και επί των επιλογών ανά backend. Επιλέξτε την dbmopen όταν διαβάζετε παλαιότερο κώδικα ή όταν η συντομία του μονόγραμμου έχει μεγαλύτερη σημασία από την επιλογή backend.
Σε αντίθεση με την open, το πρώτο όρισμα δεν είναι filehandle - είναι ο κατακερματισμός που θα δεθεί. Το HASH γράφεται με το sigil %.
Σύνοψη#
dbmopen %HASH, $DBNAME, $MASK
dbmopen(%HASH, $DBNAME, 0) # open existing only; never create
dbmclose %HASH # or: untie %HASH
Τι επιστρέφεται#
Αληθής τιμή σε επιτυχία, ψευδής τιμή σε αποτυχία. Σε αποτυχία, το $! τίθεται στο σφάλμα συστήματος που εμπόδισε τη σύνδεση. Οι συνήθεις περιπτώσεις αποτυχίας είναι «η βάση δεδομένων δεν υπάρχει και η MASK είναι 0» και σφάλματα δικαιωμάτων στα υποκείμενα αρχεία.
dbmopen(%cache, $path, 0)
or die "cache $path missing or unreadable: $!";
Μετά από επιτυχημένη κλήση, ο %HASH συμπεριφέρεται όπως οποιοσδήποτε άλλος κατακερματισμός: το $HASH{key} = $value γράφει στη βάση δεδομένων, το $HASH{key} διαβάζει από αυτήν, η delete αφαιρεί μια εγγραφή, η exists ελέγχει συμμετοχή, και οι each / keys / values επαναλαμβάνουν. Τα δεδομένα βρίσκονται στον δίσκο· ο κατακερματισμός είναι μόνο μια προβολή.
Ορίσματα#
HASH- η μεταβλητή κατακερματισμού που θα δεθεί. Πρέπει να γραφτεί με%. Οποιαδήποτε υπάρχοντα περιεχόμενα απορρίπτονται. Ο κατακερματισμός παραμένει δεσμευμένος μέχρι να κληθεί επ” αυτού ηdbmcloseή ηuntie, ή μέχρι να βγει εκτός εμβέλειας.DBNAME- η διαδρομή της βάσης δεδομένων χωρίς την επέκταση αρχείου του backend. Τα παραδοσιακά αποθηκευτικά μέσαdbm/sdbmχρησιμοποιούν δύο αρχεία με ονόματα`DBNAME.dir`και`DBNAME.pag`· ταgdbmκαι Berkeley DB χρησιμοποιούν ένα μόνο αρχείο. Το πέρασμα του"/var/lib/app/cache"ανοίγει τα/var/lib/app/cache.dir+/var/lib/app/cache.pagυπόsdbm, ή το/var/lib/app/cacheυπόgdbm.MASK- λειτουργία δημιουργίας για όσα αρχεία πρέπει να δημιουργηθούν, στην ίδια μορφή με το τρίτο όρισμα τηςchmod(τυπικά οκταδικό κυριολεκτικό όπως0666ή0644). Η ενεργήumaskεφαρμόζεται στηMASK, οπότε τα πραγματικά δικαιώματα στον δίσκο είναιMASK & ~umask. ΜιαMASKίση με0καταστέλλει τη δημιουργία: αν η βάση δεδομένων δεν υπάρχει ήδη, ηdbmopenεπιστρέφει ψευδές και το$!τίθεται.
Καθολική κατάσταση που επηρεάζει#
Παραδείγματα#
Ανοίξτε μια βάση δεδομένων ιστορικού, επαναλάβετε με each και έπειτα κλείστε την:
dbmopen(%HIST, '/usr/lib/news/history', 0666)
or die "open history: $!";
while (my ($key, $val) = each %HIST) {
print $key, ' = ', unpack('L', $val), "\n";
}
dbmclose %HIST;
Άνοιγμα μόνο για ανάγνωση, αρνούμενο τη δημιουργία της βάσης δεδομένων:
dbmopen(%cache, "$ENV{HOME}/.app/cache", 0)
or die "no cache at $ENV{HOME}/.app/cache: $!";
my $hit = $cache{$key};
dbmclose %cache;
Επιλέξτε ένα συγκεκριμένο backend φορτώνοντας το άρθρωμά του πριν καλέσετε την dbmopen. Το AnyDBM_File συμβουλεύεται το @AnyDBM_File::ISA για να αποφασίσει ποια υλοποίηση χρησιμοποιεί η dbmopen:
use DB_File;
dbmopen(%NS_Hist, "$ENV{HOME}/.netscape/history.db", 0644)
or die "open netscape history: $!";
Προστατευμένη από εγγραφή βάση δεδομένων - η εκχώρηση αποτυγχάνει σιωπηλά (ή πεθαίνει ανάλογα με το backend)· προφυλαχθείτε με eval όταν χρειάζεστε διερεύνηση:
dbmopen(%db, $path, 0) or die $!;
my $writable = eval { $db{__probe__} = 1; delete $db{__probe__}; 1 };
warn "read-only\n" unless $writable;
Μεγάλη βάση δεδομένων - αποφύγετε τις keys / values, που υλοποιούν ολόκληρη τη λίστα στη μνήμη. Χρησιμοποιήστε αντί γι” αυτές την each:
dbmopen(%big, $path, 0) or die $!;
while (my ($k, $v) = each %big) {
process($k, $v);
}
dbmclose %big;
Οριακές περιπτώσεις#
Το sigil κατακερματισμού είναι απαραίτητο.
dbmopen %h, $name, 0666- η γραφή$hή\%hδεν λειτουργεί. Η πρώτη θέση είναι το όνομα του κατακερματισμού ως κατακερματισμός, όχι ως αναφορά.Το
MASK = 0είναι το ιδίωμα «άνοιγμα μόνο υπάρχουσας». Ένα φαινομενικά εύλογο0666δημιουργεί σιωπηλά μια νέα κενή βάση δεδομένων αν το αρχείο λείπει, πράγμα που σχεδόν ποτέ δεν θέλει ένας αναγνώστης σε διαδρομή αναζήτησης σε cache.Οι επεκτάσεις διαχειρίζονται από το backend. Μην περάσετε
"cache.dir"ή"cache.pag"- περάστε"cache". Τοsdbmπροσθέτει.dir/.pag· τοgdbmγράφει στο γυμνό όνομα.Ένα άνοιγμα ανά διεργασία για παλαιότερο DBM. Αν το backend είναι η παραδοσιακή βιβλιοθήκη
dbm(3)(σπάνια σήμερα), μια διεργασία μπορεί να έχει μόνο ένα DBM ανοιχτό τη φορά. Ταsdbmκαιgdbmδεν έχουν αυτόν τον περιορισμό.Όρια μεγέθους τιμών. Το
sdbmπεριορίζει τα κλειδιά + τιμές σε περίπου 1008 bytes ανά εγγραφή· υπερβολικές εγγραφές αποκόπτονται ή απορρίπτονται. Ταgdbmκαι Berkeley DB έχουν πολύ υψηλότερα όρια. Σε περίπτωση αμφιβολίας, χρησιμοποιήστε τηνtieμεDB_Fileκαι ελέγξτε τα όρια του ίδιου του backend.Οι αριθμητικές τιμές είναι bytes στον δίσκο. Η αποθήκευση
$h{k} = 42γράφει τη συμβολοσειρά"42", όχι ακέραιο. Πακετάρετε ρητά μεpack/unpackόταν το πεδίο χρειάζεται σταθερή δυαδική διάταξη (όπως στο παράδειγμα του ιστορικού news παραπάνω).Το κλείσιμο είναι προαιρετικό αλλά συνιστάται. Η σύνδεση απελευθερώνεται όταν ο κατακερματισμός βγει εκτός εμβέλειας, αλλά μια ρητή
dbmcloseήuntieεκκενώνει τις εκκρεμείς εγγραφές και αναδεικνύει σφάλματα κατά το κλείσιμο.Εκ νέου σύνδεση ενός ήδη συνδεδεμένου κατακερματισμού. Η κλήση της
dbmopenσε κατακερματισμό που είναι ήδη συνδεδεμένος κλείνει πρώτα την προηγούμενη σύνδεση.
Διαφορές από το upstream#
Πλήρως συμβατό με το upstream Perl 5.42.
Δείτε επίσης#
dbmclose- απελευθερώστε μια σύνδεσηdbmopenκαι εκκενώστε τις εκκρεμείς εγγραφέςtie- η σύγχρονη αντικαταστάτρια· συνδυάστε μεDB_File,GDBM_File,SDBM_FileήAnyDBM_Fileγια να επιλέξετε backend ρητάuntie- απελευθερώστε μια σύνδεση που έγινε είτε μεdbmopenείτε μεtieeach- ροή εγγραφών χωρίς υλοποίηση ολόκληρης της βάσης δεδομένων στη μνήμηumask- μασκάρει το όρισμαMASKόταν δημιουργούνται υποκείμενα αρχείαopen- η συνηθισμένη ενσωματωμένη συνάρτηση ανοίγματος αρχείου, που δέχεται filehandle και όχι κατακερματισμό