This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
3f53d468cdff1a16612b3e070a795e793093de14
[perl5.git] / ext / DB_File / DB_File.pm
1 # DB_File.pm -- Perl 5 interface to Berkeley DB 
2 #
3 # written by Paul Marquess (pmqs@cpan.org)
4 # last modified 20th June 2004
5 # version 1.809
6 #
7 #     Copyright (c) 1995-2004 Paul Marquess. All rights reserved.
8 #     This program is free software; you can redistribute it and/or
9 #     modify it under the same terms as Perl itself.
10
11
12 package DB_File::HASHINFO ;
13
14 require 5.00404;
15
16 use warnings;
17 use strict;
18 use Carp;
19 require Tie::Hash;
20 @DB_File::HASHINFO::ISA = qw(Tie::Hash);
21
22 sub new
23 {
24     my $pkg = shift ;
25     my %x ;
26     tie %x, $pkg ;
27     bless \%x, $pkg ;
28 }
29
30
31 sub TIEHASH
32 {
33     my $pkg = shift ;
34
35     bless { VALID => { 
36                         bsize     => 1,
37                         ffactor   => 1,
38                         nelem     => 1,
39                         cachesize => 1,
40                         hash      => 2,
41                         lorder    => 1,
42                      }, 
43             GOT   => {}
44           }, $pkg ;
45 }
46
47
48 sub FETCH 
49 {  
50     my $self  = shift ;
51     my $key   = shift ;
52
53     return $self->{GOT}{$key} if exists $self->{VALID}{$key}  ;
54
55     my $pkg = ref $self ;
56     croak "${pkg}::FETCH - Unknown element '$key'" ;
57 }
58
59
60 sub STORE 
61 {
62     my $self  = shift ;
63     my $key   = shift ;
64     my $value = shift ;
65
66     my $type = $self->{VALID}{$key};
67
68     if ( $type )
69     {
70         croak "Key '$key' not associated with a code reference" 
71             if $type == 2 && !ref $value && ref $value ne 'CODE';
72         $self->{GOT}{$key} = $value ;
73         return ;
74     }
75     
76     my $pkg = ref $self ;
77     croak "${pkg}::STORE - Unknown element '$key'" ;
78 }
79
80 sub DELETE 
81 {
82     my $self = shift ;
83     my $key  = shift ;
84
85     if ( exists $self->{VALID}{$key} )
86     {
87         delete $self->{GOT}{$key} ;
88         return ;
89     }
90     
91     my $pkg = ref $self ;
92     croak "DB_File::HASHINFO::DELETE - Unknown element '$key'" ;
93 }
94
95 sub EXISTS
96 {
97     my $self = shift ;
98     my $key  = shift ;
99
100     exists $self->{VALID}{$key} ;
101 }
102
103 sub NotHere
104 {
105     my $self = shift ;
106     my $method = shift ;
107
108     croak ref($self) . " does not define the method ${method}" ;
109 }
110
111 sub FIRSTKEY { my $self = shift ; $self->NotHere("FIRSTKEY") }
112 sub NEXTKEY  { my $self = shift ; $self->NotHere("NEXTKEY") }
113 sub CLEAR    { my $self = shift ; $self->NotHere("CLEAR") }
114
115 package DB_File::RECNOINFO ;
116
117 use warnings;
118 use strict ;
119
120 @DB_File::RECNOINFO::ISA = qw(DB_File::HASHINFO) ;
121
122 sub TIEHASH
123 {
124     my $pkg = shift ;
125
126     bless { VALID => { map {$_, 1} 
127                        qw( bval cachesize psize flags lorder reclen bfname )
128                      },
129             GOT   => {},
130           }, $pkg ;
131 }
132
133 package DB_File::BTREEINFO ;
134
135 use warnings;
136 use strict ;
137
138 @DB_File::BTREEINFO::ISA = qw(DB_File::HASHINFO) ;
139
140 sub TIEHASH
141 {
142     my $pkg = shift ;
143
144     bless { VALID => { 
145                         flags      => 1,
146                         cachesize  => 1,
147                         maxkeypage => 1,
148                         minkeypage => 1,
149                         psize      => 1,
150                         compare    => 2,
151                         prefix     => 2,
152                         lorder     => 1,
153                      },
154             GOT   => {},
155           }, $pkg ;
156 }
157
158
159 package DB_File ;
160
161 use warnings;
162 use strict;
163 our ($VERSION, @ISA, @EXPORT, $AUTOLOAD, $DB_BTREE, $DB_HASH, $DB_RECNO);
164 our ($db_version, $use_XSLoader, $splice_end_array);
165 use Carp;
166
167
168 $VERSION = "1.809" ;
169
170 {
171     local $SIG{__WARN__} = sub {$splice_end_array = "@_";};
172     my @a =(1); splice(@a, 3);
173     $splice_end_array = 
174         ($splice_end_array =~ /^splice\(\) offset past end of array at /);
175 }      
176
177 #typedef enum { DB_BTREE, DB_HASH, DB_RECNO } DBTYPE;
178 $DB_BTREE = new DB_File::BTREEINFO ;
179 $DB_HASH  = new DB_File::HASHINFO ;
180 $DB_RECNO = new DB_File::RECNOINFO ;
181
182 require Tie::Hash;
183 require Exporter;
184 use AutoLoader;
185 BEGIN {
186     $use_XSLoader = 1 ;
187     { local $SIG{__DIE__} ; eval { require XSLoader } ; }
188
189     if ($@) {
190         $use_XSLoader = 0 ;
191         require DynaLoader;
192         @ISA = qw(DynaLoader);
193     }
194 }
195
196 push @ISA, qw(Tie::Hash Exporter);
197 @EXPORT = qw(
198         $DB_BTREE $DB_HASH $DB_RECNO 
199
200         BTREEMAGIC
201         BTREEVERSION
202         DB_LOCK
203         DB_SHMEM
204         DB_TXN
205         HASHMAGIC
206         HASHVERSION
207         MAX_PAGE_NUMBER
208         MAX_PAGE_OFFSET
209         MAX_REC_NUMBER
210         RET_ERROR
211         RET_SPECIAL
212         RET_SUCCESS
213         R_CURSOR
214         R_DUP
215         R_FIRST
216         R_FIXEDLEN
217         R_IAFTER
218         R_IBEFORE
219         R_LAST
220         R_NEXT
221         R_NOKEY
222         R_NOOVERWRITE
223         R_PREV
224         R_RECNOSYNC
225         R_SETCURSOR
226         R_SNAPSHOT
227         __R_UNUSED
228
229 );
230
231 sub AUTOLOAD {
232     my($constname);
233     ($constname = $AUTOLOAD) =~ s/.*:://;
234     my ($error, $val) = constant($constname);
235     Carp::croak $error if $error;
236     no strict 'refs';
237     *{$AUTOLOAD} = sub { $val };
238     goto &{$AUTOLOAD};
239 }           
240
241
242 eval {
243     # Make all Fcntl O_XXX constants available for importing
244     require Fcntl;
245     my @O = grep /^O_/, @Fcntl::EXPORT;
246     Fcntl->import(@O);  # first we import what we want to export
247     push(@EXPORT, @O);
248 };
249
250 if ($use_XSLoader)
251   { XSLoader::load("DB_File", $VERSION)}
252 else
253   { bootstrap DB_File $VERSION }
254
255 # Preloaded methods go here.  Autoload methods go after __END__, and are
256 # processed by the autosplit program.
257
258 sub tie_hash_or_array
259 {
260     my (@arg) = @_ ;
261     my $tieHASH = ( (caller(1))[3] =~ /TIEHASH/ ) ;
262
263     $arg[4] = tied %{ $arg[4] } 
264         if @arg >= 5 && ref $arg[4] && $arg[4] =~ /=HASH/ && tied %{ $arg[4] } ;
265
266     $arg[2] = O_CREAT()|O_RDWR() if @arg >=3 && ! defined $arg[2];
267     $arg[3] = 0666               if @arg >=4 && ! defined $arg[3];
268
269     # make recno in Berkeley DB version 2 (or better) work like 
270     # recno in version 1.
271     if ($db_version > 1 and defined $arg[4] and $arg[4] =~ /RECNO/ and 
272         $arg[1] and ! -e $arg[1]) {
273         open(FH, ">$arg[1]") or return undef ;
274         close FH ;
275         chmod $arg[3] ? $arg[3] : 0666 , $arg[1] ;
276     }
277
278     DoTie_($tieHASH, @arg) ;
279 }
280
281 sub TIEHASH
282 {
283     tie_hash_or_array(@_) ;
284 }
285
286 sub TIEARRAY
287 {
288     tie_hash_or_array(@_) ;
289 }
290
291 sub CLEAR 
292 {
293     my $self = shift;
294     my $key = 0 ;
295     my $value = "" ;
296     my $status = $self->seq($key, $value, R_FIRST());
297     my @keys;
298  
299     while ($status == 0) {
300         push @keys, $key;
301         $status = $self->seq($key, $value, R_NEXT());
302     }
303     foreach $key (reverse @keys) {
304         my $s = $self->del($key); 
305     }
306 }
307
308 sub EXTEND { }
309
310 sub STORESIZE
311 {
312     my $self = shift;
313     my $length = shift ;
314     my $current_length = $self->length() ;
315
316     if ($length < $current_length) {
317         my $key ;
318         for ($key = $current_length - 1 ; $key >= $length ; -- $key)
319           { $self->del($key) }
320     }
321     elsif ($length > $current_length) {
322         $self->put($length-1, "") ;
323     }
324 }
325  
326
327 sub SPLICE
328 {
329     my $self = shift;
330     my $offset = shift;
331     if (not defined $offset) {
332         warnings::warnif('uninitialized', 'Use of uninitialized value in splice');
333         $offset = 0;
334     }
335
336     my $length = @_ ? shift : 0;
337     # Carping about definedness comes _after_ the OFFSET sanity check.
338     # This is so we get the same error messages as Perl's splice().
339     # 
340
341     my @list = @_;
342
343     my $size = $self->FETCHSIZE();
344     
345     # 'If OFFSET is negative then it start that far from the end of
346     # the array.'
347     # 
348     if ($offset < 0) {
349         my $new_offset = $size + $offset;
350         if ($new_offset < 0) {
351             die "Modification of non-creatable array value attempted, "
352               . "subscript $offset";
353         }
354         $offset = $new_offset;
355     }
356
357     if (not defined $length) {
358         warnings::warnif('uninitialized', 'Use of uninitialized value in splice');
359         $length = 0;
360     }
361
362     if ($offset > $size) {
363         $offset = $size;
364         warnings::warnif('misc', 'splice() offset past end of array')
365             if $splice_end_array;
366     }
367
368     # 'If LENGTH is omitted, removes everything from OFFSET onward.'
369     if (not defined $length) {
370         $length = $size - $offset;
371     }
372
373     # 'If LENGTH is negative, leave that many elements off the end of
374     # the array.'
375     # 
376     if ($length < 0) {
377         $length = $size - $offset + $length;
378
379         if ($length < 0) {
380             # The user must have specified a length bigger than the
381             # length of the array passed in.  But perl's splice()
382             # doesn't catch this, it just behaves as for length=0.
383             # 
384             $length = 0;
385         }
386     }
387
388     if ($length > $size - $offset) {
389         $length = $size - $offset;
390     }
391
392     # $num_elems holds the current number of elements in the database.
393     my $num_elems = $size;
394
395     # 'Removes the elements designated by OFFSET and LENGTH from an
396     # array,'...
397     # 
398     my @removed = ();
399     foreach (0 .. $length - 1) {
400         my $old;
401         my $status = $self->get($offset, $old);
402         if ($status != 0) {
403             my $msg = "error from Berkeley DB on get($offset, \$old)";
404             if ($status == 1) {
405                 $msg .= ' (no such element?)';
406             }
407             else {
408                 $msg .= ": error status $status";
409                 if (defined $! and $! ne '') {
410                     $msg .= ", message $!";
411                 }
412             }
413             die $msg;
414         }
415         push @removed, $old;
416
417         $status = $self->del($offset);
418         if ($status != 0) {
419             my $msg = "error from Berkeley DB on del($offset)";
420             if ($status == 1) {
421                 $msg .= ' (no such element?)';
422             }
423             else {
424                 $msg .= ": error status $status";
425                 if (defined $! and $! ne '') {
426                     $msg .= ", message $!";
427                 }
428             }
429             die $msg;
430         }
431
432         -- $num_elems;
433     }
434
435     # ...'and replaces them with the elements of LIST, if any.'
436     my $pos = $offset;
437     while (defined (my $elem = shift @list)) {
438         my $old_pos = $pos;
439         my $status;
440         if ($pos >= $num_elems) {
441             $status = $self->put($pos, $elem);
442         }
443         else {
444             $status = $self->put($pos, $elem, $self->R_IBEFORE);
445         }
446
447         if ($status != 0) {
448             my $msg = "error from Berkeley DB on put($pos, $elem, ...)";
449             if ($status == 1) {
450                 $msg .= ' (no such element?)';
451             }
452             else {
453                 $msg .= ", error status $status";
454                 if (defined $! and $! ne '') {
455                     $msg .= ", message $!";
456                 }
457             }
458             die $msg;
459         }
460
461         die "pos unexpectedly changed from $old_pos to $pos with R_IBEFORE"
462           if $old_pos != $pos;
463
464         ++ $pos;
465         ++ $num_elems;
466     }
467
468     if (wantarray) {
469         # 'In list context, returns the elements removed from the
470         # array.'
471         # 
472         return @removed;
473     }
474     elsif (defined wantarray and not wantarray) {
475         # 'In scalar context, returns the last element removed, or
476         # undef if no elements are removed.'
477         # 
478         if (@removed) {
479             my $last = pop @removed;
480             return "$last";
481         }
482         else {
483             return undef;
484         }
485     }
486     elsif (not defined wantarray) {
487         # Void context
488     }
489     else { die }
490 }
491 sub ::DB_File::splice { &SPLICE }
492
493 sub find_dup
494 {
495     croak "Usage: \$db->find_dup(key,value)\n"
496         unless @_ == 3 ;
497  
498     my $db        = shift ;
499     my ($origkey, $value_wanted) = @_ ;
500     my ($key, $value) = ($origkey, 0);
501     my ($status) = 0 ;
502
503     for ($status = $db->seq($key, $value, R_CURSOR() ) ;
504          $status == 0 ;
505          $status = $db->seq($key, $value, R_NEXT() ) ) {
506
507         return 0 if $key eq $origkey and $value eq $value_wanted ;
508     }
509
510     return $status ;
511 }
512
513 sub del_dup
514 {
515     croak "Usage: \$db->del_dup(key,value)\n"
516         unless @_ == 3 ;
517  
518     my $db        = shift ;
519     my ($key, $value) = @_ ;
520     my ($status) = $db->find_dup($key, $value) ;
521     return $status if $status != 0 ;
522
523     $status = $db->del($key, R_CURSOR() ) ;
524     return $status ;
525 }
526
527 sub get_dup
528 {
529     croak "Usage: \$db->get_dup(key [,flag])\n"
530         unless @_ == 2 or @_ == 3 ;
531  
532     my $db        = shift ;
533     my $key       = shift ;
534     my $flag      = shift ;
535     my $value     = 0 ;
536     my $origkey   = $key ;
537     my $wantarray = wantarray ;
538     my %values    = () ;
539     my @values    = () ;
540     my $counter   = 0 ;
541     my $status    = 0 ;
542  
543     # iterate through the database until either EOF ($status == 0)
544     # or a different key is encountered ($key ne $origkey).
545     for ($status = $db->seq($key, $value, R_CURSOR()) ;
546          $status == 0 and $key eq $origkey ;
547          $status = $db->seq($key, $value, R_NEXT()) ) {
548  
549         # save the value or count number of matches
550         if ($wantarray) {
551             if ($flag)
552                 { ++ $values{$value} }
553             else
554                 { push (@values, $value) }
555         }
556         else
557             { ++ $counter }
558      
559     }
560  
561     return ($wantarray ? ($flag ? %values : @values) : $counter) ;
562 }
563
564
565 1;
566 __END__
567
568 =head1 NAME
569
570 DB_File - Perl5 access to Berkeley DB version 1.x
571
572 =head1 SYNOPSIS
573
574  use DB_File;
575
576  [$X =] tie %hash,  'DB_File', [$filename, $flags, $mode, $DB_HASH] ;
577  [$X =] tie %hash,  'DB_File', $filename, $flags, $mode, $DB_BTREE ;
578  [$X =] tie @array, 'DB_File', $filename, $flags, $mode, $DB_RECNO ;
579
580  $status = $X->del($key [, $flags]) ;
581  $status = $X->put($key, $value [, $flags]) ;
582  $status = $X->get($key, $value [, $flags]) ;
583  $status = $X->seq($key, $value, $flags) ;
584  $status = $X->sync([$flags]) ;
585  $status = $X->fd ;
586
587  # BTREE only
588  $count = $X->get_dup($key) ;
589  @list  = $X->get_dup($key) ;
590  %list  = $X->get_dup($key, 1) ;
591  $status = $X->find_dup($key, $value) ;
592  $status = $X->del_dup($key, $value) ;
593
594  # RECNO only
595  $a = $X->length;
596  $a = $X->pop ;
597  $X->push(list);
598  $a = $X->shift;
599  $X->unshift(list);
600  @r = $X->splice(offset, length, elements);
601
602  # DBM Filters
603  $old_filter = $db->filter_store_key  ( sub { ... } ) ;
604  $old_filter = $db->filter_store_value( sub { ... } ) ;
605  $old_filter = $db->filter_fetch_key  ( sub { ... } ) ;
606  $old_filter = $db->filter_fetch_value( sub { ... } ) ;
607
608  untie %hash ;
609  untie @array ;
610
611 =head1 DESCRIPTION
612
613 B<DB_File> is a module which allows Perl programs to make use of the
614 facilities provided by Berkeley DB version 1.x (if you have a newer
615 version of DB, see L<Using DB_File with Berkeley DB version 2 or greater>).
616 It is assumed that you have a copy of the Berkeley DB manual pages at
617 hand when reading this documentation. The interface defined here
618 mirrors the Berkeley DB interface closely.
619
620 Berkeley DB is a C library which provides a consistent interface to a
621 number of database formats.  B<DB_File> provides an interface to all
622 three of the database types currently supported by Berkeley DB.
623
624 The file types are:
625
626 =over 5
627
628 =item B<DB_HASH>
629
630 This database type allows arbitrary key/value pairs to be stored in data
631 files. This is equivalent to the functionality provided by other
632 hashing packages like DBM, NDBM, ODBM, GDBM, and SDBM. Remember though,
633 the files created using DB_HASH are not compatible with any of the
634 other packages mentioned.
635
636 A default hashing algorithm, which will be adequate for most
637 applications, is built into Berkeley DB. If you do need to use your own
638 hashing algorithm it is possible to write your own in Perl and have
639 B<DB_File> use it instead.
640
641 =item B<DB_BTREE>
642
643 The btree format allows arbitrary key/value pairs to be stored in a
644 sorted, balanced binary tree.
645
646 As with the DB_HASH format, it is possible to provide a user defined
647 Perl routine to perform the comparison of keys. By default, though, the
648 keys are stored in lexical order.
649
650 =item B<DB_RECNO>
651
652 DB_RECNO allows both fixed-length and variable-length flat text files
653 to be manipulated using the same key/value pair interface as in DB_HASH
654 and DB_BTREE.  In this case the key will consist of a record (line)
655 number.
656
657 =back
658
659 =head2 Using DB_File with Berkeley DB version 2 or greater
660
661 Although B<DB_File> is intended to be used with Berkeley DB version 1,
662 it can also be used with version 2, 3 or 4. In this case the interface is
663 limited to the functionality provided by Berkeley DB 1.x. Anywhere the
664 version 2 or greater interface differs, B<DB_File> arranges for it to work
665 like version 1. This feature allows B<DB_File> scripts that were built
666 with version 1 to be migrated to version 2 or greater without any changes.
667
668 If you want to make use of the new features available in Berkeley DB
669 2.x or greater, use the Perl module B<BerkeleyDB> instead.
670
671 B<Note:> The database file format has changed multiple times in Berkeley
672 DB version 2, 3 and 4. If you cannot recreate your databases, you
673 must dump any existing databases with either the C<db_dump> or the
674 C<db_dump185> utility that comes with Berkeley DB.
675 Once you have rebuilt DB_File to use Berkeley DB version 2 or greater,
676 your databases can be recreated using C<db_load>. Refer to the Berkeley DB
677 documentation for further details.
678
679 Please read L<"COPYRIGHT"> before using version 2.x or greater of Berkeley
680 DB with DB_File.
681
682 =head2 Interface to Berkeley DB
683
684 B<DB_File> allows access to Berkeley DB files using the tie() mechanism
685 in Perl 5 (for full details, see L<perlfunc/tie()>). This facility
686 allows B<DB_File> to access Berkeley DB files using either an
687 associative array (for DB_HASH & DB_BTREE file types) or an ordinary
688 array (for the DB_RECNO file type).
689
690 In addition to the tie() interface, it is also possible to access most
691 of the functions provided in the Berkeley DB API directly.
692 See L<THE API INTERFACE>.
693
694 =head2 Opening a Berkeley DB Database File
695
696 Berkeley DB uses the function dbopen() to open or create a database.
697 Here is the C prototype for dbopen():
698
699       DB*
700       dbopen (const char * file, int flags, int mode, 
701               DBTYPE type, const void * openinfo)
702
703 The parameter C<type> is an enumeration which specifies which of the 3
704 interface methods (DB_HASH, DB_BTREE or DB_RECNO) is to be used.
705 Depending on which of these is actually chosen, the final parameter,
706 I<openinfo> points to a data structure which allows tailoring of the
707 specific interface method.
708
709 This interface is handled slightly differently in B<DB_File>. Here is
710 an equivalent call using B<DB_File>:
711
712         tie %array, 'DB_File', $filename, $flags, $mode, $DB_HASH ;
713
714 The C<filename>, C<flags> and C<mode> parameters are the direct
715 equivalent of their dbopen() counterparts. The final parameter $DB_HASH
716 performs the function of both the C<type> and C<openinfo> parameters in
717 dbopen().
718
719 In the example above $DB_HASH is actually a pre-defined reference to a
720 hash object. B<DB_File> has three of these pre-defined references.
721 Apart from $DB_HASH, there is also $DB_BTREE and $DB_RECNO.
722
723 The keys allowed in each of these pre-defined references is limited to
724 the names used in the equivalent C structure. So, for example, the
725 $DB_HASH reference will only allow keys called C<bsize>, C<cachesize>,
726 C<ffactor>, C<hash>, C<lorder> and C<nelem>. 
727
728 To change one of these elements, just assign to it like this:
729
730         $DB_HASH->{'cachesize'} = 10000 ;
731
732 The three predefined variables $DB_HASH, $DB_BTREE and $DB_RECNO are
733 usually adequate for most applications.  If you do need to create extra
734 instances of these objects, constructors are available for each file
735 type.
736
737 Here are examples of the constructors and the valid options available
738 for DB_HASH, DB_BTREE and DB_RECNO respectively.
739
740      $a = new DB_File::HASHINFO ;
741      $a->{'bsize'} ;
742      $a->{'cachesize'} ;
743      $a->{'ffactor'};
744      $a->{'hash'} ;
745      $a->{'lorder'} ;
746      $a->{'nelem'} ;
747
748      $b = new DB_File::BTREEINFO ;
749      $b->{'flags'} ;
750      $b->{'cachesize'} ;
751      $b->{'maxkeypage'} ;
752      $b->{'minkeypage'} ;
753      $b->{'psize'} ;
754      $b->{'compare'} ;
755      $b->{'prefix'} ;
756      $b->{'lorder'} ;
757
758      $c = new DB_File::RECNOINFO ;
759      $c->{'bval'} ;
760      $c->{'cachesize'} ;
761      $c->{'psize'} ;
762      $c->{'flags'} ;
763      $c->{'lorder'} ;
764      $c->{'reclen'} ;
765      $c->{'bfname'} ;
766
767 The values stored in the hashes above are mostly the direct equivalent
768 of their C counterpart. Like their C counterparts, all are set to a
769 default values - that means you don't have to set I<all> of the
770 values when you only want to change one. Here is an example:
771
772      $a = new DB_File::HASHINFO ;
773      $a->{'cachesize'} =  12345 ;
774      tie %y, 'DB_File', "filename", $flags, 0777, $a ;
775
776 A few of the options need extra discussion here. When used, the C
777 equivalent of the keys C<hash>, C<compare> and C<prefix> store pointers
778 to C functions. In B<DB_File> these keys are used to store references
779 to Perl subs. Below are templates for each of the subs:
780
781     sub hash
782     {
783         my ($data) = @_ ;
784         ...
785         # return the hash value for $data
786         return $hash ;
787     }
788
789     sub compare
790     {
791         my ($key, $key2) = @_ ;
792         ...
793         # return  0 if $key1 eq $key2
794         #        -1 if $key1 lt $key2
795         #         1 if $key1 gt $key2
796         return (-1 , 0 or 1) ;
797     }
798
799     sub prefix
800     {
801         my ($key, $key2) = @_ ;
802         ...
803         # return number of bytes of $key2 which are 
804         # necessary to determine that it is greater than $key1
805         return $bytes ;
806     }
807
808 See L<Changing the BTREE sort order> for an example of using the
809 C<compare> template.
810
811 If you are using the DB_RECNO interface and you intend making use of
812 C<bval>, you should check out L<The 'bval' Option>.
813
814 =head2 Default Parameters
815
816 It is possible to omit some or all of the final 4 parameters in the
817 call to C<tie> and let them take default values. As DB_HASH is the most
818 common file format used, the call:
819
820     tie %A, "DB_File", "filename" ;
821
822 is equivalent to:
823
824     tie %A, "DB_File", "filename", O_CREAT|O_RDWR, 0666, $DB_HASH ;
825
826 It is also possible to omit the filename parameter as well, so the
827 call:
828
829     tie %A, "DB_File" ;
830
831 is equivalent to:
832
833     tie %A, "DB_File", undef, O_CREAT|O_RDWR, 0666, $DB_HASH ;
834
835 See L<In Memory Databases> for a discussion on the use of C<undef>
836 in place of a filename.
837
838 =head2 In Memory Databases
839
840 Berkeley DB allows the creation of in-memory databases by using NULL
841 (that is, a C<(char *)0> in C) in place of the filename.  B<DB_File>
842 uses C<undef> instead of NULL to provide this functionality.
843
844 =head1 DB_HASH
845
846 The DB_HASH file format is probably the most commonly used of the three
847 file formats that B<DB_File> supports. It is also very straightforward
848 to use.
849
850 =head2 A Simple Example
851
852 This example shows how to create a database, add key/value pairs to the
853 database, delete keys/value pairs and finally how to enumerate the
854 contents of the database.
855
856     use warnings ;
857     use strict ;
858     use DB_File ;
859     our (%h, $k, $v) ;
860
861     unlink "fruit" ;
862     tie %h, "DB_File", "fruit", O_RDWR|O_CREAT, 0666, $DB_HASH 
863         or die "Cannot open file 'fruit': $!\n";
864
865     # Add a few key/value pairs to the file
866     $h{"apple"} = "red" ;
867     $h{"orange"} = "orange" ;
868     $h{"banana"} = "yellow" ;
869     $h{"tomato"} = "red" ;
870
871     # Check for existence of a key
872     print "Banana Exists\n\n" if $h{"banana"} ;
873
874     # Delete a key/value pair.
875     delete $h{"apple"} ;
876
877     # print the contents of the file
878     while (($k, $v) = each %h)
879       { print "$k -> $v\n" }
880
881     untie %h ;
882
883 here is the output:
884
885     Banana Exists
886
887     orange -> orange
888     tomato -> red
889     banana -> yellow
890
891 Note that the like ordinary associative arrays, the order of the keys
892 retrieved is in an apparently random order.
893
894 =head1 DB_BTREE
895
896 The DB_BTREE format is useful when you want to store data in a given
897 order. By default the keys will be stored in lexical order, but as you
898 will see from the example shown in the next section, it is very easy to
899 define your own sorting function.
900
901 =head2 Changing the BTREE sort order
902
903 This script shows how to override the default sorting algorithm that
904 BTREE uses. Instead of using the normal lexical ordering, a case
905 insensitive compare function will be used.
906
907     use warnings ;
908     use strict ;
909     use DB_File ;
910
911     my %h ;
912
913     sub Compare
914     {
915         my ($key1, $key2) = @_ ;
916         "\L$key1" cmp "\L$key2" ;
917     }
918
919     # specify the Perl sub that will do the comparison
920     $DB_BTREE->{'compare'} = \&Compare ;
921
922     unlink "tree" ;
923     tie %h, "DB_File", "tree", O_RDWR|O_CREAT, 0666, $DB_BTREE 
924         or die "Cannot open file 'tree': $!\n" ;
925
926     # Add a key/value pair to the file
927     $h{'Wall'} = 'Larry' ;
928     $h{'Smith'} = 'John' ;
929     $h{'mouse'} = 'mickey' ;
930     $h{'duck'}  = 'donald' ;
931
932     # Delete
933     delete $h{"duck"} ;
934
935     # Cycle through the keys printing them in order.
936     # Note it is not necessary to sort the keys as
937     # the btree will have kept them in order automatically.
938     foreach (keys %h)
939       { print "$_\n" }
940
941     untie %h ;
942
943 Here is the output from the code above.
944
945     mouse
946     Smith
947     Wall
948
949 There are a few point to bear in mind if you want to change the
950 ordering in a BTREE database:
951
952 =over 5
953
954 =item 1.
955
956 The new compare function must be specified when you create the database.
957
958 =item 2.
959
960 You cannot change the ordering once the database has been created. Thus
961 you must use the same compare function every time you access the
962 database.
963
964 =item 3
965
966 Duplicate keys are entirely defined by the comparison function.
967 In the case-insensitive example above, the keys: 'KEY' and 'key'
968 would be considered duplicates, and assigning to the second one
969 would overwrite the first. If duplicates are allowed for (with the
970 R_DUP flag discussed below), only a single copy of duplicate keys
971 is stored in the database --- so (again with example above) assigning
972 three values to the keys: 'KEY', 'Key', and 'key' would leave just
973 the first key: 'KEY' in the database with three values. For some
974 situations this results in information loss, so care should be taken
975 to provide fully qualified comparison functions when necessary.
976 For example, the above comparison routine could be modified to
977 additionally compare case-sensitively if two keys are equal in the
978 case insensitive comparison:
979
980     sub compare {
981         my($key1, $key2) = @_;
982         lc $key1 cmp lc $key2 ||
983         $key1 cmp $key2;
984     }
985
986 And now you will only have duplicates when the keys themselves
987 are truly the same. (note: in versions of the db library prior to
988 about November 1996, such duplicate keys were retained so it was
989 possible to recover the original keys in sets of keys that
990 compared as equal).
991
992
993 =back 
994
995 =head2 Handling Duplicate Keys 
996
997 The BTREE file type optionally allows a single key to be associated
998 with an arbitrary number of values. This option is enabled by setting
999 the flags element of C<$DB_BTREE> to R_DUP when creating the database.
1000
1001 There are some difficulties in using the tied hash interface if you
1002 want to manipulate a BTREE database with duplicate keys. Consider this
1003 code:
1004
1005     use warnings ;
1006     use strict ;
1007     use DB_File ;
1008
1009     my ($filename, %h) ;
1010
1011     $filename = "tree" ;
1012     unlink $filename ;
1013
1014     # Enable duplicate records
1015     $DB_BTREE->{'flags'} = R_DUP ;
1016
1017     tie %h, "DB_File", $filename, O_RDWR|O_CREAT, 0666, $DB_BTREE 
1018         or die "Cannot open $filename: $!\n";
1019
1020     # Add some key/value pairs to the file
1021     $h{'Wall'} = 'Larry' ;
1022     $h{'Wall'} = 'Brick' ; # Note the duplicate key
1023     $h{'Wall'} = 'Brick' ; # Note the duplicate key and value
1024     $h{'Smith'} = 'John' ;
1025     $h{'mouse'} = 'mickey' ;
1026
1027     # iterate through the associative array
1028     # and print each key/value pair.
1029     foreach (sort keys %h)
1030       { print "$_  -> $h{$_}\n" }
1031
1032     untie %h ;
1033
1034 Here is the output:
1035
1036     Smith   -> John
1037     Wall    -> Larry
1038     Wall    -> Larry
1039     Wall    -> Larry
1040     mouse   -> mickey
1041
1042 As you can see 3 records have been successfully created with key C<Wall>
1043 - the only thing is, when they are retrieved from the database they
1044 I<seem> to have the same value, namely C<Larry>. The problem is caused
1045 by the way that the associative array interface works. Basically, when
1046 the associative array interface is used to fetch the value associated
1047 with a given key, it will only ever retrieve the first value.
1048
1049 Although it may not be immediately obvious from the code above, the
1050 associative array interface can be used to write values with duplicate
1051 keys, but it cannot be used to read them back from the database.
1052
1053 The way to get around this problem is to use the Berkeley DB API method
1054 called C<seq>.  This method allows sequential access to key/value
1055 pairs. See L<THE API INTERFACE> for details of both the C<seq> method
1056 and the API in general.
1057
1058 Here is the script above rewritten using the C<seq> API method.
1059
1060     use warnings ;
1061     use strict ;
1062     use DB_File ;
1063
1064     my ($filename, $x, %h, $status, $key, $value) ;
1065
1066     $filename = "tree" ;
1067     unlink $filename ;
1068
1069     # Enable duplicate records
1070     $DB_BTREE->{'flags'} = R_DUP ;
1071
1072     $x = tie %h, "DB_File", $filename, O_RDWR|O_CREAT, 0666, $DB_BTREE 
1073         or die "Cannot open $filename: $!\n";
1074
1075     # Add some key/value pairs to the file
1076     $h{'Wall'} = 'Larry' ;
1077     $h{'Wall'} = 'Brick' ; # Note the duplicate key
1078     $h{'Wall'} = 'Brick' ; # Note the duplicate key and value
1079     $h{'Smith'} = 'John' ;
1080     $h{'mouse'} = 'mickey' ;
1081
1082     # iterate through the btree using seq
1083     # and print each key/value pair.
1084     $key = $value = 0 ;
1085     for ($status = $x->seq($key, $value, R_FIRST) ;
1086          $status == 0 ;
1087          $status = $x->seq($key, $value, R_NEXT) )
1088       {  print "$key -> $value\n" }
1089
1090     undef $x ;
1091     untie %h ;
1092
1093 that prints:
1094
1095     Smith   -> John
1096     Wall    -> Brick
1097     Wall    -> Brick
1098     Wall    -> Larry
1099     mouse   -> mickey
1100
1101 This time we have got all the key/value pairs, including the multiple
1102 values associated with the key C<Wall>.
1103
1104 To make life easier when dealing with duplicate keys, B<DB_File> comes with 
1105 a few utility methods.
1106
1107 =head2 The get_dup() Method
1108
1109 The C<get_dup> method assists in
1110 reading duplicate values from BTREE databases. The method can take the
1111 following forms:
1112
1113     $count = $x->get_dup($key) ;
1114     @list  = $x->get_dup($key) ;
1115     %list  = $x->get_dup($key, 1) ;
1116
1117 In a scalar context the method returns the number of values associated
1118 with the key, C<$key>.
1119
1120 In list context, it returns all the values which match C<$key>. Note
1121 that the values will be returned in an apparently random order.
1122
1123 In list context, if the second parameter is present and evaluates
1124 TRUE, the method returns an associative array. The keys of the
1125 associative array correspond to the values that matched in the BTREE
1126 and the values of the array are a count of the number of times that
1127 particular value occurred in the BTREE.
1128
1129 So assuming the database created above, we can use C<get_dup> like
1130 this:
1131
1132     use warnings ;
1133     use strict ;
1134     use DB_File ;
1135
1136     my ($filename, $x, %h) ;
1137
1138     $filename = "tree" ;
1139
1140     # Enable duplicate records
1141     $DB_BTREE->{'flags'} = R_DUP ;
1142
1143     $x = tie %h, "DB_File", $filename, O_RDWR|O_CREAT, 0666, $DB_BTREE 
1144         or die "Cannot open $filename: $!\n";
1145
1146     my $cnt  = $x->get_dup("Wall") ;
1147     print "Wall occurred $cnt times\n" ;
1148
1149     my %hash = $x->get_dup("Wall", 1) ;
1150     print "Larry is there\n" if $hash{'Larry'} ;
1151     print "There are $hash{'Brick'} Brick Walls\n" ;
1152
1153     my @list = sort $x->get_dup("Wall") ;
1154     print "Wall =>      [@list]\n" ;
1155
1156     @list = $x->get_dup("Smith") ;
1157     print "Smith =>     [@list]\n" ;
1158
1159     @list = $x->get_dup("Dog") ;
1160     print "Dog =>       [@list]\n" ;
1161
1162
1163 and it will print:
1164
1165     Wall occurred 3 times
1166     Larry is there
1167     There are 2 Brick Walls
1168     Wall =>     [Brick Brick Larry]
1169     Smith =>    [John]
1170     Dog =>      []
1171
1172 =head2 The find_dup() Method
1173
1174     $status = $X->find_dup($key, $value) ;
1175
1176 This method checks for the existence of a specific key/value pair. If the
1177 pair exists, the cursor is left pointing to the pair and the method 
1178 returns 0. Otherwise the method returns a non-zero value.
1179
1180 Assuming the database from the previous example:
1181
1182     use warnings ;
1183     use strict ;
1184     use DB_File ;
1185
1186     my ($filename, $x, %h, $found) ;
1187
1188     $filename = "tree" ;
1189
1190     # Enable duplicate records
1191     $DB_BTREE->{'flags'} = R_DUP ;
1192
1193     $x = tie %h, "DB_File", $filename, O_RDWR|O_CREAT, 0666, $DB_BTREE 
1194         or die "Cannot open $filename: $!\n";
1195
1196     $found = ( $x->find_dup("Wall", "Larry") == 0 ? "" : "not") ; 
1197     print "Larry Wall is $found there\n" ;
1198
1199     $found = ( $x->find_dup("Wall", "Harry") == 0 ? "" : "not") ; 
1200     print "Harry Wall is $found there\n" ;
1201
1202     undef $x ;
1203     untie %h ;
1204
1205 prints this
1206
1207     Larry Wall is  there
1208     Harry Wall is not there
1209
1210
1211 =head2 The del_dup() Method
1212
1213     $status = $X->del_dup($key, $value) ;
1214
1215 This method deletes a specific key/value pair. It returns
1216 0 if they exist and have been deleted successfully.
1217 Otherwise the method returns a non-zero value.
1218
1219 Again assuming the existence of the C<tree> database
1220
1221     use warnings ;
1222     use strict ;
1223     use DB_File ;
1224
1225     my ($filename, $x, %h, $found) ;
1226
1227     $filename = "tree" ;
1228
1229     # Enable duplicate records
1230     $DB_BTREE->{'flags'} = R_DUP ;
1231
1232     $x = tie %h, "DB_File", $filename, O_RDWR|O_CREAT, 0666, $DB_BTREE 
1233         or die "Cannot open $filename: $!\n";
1234
1235     $x->del_dup("Wall", "Larry") ;
1236
1237     $found = ( $x->find_dup("Wall", "Larry") == 0 ? "" : "not") ; 
1238     print "Larry Wall is $found there\n" ;
1239
1240     undef $x ;
1241     untie %h ;
1242
1243 prints this
1244
1245     Larry Wall is not there
1246
1247 =head2 Matching Partial Keys 
1248
1249 The BTREE interface has a feature which allows partial keys to be
1250 matched. This functionality is I<only> available when the C<seq> method
1251 is used along with the R_CURSOR flag.
1252
1253     $x->seq($key, $value, R_CURSOR) ;
1254
1255 Here is the relevant quote from the dbopen man page where it defines
1256 the use of the R_CURSOR flag with seq:
1257
1258     Note, for the DB_BTREE access method, the returned key is not
1259     necessarily an exact match for the specified key. The returned key
1260     is the smallest key greater than or equal to the specified key,
1261     permitting partial key matches and range searches.
1262
1263 In the example script below, the C<match> sub uses this feature to find
1264 and print the first matching key/value pair given a partial key.
1265
1266     use warnings ;
1267     use strict ;
1268     use DB_File ;
1269     use Fcntl ;
1270
1271     my ($filename, $x, %h, $st, $key, $value) ;
1272
1273     sub match
1274     {
1275         my $key = shift ;
1276         my $value = 0;
1277         my $orig_key = $key ;
1278         $x->seq($key, $value, R_CURSOR) ;
1279         print "$orig_key\t-> $key\t-> $value\n" ;
1280     }
1281
1282     $filename = "tree" ;
1283     unlink $filename ;
1284
1285     $x = tie %h, "DB_File", $filename, O_RDWR|O_CREAT, 0666, $DB_BTREE
1286         or die "Cannot open $filename: $!\n";
1287
1288     # Add some key/value pairs to the file
1289     $h{'mouse'} = 'mickey' ;
1290     $h{'Wall'} = 'Larry' ;
1291     $h{'Walls'} = 'Brick' ; 
1292     $h{'Smith'} = 'John' ;
1293
1294
1295     $key = $value = 0 ;
1296     print "IN ORDER\n" ;
1297     for ($st = $x->seq($key, $value, R_FIRST) ;
1298          $st == 0 ;
1299          $st = $x->seq($key, $value, R_NEXT) )
1300
1301       {  print "$key    -> $value\n" }
1302
1303     print "\nPARTIAL MATCH\n" ;
1304
1305     match "Wa" ;
1306     match "A" ;
1307     match "a" ;
1308
1309     undef $x ;
1310     untie %h ;
1311
1312 Here is the output:
1313
1314     IN ORDER
1315     Smith -> John
1316     Wall  -> Larry
1317     Walls -> Brick
1318     mouse -> mickey
1319
1320     PARTIAL MATCH
1321     Wa -> Wall  -> Larry
1322     A  -> Smith -> John
1323     a  -> mouse -> mickey
1324
1325 =head1 DB_RECNO
1326
1327 DB_RECNO provides an interface to flat text files. Both variable and
1328 fixed length records are supported.
1329
1330 In order to make RECNO more compatible with Perl, the array offset for
1331 all RECNO arrays begins at 0 rather than 1 as in Berkeley DB.
1332
1333 As with normal Perl arrays, a RECNO array can be accessed using
1334 negative indexes. The index -1 refers to the last element of the array,
1335 -2 the second last, and so on. Attempting to access an element before
1336 the start of the array will raise a fatal run-time error.
1337
1338 =head2 The 'bval' Option
1339
1340 The operation of the bval option warrants some discussion. Here is the
1341 definition of bval from the Berkeley DB 1.85 recno manual page:
1342
1343     The delimiting byte to be used to mark  the  end  of  a
1344     record for variable-length records, and the pad charac-
1345     ter for fixed-length records.  If no  value  is  speci-
1346     fied,  newlines  (``\n'')  are  used to mark the end of
1347     variable-length records and  fixed-length  records  are
1348     padded with spaces.
1349
1350 The second sentence is wrong. In actual fact bval will only default to
1351 C<"\n"> when the openinfo parameter in dbopen is NULL. If a non-NULL
1352 openinfo parameter is used at all, the value that happens to be in bval
1353 will be used. That means you always have to specify bval when making
1354 use of any of the options in the openinfo parameter. This documentation
1355 error will be fixed in the next release of Berkeley DB.
1356
1357 That clarifies the situation with regards Berkeley DB itself. What
1358 about B<DB_File>? Well, the behavior defined in the quote above is
1359 quite useful, so B<DB_File> conforms to it.
1360
1361 That means that you can specify other options (e.g. cachesize) and
1362 still have bval default to C<"\n"> for variable length records, and
1363 space for fixed length records.
1364
1365 Also note that the bval option only allows you to specify a single byte
1366 as a delimiter.
1367
1368 =head2 A Simple Example
1369
1370 Here is a simple example that uses RECNO (if you are using a version 
1371 of Perl earlier than 5.004_57 this example won't work -- see 
1372 L<Extra RECNO Methods> for a workaround).
1373
1374     use warnings ;
1375     use strict ;
1376     use DB_File ;
1377
1378     my $filename = "text" ;
1379     unlink $filename ;
1380
1381     my @h ;
1382     tie @h, "DB_File", $filename, O_RDWR|O_CREAT, 0666, $DB_RECNO 
1383         or die "Cannot open file 'text': $!\n" ;
1384
1385     # Add a few key/value pairs to the file
1386     $h[0] = "orange" ;
1387     $h[1] = "blue" ;
1388     $h[2] = "yellow" ;
1389
1390     push @h, "green", "black" ;
1391
1392     my $elements = scalar @h ;
1393     print "The array contains $elements entries\n" ;
1394
1395     my $last = pop @h ;
1396     print "popped $last\n" ;
1397
1398     unshift @h, "white" ;
1399     my $first = shift @h ;
1400     print "shifted $first\n" ;
1401
1402     # Check for existence of a key
1403     print "Element 1 Exists with value $h[1]\n" if $h[1] ;
1404
1405     # use a negative index
1406     print "The last element is $h[-1]\n" ;
1407     print "The 2nd last element is $h[-2]\n" ;
1408
1409     untie @h ;
1410
1411 Here is the output from the script:
1412
1413     The array contains 5 entries
1414     popped black
1415     shifted white
1416     Element 1 Exists with value blue
1417     The last element is green
1418     The 2nd last element is yellow
1419
1420 =head2 Extra RECNO Methods
1421
1422 If you are using a version of Perl earlier than 5.004_57, the tied
1423 array interface is quite limited. In the example script above
1424 C<push>, C<pop>, C<shift>, C<unshift>
1425 or determining the array length will not work with a tied array.
1426
1427 To make the interface more useful for older versions of Perl, a number
1428 of methods are supplied with B<DB_File> to simulate the missing array
1429 operations. All these methods are accessed via the object returned from
1430 the tie call.
1431
1432 Here are the methods:
1433
1434 =over 5
1435
1436 =item B<$X-E<gt>push(list) ;>
1437
1438 Pushes the elements of C<list> to the end of the array.
1439
1440 =item B<$value = $X-E<gt>pop ;>
1441
1442 Removes and returns the last element of the array.
1443
1444 =item B<$X-E<gt>shift>
1445
1446 Removes and returns the first element of the array.
1447
1448 =item B<$X-E<gt>unshift(list) ;>
1449
1450 Pushes the elements of C<list> to the start of the array.
1451
1452 =item B<$X-E<gt>length>
1453
1454 Returns the number of elements in the array.
1455
1456 =item B<$X-E<gt>splice(offset, length, elements);>
1457
1458 Returns a splice of the array.
1459
1460 =back
1461
1462 =head2 Another Example
1463
1464 Here is a more complete example that makes use of some of the methods
1465 described above. It also makes use of the API interface directly (see 
1466 L<THE API INTERFACE>).
1467
1468     use warnings ;
1469     use strict ;
1470     my (@h, $H, $file, $i) ;
1471     use DB_File ;
1472     use Fcntl ;
1473
1474     $file = "text" ;
1475
1476     unlink $file ;
1477
1478     $H = tie @h, "DB_File", $file, O_RDWR|O_CREAT, 0666, $DB_RECNO 
1479         or die "Cannot open file $file: $!\n" ;
1480
1481     # first create a text file to play with
1482     $h[0] = "zero" ;
1483     $h[1] = "one" ;
1484     $h[2] = "two" ;
1485     $h[3] = "three" ;
1486     $h[4] = "four" ;
1487
1488
1489     # Print the records in order.
1490     #
1491     # The length method is needed here because evaluating a tied
1492     # array in a scalar context does not return the number of
1493     # elements in the array.  
1494
1495     print "\nORIGINAL\n" ;
1496     foreach $i (0 .. $H->length - 1) {
1497         print "$i: $h[$i]\n" ;
1498     }
1499
1500     # use the push & pop methods
1501     $a = $H->pop ;
1502     $H->push("last") ;
1503     print "\nThe last record was [$a]\n" ;
1504
1505     # and the shift & unshift methods
1506     $a = $H->shift ;
1507     $H->unshift("first") ;
1508     print "The first record was [$a]\n" ;
1509
1510     # Use the API to add a new record after record 2.
1511     $i = 2 ;
1512     $H->put($i, "Newbie", R_IAFTER) ;
1513
1514     # and a new record before record 1.
1515     $i = 1 ;
1516     $H->put($i, "New One", R_IBEFORE) ;
1517
1518     # delete record 3
1519     $H->del(3) ;
1520
1521     # now print the records in reverse order
1522     print "\nREVERSE\n" ;
1523     for ($i = $H->length - 1 ; $i >= 0 ; -- $i)
1524       { print "$i: $h[$i]\n" }
1525
1526     # same again, but use the API functions instead
1527     print "\nREVERSE again\n" ;
1528     my ($s, $k, $v)  = (0, 0, 0) ;
1529     for ($s = $H->seq($k, $v, R_LAST) ; 
1530              $s == 0 ; 
1531              $s = $H->seq($k, $v, R_PREV))
1532       { print "$k: $v\n" }
1533
1534     undef $H ;
1535     untie @h ;
1536
1537 and this is what it outputs:
1538
1539     ORIGINAL
1540     0: zero
1541     1: one
1542     2: two
1543     3: three
1544     4: four
1545
1546     The last record was [four]
1547     The first record was [zero]
1548
1549     REVERSE
1550     5: last
1551     4: three
1552     3: Newbie
1553     2: one
1554     1: New One
1555     0: first
1556
1557     REVERSE again
1558     5: last
1559     4: three
1560     3: Newbie
1561     2: one
1562     1: New One
1563     0: first
1564
1565 Notes:
1566
1567 =over 5
1568
1569 =item 1.
1570
1571 Rather than iterating through the array, C<@h> like this:
1572
1573     foreach $i (@h)
1574
1575 it is necessary to use either this:
1576
1577     foreach $i (0 .. $H->length - 1) 
1578
1579 or this:
1580
1581     for ($a = $H->get($k, $v, R_FIRST) ;
1582          $a == 0 ;
1583          $a = $H->get($k, $v, R_NEXT) )
1584
1585 =item 2.
1586
1587 Notice that both times the C<put> method was used the record index was
1588 specified using a variable, C<$i>, rather than the literal value
1589 itself. This is because C<put> will return the record number of the
1590 inserted line via that parameter.
1591
1592 =back
1593
1594 =head1 THE API INTERFACE
1595
1596 As well as accessing Berkeley DB using a tied hash or array, it is also
1597 possible to make direct use of most of the API functions defined in the
1598 Berkeley DB documentation.
1599
1600 To do this you need to store a copy of the object returned from the tie.
1601
1602         $db = tie %hash, "DB_File", "filename" ;
1603
1604 Once you have done that, you can access the Berkeley DB API functions
1605 as B<DB_File> methods directly like this:
1606
1607         $db->put($key, $value, R_NOOVERWRITE) ;
1608
1609 B<Important:> If you have saved a copy of the object returned from
1610 C<tie>, the underlying database file will I<not> be closed until both
1611 the tied variable is untied and all copies of the saved object are
1612 destroyed. 
1613
1614     use DB_File ;
1615     $db = tie %hash, "DB_File", "filename" 
1616         or die "Cannot tie filename: $!" ;
1617     ...
1618     undef $db ;
1619     untie %hash ;
1620
1621 See L<The untie() Gotcha> for more details.
1622
1623 All the functions defined in L<dbopen> are available except for
1624 close() and dbopen() itself. The B<DB_File> method interface to the
1625 supported functions have been implemented to mirror the way Berkeley DB
1626 works whenever possible. In particular note that:
1627
1628 =over 5
1629
1630 =item *
1631
1632 The methods return a status value. All return 0 on success.
1633 All return -1 to signify an error and set C<$!> to the exact
1634 error code. The return code 1 generally (but not always) means that the
1635 key specified did not exist in the database.
1636
1637 Other return codes are defined. See below and in the Berkeley DB
1638 documentation for details. The Berkeley DB documentation should be used
1639 as the definitive source.
1640
1641 =item *
1642
1643 Whenever a Berkeley DB function returns data via one of its parameters,
1644 the equivalent B<DB_File> method does exactly the same.
1645
1646 =item *
1647
1648 If you are careful, it is possible to mix API calls with the tied
1649 hash/array interface in the same piece of code. Although only a few of
1650 the methods used to implement the tied interface currently make use of
1651 the cursor, you should always assume that the cursor has been changed
1652 any time the tied hash/array interface is used. As an example, this
1653 code will probably not do what you expect:
1654
1655     $X = tie %x, 'DB_File', $filename, O_RDWR|O_CREAT, 0777, $DB_BTREE
1656         or die "Cannot tie $filename: $!" ;
1657
1658     # Get the first key/value pair and set  the cursor
1659     $X->seq($key, $value, R_FIRST) ;
1660
1661     # this line will modify the cursor
1662     $count = scalar keys %x ; 
1663
1664     # Get the second key/value pair.
1665     # oops, it didn't, it got the last key/value pair!
1666     $X->seq($key, $value, R_NEXT) ;
1667
1668 The code above can be rearranged to get around the problem, like this:
1669
1670     $X = tie %x, 'DB_File', $filename, O_RDWR|O_CREAT, 0777, $DB_BTREE
1671         or die "Cannot tie $filename: $!" ;
1672
1673     # this line will modify the cursor
1674     $count = scalar keys %x ; 
1675
1676     # Get the first key/value pair and set  the cursor
1677     $X->seq($key, $value, R_FIRST) ;
1678
1679     # Get the second key/value pair.
1680     # worked this time.
1681     $X->seq($key, $value, R_NEXT) ;
1682
1683 =back
1684
1685 All the constants defined in L<dbopen> for use in the flags parameters
1686 in the methods defined below are also available. Refer to the Berkeley
1687 DB documentation for the precise meaning of the flags values.
1688
1689 Below is a list of the methods available.
1690
1691 =over 5
1692
1693 =item B<$status = $X-E<gt>get($key, $value [, $flags]) ;>
1694
1695 Given a key (C<$key>) this method reads the value associated with it
1696 from the database. The value read from the database is returned in the
1697 C<$value> parameter.
1698
1699 If the key does not exist the method returns 1.
1700
1701 No flags are currently defined for this method.
1702
1703 =item B<$status = $X-E<gt>put($key, $value [, $flags]) ;>
1704
1705 Stores the key/value pair in the database.
1706
1707 If you use either the R_IAFTER or R_IBEFORE flags, the C<$key> parameter
1708 will have the record number of the inserted key/value pair set.
1709
1710 Valid flags are R_CURSOR, R_IAFTER, R_IBEFORE, R_NOOVERWRITE and
1711 R_SETCURSOR.
1712
1713 =item B<$status = $X-E<gt>del($key [, $flags]) ;>
1714
1715 Removes all key/value pairs with key C<$key> from the database.
1716
1717 A return code of 1 means that the requested key was not in the
1718 database.
1719
1720 R_CURSOR is the only valid flag at present.
1721
1722 =item B<$status = $X-E<gt>fd ;>
1723
1724 Returns the file descriptor for the underlying database.
1725
1726 See L<Locking: The Trouble with fd> for an explanation for why you should
1727 not use C<fd> to lock your database.
1728
1729 =item B<$status = $X-E<gt>seq($key, $value, $flags) ;>
1730
1731 This interface allows sequential retrieval from the database. See
1732 L<dbopen> for full details.
1733
1734 Both the C<$key> and C<$value> parameters will be set to the key/value
1735 pair read from the database.
1736
1737 The flags parameter is mandatory. The valid flag values are R_CURSOR,
1738 R_FIRST, R_LAST, R_NEXT and R_PREV.
1739
1740 =item B<$status = $X-E<gt>sync([$flags]) ;>
1741
1742 Flushes any cached buffers to disk.
1743
1744 R_RECNOSYNC is the only valid flag at present.
1745
1746 =back
1747
1748 =head1 DBM FILTERS
1749
1750 A DBM Filter is a piece of code that is be used when you I<always>
1751 want to make the same transformation to all keys and/or values in a
1752 DBM database.
1753
1754 There are four methods associated with DBM Filters. All work identically,
1755 and each is used to install (or uninstall) a single DBM Filter. Each
1756 expects a single parameter, namely a reference to a sub. The only
1757 difference between them is the place that the filter is installed.
1758
1759 To summarise:
1760
1761 =over 5
1762
1763 =item B<filter_store_key>
1764
1765 If a filter has been installed with this method, it will be invoked
1766 every time you write a key to a DBM database.
1767
1768 =item B<filter_store_value>
1769
1770 If a filter has been installed with this method, it will be invoked
1771 every time you write a value to a DBM database.
1772
1773
1774 =item B<filter_fetch_key>
1775
1776 If a filter has been installed with this method, it will be invoked
1777 every time you read a key from a DBM database.
1778
1779 =item B<filter_fetch_value>
1780
1781 If a filter has been installed with this method, it will be invoked
1782 every time you read a value from a DBM database.
1783
1784 =back
1785
1786 You can use any combination of the methods, from none, to all four.
1787
1788 All filter methods return the existing filter, if present, or C<undef>
1789 in not.
1790
1791 To delete a filter pass C<undef> to it.
1792
1793 =head2 The Filter
1794
1795 When each filter is called by Perl, a local copy of C<$_> will contain
1796 the key or value to be filtered. Filtering is achieved by modifying
1797 the contents of C<$_>. The return code from the filter is ignored.
1798
1799 =head2 An Example -- the NULL termination problem.
1800
1801 Consider the following scenario. You have a DBM database
1802 that you need to share with a third-party C application. The C application
1803 assumes that I<all> keys and values are NULL terminated. Unfortunately
1804 when Perl writes to DBM databases it doesn't use NULL termination, so
1805 your Perl application will have to manage NULL termination itself. When
1806 you write to the database you will have to use something like this:
1807
1808     $hash{"$key\0"} = "$value\0" ;
1809
1810 Similarly the NULL needs to be taken into account when you are considering
1811 the length of existing keys/values.
1812
1813 It would be much better if you could ignore the NULL terminations issue
1814 in the main application code and have a mechanism that automatically
1815 added the terminating NULL to all keys and values whenever you write to
1816 the database and have them removed when you read from the database. As I'm
1817 sure you have already guessed, this is a problem that DBM Filters can
1818 fix very easily.
1819
1820     use warnings ;
1821     use strict ;
1822     use DB_File ;
1823
1824     my %hash ;
1825     my $filename = "filt" ;
1826     unlink $filename ;
1827
1828     my $db = tie %hash, 'DB_File', $filename, O_CREAT|O_RDWR, 0666, $DB_HASH 
1829       or die "Cannot open $filename: $!\n" ;
1830
1831     # Install DBM Filters
1832     $db->filter_fetch_key  ( sub { s/\0$//    } ) ;
1833     $db->filter_store_key  ( sub { $_ .= "\0" } ) ;
1834     $db->filter_fetch_value( sub { s/\0$//    } ) ;
1835     $db->filter_store_value( sub { $_ .= "\0" } ) ;
1836
1837     $hash{"abc"} = "def" ;
1838     my $a = $hash{"ABC"} ;
1839     # ...
1840     undef $db ;
1841     untie %hash ;
1842
1843 Hopefully the contents of each of the filters should be
1844 self-explanatory. Both "fetch" filters remove the terminating NULL,
1845 and both "store" filters add a terminating NULL.
1846
1847
1848 =head2 Another Example -- Key is a C int.
1849
1850 Here is another real-life example. By default, whenever Perl writes to
1851 a DBM database it always writes the key and value as strings. So when
1852 you use this:
1853
1854     $hash{12345} = "soemthing" ;
1855
1856 the key 12345 will get stored in the DBM database as the 5 byte string
1857 "12345". If you actually want the key to be stored in the DBM database
1858 as a C int, you will have to use C<pack> when writing, and C<unpack>
1859 when reading.
1860
1861 Here is a DBM Filter that does it:
1862
1863     use warnings ;
1864     use strict ;
1865     use DB_File ;
1866     my %hash ;
1867     my $filename = "filt" ;
1868     unlink $filename ;
1869
1870
1871     my $db = tie %hash, 'DB_File', $filename, O_CREAT|O_RDWR, 0666, $DB_HASH 
1872       or die "Cannot open $filename: $!\n" ;
1873
1874     $db->filter_fetch_key  ( sub { $_ = unpack("i", $_) } ) ;
1875     $db->filter_store_key  ( sub { $_ = pack ("i", $_) } ) ;
1876     $hash{123} = "def" ;
1877     # ...
1878     undef $db ;
1879     untie %hash ;
1880
1881 This time only two filters have been used -- we only need to manipulate
1882 the contents of the key, so it wasn't necessary to install any value
1883 filters.
1884
1885 =head1 HINTS AND TIPS 
1886
1887
1888 =head2 Locking: The Trouble with fd
1889
1890 Until version 1.72 of this module, the recommended technique for locking
1891 B<DB_File> databases was to flock the filehandle returned from the "fd"
1892 function. Unfortunately this technique has been shown to be fundamentally
1893 flawed (Kudos to David Harris for tracking this down). Use it at your own
1894 peril!
1895
1896 The locking technique went like this. 
1897
1898     $db = tie(%db, 'DB_File', 'foo.db', O_CREAT|O_RDWR, 0644)
1899         || die "dbcreat foo.db $!";
1900     $fd = $db->fd;
1901     open(DB_FH, "+<&=$fd") || die "dup $!";
1902     flock (DB_FH, LOCK_EX) || die "flock: $!";
1903     ...
1904     $db{"Tom"} = "Jerry" ;
1905     ...
1906     flock(DB_FH, LOCK_UN);
1907     undef $db;
1908     untie %db;
1909     close(DB_FH);
1910
1911 In simple terms, this is what happens:
1912
1913 =over 5
1914
1915 =item 1.
1916
1917 Use "tie" to open the database.
1918
1919 =item 2.
1920
1921 Lock the database with fd & flock.
1922
1923 =item 3.
1924
1925 Read & Write to the database.
1926
1927 =item 4.
1928
1929 Unlock and close the database.
1930
1931 =back
1932
1933 Here is the crux of the problem. A side-effect of opening the B<DB_File>
1934 database in step 2 is that an initial block from the database will get
1935 read from disk and cached in memory.
1936
1937 To see why this is a problem, consider what can happen when two processes,
1938 say "A" and "B", both want to update the same B<DB_File> database
1939 using the locking steps outlined above. Assume process "A" has already
1940 opened the database and has a write lock, but it hasn't actually updated
1941 the database yet (it has finished step 2, but not started step 3 yet). Now
1942 process "B" tries to open the same database - step 1 will succeed,
1943 but it will block on step 2 until process "A" releases the lock. The
1944 important thing to notice here is that at this point in time both
1945 processes will have cached identical initial blocks from the database.
1946
1947 Now process "A" updates the database and happens to change some of the
1948 data held in the initial buffer. Process "A" terminates, flushing
1949 all cached data to disk and releasing the database lock. At this point
1950 the database on disk will correctly reflect the changes made by process
1951 "A".
1952
1953 With the lock released, process "B" can now continue. It also updates the
1954 database and unfortunately it too modifies the data that was in its
1955 initial buffer. Once that data gets flushed to disk it will overwrite
1956 some/all of the changes process "A" made to the database.
1957
1958 The result of this scenario is at best a database that doesn't contain
1959 what you expect. At worst the database will corrupt.
1960
1961 The above won't happen every time competing process update the same
1962 B<DB_File> database, but it does illustrate why the technique should
1963 not be used.
1964
1965 =head2 Safe ways to lock a database
1966
1967 Starting with version 2.x, Berkeley DB  has internal support for locking.
1968 The companion module to this one, B<BerkeleyDB>, provides an interface
1969 to this locking functionality. If you are serious about locking
1970 Berkeley DB databases, I strongly recommend using B<BerkeleyDB>.
1971
1972 If using B<BerkeleyDB> isn't an option, there are a number of modules
1973 available on CPAN that can be used to implement locking. Each one
1974 implements locking differently and has different goals in mind. It is
1975 therefore worth knowing the difference, so that you can pick the right
1976 one for your application. Here are the three locking wrappers:
1977
1978 =over 5
1979
1980 =item B<Tie::DB_Lock>
1981
1982 A B<DB_File> wrapper which creates copies of the database file for
1983 read access, so that you have a kind of a multiversioning concurrent read
1984 system. However, updates are still serial. Use for databases where reads
1985 may be lengthy and consistency problems may occur.
1986
1987 =item B<Tie::DB_LockFile> 
1988
1989 A B<DB_File> wrapper that has the ability to lock and unlock the database
1990 while it is being used. Avoids the tie-before-flock problem by simply
1991 re-tie-ing the database when you get or drop a lock.  Because of the
1992 flexibility in dropping and re-acquiring the lock in the middle of a
1993 session, this can be massaged into a system that will work with long
1994 updates and/or reads if the application follows the hints in the POD
1995 documentation.
1996
1997 =item B<DB_File::Lock> 
1998
1999 An extremely lightweight B<DB_File> wrapper that simply flocks a lockfile
2000 before tie-ing the database and drops the lock after the untie. Allows
2001 one to use the same lockfile for multiple databases to avoid deadlock
2002 problems, if desired. Use for databases where updates are reads are
2003 quick and simple flock locking semantics are enough.
2004
2005 =back
2006
2007 =head2 Sharing Databases With C Applications
2008
2009 There is no technical reason why a Berkeley DB database cannot be
2010 shared by both a Perl and a C application.
2011
2012 The vast majority of problems that are reported in this area boil down
2013 to the fact that C strings are NULL terminated, whilst Perl strings are
2014 not. See L<DBM FILTERS> for a generic way to work around this problem.
2015
2016 Here is a real example. Netscape 2.0 keeps a record of the locations you
2017 visit along with the time you last visited them in a DB_HASH database.
2018 This is usually stored in the file F<~/.netscape/history.db>. The key
2019 field in the database is the location string and the value field is the
2020 time the location was last visited stored as a 4 byte binary value.
2021
2022 If you haven't already guessed, the location string is stored with a
2023 terminating NULL. This means you need to be careful when accessing the
2024 database.
2025
2026 Here is a snippet of code that is loosely based on Tom Christiansen's
2027 I<ggh> script (available from your nearest CPAN archive in
2028 F<authors/id/TOMC/scripts/nshist.gz>).
2029
2030     use warnings ;
2031     use strict ;
2032     use DB_File ;
2033     use Fcntl ;
2034
2035     my ($dotdir, $HISTORY, %hist_db, $href, $binary_time, $date) ;
2036     $dotdir = $ENV{HOME} || $ENV{LOGNAME};
2037
2038     $HISTORY = "$dotdir/.netscape/history.db";
2039
2040     tie %hist_db, 'DB_File', $HISTORY
2041         or die "Cannot open $HISTORY: $!\n" ;;
2042
2043     # Dump the complete database
2044     while ( ($href, $binary_time) = each %hist_db ) {
2045
2046         # remove the terminating NULL
2047         $href =~ s/\x00$// ;
2048
2049         # convert the binary time into a user friendly string
2050         $date = localtime unpack("V", $binary_time);
2051         print "$date $href\n" ;
2052     }
2053
2054     # check for the existence of a specific key
2055     # remember to add the NULL
2056     if ( $binary_time = $hist_db{"http://mox.perl.com/\x00"} ) {
2057         $date = localtime unpack("V", $binary_time) ;
2058         print "Last visited mox.perl.com on $date\n" ;
2059     }
2060     else {
2061         print "Never visited mox.perl.com\n"
2062     }
2063
2064     untie %hist_db ;
2065
2066 =head2 The untie() Gotcha
2067
2068 If you make use of the Berkeley DB API, it is I<very> strongly
2069 recommended that you read L<perltie/The untie Gotcha>. 
2070
2071 Even if you don't currently make use of the API interface, it is still
2072 worth reading it.
2073
2074 Here is an example which illustrates the problem from a B<DB_File>
2075 perspective:
2076
2077     use DB_File ;
2078     use Fcntl ;
2079
2080     my %x ;
2081     my $X ;
2082
2083     $X = tie %x, 'DB_File', 'tst.fil' , O_RDWR|O_TRUNC
2084         or die "Cannot tie first time: $!" ;
2085
2086     $x{123} = 456 ;
2087
2088     untie %x ;
2089
2090     tie %x, 'DB_File', 'tst.fil' , O_RDWR|O_CREAT
2091         or die "Cannot tie second time: $!" ;
2092
2093     untie %x ;
2094
2095 When run, the script will produce this error message:
2096
2097     Cannot tie second time: Invalid argument at bad.file line 14.
2098
2099 Although the error message above refers to the second tie() statement
2100 in the script, the source of the problem is really with the untie()
2101 statement that precedes it.
2102
2103 Having read L<perltie> you will probably have already guessed that the
2104 error is caused by the extra copy of the tied object stored in C<$X>.
2105 If you haven't, then the problem boils down to the fact that the
2106 B<DB_File> destructor, DESTROY, will not be called until I<all>
2107 references to the tied object are destroyed. Both the tied variable,
2108 C<%x>, and C<$X> above hold a reference to the object. The call to
2109 untie() will destroy the first, but C<$X> still holds a valid
2110 reference, so the destructor will not get called and the database file
2111 F<tst.fil> will remain open. The fact that Berkeley DB then reports the
2112 attempt to open a database that is already open via the catch-all
2113 "Invalid argument" doesn't help.
2114
2115 If you run the script with the C<-w> flag the error message becomes:
2116
2117     untie attempted while 1 inner references still exist at bad.file line 12.
2118     Cannot tie second time: Invalid argument at bad.file line 14.
2119
2120 which pinpoints the real problem. Finally the script can now be
2121 modified to fix the original problem by destroying the API object
2122 before the untie:
2123
2124     ...
2125     $x{123} = 456 ;
2126
2127     undef $X ;
2128     untie %x ;
2129
2130     $X = tie %x, 'DB_File', 'tst.fil' , O_RDWR|O_CREAT
2131     ...
2132
2133
2134 =head1 COMMON QUESTIONS
2135
2136 =head2 Why is there Perl source in my database?
2137
2138 If you look at the contents of a database file created by DB_File,
2139 there can sometimes be part of a Perl script included in it.
2140
2141 This happens because Berkeley DB uses dynamic memory to allocate
2142 buffers which will subsequently be written to the database file. Being
2143 dynamic, the memory could have been used for anything before DB
2144 malloced it. As Berkeley DB doesn't clear the memory once it has been
2145 allocated, the unused portions will contain random junk. In the case
2146 where a Perl script gets written to the database, the random junk will
2147 correspond to an area of dynamic memory that happened to be used during
2148 the compilation of the script.
2149
2150 Unless you don't like the possibility of there being part of your Perl
2151 scripts embedded in a database file, this is nothing to worry about.
2152
2153 =head2 How do I store complex data structures with DB_File?
2154
2155 Although B<DB_File> cannot do this directly, there is a module which
2156 can layer transparently over B<DB_File> to accomplish this feat.
2157
2158 Check out the MLDBM module, available on CPAN in the directory
2159 F<modules/by-module/MLDBM>.
2160
2161 =head2 What does "Invalid Argument" mean?
2162
2163 You will get this error message when one of the parameters in the
2164 C<tie> call is wrong. Unfortunately there are quite a few parameters to
2165 get wrong, so it can be difficult to figure out which one it is.
2166
2167 Here are a couple of possibilities:
2168
2169 =over 5
2170
2171 =item 1.
2172
2173 Attempting to reopen a database without closing it. 
2174
2175 =item 2.
2176
2177 Using the O_WRONLY flag.
2178
2179 =back
2180
2181 =head2 What does "Bareword 'DB_File' not allowed" mean? 
2182
2183 You will encounter this particular error message when you have the
2184 C<strict 'subs'> pragma (or the full strict pragma) in your script.
2185 Consider this script:
2186
2187     use warnings ;
2188     use strict ;
2189     use DB_File ;
2190     my %x ;
2191     tie %x, DB_File, "filename" ;
2192
2193 Running it produces the error in question:
2194
2195     Bareword "DB_File" not allowed while "strict subs" in use 
2196
2197 To get around the error, place the word C<DB_File> in either single or
2198 double quotes, like this:
2199
2200     tie %x, "DB_File", "filename" ;
2201
2202 Although it might seem like a real pain, it is really worth the effort
2203 of having a C<use strict> in all your scripts.
2204
2205 =head1 REFERENCES
2206
2207 Articles that are either about B<DB_File> or make use of it.
2208
2209 =over 5
2210
2211 =item 1.
2212
2213 I<Full-Text Searching in Perl>, Tim Kientzle (tkientzle@ddj.com),
2214 Dr. Dobb's Journal, Issue 295, January 1999, pp 34-41
2215
2216 =back
2217
2218 =head1 HISTORY
2219
2220 Moved to the Changes file.
2221
2222 =head1 BUGS
2223
2224 Some older versions of Berkeley DB had problems with fixed length
2225 records using the RECNO file format. This problem has been fixed since
2226 version 1.85 of Berkeley DB.
2227
2228 I am sure there are bugs in the code. If you do find any, or can
2229 suggest any enhancements, I would welcome your comments.
2230
2231 =head1 AVAILABILITY
2232
2233 B<DB_File> comes with the standard Perl source distribution. Look in
2234 the directory F<ext/DB_File>. Given the amount of time between releases
2235 of Perl the version that ships with Perl is quite likely to be out of
2236 date, so the most recent version can always be found on CPAN (see
2237 L<perlmodlib/CPAN> for details), in the directory
2238 F<modules/by-module/DB_File>.
2239
2240 This version of B<DB_File> will work with either version 1.x, 2.x or
2241 3.x of Berkeley DB, but is limited to the functionality provided by
2242 version 1.
2243
2244 The official web site for Berkeley DB is F<http://www.sleepycat.com>.
2245 All versions of Berkeley DB are available there.
2246
2247 Alternatively, Berkeley DB version 1 is available at your nearest CPAN
2248 archive in F<src/misc/db.1.85.tar.gz>.
2249
2250 If you are running IRIX, then get Berkeley DB version 1 from
2251 F<http://reality.sgi.com/ariel>. It has the patches necessary to
2252 compile properly on IRIX 5.3.
2253
2254 =head1 COPYRIGHT
2255
2256 Copyright (c) 1995-2004 Paul Marquess. All rights reserved. This program
2257 is free software; you can redistribute it and/or modify it under the
2258 same terms as Perl itself.
2259
2260 Although B<DB_File> is covered by the Perl license, the library it
2261 makes use of, namely Berkeley DB, is not. Berkeley DB has its own
2262 copyright and its own license. Please take the time to read it.
2263
2264 Here are are few words taken from the Berkeley DB FAQ (at
2265 F<http://www.sleepycat.com>) regarding the license:
2266
2267     Do I have to license DB to use it in Perl scripts? 
2268
2269     No. The Berkeley DB license requires that software that uses
2270     Berkeley DB be freely redistributable. In the case of Perl, that
2271     software is Perl, and not your scripts. Any Perl scripts that you
2272     write are your property, including scripts that make use of
2273     Berkeley DB. Neither the Perl license nor the Berkeley DB license
2274     place any restriction on what you may do with them.
2275
2276 If you are in any doubt about the license situation, contact either the
2277 Berkeley DB authors or the author of DB_File. See L<"AUTHOR"> for details.
2278
2279
2280 =head1 SEE ALSO
2281
2282 L<perl>, L<dbopen(3)>, L<hash(3)>, L<recno(3)>, L<btree(3)>,
2283 L<perldbmfilter>
2284
2285 =head1 AUTHOR
2286
2287 The DB_File interface was written by Paul Marquess
2288 E<lt>pmqs@cpan.orgE<gt>.
2289 Questions about the DB system itself may be addressed to
2290 E<lt>db@sleepycat.comE<gt>.
2291
2292 =cut