X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBM%2FDeep.pm;h=75aee67487b725716c521253bc1d4f5cdbe55b07;hb=86867f3a6f23efdf7c7290f5a0b7a69f5f39834f;hp=51e3f953ed298fe9ef2e018aa3e00529db1b6f87;hpb=cfd97a7f63c295750c44d5a5be469cf57841b867;p=dbsrgits%2FDBM-Deep.git diff --git a/lib/DBM/Deep.pm b/lib/DBM/Deep.pm index 51e3f95..75aee67 100644 --- a/lib/DBM/Deep.pm +++ b/lib/DBM/Deep.pm @@ -34,6 +34,8 @@ use 5.6.0; use strict; use warnings; +our $VERSION = q(0.99_01); + use Fcntl qw( :DEFAULT :flock :seek ); use Digest::MD5 (); use Scalar::Util (); @@ -41,14 +43,11 @@ use Scalar::Util (); use DBM::Deep::Engine; use DBM::Deep::File; -use vars qw( $VERSION ); -$VERSION = q(0.99_01); - ## # Setup constants for users to pass to new() ## -sub TYPE_HASH () { DBM::Deep::Engine->SIG_HASH } -sub TYPE_ARRAY () { DBM::Deep::Engine->SIG_ARRAY } +sub TYPE_HASH () { DBM::Deep::Engine->SIG_HASH } +sub TYPE_ARRAY () { DBM::Deep::Engine->SIG_ARRAY } sub _get_args { my $proto = shift; @@ -335,8 +334,7 @@ sub rollback { sub commit { my $self = shift->_get_self; - # At this point, we need to replay the actions taken - $self->_fileobj->end_transaction; + $self->_fileobj->commit_transaction; return 1; } @@ -386,9 +384,10 @@ sub _find_parent { my $self = shift; my $base = ''; + #XXX This if() is redundant if ( my $parent = $self->{parent} ) { my $child = $self; - while ( 1 ) { + while ( $parent->{parent} ) { $base = ( $parent->_type eq TYPE_HASH ? "\{$child->{parent_key}\}" @@ -397,10 +396,15 @@ sub _find_parent { $child = $parent; $parent = $parent->{parent}; - last unless $parent; + } + if ( $base ) { + $base = "\$db->get( '$child->{parent_key}' )->" . $base; + } + else { + $base = "\$db->get( '$child->{parent_key}' )"; } } - return '$db->' . $base; + return $base; } sub STORE { @@ -415,44 +419,45 @@ sub STORE { $self->_throw_error( 'Cannot write to a readonly filehandle' ); } -# if ( my $afh = $self->_fileobj->{audit_fh} ) { - if ( defined $orig_key ) { - my $lhs = $self->_find_parent; - if ( $self->_type eq TYPE_HASH ) { - $lhs .= "\{$orig_key\}"; - } - else { - $lhs .= "\[$orig_key\]"; - } + #XXX The second condition needs to disappear + if ( defined $orig_key && !( $self->_type eq TYPE_ARRAY && $orig_key eq 'length') ) { + my $rhs; + + my $r = Scalar::Util::reftype( $value ) || ''; + if ( $r eq 'HASH' ) { + $rhs = '{}'; + } + elsif ( $r eq 'ARRAY' ) { + $rhs = '[]'; + } + elsif ( defined $value ) { + $rhs = "'$value'"; + } + else { + $rhs = "undef"; + } - my $rhs; + if ( my $c = Scalar::Util::blessed( $value ) ) { + $rhs = "bless $rhs, '$c'"; + } - my $r = Scalar::Util::reftype( $value ) || ''; - if ( $r eq 'HASH' ) { - $rhs = '{}'; - } - elsif ( $r eq 'ARRAY' ) { - $rhs = '[]'; + my $lhs = $self->_find_parent; + if ( $lhs ) { + if ( $self->_type eq TYPE_HASH ) { + $lhs .= "->\{$orig_key\}"; } else { - if ( defined $value ) { - $rhs = "'$value'"; - } - else { - $rhs = "undef"; - } - } - - if ( my $c = Scalar::Util::blessed( $value ) ) { - $rhs = "bless $rhs, '$c'"; + $lhs .= "->\[$orig_key\]"; } - $self->_fileobj->audit( "$lhs = $rhs;" ); -# flock( $afh, LOCK_EX ); -# print( $afh "$lhs = $rhs; # " . localtime(time) . "\n" ); -# flock( $afh, LOCK_UN ); + $lhs .= "=$rhs;"; + } + else { + $lhs = "\$db->put('$orig_key',$rhs);"; } -# } + + $self->_fileobj->audit($lhs); + } ## # Request exclusive lock for writing @@ -472,11 +477,11 @@ sub STORE { ## # Add key/value to bucket list ## - my $result = $self->{engine}->add_bucket( $tag, $md5, $key, $value, undef, $orig_key ); + $self->{engine}->add_bucket( $tag, $md5, $key, $value, undef, $orig_key ); $self->unlock(); - return $result; + return 1; } sub FETCH { @@ -493,7 +498,8 @@ sub FETCH { ## $self->lock( LOCK_SH ); - my $tag = $self->{engine}->find_bucket_list( $self->_base_offset, $md5 ); + my $tag = $self->{engine}->find_bucket_list( $self->_base_offset, $md5 );#, { create => 1 } ); + #XXX This needs to autovivify if (!$tag) { $self->unlock(); return; @@ -524,19 +530,13 @@ sub DELETE { $self->_throw_error( 'Cannot write to a readonly filehandle' ); } - if ( my $afh = $self->_fileobj->{audit_fh} ) { - if ( defined $orig_key ) { - my $lhs = $self->_find_parent; - if ( $self->_type eq TYPE_HASH ) { - $lhs .= "\{$orig_key\}"; - } - else { - $lhs .= "\[$orig_key]\]"; - } - - flock( $afh, LOCK_EX ); - print( $afh "delete $lhs; # " . localtime(time) . "\n" ); - flock( $afh, LOCK_UN ); + if ( defined $orig_key ) { + my $lhs = $self->_find_parent; + if ( $lhs ) { + $self->_fileobj->audit( "delete $lhs;" ); + } + else { + $self->_fileobj->audit( "\$db->delete('$orig_key');" ); } } @@ -618,10 +618,9 @@ sub CLEAR { $self->_throw_error( 'Cannot write to a readonly filehandle' ); } - if ( my $afh = $self->_fileobj->{audit_fh} ) { + { my $lhs = $self->_find_parent; - my $rhs = '()'; if ( $self->_type eq TYPE_HASH ) { $lhs = '%{' . $lhs . '}'; } @@ -629,9 +628,7 @@ sub CLEAR { $lhs = '@{' . $lhs . '}'; } - flock( $afh, LOCK_EX ); - print( $afh "$lhs = $rhs; # " . localtime(time) . "\n" ); - flock( $afh, LOCK_UN ); + $self->_fileobj->audit( "$lhs = ();" ); } ## @@ -639,14 +636,6 @@ sub CLEAR { ## $self->lock( LOCK_EX ); - my $fh = $self->_fh; - - seek($fh, $self->_base_offset + $self->_fileobj->{file_offset}, SEEK_SET); - if (eof $fh) { - $self->unlock(); - return; - } - #XXX This needs updating to use _release_space $self->{engine}->write_tag( $self->_base_offset, $self->_type,