exists now works on negative arrays
[dbsrgits/DBM-Deep.git] / lib / DBM / Deep / Hash.pm
CommitLineData
6fe26b29 1package DBM::Deep::Hash;
2
3use strict;
4
5use base 'DBM::Deep';
6
596e9574 7sub _get_self {
2ac02042 8 eval { tied( %{$_[0]} ) } || $_[0]
596e9574 9}
10
6fe26b29 11sub TIEHASH {
12 ##
13 # Tied hash constructor method, called by Perl's tie() function.
14 ##
15 my $class = shift;
16 my $args;
217fef02 17 if (scalar(@_) > 1) {
18 if ( @_ % 2 ) {
19 $class->_throw_error( "Odd number of parameters to TIEHASH" );
20 }
21 $args = {@_};
22 }
e1b265cc 23 elsif ( my $type = Scalar::Util::reftype($_[0]) ) {
24 if ( $type ne 'HASH' ) {
25 $class->_throw_error( "Not a hashref in TIEHASH" );
26 }
27 $args = $_[0];
28 }
6fe26b29 29 else { $args = { file => shift }; }
30
31 $args->{type} = $class->TYPE_HASH;
32
33 return $class->_init($args);
34}
35
cb79ec85 36sub FETCH {
37 my $self = shift->_get_self;
38 my $key = ($self->root->{filter_store_key})
39 ? $self->root->{filter_store_key}->($_[0])
40 : $_[0];
41
42 return $self->SUPER::FETCH( $key );
43}
44
81d3d316 45sub STORE {
46 my $self = shift->_get_self;
47 my $key = ($self->root->{filter_store_key})
48 ? $self->root->{filter_store_key}->($_[0])
49 : $_[0];
50 my $value = $_[1];
51
52 return $self->SUPER::STORE( $key, $value );
53}
54
baa27ab6 55sub EXISTS {
56 my $self = shift->_get_self;
57 my $key = ($self->root->{filter_store_key})
58 ? $self->root->{filter_store_key}->($_[0])
59 : $_[0];
60
61 return $self->SUPER::EXISTS( $key );
62}
63
feaf1e6f 64sub DELETE {
65 my $self = shift->_get_self;
66 my $key = ($self->root->{filter_store_key})
67 ? $self->root->{filter_store_key}->($_[0])
68 : $_[0];
69
70 return $self->SUPER::DELETE( $key );
71}
72
6fe26b29 73sub FIRSTKEY {
74 ##
75 # Locate and return first key (in no particular order)
76 ##
2ac02042 77 my $self = $_[0]->_get_self;
6fe26b29 78
79 ##
80 # Make sure file is open
81 ##
82 if (!defined($self->fh)) { $self->_open(); }
83
84 ##
85 # Request shared lock for reading
86 ##
87 $self->lock( $self->LOCK_SH );
88
89 my $result = $self->_get_next_key();
90
91 $self->unlock();
92
93 return ($result && $self->root->{filter_fetch_key})
94 ? $self->root->{filter_fetch_key}->($result)
95 : $result;
96}
97
98sub NEXTKEY {
99 ##
100 # Return next key (in no particular order), given previous one
101 ##
2ac02042 102 my $self = $_[0]->_get_self;
6fe26b29 103
104 my $prev_key = ($self->root->{filter_store_key})
105 ? $self->root->{filter_store_key}->($_[1])
106 : $_[1];
107
108 my $prev_md5 = $DBM::Deep::DIGEST_FUNC->($prev_key);
109
110 ##
111 # Make sure file is open
112 ##
113 if (!defined($self->fh)) { $self->_open(); }
114
115 ##
116 # Request shared lock for reading
117 ##
118 $self->lock( $self->LOCK_SH );
119
120 my $result = $self->_get_next_key( $prev_md5 );
121
122 $self->unlock();
123
124 return ($result && $self->root->{filter_fetch_key})
125 ? $self->root->{filter_fetch_key}->($result)
126 : $result;
127}
128
129##
130# Public method aliases
131##
132*first_key = *FIRSTKEY;
133*next_key = *NEXTKEY;
134
1351;
136__END__