Updated Changes
[dbsrgits/DBM-Deep.git] / lib / DBM / Deep / Hash.pm
CommitLineData
6fe26b29 1package DBM::Deep::Hash;
2
2120a181 3use 5.006_000;
460b1067 4
6fe26b29 5use strict;
460b1067 6use warnings;
6fe26b29 7
695c88b1 8our $VERSION = q(1.0013);
86867f3a 9
6fe26b29 10use base 'DBM::Deep';
11
596e9574 12sub _get_self {
a4e2db58 13 eval { local $SIG{'__DIE__'}; tied( %{$_[0]} ) } || $_[0]
596e9574 14}
15
e00d0eb3 16sub _repr { return {} }
f9c33187 17
6fe26b29 18sub TIEHASH {
19 ##
20 # Tied hash constructor method, called by Perl's tie() function.
21 ##
22 my $class = shift;
0ca7ea98 23 my $args = $class->_get_args( @_ );
6fe26b29 24
25 $args->{type} = $class->TYPE_HASH;
26
27 return $class->_init($args);
28}
29
cb79ec85 30sub FETCH {
31 my $self = shift->_get_self;
2120a181 32 DBM::Deep->_throw_error( "Cannot use an undefined hash key." ) unless defined $_[0];
83371fe3 33 my $key = ($self->_storage->{filter_store_key})
34 ? $self->_storage->{filter_store_key}->($_[0])
cb79ec85 35 : $_[0];
36
359a01ac 37 return $self->SUPER::FETCH( $key, $_[0] );
cb79ec85 38}
39
81d3d316 40sub STORE {
41 my $self = shift->_get_self;
2120a181 42 DBM::Deep->_throw_error( "Cannot use an undefined hash key." ) unless defined $_[0];
1cff45d7 43 my $key = ($self->_storage->{filter_store_key})
83371fe3 44 ? $self->_storage->{filter_store_key}->($_[0])
81d3d316 45 : $_[0];
46 my $value = $_[1];
47
359a01ac 48 return $self->SUPER::STORE( $key, $value, $_[0] );
81d3d316 49}
50
baa27ab6 51sub EXISTS {
52 my $self = shift->_get_self;
2120a181 53 DBM::Deep->_throw_error( "Cannot use an undefined hash key." ) unless defined $_[0];
1cff45d7 54 my $key = ($self->_storage->{filter_store_key})
83371fe3 55 ? $self->_storage->{filter_store_key}->($_[0])
baa27ab6 56 : $_[0];
57
58 return $self->SUPER::EXISTS( $key );
59}
60
feaf1e6f 61sub DELETE {
62 my $self = shift->_get_self;
2120a181 63 DBM::Deep->_throw_error( "Cannot use an undefined hash key." ) unless defined $_[0];
1cff45d7 64 my $key = ($self->_storage->{filter_store_key})
83371fe3 65 ? $self->_storage->{filter_store_key}->($_[0])
feaf1e6f 66 : $_[0];
67
359a01ac 68 return $self->SUPER::DELETE( $key, $_[0] );
feaf1e6f 69}
70
6fe26b29 71sub FIRSTKEY {
1cff45d7 72 ##
73 # Locate and return first key (in no particular order)
74 ##
eea0d863 75 my $self = shift->_get_self;
6fe26b29 76
1cff45d7 77 ##
78 # Request shared lock for reading
79 ##
80 $self->lock( $self->LOCK_SH );
81
82 my $result = $self->_engine->get_next_key( $self );
83
84 $self->unlock();
85
86 return ($result && $self->_storage->{filter_fetch_key})
83371fe3 87 ? $self->_storage->{filter_fetch_key}->($result)
6fe26b29 88 : $result;
89}
90
91sub NEXTKEY {
1cff45d7 92 ##
93 # Return next key (in no particular order), given previous one
94 ##
eea0d863 95 my $self = shift->_get_self;
6fe26b29 96
1cff45d7 97 my $prev_key = ($self->_storage->{filter_store_key})
83371fe3 98 ? $self->_storage->{filter_store_key}->($_[0])
eea0d863 99 : $_[0];
6fe26b29 100
1cff45d7 101 ##
102 # Request shared lock for reading
103 ##
104 $self->lock( $self->LOCK_SH );
105
106 my $result = $self->_engine->get_next_key( $self, $prev_key );
107
108 $self->unlock();
109
110 return ($result && $self->_storage->{filter_fetch_key})
83371fe3 111 ? $self->_storage->{filter_fetch_key}->($result)
6fe26b29 112 : $result;
113}
114
115##
116# Public method aliases
117##
f9c33187 118sub first_key { (shift)->FIRSTKEY(@_) }
119sub next_key { (shift)->NEXTKEY(@_) }
120
121sub _copy_node {
898fd1fd 122 my $self = shift;
f9c33187 123 my ($db_temp) = @_;
124
125 my $key = $self->first_key();
126 while ($key) {
127 my $value = $self->get($key);
128 $self->_copy_value( \$db_temp->{$key}, $value );
129 $key = $self->next_key($key);
130 }
131
132 return 1;
133}
6fe26b29 134
1351;
136__END__