6aeaed82e2f540836ec80bcd4048c1b943e50815
[dbsrgits/DBM-Deep.git] / lib / DBM / Deep.pm
1 package DBM::Deep;
2
3 ##
4 # DBM::Deep
5 #
6 # Description:
7 #    Multi-level database module for storing hash trees, arrays and simple
8 #    key/value pairs into FTP-able, cross-platform binary database files.
9 #
10 #    Type `perldoc DBM::Deep` for complete documentation.
11 #
12 # Usage Examples:
13 #    my %db;
14 #    tie %db, 'DBM::Deep', 'my_database.db'; # standard tie() method
15 #
16 #    my $db = new DBM::Deep( 'my_database.db' ); # preferred OO method
17 #
18 #    $db->{my_scalar} = 'hello world';
19 #    $db->{my_hash} = { larry => 'genius', hashes => 'fast' };
20 #    $db->{my_array} = [ 1, 2, 3, time() ];
21 #    $db->{my_complex} = [ 'hello', { perl => 'rules' }, 42, 99 ];
22 #    push @{$db->{my_array}}, 'another value';
23 #    my @key_list = keys %{$db->{my_hash}};
24 #    print "This module " . $db->{my_complex}->[1]->{perl} . "!\n";
25 #
26 # Copyright:
27 #    (c) 2002-2006 Joseph Huckaby.  All Rights Reserved.
28 #    This program is free software; you can redistribute it and/or
29 #    modify it under the same terms as Perl itself.
30 ##
31
32 use strict;
33
34 use Fcntl qw( :DEFAULT :flock :seek );
35 use Digest::MD5 ();
36 use Scalar::Util ();
37
38 use DBM::Deep::Engine;
39
40 use vars qw( $VERSION );
41 $VERSION = q(0.99_01);
42
43 ##
44 # Setup constants for users to pass to new()
45 ##
46 sub TYPE_HASH   () { DBM::Deep::Engine::SIG_HASH   }
47 sub TYPE_ARRAY  () { DBM::Deep::Engine::SIG_ARRAY  }
48 sub TYPE_SCALAR () { DBM::Deep::Engine::SIG_SCALAR }
49
50 sub _get_args {
51     my $proto = shift;
52
53     my $args;
54     if (scalar(@_) > 1) {
55         if ( @_ % 2 ) {
56             $proto->_throw_error( "Odd number of parameters to " . (caller(1))[2] );
57         }
58         $args = {@_};
59     }
60     elsif ( ref $_[0] ) {
61         unless ( eval { local $SIG{'__DIE__'}; %{$_[0]} || 1 } ) {
62             $proto->_throw_error( "Not a hashref in args to " . (caller(1))[2] );
63         }
64         $args = $_[0];
65     }
66     else {
67         $args = { file => shift };
68     }
69
70     return $args;
71 }
72
73 sub new {
74     ##
75     # Class constructor method for Perl OO interface.
76     # Calls tie() and returns blessed reference to tied hash or array,
77     # providing a hybrid OO/tie interface.
78     ##
79     my $class = shift;
80     my $args = $class->_get_args( @_ );
81
82     ##
83     # Check if we want a tied hash or array.
84     ##
85     my $self;
86     if (defined($args->{type}) && $args->{type} eq TYPE_ARRAY) {
87         $class = 'DBM::Deep::Array';
88         require DBM::Deep::Array;
89         tie @$self, $class, %$args;
90     }
91     else {
92         $class = 'DBM::Deep::Hash';
93         require DBM::Deep::Hash;
94         tie %$self, $class, %$args;
95     }
96
97     return bless $self, $class;
98 }
99
100 sub _init {
101     ##
102     # Setup $self and bless into this class.
103     ##
104     my $class = shift;
105     my $args = shift;
106
107     # These are the defaults to be optionally overridden below
108     my $self = bless {
109         type        => TYPE_HASH,
110         engine      => DBM::Deep::Engine->new,
111     }, $class;
112
113     $self->{base_offset} = length( $self->{engine}->SIG_FILE );
114
115     foreach my $param ( keys %$self ) {
116         next unless exists $args->{$param};
117         $self->{$param} = delete $args->{$param}
118     }
119
120     # locking implicitly enables autoflush
121     if ($args->{locking}) { $args->{autoflush} = 1; }
122
123     $self->{root} = exists $args->{root}
124         ? $args->{root}
125         : DBM::Deep::_::Root->new( $args );
126
127     $self->{engine}->setup_fh( $self );
128
129     return $self;
130 }
131
132 sub TIEHASH {
133     shift;
134     require DBM::Deep::Hash;
135     return DBM::Deep::Hash->TIEHASH( @_ );
136 }
137
138 sub TIEARRAY {
139     shift;
140     require DBM::Deep::Array;
141     return DBM::Deep::Array->TIEARRAY( @_ );
142 }
143
144 #XXX Unneeded now ...
145 #sub DESTROY {
146 #}
147
148 sub lock {
149     ##
150     # If db locking is set, flock() the db file.  If called multiple
151     # times before unlock(), then the same number of unlocks() must
152     # be called before the lock is released.
153     ##
154     my $self = $_[0]->_get_self;
155     my $type = $_[1];
156     $type = LOCK_EX unless defined $type;
157
158     if (!defined($self->_fh)) { return; }
159
160     if ($self->_root->{locking}) {
161         if (!$self->_root->{locked}) {
162             flock($self->_fh, $type);
163
164             # refresh end counter in case file has changed size
165             my @stats = stat($self->_root->{file});
166             $self->_root->{end} = $stats[7];
167
168             # double-check file inode, in case another process
169             # has optimize()d our file while we were waiting.
170             if ($stats[1] != $self->_root->{inode}) {
171                 $self->{engine}->close_fh( $self );
172                 $self->{engine}->setup_fh( $self );
173                 flock($self->_fh, $type); # re-lock
174
175                 # This may not be necessary after re-opening
176                 $self->_root->{end} = (stat($self->_fh))[7]; # re-end
177             }
178         }
179         $self->_root->{locked}++;
180
181         return 1;
182     }
183
184     return;
185 }
186
187 sub unlock {
188     ##
189     # If db locking is set, unlock the db file.  See note in lock()
190     # regarding calling lock() multiple times.
191     ##
192     my $self = $_[0]->_get_self;
193
194     if (!defined($self->_fh)) { return; }
195
196     if ($self->_root->{locking} && $self->_root->{locked} > 0) {
197         $self->_root->{locked}--;
198         if (!$self->_root->{locked}) { flock($self->_fh, LOCK_UN); }
199
200         return 1;
201     }
202
203     return;
204 }
205
206 sub _copy_value {
207     my $self = shift->_get_self;
208     my ($spot, $value) = @_;
209
210     if ( !ref $value ) {
211         ${$spot} = $value;
212     }
213     elsif ( eval { local $SIG{__DIE__}; $value->isa( 'DBM::Deep' ) } ) {
214         my $type = $value->_type;
215         ${$spot} = $type eq TYPE_HASH ? {} : [];
216         $value->_copy_node( ${$spot} );
217     }
218     else {
219         my $r = Scalar::Util::reftype( $value );
220         my $c = Scalar::Util::blessed( $value );
221         if ( $r eq 'ARRAY' ) {
222             ${$spot} = [ @{$value} ];
223         }
224         else {
225             ${$spot} = { %{$value} };
226         }
227         ${$spot} = bless ${$spot}, $c
228             if defined $c;
229     }
230
231     return 1;
232 }
233
234 sub _copy_node {
235     ##
236     # Copy single level of keys or elements to new DB handle.
237     # Recurse for nested structures
238     ##
239     my $self = shift->_get_self;
240     my ($db_temp) = @_;
241
242     if ($self->_type eq TYPE_HASH) {
243         my $key = $self->first_key();
244         while ($key) {
245             my $value = $self->get($key);
246             $self->_copy_value( \$db_temp->{$key}, $value );
247             $key = $self->next_key($key);
248         }
249     }
250     else {
251         my $length = $self->length();
252         for (my $index = 0; $index < $length; $index++) {
253             my $value = $self->get($index);
254             $self->_copy_value( \$db_temp->[$index], $value );
255         }
256     }
257
258     return 1;
259 }
260
261 sub export {
262     ##
263     # Recursively export into standard Perl hashes and arrays.
264     ##
265     my $self = $_[0]->_get_self;
266
267     my $temp;
268     if ($self->_type eq TYPE_HASH) { $temp = {}; }
269     elsif ($self->_type eq TYPE_ARRAY) { $temp = []; }
270
271     $self->lock();
272     $self->_copy_node( $temp );
273     $self->unlock();
274
275     return $temp;
276 }
277
278 sub import {
279     ##
280     # Recursively import Perl hash/array structure
281     ##
282     #XXX This use of ref() seems to be ok
283     if (!ref($_[0])) { return; } # Perl calls import() on use -- ignore
284
285     my $self = $_[0]->_get_self;
286     my $struct = $_[1];
287
288     #XXX This use of ref() seems to be ok
289     if (!ref($struct)) {
290         ##
291         # struct is not a reference, so just import based on our type
292         ##
293         shift @_;
294
295         if ($self->_type eq TYPE_HASH) { $struct = {@_}; }
296         elsif ($self->_type eq TYPE_ARRAY) { $struct = [@_]; }
297     }
298
299     my $r = Scalar::Util::reftype($struct) || '';
300     if ($r eq "HASH" && $self->_type eq TYPE_HASH) {
301         foreach my $key (keys %$struct) { $self->put($key, $struct->{$key}); }
302     }
303     elsif ($r eq "ARRAY" && $self->_type eq TYPE_ARRAY) {
304         $self->push( @$struct );
305     }
306     else {
307         $self->_throw_error("Cannot import: type mismatch");
308     }
309
310     return 1;
311 }
312
313 sub optimize {
314     ##
315     # Rebuild entire database into new file, then move
316     # it back on top of original.
317     ##
318     my $self = $_[0]->_get_self;
319
320 #XXX Need to create a new test for this
321 #    if ($self->_root->{links} > 1) {
322 #        $self->_throw_error("Cannot optimize: reference count is greater than 1");
323 #    }
324
325     my $db_temp = DBM::Deep->new(
326         file => $self->_root->{file} . '.tmp',
327         type => $self->_type
328     );
329     if (!$db_temp) {
330         $self->_throw_error("Cannot optimize: failed to open temp file: $!");
331     }
332
333     $self->lock();
334     $self->_copy_node( $db_temp );
335     undef $db_temp;
336
337     ##
338     # Attempt to copy user, group and permissions over to new file
339     ##
340     my @stats = stat($self->_fh);
341     my $perms = $stats[2] & 07777;
342     my $uid = $stats[4];
343     my $gid = $stats[5];
344     chown( $uid, $gid, $self->_root->{file} . '.tmp' );
345     chmod( $perms, $self->_root->{file} . '.tmp' );
346
347     # q.v. perlport for more information on this variable
348     if ( $^O eq 'MSWin32' || $^O eq 'cygwin' ) {
349         ##
350         # Potential race condition when optmizing on Win32 with locking.
351         # The Windows filesystem requires that the filehandle be closed
352         # before it is overwritten with rename().  This could be redone
353         # with a soft copy.
354         ##
355         $self->unlock();
356         $self->{engine}->close_fh( $self );
357     }
358
359     if (!rename $self->_root->{file} . '.tmp', $self->_root->{file}) {
360         unlink $self->_root->{file} . '.tmp';
361         $self->unlock();
362         $self->_throw_error("Optimize failed: Cannot copy temp file over original: $!");
363     }
364
365     $self->unlock();
366     $self->{engine}->close_fh( $self );
367     $self->{engine}->setup_fh( $self );
368
369     return 1;
370 }
371
372 sub clone {
373     ##
374     # Make copy of object and return
375     ##
376     my $self = $_[0]->_get_self;
377
378     return DBM::Deep->new(
379         type => $self->_type,
380         base_offset => $self->_base_offset,
381         root => $self->_root
382     );
383 }
384
385 {
386     my %is_legal_filter = map {
387         $_ => ~~1,
388     } qw(
389         store_key store_value
390         fetch_key fetch_value
391     );
392
393     sub set_filter {
394         ##
395         # Setup filter function for storing or fetching the key or value
396         ##
397         my $self = $_[0]->_get_self;
398         my $type = lc $_[1];
399         my $func = $_[2] ? $_[2] : undef;
400
401         if ( $is_legal_filter{$type} ) {
402             $self->_root->{"filter_$type"} = $func;
403             return 1;
404         }
405
406         return;
407     }
408 }
409
410 ##
411 # Accessor methods
412 ##
413
414 sub _root {
415     ##
416     # Get access to the root structure
417     ##
418     my $self = $_[0]->_get_self;
419     return $self->{root};
420 }
421
422 sub _fh {
423     ##
424     # Get access to the raw fh
425     ##
426     my $self = $_[0]->_get_self;
427     return $self->_root->{fh};
428 }
429
430 sub _type {
431     ##
432     # Get type of current node (TYPE_HASH or TYPE_ARRAY)
433     ##
434     my $self = $_[0]->_get_self;
435     return $self->{type};
436 }
437
438 sub _base_offset {
439     ##
440     # Get base_offset of current node (TYPE_HASH or TYPE_ARRAY)
441     ##
442     my $self = $_[0]->_get_self;
443     return $self->{base_offset};
444 }
445
446 ##
447 # Utility methods
448 ##
449
450 sub _throw_error {
451     die "DBM::Deep: $_[1]\n";
452 }
453
454 sub _is_writable {
455     my $fh = shift;
456     (O_WRONLY | O_RDWR) & fcntl( $fh, F_GETFL, my $slush = 0);
457 }
458
459 #sub _is_readable {
460 #    my $fh = shift;
461 #    (O_RDONLY | O_RDWR) & fcntl( $fh, F_GETFL, my $slush = 0);
462 #}
463
464 sub STORE {
465     ##
466     # Store single hash key/value or array element in database.
467     ##
468     my $self = shift->_get_self;
469     my ($key, $value) = @_;
470
471     unless ( _is_writable( $self->_fh ) ) {
472         $self->_throw_error( 'Cannot write to a readonly filehandle' );
473     }
474
475     ##
476     # Request exclusive lock for writing
477     ##
478     $self->lock( LOCK_EX );
479
480     my $md5 = $self->{engine}{digest}->($key);
481
482     my $tag = $self->{engine}->find_bucket_list( $self, $md5, { create => 1 } );
483
484     # User may be storing a hash, in which case we do not want it run
485     # through the filtering system
486     if ( !ref($value) && $self->_root->{filter_store_value} ) {
487         $value = $self->_root->{filter_store_value}->( $value );
488     }
489
490     ##
491     # Add key/value to bucket list
492     ##
493     my $result = $self->{engine}->add_bucket( $self, $tag, $md5, $key, $value );
494
495     $self->unlock();
496
497     return $result;
498 }
499
500 sub FETCH {
501     ##
502     # Fetch single value or element given plain key or array index
503     ##
504     my $self = shift->_get_self;
505     my $key = shift;
506
507     my $md5 = $self->{engine}{digest}->($key);
508
509     ##
510     # Request shared lock for reading
511     ##
512     $self->lock( LOCK_SH );
513
514     my $tag = $self->{engine}->find_bucket_list( $self, $md5 );
515     if (!$tag) {
516         $self->unlock();
517         return;
518     }
519
520     ##
521     # Get value from bucket list
522     ##
523     my $result = $self->{engine}->get_bucket_value( $self, $tag, $md5 );
524
525     $self->unlock();
526
527     # Filters only apply to scalar values, so the ref check is making
528     # sure the fetched bucket is a scalar, not a child hash or array.
529     return ($result && !ref($result) && $self->_root->{filter_fetch_value})
530         ? $self->_root->{filter_fetch_value}->($result)
531         : $result;
532 }
533
534 sub DELETE {
535     ##
536     # Delete single key/value pair or element given plain key or array index
537     ##
538     my $self = $_[0]->_get_self;
539     my $key = $_[1];
540
541     unless ( _is_writable( $self->_fh ) ) {
542         $self->_throw_error( 'Cannot write to a readonly filehandle' );
543     }
544
545     ##
546     # Request exclusive lock for writing
547     ##
548     $self->lock( LOCK_EX );
549
550     my $md5 = $self->{engine}{digest}->($key);
551
552     my $tag = $self->{engine}->find_bucket_list( $self, $md5 );
553     if (!$tag) {
554         $self->unlock();
555         return;
556     }
557
558     ##
559     # Delete bucket
560     ##
561     my $value = $self->{engine}->get_bucket_value($self,  $tag, $md5 );
562
563     if (defined $value && !ref($value) && $self->_root->{filter_fetch_value}) {
564         $value = $self->_root->{filter_fetch_value}->($value);
565     }
566
567     my $result = $self->{engine}->delete_bucket( $self, $tag, $md5 );
568
569     ##
570     # If this object is an array and the key deleted was on the end of the stack,
571     # decrement the length variable.
572     ##
573
574     $self->unlock();
575
576     return $value;
577 }
578
579 sub EXISTS {
580     ##
581     # Check if a single key or element exists given plain key or array index
582     ##
583     my $self = $_[0]->_get_self;
584     my $key = $_[1];
585
586     my $md5 = $self->{engine}{digest}->($key);
587
588     ##
589     # Request shared lock for reading
590     ##
591     $self->lock( LOCK_SH );
592
593     my $tag = $self->{engine}->find_bucket_list( $self, $md5 );
594     if (!$tag) {
595         $self->unlock();
596
597         ##
598         # For some reason, the built-in exists() function returns '' for false
599         ##
600         return '';
601     }
602
603     ##
604     # Check if bucket exists and return 1 or ''
605     ##
606     my $result = $self->{engine}->bucket_exists( $self, $tag, $md5 ) || '';
607
608     $self->unlock();
609
610     return $result;
611 }
612
613 sub CLEAR {
614     ##
615     # Clear all keys from hash, or all elements from array.
616     ##
617     my $self = $_[0]->_get_self;
618
619     unless ( _is_writable( $self->_fh ) ) {
620         $self->_throw_error( 'Cannot write to a readonly filehandle' );
621     }
622
623     ##
624     # Request exclusive lock for writing
625     ##
626     $self->lock( LOCK_EX );
627
628     my $fh = $self->_fh;
629
630     seek($fh, $self->_base_offset + $self->_root->{file_offset}, SEEK_SET);
631     if (eof $fh) {
632         $self->unlock();
633         return;
634     }
635
636     $self->{engine}->create_tag($self, $self->_base_offset, $self->_type, chr(0) x $self->{engine}{index_size});
637
638     $self->unlock();
639
640     return 1;
641 }
642
643 ##
644 # Public method aliases
645 ##
646 sub put { (shift)->STORE( @_ ) }
647 sub store { (shift)->STORE( @_ ) }
648 sub get { (shift)->FETCH( @_ ) }
649 sub fetch { (shift)->FETCH( @_ ) }
650 sub delete { (shift)->DELETE( @_ ) }
651 sub exists { (shift)->EXISTS( @_ ) }
652 sub clear { (shift)->CLEAR( @_ ) }
653
654 package DBM::Deep::_::Root;
655
656 sub new {
657     my $class = shift;
658     my ($args) = @_;
659
660     my $self = bless {
661         autobless          => undef,
662         autoflush          => undef,
663         #XXX It should be this in order to work with the initial create_tag(),
664         #XXX but it's not ... it works out because of the stat() in setup_fh(),
665         #XXX but that's not good.
666         end                => 0, #length(DBM::Deep->SIG_FILE),
667         fh                 => undef,
668         file               => undef,
669         file_offset        => 0,
670         locking            => undef,
671         locked             => 0,
672         filter_store_key   => undef,
673         filter_store_value => undef,
674         filter_fetch_key   => undef,
675         filter_fetch_value => undef,
676         %$args,
677     }, $class;
678
679     if ( $self->{fh} && !$self->{file_offset} ) {
680         $self->{file_offset} = tell( $self->{fh} );
681     }
682
683     return $self;
684 }
685
686 sub DESTROY {
687     my $self = shift;
688     return unless $self;
689
690     close $self->{fh} if $self->{fh};
691
692     return;
693 }
694
695 1;
696 __END__
697
698 =head1 NAME
699
700 DBM::Deep - A pure perl multi-level hash/array DBM
701
702 =head1 SYNOPSIS
703
704   use DBM::Deep;
705   my $db = DBM::Deep->new( "foo.db" );
706
707   $db->{key} = 'value'; # tie() style
708   print $db->{key};
709
710   $db->put('key' => 'value'); # OO style
711   print $db->get('key');
712
713   # true multi-level support
714   $db->{my_complex} = [
715       'hello', { perl => 'rules' },
716       42, 99,
717   ];
718
719 =head1 DESCRIPTION
720
721 A unique flat-file database module, written in pure perl.  True
722 multi-level hash/array support (unlike MLDBM, which is faked), hybrid
723 OO / tie() interface, cross-platform FTPable files, and quite fast.  Can
724 handle millions of keys and unlimited hash levels without significant
725 slow-down.  Written from the ground-up in pure perl -- this is NOT a
726 wrapper around a C-based DBM.  Out-of-the-box compatibility with Unix,
727 Mac OS X and Windows.
728
729 =head1 VERSION DIFFERENCES
730
731 B<NOTE>: 0.99_01 and above have significant file format differences from 0.98 and
732 before. While attempts have been made to be backwards compatible, no guarantees.
733
734 =head1 INSTALLATION
735
736 Hopefully you are using Perl's excellent CPAN module, which will download
737 and install the module for you.  If not, get the tarball, and run these
738 commands:
739
740     tar zxf DBM-Deep-*
741     cd DBM-Deep-*
742     perl Makefile.PL
743     make
744     make test
745     make install
746
747 =head1 SETUP
748
749 Construction can be done OO-style (which is the recommended way), or using
750 Perl's tie() function.  Both are examined here.
751
752 =head2 OO CONSTRUCTION
753
754 The recommended way to construct a DBM::Deep object is to use the new()
755 method, which gets you a blessed, tied hash or array reference.
756
757     my $db = DBM::Deep->new( "foo.db" );
758
759 This opens a new database handle, mapped to the file "foo.db".  If this
760 file does not exist, it will automatically be created.  DB files are
761 opened in "r+" (read/write) mode, and the type of object returned is a
762 hash, unless otherwise specified (see L<OPTIONS> below).
763
764 You can pass a number of options to the constructor to specify things like
765 locking, autoflush, etc.  This is done by passing an inline hash:
766
767     my $db = DBM::Deep->new(
768         file => "foo.db",
769         locking => 1,
770         autoflush => 1
771     );
772
773 Notice that the filename is now specified I<inside> the hash with
774 the "file" parameter, as opposed to being the sole argument to the
775 constructor.  This is required if any options are specified.
776 See L<OPTIONS> below for the complete list.
777
778
779
780 You can also start with an array instead of a hash.  For this, you must
781 specify the C<type> parameter:
782
783     my $db = DBM::Deep->new(
784         file => "foo.db",
785         type => DBM::Deep->TYPE_ARRAY
786     );
787
788 B<Note:> Specifing the C<type> parameter only takes effect when beginning
789 a new DB file.  If you create a DBM::Deep object with an existing file, the
790 C<type> will be loaded from the file header, and an error will be thrown if
791 the wrong type is passed in.
792
793 =head2 TIE CONSTRUCTION
794
795 Alternately, you can create a DBM::Deep handle by using Perl's built-in
796 tie() function.  The object returned from tie() can be used to call methods,
797 such as lock() and unlock(), but cannot be used to assign to the DBM::Deep
798 file (as expected with most tie'd objects).
799
800     my %hash;
801     my $db = tie %hash, "DBM::Deep", "foo.db";
802
803     my @array;
804     my $db = tie @array, "DBM::Deep", "bar.db";
805
806 As with the OO constructor, you can replace the DB filename parameter with
807 a hash containing one or more options (see L<OPTIONS> just below for the
808 complete list).
809
810     tie %hash, "DBM::Deep", {
811         file => "foo.db",
812         locking => 1,
813         autoflush => 1
814     };
815
816 =head2 OPTIONS
817
818 There are a number of options that can be passed in when constructing your
819 DBM::Deep objects.  These apply to both the OO- and tie- based approaches.
820
821 =over
822
823 =item * file
824
825 Filename of the DB file to link the handle to.  You can pass a full absolute
826 filesystem path, partial path, or a plain filename if the file is in the
827 current working directory.  This is a required parameter (though q.v. fh).
828
829 =item * fh
830
831 If you want, you can pass in the fh instead of the file. This is most useful for doing
832 something like:
833
834   my $db = DBM::Deep->new( { fh => \*DATA } );
835
836 You are responsible for making sure that the fh has been opened appropriately for your
837 needs. If you open it read-only and attempt to write, an exception will be thrown. If you
838 open it write-only or append-only, an exception will be thrown immediately as DBM::Deep
839 needs to read from the fh.
840
841 =item * file_offset
842
843 This is the offset within the file that the DBM::Deep db starts. Most of the time, you will
844 not need to set this. However, it's there if you want it.
845
846 If you pass in fh and do not set this, it will be set appropriately.
847
848 =item * type
849
850 This parameter specifies what type of object to create, a hash or array.  Use
851 one of these two constants: C<DBM::Deep-E<gt>TYPE_HASH> or C<DBM::Deep-E<gt>TYPE_ARRAY>.
852 This only takes effect when beginning a new file.  This is an optional
853 parameter, and defaults to C<DBM::Deep-E<gt>TYPE_HASH>.
854
855 =item * locking
856
857 Specifies whether locking is to be enabled.  DBM::Deep uses Perl's Fnctl flock()
858 function to lock the database in exclusive mode for writes, and shared mode for
859 reads.  Pass any true value to enable.  This affects the base DB handle I<and
860 any child hashes or arrays> that use the same DB file.  This is an optional
861 parameter, and defaults to 0 (disabled).  See L<LOCKING> below for more.
862
863 =item * autoflush
864
865 Specifies whether autoflush is to be enabled on the underlying filehandle.
866 This obviously slows down write operations, but is required if you may have
867 multiple processes accessing the same DB file (also consider enable I<locking>).
868 Pass any true value to enable.  This is an optional parameter, and defaults to 0
869 (disabled).
870
871 =item * autobless
872
873 If I<autobless> mode is enabled, DBM::Deep will preserve blessed hashes, and
874 restore them when fetched.  This is an B<experimental> feature, and does have
875 side-effects.  Basically, when hashes are re-blessed into their original
876 classes, they are no longer blessed into the DBM::Deep class!  So you won't be
877 able to call any DBM::Deep methods on them.  You have been warned.
878 This is an optional parameter, and defaults to 0 (disabled).
879
880 =item * filter_*
881
882 See L<FILTERS> below.
883
884 =back
885
886 =head1 TIE INTERFACE
887
888 With DBM::Deep you can access your databases using Perl's standard hash/array
889 syntax.  Because all DBM::Deep objects are I<tied> to hashes or arrays, you can
890 treat them as such.  DBM::Deep will intercept all reads/writes and direct them
891 to the right place -- the DB file.  This has nothing to do with the
892 L<TIE CONSTRUCTION> section above.  This simply tells you how to use DBM::Deep
893 using regular hashes and arrays, rather than calling functions like C<get()>
894 and C<put()> (although those work too).  It is entirely up to you how to want
895 to access your databases.
896
897 =head2 HASHES
898
899 You can treat any DBM::Deep object like a normal Perl hash reference.  Add keys,
900 or even nested hashes (or arrays) using standard Perl syntax:
901
902     my $db = DBM::Deep->new( "foo.db" );
903
904     $db->{mykey} = "myvalue";
905     $db->{myhash} = {};
906     $db->{myhash}->{subkey} = "subvalue";
907
908     print $db->{myhash}->{subkey} . "\n";
909
910 You can even step through hash keys using the normal Perl C<keys()> function:
911
912     foreach my $key (keys %$db) {
913         print "$key: " . $db->{$key} . "\n";
914     }
915
916 Remember that Perl's C<keys()> function extracts I<every> key from the hash and
917 pushes them onto an array, all before the loop even begins.  If you have an
918 extra large hash, this may exhaust Perl's memory.  Instead, consider using
919 Perl's C<each()> function, which pulls keys/values one at a time, using very
920 little memory:
921
922     while (my ($key, $value) = each %$db) {
923         print "$key: $value\n";
924     }
925
926 Please note that when using C<each()>, you should always pass a direct
927 hash reference, not a lookup.  Meaning, you should B<never> do this:
928
929     # NEVER DO THIS
930     while (my ($key, $value) = each %{$db->{foo}}) { # BAD
931
932 This causes an infinite loop, because for each iteration, Perl is calling
933 FETCH() on the $db handle, resulting in a "new" hash for foo every time, so
934 it effectively keeps returning the first key over and over again. Instead,
935 assign a temporary variable to C<$db->{foo}>, then pass that to each().
936
937 =head2 ARRAYS
938
939 As with hashes, you can treat any DBM::Deep object like a normal Perl array
940 reference.  This includes inserting, removing and manipulating elements,
941 and the C<push()>, C<pop()>, C<shift()>, C<unshift()> and C<splice()> functions.
942 The object must have first been created using type C<DBM::Deep-E<gt>TYPE_ARRAY>,
943 or simply be a nested array reference inside a hash.  Example:
944
945     my $db = DBM::Deep->new(
946         file => "foo-array.db",
947         type => DBM::Deep->TYPE_ARRAY
948     );
949
950     $db->[0] = "foo";
951     push @$db, "bar", "baz";
952     unshift @$db, "bah";
953
954     my $last_elem = pop @$db; # baz
955     my $first_elem = shift @$db; # bah
956     my $second_elem = $db->[1]; # bar
957
958     my $num_elements = scalar @$db;
959
960 =head1 OO INTERFACE
961
962 In addition to the I<tie()> interface, you can also use a standard OO interface
963 to manipulate all aspects of DBM::Deep databases.  Each type of object (hash or
964 array) has its own methods, but both types share the following common methods:
965 C<put()>, C<get()>, C<exists()>, C<delete()> and C<clear()>.
966
967 =over
968
969 =item * new() / clone()
970
971 These are the constructor and copy-functions.
972
973 =item * put() / store()
974
975 Stores a new hash key/value pair, or sets an array element value.  Takes two
976 arguments, the hash key or array index, and the new value.  The value can be
977 a scalar, hash ref or array ref.  Returns true on success, false on failure.
978
979     $db->put("foo", "bar"); # for hashes
980     $db->put(1, "bar"); # for arrays
981
982 =item * get() / fetch()
983
984 Fetches the value of a hash key or array element.  Takes one argument: the hash
985 key or array index.  Returns a scalar, hash ref or array ref, depending on the
986 data type stored.
987
988     my $value = $db->get("foo"); # for hashes
989     my $value = $db->get(1); # for arrays
990
991 =item * exists()
992
993 Checks if a hash key or array index exists.  Takes one argument: the hash key
994 or array index.  Returns true if it exists, false if not.
995
996     if ($db->exists("foo")) { print "yay!\n"; } # for hashes
997     if ($db->exists(1)) { print "yay!\n"; } # for arrays
998
999 =item * delete()
1000
1001 Deletes one hash key/value pair or array element.  Takes one argument: the hash
1002 key or array index.  Returns true on success, false if not found.  For arrays,
1003 the remaining elements located after the deleted element are NOT moved over.
1004 The deleted element is essentially just undefined, which is exactly how Perl's
1005 internal arrays work.  Please note that the space occupied by the deleted
1006 key/value or element is B<not> reused again -- see L<UNUSED SPACE RECOVERY>
1007 below for details and workarounds.
1008
1009     $db->delete("foo"); # for hashes
1010     $db->delete(1); # for arrays
1011
1012 =item * clear()
1013
1014 Deletes B<all> hash keys or array elements.  Takes no arguments.  No return
1015 value.  Please note that the space occupied by the deleted keys/values or
1016 elements is B<not> reused again -- see L<UNUSED SPACE RECOVERY> below for
1017 details and workarounds.
1018
1019     $db->clear(); # hashes or arrays
1020
1021 =item * lock() / unlock()
1022
1023 q.v. Locking.
1024
1025 =item * optimize()
1026
1027 Recover lost disk space.
1028
1029 =item * import() / export()
1030
1031 Data going in and out.
1032
1033 =item * set_digest() / set_pack() / set_filter()
1034
1035 q.v. adjusting the interal parameters.
1036
1037 =back
1038
1039 =head2 HASHES
1040
1041 For hashes, DBM::Deep supports all the common methods described above, and the
1042 following additional methods: C<first_key()> and C<next_key()>.
1043
1044 =over
1045
1046 =item * first_key()
1047
1048 Returns the "first" key in the hash.  As with built-in Perl hashes, keys are
1049 fetched in an undefined order (which appears random).  Takes no arguments,
1050 returns the key as a scalar value.
1051
1052     my $key = $db->first_key();
1053
1054 =item * next_key()
1055
1056 Returns the "next" key in the hash, given the previous one as the sole argument.
1057 Returns undef if there are no more keys to be fetched.
1058
1059     $key = $db->next_key($key);
1060
1061 =back
1062
1063 Here are some examples of using hashes:
1064
1065     my $db = DBM::Deep->new( "foo.db" );
1066
1067     $db->put("foo", "bar");
1068     print "foo: " . $db->get("foo") . "\n";
1069
1070     $db->put("baz", {}); # new child hash ref
1071     $db->get("baz")->put("buz", "biz");
1072     print "buz: " . $db->get("baz")->get("buz") . "\n";
1073
1074     my $key = $db->first_key();
1075     while ($key) {
1076         print "$key: " . $db->get($key) . "\n";
1077         $key = $db->next_key($key);
1078     }
1079
1080     if ($db->exists("foo")) { $db->delete("foo"); }
1081
1082 =head2 ARRAYS
1083
1084 For arrays, DBM::Deep supports all the common methods described above, and the
1085 following additional methods: C<length()>, C<push()>, C<pop()>, C<shift()>,
1086 C<unshift()> and C<splice()>.
1087
1088 =over
1089
1090 =item * length()
1091
1092 Returns the number of elements in the array.  Takes no arguments.
1093
1094     my $len = $db->length();
1095
1096 =item * push()
1097
1098 Adds one or more elements onto the end of the array.  Accepts scalars, hash
1099 refs or array refs.  No return value.
1100
1101     $db->push("foo", "bar", {});
1102
1103 =item * pop()
1104
1105 Fetches the last element in the array, and deletes it.  Takes no arguments.
1106 Returns undef if array is empty.  Returns the element value.
1107
1108     my $elem = $db->pop();
1109
1110 =item * shift()
1111
1112 Fetches the first element in the array, deletes it, then shifts all the
1113 remaining elements over to take up the space.  Returns the element value.  This
1114 method is not recommended with large arrays -- see L<LARGE ARRAYS> below for
1115 details.
1116
1117     my $elem = $db->shift();
1118
1119 =item * unshift()
1120
1121 Inserts one or more elements onto the beginning of the array, shifting all
1122 existing elements over to make room.  Accepts scalars, hash refs or array refs.
1123 No return value.  This method is not recommended with large arrays -- see
1124 <LARGE ARRAYS> below for details.
1125
1126     $db->unshift("foo", "bar", {});
1127
1128 =item * splice()
1129
1130 Performs exactly like Perl's built-in function of the same name.  See L<perldoc
1131 -f splice> for usage -- it is too complicated to document here.  This method is
1132 not recommended with large arrays -- see L<LARGE ARRAYS> below for details.
1133
1134 =back
1135
1136 Here are some examples of using arrays:
1137
1138     my $db = DBM::Deep->new(
1139         file => "foo.db",
1140         type => DBM::Deep->TYPE_ARRAY
1141     );
1142
1143     $db->push("bar", "baz");
1144     $db->unshift("foo");
1145     $db->put(3, "buz");
1146
1147     my $len = $db->length();
1148     print "length: $len\n"; # 4
1149
1150     for (my $k=0; $k<$len; $k++) {
1151         print "$k: " . $db->get($k) . "\n";
1152     }
1153
1154     $db->splice(1, 2, "biz", "baf");
1155
1156     while (my $elem = shift @$db) {
1157         print "shifted: $elem\n";
1158     }
1159
1160 =head1 LOCKING
1161
1162 Enable automatic file locking by passing a true value to the C<locking>
1163 parameter when constructing your DBM::Deep object (see L<SETUP> above).
1164
1165     my $db = DBM::Deep->new(
1166         file => "foo.db",
1167         locking => 1
1168     );
1169
1170 This causes DBM::Deep to C<flock()> the underlying filehandle with exclusive
1171 mode for writes, and shared mode for reads.  This is required if you have
1172 multiple processes accessing the same database file, to avoid file corruption.
1173 Please note that C<flock()> does NOT work for files over NFS.  See L<DB OVER
1174 NFS> below for more.
1175
1176 =head2 EXPLICIT LOCKING
1177
1178 You can explicitly lock a database, so it remains locked for multiple
1179 transactions.  This is done by calling the C<lock()> method, and passing an
1180 optional lock mode argument (defaults to exclusive mode).  This is particularly
1181 useful for things like counters, where the current value needs to be fetched,
1182 then incremented, then stored again.
1183
1184     $db->lock();
1185     my $counter = $db->get("counter");
1186     $counter++;
1187     $db->put("counter", $counter);
1188     $db->unlock();
1189
1190     # or...
1191
1192     $db->lock();
1193     $db->{counter}++;
1194     $db->unlock();
1195
1196 You can pass C<lock()> an optional argument, which specifies which mode to use
1197 (exclusive or shared).  Use one of these two constants: C<DBM::Deep-E<gt>LOCK_EX>
1198 or C<DBM::Deep-E<gt>LOCK_SH>.  These are passed directly to C<flock()>, and are the
1199 same as the constants defined in Perl's C<Fcntl> module.
1200
1201     $db->lock( DBM::Deep->LOCK_SH );
1202     # something here
1203     $db->unlock();
1204
1205 =head1 IMPORTING/EXPORTING
1206
1207 You can import existing complex structures by calling the C<import()> method,
1208 and export an entire database into an in-memory structure using the C<export()>
1209 method.  Both are examined here.
1210
1211 =head2 IMPORTING
1212
1213 Say you have an existing hash with nested hashes/arrays inside it.  Instead of
1214 walking the structure and adding keys/elements to the database as you go,
1215 simply pass a reference to the C<import()> method.  This recursively adds
1216 everything to an existing DBM::Deep object for you.  Here is an example:
1217
1218     my $struct = {
1219         key1 => "value1",
1220         key2 => "value2",
1221         array1 => [ "elem0", "elem1", "elem2" ],
1222         hash1 => {
1223             subkey1 => "subvalue1",
1224             subkey2 => "subvalue2"
1225         }
1226     };
1227
1228     my $db = DBM::Deep->new( "foo.db" );
1229     $db->import( $struct );
1230
1231     print $db->{key1} . "\n"; # prints "value1"
1232
1233 This recursively imports the entire C<$struct> object into C<$db>, including
1234 all nested hashes and arrays.  If the DBM::Deep object contains exsiting data,
1235 keys are merged with the existing ones, replacing if they already exist.
1236 The C<import()> method can be called on any database level (not just the base
1237 level), and works with both hash and array DB types.
1238
1239 B<Note:> Make sure your existing structure has no circular references in it.
1240 These will cause an infinite loop when importing.
1241
1242 =head2 EXPORTING
1243
1244 Calling the C<export()> method on an existing DBM::Deep object will return
1245 a reference to a new in-memory copy of the database.  The export is done
1246 recursively, so all nested hashes/arrays are all exported to standard Perl
1247 objects.  Here is an example:
1248
1249     my $db = DBM::Deep->new( "foo.db" );
1250
1251     $db->{key1} = "value1";
1252     $db->{key2} = "value2";
1253     $db->{hash1} = {};
1254     $db->{hash1}->{subkey1} = "subvalue1";
1255     $db->{hash1}->{subkey2} = "subvalue2";
1256
1257     my $struct = $db->export();
1258
1259     print $struct->{key1} . "\n"; # prints "value1"
1260
1261 This makes a complete copy of the database in memory, and returns a reference
1262 to it.  The C<export()> method can be called on any database level (not just
1263 the base level), and works with both hash and array DB types.  Be careful of
1264 large databases -- you can store a lot more data in a DBM::Deep object than an
1265 in-memory Perl structure.
1266
1267 B<Note:> Make sure your database has no circular references in it.
1268 These will cause an infinite loop when exporting.
1269
1270 =head1 FILTERS
1271
1272 DBM::Deep has a number of hooks where you can specify your own Perl function
1273 to perform filtering on incoming or outgoing data.  This is a perfect
1274 way to extend the engine, and implement things like real-time compression or
1275 encryption.  Filtering applies to the base DB level, and all child hashes /
1276 arrays.  Filter hooks can be specified when your DBM::Deep object is first
1277 constructed, or by calling the C<set_filter()> method at any time.  There are
1278 four available filter hooks, described below:
1279
1280 =over
1281
1282 =item * filter_store_key
1283
1284 This filter is called whenever a hash key is stored.  It
1285 is passed the incoming key, and expected to return a transformed key.
1286
1287 =item * filter_store_value
1288
1289 This filter is called whenever a hash key or array element is stored.  It
1290 is passed the incoming value, and expected to return a transformed value.
1291
1292 =item * filter_fetch_key
1293
1294 This filter is called whenever a hash key is fetched (i.e. via
1295 C<first_key()> or C<next_key()>).  It is passed the transformed key,
1296 and expected to return the plain key.
1297
1298 =item * filter_fetch_value
1299
1300 This filter is called whenever a hash key or array element is fetched.
1301 It is passed the transformed value, and expected to return the plain value.
1302
1303 =back
1304
1305 Here are the two ways to setup a filter hook:
1306
1307     my $db = DBM::Deep->new(
1308         file => "foo.db",
1309         filter_store_value => \&my_filter_store,
1310         filter_fetch_value => \&my_filter_fetch
1311     );
1312
1313     # or...
1314
1315     $db->set_filter( "filter_store_value", \&my_filter_store );
1316     $db->set_filter( "filter_fetch_value", \&my_filter_fetch );
1317
1318 Your filter function will be called only when dealing with SCALAR keys or
1319 values.  When nested hashes and arrays are being stored/fetched, filtering
1320 is bypassed.  Filters are called as static functions, passed a single SCALAR
1321 argument, and expected to return a single SCALAR value.  If you want to
1322 remove a filter, set the function reference to C<undef>:
1323
1324     $db->set_filter( "filter_store_value", undef );
1325
1326 =head2 REAL-TIME ENCRYPTION EXAMPLE
1327
1328 Here is a working example that uses the I<Crypt::Blowfish> module to
1329 do real-time encryption / decryption of keys & values with DBM::Deep Filters.
1330 Please visit L<http://search.cpan.org/search?module=Crypt::Blowfish> for more
1331 on I<Crypt::Blowfish>.  You'll also need the I<Crypt::CBC> module.
1332
1333     use DBM::Deep;
1334     use Crypt::Blowfish;
1335     use Crypt::CBC;
1336
1337     my $cipher = Crypt::CBC->new({
1338         'key'             => 'my secret key',
1339         'cipher'          => 'Blowfish',
1340         'iv'              => '$KJh#(}q',
1341         'regenerate_key'  => 0,
1342         'padding'         => 'space',
1343         'prepend_iv'      => 0
1344     });
1345
1346     my $db = DBM::Deep->new(
1347         file => "foo-encrypt.db",
1348         filter_store_key => \&my_encrypt,
1349         filter_store_value => \&my_encrypt,
1350         filter_fetch_key => \&my_decrypt,
1351         filter_fetch_value => \&my_decrypt,
1352     );
1353
1354     $db->{key1} = "value1";
1355     $db->{key2} = "value2";
1356     print "key1: " . $db->{key1} . "\n";
1357     print "key2: " . $db->{key2} . "\n";
1358
1359     undef $db;
1360     exit;
1361
1362     sub my_encrypt {
1363         return $cipher->encrypt( $_[0] );
1364     }
1365     sub my_decrypt {
1366         return $cipher->decrypt( $_[0] );
1367     }
1368
1369 =head2 REAL-TIME COMPRESSION EXAMPLE
1370
1371 Here is a working example that uses the I<Compress::Zlib> module to do real-time
1372 compression / decompression of keys & values with DBM::Deep Filters.
1373 Please visit L<http://search.cpan.org/search?module=Compress::Zlib> for
1374 more on I<Compress::Zlib>.
1375
1376     use DBM::Deep;
1377     use Compress::Zlib;
1378
1379     my $db = DBM::Deep->new(
1380         file => "foo-compress.db",
1381         filter_store_key => \&my_compress,
1382         filter_store_value => \&my_compress,
1383         filter_fetch_key => \&my_decompress,
1384         filter_fetch_value => \&my_decompress,
1385     );
1386
1387     $db->{key1} = "value1";
1388     $db->{key2} = "value2";
1389     print "key1: " . $db->{key1} . "\n";
1390     print "key2: " . $db->{key2} . "\n";
1391
1392     undef $db;
1393     exit;
1394
1395     sub my_compress {
1396         return Compress::Zlib::memGzip( $_[0] ) ;
1397     }
1398     sub my_decompress {
1399         return Compress::Zlib::memGunzip( $_[0] ) ;
1400     }
1401
1402 B<Note:> Filtering of keys only applies to hashes.  Array "keys" are
1403 actually numerical index numbers, and are not filtered.
1404
1405 =head1 ERROR HANDLING
1406
1407 Most DBM::Deep methods return a true value for success, and call die() on
1408 failure.  You can wrap calls in an eval block to catch the die.
1409
1410     my $db = DBM::Deep->new( "foo.db" ); # create hash
1411     eval { $db->push("foo"); }; # ILLEGAL -- push is array-only call
1412
1413     print $@;           # prints error message
1414
1415 =head1 LARGEFILE SUPPORT
1416
1417 If you have a 64-bit system, and your Perl is compiled with both LARGEFILE
1418 and 64-bit support, you I<may> be able to create databases larger than 2 GB.
1419 DBM::Deep by default uses 32-bit file offset tags, but these can be changed
1420 by calling the static C<set_pack()> method before you do anything else.
1421
1422     DBM::Deep::set_pack(8, 'Q');
1423
1424 This tells DBM::Deep to pack all file offsets with 8-byte (64-bit) quad words
1425 instead of 32-bit longs.  After setting these values your DB files have a
1426 theoretical maximum size of 16 XB (exabytes).
1427
1428 B<Note:> Changing these values will B<NOT> work for existing database files.
1429 Only change this for new files, and make sure it stays set consistently
1430 throughout the file's life.  If you do set these values, you can no longer
1431 access 32-bit DB files.  You can, however, call C<set_pack(4, 'N')> to change
1432 back to 32-bit mode.
1433
1434 B<Note:> I have not personally tested files > 2 GB -- all my systems have
1435 only a 32-bit Perl.  However, I have received user reports that this does
1436 indeed work!
1437
1438 =head1 LOW-LEVEL ACCESS
1439
1440 If you require low-level access to the underlying filehandle that DBM::Deep uses,
1441 you can call the C<_fh()> method, which returns the handle:
1442
1443     my $fh = $db->_fh();
1444
1445 This method can be called on the root level of the datbase, or any child
1446 hashes or arrays.  All levels share a I<root> structure, which contains things
1447 like the filehandle, a reference counter, and all the options specified
1448 when you created the object.  You can get access to this root structure by
1449 calling the C<root()> method.
1450
1451     my $root = $db->_root();
1452
1453 This is useful for changing options after the object has already been created,
1454 such as enabling/disabling locking.  You can also store your own temporary user
1455 data in this structure (be wary of name collision), which is then accessible from
1456 any child hash or array.
1457
1458 =head1 CUSTOM DIGEST ALGORITHM
1459
1460 DBM::Deep by default uses the I<Message Digest 5> (MD5) algorithm for hashing
1461 keys.  However you can override this, and use another algorithm (such as SHA-256)
1462 or even write your own.  But please note that DBM::Deep currently expects zero
1463 collisions, so your algorithm has to be I<perfect>, so to speak.
1464 Collision detection may be introduced in a later version.
1465
1466
1467
1468 You can specify a custom digest algorithm by calling the static C<set_digest()>
1469 function, passing a reference to a subroutine, and the length of the algorithm's
1470 hashes (in bytes).  This is a global static function, which affects ALL DBM::Deep
1471 objects.  Here is a working example that uses a 256-bit hash from the
1472 I<Digest::SHA256> module.  Please see
1473 L<http://search.cpan.org/search?module=Digest::SHA256> for more.
1474
1475     use DBM::Deep;
1476     use Digest::SHA256;
1477
1478     my $context = Digest::SHA256::new(256);
1479
1480     DBM::Deep::set_digest( \&my_digest, 32 );
1481
1482     my $db = DBM::Deep->new( "foo-sha.db" );
1483
1484     $db->{key1} = "value1";
1485     $db->{key2} = "value2";
1486     print "key1: " . $db->{key1} . "\n";
1487     print "key2: " . $db->{key2} . "\n";
1488
1489     undef $db;
1490     exit;
1491
1492     sub my_digest {
1493         return substr( $context->hash($_[0]), 0, 32 );
1494     }
1495
1496 B<Note:> Your returned digest strings must be B<EXACTLY> the number
1497 of bytes you specify in the C<set_digest()> function (in this case 32).
1498
1499 =head1 CIRCULAR REFERENCES
1500
1501 DBM::Deep has B<experimental> support for circular references.  Meaning you
1502 can have a nested hash key or array element that points to a parent object.
1503 This relationship is stored in the DB file, and is preserved between sessions.
1504 Here is an example:
1505
1506     my $db = DBM::Deep->new( "foo.db" );
1507
1508     $db->{foo} = "bar";
1509     $db->{circle} = $db; # ref to self
1510
1511     print $db->{foo} . "\n"; # prints "foo"
1512     print $db->{circle}->{foo} . "\n"; # prints "foo" again
1513
1514 B<Note>: Passing the object to a function that recursively walks the
1515 object tree (such as I<Data::Dumper> or even the built-in C<optimize()> or
1516 C<export()> methods) will result in an infinite loop. This will be fixed in
1517 a future release.
1518
1519 =head1 CAVEATS / ISSUES / BUGS
1520
1521 This section describes all the known issues with DBM::Deep.  It you have found
1522 something that is not listed here, please send e-mail to L<jhuckaby@cpan.org>.
1523
1524 =head2 UNUSED SPACE RECOVERY
1525
1526 One major caveat with DBM::Deep is that space occupied by existing keys and
1527 values is not recovered when they are deleted.  Meaning if you keep deleting
1528 and adding new keys, your file will continuously grow.  I am working on this,
1529 but in the meantime you can call the built-in C<optimize()> method from time to
1530 time (perhaps in a crontab or something) to recover all your unused space.
1531
1532     $db->optimize(); # returns true on success
1533
1534 This rebuilds the ENTIRE database into a new file, then moves it on top of
1535 the original.  The new file will have no unused space, thus it will take up as
1536 little disk space as possible.  Please note that this operation can take
1537 a long time for large files, and you need enough disk space to temporarily hold
1538 2 copies of your DB file.  The temporary file is created in the same directory
1539 as the original, named with a ".tmp" extension, and is deleted when the
1540 operation completes.  Oh, and if locking is enabled, the DB is automatically
1541 locked for the entire duration of the copy.
1542
1543 B<WARNING:> Only call optimize() on the top-level node of the database, and
1544 make sure there are no child references lying around.  DBM::Deep keeps a reference
1545 counter, and if it is greater than 1, optimize() will abort and return undef.
1546
1547 =head2 AUTOVIVIFICATION
1548
1549 Unfortunately, autovivification doesn't work with tied hashes.  This appears to
1550 be a bug in Perl's tie() system, as I<Jakob Schmidt> encountered the very same
1551 issue with his I<DWH_FIle> module (see L<http://search.cpan.org/search?module=DWH_File>),
1552 and it is also mentioned in the BUGS section for the I<MLDBM> module <see
1553 L<http://search.cpan.org/search?module=MLDBM>).  Basically, on a new db file,
1554 this does not work:
1555
1556     $db->{foo}->{bar} = "hello";
1557
1558 Since "foo" doesn't exist, you cannot add "bar" to it.  You end up with "foo"
1559 being an empty hash.  Try this instead, which works fine:
1560
1561     $db->{foo} = { bar => "hello" };
1562
1563 As of Perl 5.8.7, this bug still exists.  I have walked very carefully through
1564 the execution path, and Perl indeed passes an empty hash to the STORE() method.
1565 Probably a bug in Perl.
1566
1567 =head2 REFERENCES
1568
1569 (The reasons given assume a high level of Perl understanding, specifically of
1570 references. You can safely skip this section.)
1571
1572 Currently, the only references supported are HASH and ARRAY. The other reference
1573 types (SCALAR, CODE, GLOB, and REF) cannot be supported for various reasons.
1574
1575 =over 4
1576
1577 =item * GLOB
1578
1579 These are things like filehandles and other sockets. They can't be supported
1580 because it's completely unclear how DBM::Deep should serialize them.
1581
1582 =item * SCALAR / REF
1583
1584 The discussion here refers to the following type of example:
1585
1586   my $x = 25;
1587   $db->{key1} = \$x;
1588
1589   $x = 50;
1590
1591   # In some other process ...
1592
1593   my $val = ${ $db->{key1} };
1594
1595   is( $val, 50, "What actually gets stored in the DB file?" );
1596
1597 The problem is one of synchronization. When the variable being referred to
1598 changes value, the reference isn't notified. This means that the new value won't
1599 be stored in the datafile for other processes to read. There is no TIEREF.
1600
1601 It is theoretically possible to store references to values already within a
1602 DBM::Deep object because everything already is synchronized, but the change to
1603 the internals would be quite large. Specifically, DBM::Deep would have to tie
1604 every single value that is stored. This would bloat the RAM footprint of
1605 DBM::Deep at least twofold (if not more) and be a significant performance drain,
1606 all to support a feature that has never been requested.
1607
1608 =item * CODE
1609
1610 L<http://search.cpan.org/search?module=Data::Dump::Streamer> provides a
1611 mechanism for serializing coderefs, including saving off all closure state.
1612 However, just as for SCALAR and REF, that closure state may change without
1613 notifying the DBM::Deep object storing the reference.
1614
1615 =back
1616
1617 =head2 FILE CORRUPTION
1618
1619 The current level of error handling in DBM::Deep is minimal.  Files I<are> checked
1620 for a 32-bit signature when opened, but other corruption in files can cause
1621 segmentation faults.  DBM::Deep may try to seek() past the end of a file, or get
1622 stuck in an infinite loop depending on the level of corruption.  File write
1623 operations are not checked for failure (for speed), so if you happen to run
1624 out of disk space, DBM::Deep will probably fail in a bad way.  These things will
1625 be addressed in a later version of DBM::Deep.
1626
1627 =head2 DB OVER NFS
1628
1629 Beware of using DB files over NFS.  DBM::Deep uses flock(), which works well on local
1630 filesystems, but will NOT protect you from file corruption over NFS.  I've heard
1631 about setting up your NFS server with a locking daemon, then using lockf() to
1632 lock your files, but your mileage may vary there as well.  From what I
1633 understand, there is no real way to do it.  However, if you need access to the
1634 underlying filehandle in DBM::Deep for using some other kind of locking scheme like
1635 lockf(), see the L<LOW-LEVEL ACCESS> section above.
1636
1637 =head2 COPYING OBJECTS
1638
1639 Beware of copying tied objects in Perl.  Very strange things can happen.
1640 Instead, use DBM::Deep's C<clone()> method which safely copies the object and
1641 returns a new, blessed, tied hash or array to the same level in the DB.
1642
1643     my $copy = $db->clone();
1644
1645 B<Note>: Since clone() here is cloning the object, not the database location, any
1646 modifications to either $db or $copy will be visible in both.
1647
1648 =head2 LARGE ARRAYS
1649
1650 Beware of using C<shift()>, C<unshift()> or C<splice()> with large arrays.
1651 These functions cause every element in the array to move, which can be murder
1652 on DBM::Deep, as every element has to be fetched from disk, then stored again in
1653 a different location.  This will be addressed in the forthcoming version 1.00.
1654
1655 =head2 WRITEONLY FILES
1656
1657 If you pass in a filehandle to new(), you may have opened it in either a readonly or
1658 writeonly mode. STORE will verify that the filehandle is writable. However, there
1659 doesn't seem to be a good way to determine if a filehandle is readable. And, if the
1660 filehandle isn't readable, it's not clear what will happen. So, don't do that.
1661
1662 =head1 PERFORMANCE
1663
1664 This section discusses DBM::Deep's speed and memory usage.
1665
1666 =head2 SPEED
1667
1668 Obviously, DBM::Deep isn't going to be as fast as some C-based DBMs, such as
1669 the almighty I<BerkeleyDB>.  But it makes up for it in features like true
1670 multi-level hash/array support, and cross-platform FTPable files.  Even so,
1671 DBM::Deep is still pretty fast, and the speed stays fairly consistent, even
1672 with huge databases.  Here is some test data:
1673
1674     Adding 1,000,000 keys to new DB file...
1675
1676     At 100 keys, avg. speed is 2,703 keys/sec
1677     At 200 keys, avg. speed is 2,642 keys/sec
1678     At 300 keys, avg. speed is 2,598 keys/sec
1679     At 400 keys, avg. speed is 2,578 keys/sec
1680     At 500 keys, avg. speed is 2,722 keys/sec
1681     At 600 keys, avg. speed is 2,628 keys/sec
1682     At 700 keys, avg. speed is 2,700 keys/sec
1683     At 800 keys, avg. speed is 2,607 keys/sec
1684     At 900 keys, avg. speed is 2,190 keys/sec
1685     At 1,000 keys, avg. speed is 2,570 keys/sec
1686     At 2,000 keys, avg. speed is 2,417 keys/sec
1687     At 3,000 keys, avg. speed is 1,982 keys/sec
1688     At 4,000 keys, avg. speed is 1,568 keys/sec
1689     At 5,000 keys, avg. speed is 1,533 keys/sec
1690     At 6,000 keys, avg. speed is 1,787 keys/sec
1691     At 7,000 keys, avg. speed is 1,977 keys/sec
1692     At 8,000 keys, avg. speed is 2,028 keys/sec
1693     At 9,000 keys, avg. speed is 2,077 keys/sec
1694     At 10,000 keys, avg. speed is 2,031 keys/sec
1695     At 20,000 keys, avg. speed is 1,970 keys/sec
1696     At 30,000 keys, avg. speed is 2,050 keys/sec
1697     At 40,000 keys, avg. speed is 2,073 keys/sec
1698     At 50,000 keys, avg. speed is 1,973 keys/sec
1699     At 60,000 keys, avg. speed is 1,914 keys/sec
1700     At 70,000 keys, avg. speed is 2,091 keys/sec
1701     At 80,000 keys, avg. speed is 2,103 keys/sec
1702     At 90,000 keys, avg. speed is 1,886 keys/sec
1703     At 100,000 keys, avg. speed is 1,970 keys/sec
1704     At 200,000 keys, avg. speed is 2,053 keys/sec
1705     At 300,000 keys, avg. speed is 1,697 keys/sec
1706     At 400,000 keys, avg. speed is 1,838 keys/sec
1707     At 500,000 keys, avg. speed is 1,941 keys/sec
1708     At 600,000 keys, avg. speed is 1,930 keys/sec
1709     At 700,000 keys, avg. speed is 1,735 keys/sec
1710     At 800,000 keys, avg. speed is 1,795 keys/sec
1711     At 900,000 keys, avg. speed is 1,221 keys/sec
1712     At 1,000,000 keys, avg. speed is 1,077 keys/sec
1713
1714 This test was performed on a PowerMac G4 1gHz running Mac OS X 10.3.2 & Perl
1715 5.8.1, with an 80GB Ultra ATA/100 HD spinning at 7200RPM.  The hash keys and
1716 values were between 6 - 12 chars in length.  The DB file ended up at 210MB.
1717 Run time was 12 min 3 sec.
1718
1719 =head2 MEMORY USAGE
1720
1721 One of the great things about DBM::Deep is that it uses very little memory.
1722 Even with huge databases (1,000,000+ keys) you will not see much increased
1723 memory on your process.  DBM::Deep relies solely on the filesystem for storing
1724 and fetching data.  Here is output from I</usr/bin/top> before even opening a
1725 database handle:
1726
1727       PID USER     PRI  NI  SIZE  RSS SHARE STAT %CPU %MEM   TIME COMMAND
1728     22831 root      11   0  2716 2716  1296 R     0.0  0.2   0:07 perl
1729
1730 Basically the process is taking 2,716K of memory.  And here is the same
1731 process after storing and fetching 1,000,000 keys:
1732
1733       PID USER     PRI  NI  SIZE  RSS SHARE STAT %CPU %MEM   TIME COMMAND
1734     22831 root      14   0  2772 2772  1328 R     0.0  0.2  13:32 perl
1735
1736 Notice the memory usage increased by only 56K.  Test was performed on a 700mHz
1737 x86 box running Linux RedHat 7.2 & Perl 5.6.1.
1738
1739 =head1 DB FILE FORMAT
1740
1741 In case you were interested in the underlying DB file format, it is documented
1742 here in this section.  You don't need to know this to use the module, it's just
1743 included for reference.
1744
1745 =head2 SIGNATURE
1746
1747 DBM::Deep files always start with a 32-bit signature to identify the file type.
1748 This is at offset 0.  The signature is "DPDB" in network byte order.  This is
1749 checked for when the file is opened and an error will be thrown if it's not found.
1750
1751 =head2 TAG
1752
1753 The DBM::Deep file is in a I<tagged format>, meaning each section of the file
1754 has a standard header containing the type of data, the length of data, and then
1755 the data itself.  The type is a single character (1 byte), the length is a
1756 32-bit unsigned long in network byte order, and the data is, well, the data.
1757 Here is how it unfolds:
1758
1759 =head2 MASTER INDEX
1760
1761 Immediately after the 32-bit file signature is the I<Master Index> record.
1762 This is a standard tag header followed by 1024 bytes (in 32-bit mode) or 2048
1763 bytes (in 64-bit mode) of data.  The type is I<H> for hash or I<A> for array,
1764 depending on how the DBM::Deep object was constructed.
1765
1766 The index works by looking at a I<MD5 Hash> of the hash key (or array index
1767 number).  The first 8-bit char of the MD5 signature is the offset into the
1768 index, multipled by 4 in 32-bit mode, or 8 in 64-bit mode.  The value of the
1769 index element is a file offset of the next tag for the key/element in question,
1770 which is usually a I<Bucket List> tag (see below).
1771
1772 The next tag I<could> be another index, depending on how many keys/elements
1773 exist.  See L<RE-INDEXING> below for details.
1774
1775 =head2 BUCKET LIST
1776
1777 A I<Bucket List> is a collection of 16 MD5 hashes for keys/elements, plus
1778 file offsets to where the actual data is stored.  It starts with a standard
1779 tag header, with type I<B>, and a data size of 320 bytes in 32-bit mode, or
1780 384 bytes in 64-bit mode.  Each MD5 hash is stored in full (16 bytes), plus
1781 the 32-bit or 64-bit file offset for the I<Bucket> containing the actual data.
1782 When the list fills up, a I<Re-Index> operation is performed (See
1783 L<RE-INDEXING> below).
1784
1785 =head2 BUCKET
1786
1787 A I<Bucket> is a tag containing a key/value pair (in hash mode), or a
1788 index/value pair (in array mode).  It starts with a standard tag header with
1789 type I<D> for scalar data (string, binary, etc.), or it could be a nested
1790 hash (type I<H>) or array (type I<A>).  The value comes just after the tag
1791 header.  The size reported in the tag header is only for the value, but then,
1792 just after the value is another size (32-bit unsigned long) and then the plain
1793 key itself.  Since the value is likely to be fetched more often than the plain
1794 key, I figured it would be I<slightly> faster to store the value first.
1795
1796 If the type is I<H> (hash) or I<A> (array), the value is another I<Master Index>
1797 record for the nested structure, where the process begins all over again.
1798
1799 =head2 RE-INDEXING
1800
1801 After a I<Bucket List> grows to 16 records, its allocated space in the file is
1802 exhausted.  Then, when another key/element comes in, the list is converted to a
1803 new index record.  However, this index will look at the next char in the MD5
1804 hash, and arrange new Bucket List pointers accordingly.  This process is called
1805 I<Re-Indexing>.  Basically, a new index tag is created at the file EOF, and all
1806 17 (16 + new one) keys/elements are removed from the old Bucket List and
1807 inserted into the new index.  Several new Bucket Lists are created in the
1808 process, as a new MD5 char from the key is being examined (it is unlikely that
1809 the keys will all share the same next char of their MD5s).
1810
1811 Because of the way the I<MD5> algorithm works, it is impossible to tell exactly
1812 when the Bucket Lists will turn into indexes, but the first round tends to
1813 happen right around 4,000 keys.  You will see a I<slight> decrease in
1814 performance here, but it picks back up pretty quick (see L<SPEED> above).  Then
1815 it takes B<a lot> more keys to exhaust the next level of Bucket Lists.  It's
1816 right around 900,000 keys.  This process can continue nearly indefinitely --
1817 right up until the point the I<MD5> signatures start colliding with each other,
1818 and this is B<EXTREMELY> rare -- like winning the lottery 5 times in a row AND
1819 getting struck by lightning while you are walking to cash in your tickets.
1820 Theoretically, since I<MD5> hashes are 128-bit values, you I<could> have up to
1821 340,282,366,921,000,000,000,000,000,000,000,000,000 keys/elements (I believe
1822 this is 340 unodecillion, but don't quote me).
1823
1824 =head2 STORING
1825
1826 When a new key/element is stored, the key (or index number) is first run through
1827 I<Digest::MD5> to get a 128-bit signature (example, in hex:
1828 b05783b0773d894396d475ced9d2f4f6).  Then, the I<Master Index> record is checked
1829 for the first char of the signature (in this case I<b0>).  If it does not exist,
1830 a new I<Bucket List> is created for our key (and the next 15 future keys that
1831 happen to also have I<b> as their first MD5 char).  The entire MD5 is written
1832 to the I<Bucket List> along with the offset of the new I<Bucket> record (EOF at
1833 this point, unless we are replacing an existing I<Bucket>), where the actual
1834 data will be stored.
1835
1836 =head2 FETCHING
1837
1838 Fetching an existing key/element involves getting a I<Digest::MD5> of the key
1839 (or index number), then walking along the indexes.  If there are enough
1840 keys/elements in this DB level, there might be nested indexes, each linked to
1841 a particular char of the MD5.  Finally, a I<Bucket List> is pointed to, which
1842 contains up to 16 full MD5 hashes.  Each is checked for equality to the key in
1843 question.  If we found a match, the I<Bucket> tag is loaded, where the value and
1844 plain key are stored.
1845
1846 Fetching the plain key occurs when calling the I<first_key()> and I<next_key()>
1847 methods.  In this process the indexes are walked systematically, and each key
1848 fetched in increasing MD5 order (which is why it appears random).   Once the
1849 I<Bucket> is found, the value is skipped and the plain key returned instead.
1850 B<Note:> Do not count on keys being fetched as if the MD5 hashes were
1851 alphabetically sorted.  This only happens on an index-level -- as soon as the
1852 I<Bucket Lists> are hit, the keys will come out in the order they went in --
1853 so it's pretty much undefined how the keys will come out -- just like Perl's
1854 built-in hashes.
1855
1856 =head1 CODE COVERAGE
1857
1858 We use B<Devel::Cover> to test the code coverage of our tests, below is the
1859 B<Devel::Cover> report on this module's test suite.
1860
1861   ----------------------------------- ------ ------ ------ ------ ------ ------
1862   File                                  stmt   bran   cond    sub   time  total
1863   ----------------------------------- ------ ------ ------ ------ ------ ------
1864   blib/lib/DBM/Deep.pm                  94.9   80.6   73.0  100.0   37.9   90.4
1865   blib/lib/DBM/Deep/Array.pm           100.0   91.1  100.0  100.0   18.2   98.1
1866   blib/lib/DBM/Deep/Engine.pm           98.9   87.3   80.0  100.0   34.2   95.2
1867   blib/lib/DBM/Deep/Hash.pm            100.0   87.5  100.0  100.0    9.7   97.3
1868   Total                                 97.9   85.9   79.7  100.0  100.0   94.3
1869   ----------------------------------- ------ ------ ------ ------ ------ ------
1870
1871 =head1 MORE INFORMATION
1872
1873 Check out the DBM::Deep Google Group at L<http://groups.google.com/group/DBM-Deep>
1874 or send email to L<DBM-Deep@googlegroups.com>.
1875
1876 =head1 AUTHORS
1877
1878 Joseph Huckaby, L<jhuckaby@cpan.org>
1879
1880 Rob Kinyon, L<rkinyon@cpan.org>
1881
1882 Special thanks to Adam Sah and Rich Gaushell!  You know why :-)
1883
1884 =head1 SEE ALSO
1885
1886 perltie(1), Tie::Hash(3), Digest::MD5(3), Fcntl(3), flock(2), lockf(3), nfs(5),
1887 Digest::SHA256(3), Crypt::Blowfish(3), Compress::Zlib(3)
1888
1889 =head1 LICENSE
1890
1891 Copyright (c) 2002-2006 Joseph Huckaby.  All Rights Reserved.
1892 This is free software, you may use it and distribute it under the
1893 same terms as Perl itself.
1894
1895 =cut