Fixed the hypothetical TIESCALAR
[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 {
a4e2db58 8 eval { local $SIG{'__DIE__'}; 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;
0ca7ea98 16 my $args = $class->_get_args( @_ );
6fe26b29 17
18 $args->{type} = $class->TYPE_HASH;
19
20 return $class->_init($args);
21}
22
cb79ec85 23sub FETCH {
24 my $self = shift->_get_self;
25 my $key = ($self->root->{filter_store_key})
26 ? $self->root->{filter_store_key}->($_[0])
27 : $_[0];
28
29 return $self->SUPER::FETCH( $key );
30}
31
81d3d316 32sub STORE {
33 my $self = shift->_get_self;
34 my $key = ($self->root->{filter_store_key})
35 ? $self->root->{filter_store_key}->($_[0])
36 : $_[0];
37 my $value = $_[1];
38
39 return $self->SUPER::STORE( $key, $value );
40}
41
baa27ab6 42sub EXISTS {
43 my $self = shift->_get_self;
44 my $key = ($self->root->{filter_store_key})
45 ? $self->root->{filter_store_key}->($_[0])
46 : $_[0];
47
48 return $self->SUPER::EXISTS( $key );
49}
50
feaf1e6f 51sub DELETE {
52 my $self = shift->_get_self;
53 my $key = ($self->root->{filter_store_key})
54 ? $self->root->{filter_store_key}->($_[0])
55 : $_[0];
56
57 return $self->SUPER::DELETE( $key );
58}
59
6fe26b29 60sub FIRSTKEY {
61 ##
62 # Locate and return first key (in no particular order)
63 ##
2ac02042 64 my $self = $_[0]->_get_self;
6fe26b29 65
66 ##
67 # Make sure file is open
68 ##
69 if (!defined($self->fh)) { $self->_open(); }
70
71 ##
72 # Request shared lock for reading
73 ##
74 $self->lock( $self->LOCK_SH );
75
76 my $result = $self->_get_next_key();
77
78 $self->unlock();
79
80 return ($result && $self->root->{filter_fetch_key})
81 ? $self->root->{filter_fetch_key}->($result)
82 : $result;
83}
84
85sub NEXTKEY {
86 ##
87 # Return next key (in no particular order), given previous one
88 ##
2ac02042 89 my $self = $_[0]->_get_self;
6fe26b29 90
91 my $prev_key = ($self->root->{filter_store_key})
92 ? $self->root->{filter_store_key}->($_[1])
93 : $_[1];
94
95 my $prev_md5 = $DBM::Deep::DIGEST_FUNC->($prev_key);
96
97 ##
98 # Make sure file is open
99 ##
100 if (!defined($self->fh)) { $self->_open(); }
101
102 ##
103 # Request shared lock for reading
104 ##
105 $self->lock( $self->LOCK_SH );
106
107 my $result = $self->_get_next_key( $prev_md5 );
108
109 $self->unlock();
110
111 return ($result && $self->root->{filter_fetch_key})
112 ? $self->root->{filter_fetch_key}->($result)
113 : $result;
114}
115
116##
117# Public method aliases
118##
119*first_key = *FIRSTKEY;
120*next_key = *NEXTKEY;
121
1221;
123__END__