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 επιστρέφει ψευδές και το $! τίθεται.

Καθολική κατάσταση που επηρεάζει#

  • $! - τίθεται σε αποτυχία (βάση δεδομένων ανύπαρκτη, άρνηση δικαιωμάτων, αλλοιωμένο υποκείμενο μέσο).

  • Η ενεργή umask - μασκάρει τη MASK όταν δημιουργούνται νέα υποκείμενα αρχεία.

Παραδείγματα#

Ανοίξτε μια βάση δεδομένων ιστορικού, επαναλάβετε με 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 είτε με tie

  • each - ροή εγγραφών χωρίς υλοποίηση ολόκληρης της βάσης δεδομένων στη μνήμη

  • umask - μασκάρει το όρισμα MASK όταν δημιουργούνται υποκείμενα αρχεία

  • open - η συνηθισμένη ενσωματωμένη συνάρτηση ανοίγματος αρχείου, που δέχεται filehandle και όχι κατακερματισμό