X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBM%2FDeep%2FEngine.pm;h=5d9b03406cd3ba49dc3e2ee3d03ad73b8406ff32;hb=c2472eded1c8461656b9df2151a763a8379d9b25;hp=0419be7d939f53e857ba8ff3775bcf7507a244bd;hpb=d3aaaf5ed9523707a1fe38ec09ea9c937fa1000f;p=dbsrgits%2FDBM-Deep.git diff --git a/lib/DBM/Deep/Engine.pm b/lib/DBM/Deep/Engine.pm index 0419be7..5d9b034 100644 --- a/lib/DBM/Deep/Engine.pm +++ b/lib/DBM/Deep/Engine.pm @@ -381,5 +381,40 @@ sub storage { $_[0]{storage} } sub sector_type { die "sector_type must be implemented in a child class" } +# This code is to make sure we write all the values in the $value to the +# disk and to make sure all changes to $value after the assignment are +# reflected on disk. This may be counter-intuitive at first, but it is +# correct dwimmery. +# NOTE - simply tying $value won't perform a STORE on each value. Hence, +# the copy to a temp value. +sub _descend { + my $self = shift; + my ($value, $value_sector) = @_; + my $r = Scalar::Util::reftype( $value ) || ''; + + if ( $r eq 'ARRAY' ) { + my @temp = @$value; + tie @$value, 'DBM::Deep', { + base_offset => $value_sector->offset, + staleness => $value_sector->staleness, + storage => $self->storage, + engine => $self, + }; + @$value = @temp; + bless $value, 'DBM::Deep::Array' unless Scalar::Util::blessed( $value ); + } + elsif ( $r eq 'HASH' ) { + my %temp = %$value; + tie %$value, 'DBM::Deep', { + base_offset => $value_sector->offset, + staleness => $value_sector->staleness, + storage => $self->storage, + engine => $self, + }; + %$value = %temp; + bless $value, 'DBM::Deep::Hash' unless Scalar::Util::blessed( $value ); + } +} + 1; __END__