use DB_File ; [$X =] tie %hash, DB_File, $filename [, $flags, $mode, $DB_HASH] ; [$X =] tie %hash, DB_File, $filename, $flags, $mode, $DB_BTREE ; [$X =] tie @array, DB_File, $filename, $flags, $mode, $DB_RECNO ; $status = $X->del($key [, $flags]) ; $status = $X->put($key, $value [, $flags]) ; $status = $X->get($key, $value [, $flags]) ; $status = $X->seq($key, $value [, $flags]) ; $status = $X->sync([$flags]) ; $status = $X->fd ; untie %hash ; untie @array ;
Berkeley DB is a C library which provides a consistent interface to a number of database formats. DB_File provides an interface to all three of the database types currently supported by Berkeley DB.
The file types are:
A default hashing algorithm, which will be adequate for most applications, is built into Berkeley DB. If you do need to use your own hashing algorithm it is possible to write your own in Perl and have DB_File use it instead.
As with the DB_HASH format, it is possible to provide a user defined Perl routine to perform the comparison of keys. By default, though, the keys are stored in lexical order.
In addition to the tie() interface, it is also possible to use most of the functions provided in the Berkeley DB API.
DB* dbopen (const char * file, int flags, int mode, DBTYPE type, const void * openinfo)The parameter type is an enumeration which specifies which of the 3 interface methods (DB_HASH, DB_BTREE or DB_RECNO) is to be used. Depending on which of these is actually chosen, the final parameter, openinfo points to a data structure which allows tailoring of the specific interface method.
This interface is handled slightly differently in DB_File. Here is an equivalent call using DB_File.
tie %array, DB_File, $filename, $flags, $mode, $DB_HASH ;The filename, flags and mode parameters are the direct equivalent of their dbopen() counterparts. The final parameter $DB_HASH performs the function of both the type and openinfo parameters in dbopen().
In the example above $DB_HASH is actually a reference to a hash object. DB_File has three of these pre-defined references. Apart from $DB_HASH, there is also $DB_BTREE and $DB_RECNO.
The keys allowed in each of these pre-defined references is limited to the names used in the equivalent C structure. So, for example, the $DB_HASH reference will only allow keys called bsize, cachesize, ffactor, hash, lorder and nelem.
To change one of these elements, just assign to it like this
$DB_HASH{cachesize} = 10000 ;
To do this you need to remember the return value from the tie.
$db = tie %hash, DB_File, "filename"Once you have done that, you can access the Berkeley DB API functions directly.
$db->put($key, $value, R_NOOVERWRITE) ;All the functions defined in dbx(3X) are available except for close() and dbopen() itself. The DB_File interface to these functions have been implemented to mirror the the way Berkeley DB works. In particular note that all the functions return only a status value. Whenever a Berkeley DB function returns data via one of its parameters, the DB_File equivalent does exactly the same.
All the constants defined in dbopen are also available.
Below is a list of the functions available.
If you use either the R_IAFTER or R_IBEFORE flags, the key parameter will have the record number of the inserted key/value pair set.
Both the key and value parameters will be set.
use DB_File ; use Fcntl ; tie %h, DB_File, "hashed", O_RDWR|O_CREAT, 0640, $DB_HASH ; # Add a key/value pair to the file $h{"apple"} = "orange" ; # Check for existence of a key print "Exists\n" if $h{"banana"} ; # Delete delete $h{"apple"} ; untie %h ;
use DB_File ; use Fcntl ; sub Compare { my ($key1, $key2) = @_ ; "\L$key1" cmp "\L$key2" ; } $DB_BTREE->{compare} = 'Compare' ; tie %h, DB_File, "tree", O_RDWR|O_CREAT, 0640, $DB_BTREE ; # Add a key/value pair to the file $h{'Wall'} = 'Larry' ; $h{'Smith'} = 'John' ; $h{'mouse'} = 'mickey' ; $h{'duck'} = 'donald' ; # Delete delete $h{"duck"} ; # Cycle through the keys printing them in order. # Note it is not necessary to sort the keys as # the btree will have kept them in order automatically. foreach (keys %h) { print "$_\n" } untie %h ;Here is the output from the code above.
mouse Smith Wall
use DB_File ; use Fcntl ; $DB_RECNO->{psize} = 3000 ; tie @h, DB_File, "text", O_RDWR|O_CREAT, 0640, $DB_RECNO ; # Add a key/value pair to the file $h[0] = "orange" ; # Check for existence of a key print "Exists\n" if $h[1] ; untie @h ;
If you cannot find any, then either you didn't look very hard or the moment has passed and I have dropped them.
I am sure there are bugs in the code. If you do find any, or can suggest any enhancements, I would welcome your comments.
Berkeley DB is available from F