Created concept of Storage:: in order to start adding more storage backends
[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;
065b45be 6use warnings FATAL => 'all';
86867f3a 7
6fe26b29 8use base 'DBM::Deep';
9
596e9574 10sub _get_self {
a4e2db58 11 eval { local $SIG{'__DIE__'}; tied( %{$_[0]} ) } || $_[0]
596e9574 12}
13
e00d0eb3 14sub _repr { return {} }
f9c33187 15
6fe26b29 16sub TIEHASH {
6fe26b29 17 my $class = shift;
0ca7ea98 18 my $args = $class->_get_args( @_ );
6fe26b29 19
20 $args->{type} = $class->TYPE_HASH;
21
22 return $class->_init($args);
23}
24
cb79ec85 25sub FETCH {
26 my $self = shift->_get_self;
2120a181 27 DBM::Deep->_throw_error( "Cannot use an undefined hash key." ) unless defined $_[0];
f1879fdc 28 my $key = ($self->_engine->storage->{filter_store_key})
29 ? $self->_engine->storage->{filter_store_key}->($_[0])
cb79ec85 30 : $_[0];
31
359a01ac 32 return $self->SUPER::FETCH( $key, $_[0] );
cb79ec85 33}
34
81d3d316 35sub STORE {
36 my $self = shift->_get_self;
2120a181 37 DBM::Deep->_throw_error( "Cannot use an undefined hash key." ) unless defined $_[0];
f1879fdc 38 my $key = ($self->_engine->storage->{filter_store_key})
39 ? $self->_engine->storage->{filter_store_key}->($_[0])
81d3d316 40 : $_[0];
41 my $value = $_[1];
42
359a01ac 43 return $self->SUPER::STORE( $key, $value, $_[0] );
81d3d316 44}
45
baa27ab6 46sub EXISTS {
47 my $self = shift->_get_self;
2120a181 48 DBM::Deep->_throw_error( "Cannot use an undefined hash key." ) unless defined $_[0];
f1879fdc 49 my $key = ($self->_engine->storage->{filter_store_key})
50 ? $self->_engine->storage->{filter_store_key}->($_[0])
baa27ab6 51 : $_[0];
52
53 return $self->SUPER::EXISTS( $key );
54}
55
feaf1e6f 56sub DELETE {
57 my $self = shift->_get_self;
2120a181 58 DBM::Deep->_throw_error( "Cannot use an undefined hash key." ) unless defined $_[0];
f1879fdc 59 my $key = ($self->_engine->storage->{filter_store_key})
60 ? $self->_engine->storage->{filter_store_key}->($_[0])
feaf1e6f 61 : $_[0];
62
359a01ac 63 return $self->SUPER::DELETE( $key, $_[0] );
feaf1e6f 64}
65
d426259c 66# Locate and return first key (in no particular order)
6fe26b29 67sub FIRSTKEY {
eea0d863 68 my $self = shift->_get_self;
6fe26b29 69
5c0756fc 70 $self->lock_shared;
1cff45d7 71
72 my $result = $self->_engine->get_next_key( $self );
73
9c87a079 74 $self->unlock;
1cff45d7 75
f1879fdc 76 return ($result && $self->_engine->storage->{filter_fetch_key})
77 ? $self->_engine->storage->{filter_fetch_key}->($result)
6fe26b29 78 : $result;
79}
80
d426259c 81# Return next key (in no particular order), given previous one
6fe26b29 82sub NEXTKEY {
eea0d863 83 my $self = shift->_get_self;
6fe26b29 84
f1879fdc 85 my $prev_key = ($self->_engine->storage->{filter_store_key})
86 ? $self->_engine->storage->{filter_store_key}->($_[0])
eea0d863 87 : $_[0];
6fe26b29 88
5c0756fc 89 $self->lock_shared;
1cff45d7 90
91 my $result = $self->_engine->get_next_key( $self, $prev_key );
92
9c87a079 93 $self->unlock;
94
f1879fdc 95 return ($result && $self->_engine->storage->{filter_fetch_key})
96 ? $self->_engine->storage->{filter_fetch_key}->($result)
6fe26b29 97 : $result;
98}
99
f9c33187 100sub first_key { (shift)->FIRSTKEY(@_) }
d426259c 101sub next_key { (shift)->NEXTKEY(@_) }
f9c33187 102
103sub _copy_node {
898fd1fd 104 my $self = shift;
f9c33187 105 my ($db_temp) = @_;
106
107 my $key = $self->first_key();
108 while ($key) {
109 my $value = $self->get($key);
110 $self->_copy_value( \$db_temp->{$key}, $value );
111 $key = $self->next_key($key);
112 }
113
114 return 1;
115}
6fe26b29 116
1171;
118__END__