1 package DBM::Deep::Hash;
8 eval { tied( %{$_[0]} ) } || $_[0]
13 # Tied hash constructor method, called by Perl's tie() function.
19 $class->_throw_error( "Odd number of parameters to TIEHASH" );
23 elsif ( my $type = Scalar::Util::reftype($_[0]) ) {
24 if ( $type ne 'HASH' ) {
25 $class->_throw_error( "Not a hashref in TIEHASH" );
29 else { $args = { file => shift }; }
31 $args->{type} = $class->TYPE_HASH;
33 return $class->_init($args);
37 my $self = shift->_get_self;
38 my $key = ($self->root->{filter_store_key})
39 ? $self->root->{filter_store_key}->($_[0])
42 return $self->SUPER::FETCH( $key );
46 my $self = shift->_get_self;
47 my $key = ($self->root->{filter_store_key})
48 ? $self->root->{filter_store_key}->($_[0])
52 return $self->SUPER::STORE( $key, $value );
56 my $self = shift->_get_self;
57 my $key = ($self->root->{filter_store_key})
58 ? $self->root->{filter_store_key}->($_[0])
61 return $self->SUPER::EXISTS( $key );
65 my $self = shift->_get_self;
66 my $key = ($self->root->{filter_store_key})
67 ? $self->root->{filter_store_key}->($_[0])
70 return $self->SUPER::DELETE( $key );
75 # Locate and return first key (in no particular order)
77 my $self = $_[0]->_get_self;
80 # Make sure file is open
82 if (!defined($self->fh)) { $self->_open(); }
85 # Request shared lock for reading
87 $self->lock( $self->LOCK_SH );
89 my $result = $self->_get_next_key();
93 return ($result && $self->root->{filter_fetch_key})
94 ? $self->root->{filter_fetch_key}->($result)
100 # Return next key (in no particular order), given previous one
102 my $self = $_[0]->_get_self;
104 my $prev_key = ($self->root->{filter_store_key})
105 ? $self->root->{filter_store_key}->($_[1])
108 my $prev_md5 = $DBM::Deep::DIGEST_FUNC->($prev_key);
111 # Make sure file is open
113 if (!defined($self->fh)) { $self->_open(); }
116 # Request shared lock for reading
118 $self->lock( $self->LOCK_SH );
120 my $result = $self->_get_next_key( $prev_md5 );
124 return ($result && $self->root->{filter_fetch_key})
125 ? $self->root->{filter_fetch_key}->($result)
130 # Public method aliases
132 *first_key = *FIRSTKEY;
133 *next_key = *NEXTKEY;