Removed final vestiges of misunderstandings
[dbsrgits/DBM-Deep.git] / lib / DBM / Deep / Hash.pm
CommitLineData
6fe26b29 1package DBM::Deep::Hash;
2
460b1067 3use 5.6.0;
4
6fe26b29 5use strict;
460b1067 6use warnings;
6fe26b29 7
129ea236 8use constant DEBUG => 0;
9
c3aafc14 10our $VERSION = q(0.99_03);
86867f3a 11
6fe26b29 12use base 'DBM::Deep';
13
596e9574 14sub _get_self {
a4e2db58 15 eval { local $SIG{'__DIE__'}; tied( %{$_[0]} ) } || $_[0]
596e9574 16}
17
12b96196 18#XXX Need to add a check here for @_ % 2
f9c33187 19sub _repr { shift;return { @_ } }
20
21sub _import {
22 my $self = shift;
23 my ($struct) = @_;
24
25 eval {
26 local $SIG{'__DIE__'};
27 foreach my $key (keys %$struct) {
28 $self->put($key, $struct->{$key});
29 }
30 }; if ($@) {
31 $self->_throw_error("Cannot import: type mismatch");
32 }
33
34 return 1;
35}
36
6fe26b29 37sub TIEHASH {
38 ##
39 # Tied hash constructor method, called by Perl's tie() function.
40 ##
41 my $class = shift;
0ca7ea98 42 my $args = $class->_get_args( @_ );
6fe26b29 43
44 $args->{type} = $class->TYPE_HASH;
45
46 return $class->_init($args);
47}
48
cb79ec85 49sub FETCH {
129ea236 50 print "FETCH( @_ )\n" if DEBUG;
cb79ec85 51 my $self = shift->_get_self;
83371fe3 52 my $key = ($self->_storage->{filter_store_key})
53 ? $self->_storage->{filter_store_key}->($_[0])
cb79ec85 54 : $_[0];
55
359a01ac 56 return $self->SUPER::FETCH( $key, $_[0] );
cb79ec85 57}
58
81d3d316 59sub STORE {
129ea236 60 print "STORE( @_ )\n" if DEBUG;
81d3d316 61 my $self = shift->_get_self;
83371fe3 62 my $key = ($self->_storage->{filter_store_key})
63 ? $self->_storage->{filter_store_key}->($_[0])
81d3d316 64 : $_[0];
65 my $value = $_[1];
66
359a01ac 67 return $self->SUPER::STORE( $key, $value, $_[0] );
81d3d316 68}
69
baa27ab6 70sub EXISTS {
129ea236 71 print "EXISTS( @_ )\n" if DEBUG;
baa27ab6 72 my $self = shift->_get_self;
83371fe3 73 my $key = ($self->_storage->{filter_store_key})
74 ? $self->_storage->{filter_store_key}->($_[0])
baa27ab6 75 : $_[0];
76
77 return $self->SUPER::EXISTS( $key );
78}
79
feaf1e6f 80sub DELETE {
81 my $self = shift->_get_self;
83371fe3 82 my $key = ($self->_storage->{filter_store_key})
83 ? $self->_storage->{filter_store_key}->($_[0])
feaf1e6f 84 : $_[0];
85
359a01ac 86 return $self->SUPER::DELETE( $key, $_[0] );
feaf1e6f 87}
88
6fe26b29 89sub FIRSTKEY {
129ea236 90 print "FIRSTKEY\n" if DEBUG;
6fe26b29 91 ##
92 # Locate and return first key (in no particular order)
93 ##
eea0d863 94 my $self = shift->_get_self;
6fe26b29 95
96 ##
6fe26b29 97 # Request shared lock for reading
98 ##
99 $self->lock( $self->LOCK_SH );
100
40956c06 101 my $result = $self->_engine->get_next_key($self->_storage->transaction_id, $self->_base_offset);
6fe26b29 102
103 $self->unlock();
104
83371fe3 105 return ($result && $self->_storage->{filter_fetch_key})
106 ? $self->_storage->{filter_fetch_key}->($result)
6fe26b29 107 : $result;
108}
109
110sub NEXTKEY {
129ea236 111 print "NEXTKEY( @_ )\n" if DEBUG;
6fe26b29 112 ##
113 # Return next key (in no particular order), given previous one
114 ##
eea0d863 115 my $self = shift->_get_self;
6fe26b29 116
83371fe3 117 my $prev_key = ($self->_storage->{filter_store_key})
118 ? $self->_storage->{filter_store_key}->($_[0])
eea0d863 119 : $_[0];
6fe26b29 120
6fe26b29 121 ##
6fe26b29 122 # Request shared lock for reading
123 ##
124 $self->lock( $self->LOCK_SH );
125
40956c06 126 my $result = $self->_engine->get_next_key( $self->_storage->transaction_id, $self->_base_offset, $prev_key );
6fe26b29 127
128 $self->unlock();
129
83371fe3 130 return ($result && $self->_storage->{filter_fetch_key})
131 ? $self->_storage->{filter_fetch_key}->($result)
6fe26b29 132 : $result;
133}
134
135##
136# Public method aliases
137##
f9c33187 138sub first_key { (shift)->FIRSTKEY(@_) }
139sub next_key { (shift)->NEXTKEY(@_) }
140
141sub _copy_node {
898fd1fd 142 my $self = shift;
f9c33187 143 my ($db_temp) = @_;
144
145 my $key = $self->first_key();
146 while ($key) {
147 my $value = $self->get($key);
148 $self->_copy_value( \$db_temp->{$key}, $value );
149 $key = $self->next_key($key);
150 }
151
152 return 1;
153}
6fe26b29 154
1551;
156__END__