Moved find_bucket_list, traverse_index, and get_next_key to Engine
[dbsrgits/DBM-Deep.git] / lib / DBM / Deep / Hash.pm
1 package DBM::Deep::Hash;
2
3 use strict;
4
5 use base 'DBM::Deep';
6
7 sub _get_self {
8     eval { local $SIG{'__DIE__'}; tied( %{$_[0]} ) } || $_[0]
9 }
10
11 sub TIEHASH {
12     ##
13     # Tied hash constructor method, called by Perl's tie() function.
14     ##
15     my $class = shift;
16     my $args = $class->_get_args( @_ );
17     
18     $args->{type} = $class->TYPE_HASH;
19
20     return $class->_init($args);
21 }
22
23 sub 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
32 sub 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
42 sub 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
51 sub 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
60 sub FIRSTKEY {
61         ##
62         # Locate and return first key (in no particular order)
63         ##
64     my $self = $_[0]->_get_self;
65
66         ##
67         # Request shared lock for reading
68         ##
69         $self->lock( $self->LOCK_SH );
70         
71         my $result = $self->{engine}->get_next_key($self);
72         
73         $self->unlock();
74         
75         return ($result && $self->_root->{filter_fetch_key})
76         ? $self->_root->{filter_fetch_key}->($result)
77         : $result;
78 }
79
80 sub NEXTKEY {
81         ##
82         # Return next key (in no particular order), given previous one
83         ##
84     my $self = $_[0]->_get_self;
85
86         my $prev_key = ($self->_root->{filter_store_key})
87         ? $self->_root->{filter_store_key}->($_[1])
88         : $_[1];
89
90         my $prev_md5 = $DBM::Deep::DIGEST_FUNC->($prev_key);
91
92         ##
93         # Request shared lock for reading
94         ##
95         $self->lock( $self->LOCK_SH );
96         
97         my $result = $self->{engine}->get_next_key( $self, $prev_md5 );
98         
99         $self->unlock();
100         
101         return ($result && $self->_root->{filter_fetch_key})
102         ? $self->_root->{filter_fetch_key}->($result)
103         : $result;
104 }
105
106 ##
107 # Public method aliases
108 ##
109 *first_key = *FIRSTKEY;
110 *next_key = *NEXTKEY;
111
112 1;
113 __END__