RT# 50541: Fix for clear bug. Introduces a speed regression
[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
29460253 8our $VERSION = $DBM::Deep::VERSION;
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 {
6fe26b29 19 my $class = shift;
0ca7ea98 20 my $args = $class->_get_args( @_ );
6fe26b29 21
22 $args->{type} = $class->TYPE_HASH;
23
24 return $class->_init($args);
25}
26
cb79ec85 27sub FETCH {
28 my $self = shift->_get_self;
2120a181 29 DBM::Deep->_throw_error( "Cannot use an undefined hash key." ) unless defined $_[0];
f1879fdc 30 my $key = ($self->_engine->storage->{filter_store_key})
31 ? $self->_engine->storage->{filter_store_key}->($_[0])
cb79ec85 32 : $_[0];
33
359a01ac 34 return $self->SUPER::FETCH( $key, $_[0] );
cb79ec85 35}
36
81d3d316 37sub STORE {
38 my $self = shift->_get_self;
2120a181 39 DBM::Deep->_throw_error( "Cannot use an undefined hash key." ) unless defined $_[0];
f1879fdc 40 my $key = ($self->_engine->storage->{filter_store_key})
41 ? $self->_engine->storage->{filter_store_key}->($_[0])
81d3d316 42 : $_[0];
43 my $value = $_[1];
44
359a01ac 45 return $self->SUPER::STORE( $key, $value, $_[0] );
81d3d316 46}
47
baa27ab6 48sub EXISTS {
49 my $self = shift->_get_self;
2120a181 50 DBM::Deep->_throw_error( "Cannot use an undefined hash key." ) unless defined $_[0];
f1879fdc 51 my $key = ($self->_engine->storage->{filter_store_key})
52 ? $self->_engine->storage->{filter_store_key}->($_[0])
baa27ab6 53 : $_[0];
54
55 return $self->SUPER::EXISTS( $key );
56}
57
feaf1e6f 58sub DELETE {
59 my $self = shift->_get_self;
2120a181 60 DBM::Deep->_throw_error( "Cannot use an undefined hash key." ) unless defined $_[0];
f1879fdc 61 my $key = ($self->_engine->storage->{filter_store_key})
62 ? $self->_engine->storage->{filter_store_key}->($_[0])
feaf1e6f 63 : $_[0];
64
359a01ac 65 return $self->SUPER::DELETE( $key, $_[0] );
feaf1e6f 66}
67
d426259c 68# Locate and return first key (in no particular order)
6fe26b29 69sub FIRSTKEY {
eea0d863 70 my $self = shift->_get_self;
6fe26b29 71
5c0756fc 72 $self->lock_shared;
1cff45d7 73
74 my $result = $self->_engine->get_next_key( $self );
75
9c87a079 76 $self->unlock;
1cff45d7 77
f1879fdc 78 return ($result && $self->_engine->storage->{filter_fetch_key})
79 ? $self->_engine->storage->{filter_fetch_key}->($result)
6fe26b29 80 : $result;
81}
82
d426259c 83# Return next key (in no particular order), given previous one
6fe26b29 84sub NEXTKEY {
eea0d863 85 my $self = shift->_get_self;
6fe26b29 86
f1879fdc 87 my $prev_key = ($self->_engine->storage->{filter_store_key})
88 ? $self->_engine->storage->{filter_store_key}->($_[0])
eea0d863 89 : $_[0];
6fe26b29 90
5c0756fc 91 $self->lock_shared;
1cff45d7 92
93 my $result = $self->_engine->get_next_key( $self, $prev_key );
94
9c87a079 95 $self->unlock;
96
f1879fdc 97 return ($result && $self->_engine->storage->{filter_fetch_key})
98 ? $self->_engine->storage->{filter_fetch_key}->($result)
6fe26b29 99 : $result;
100}
101
f9c33187 102sub first_key { (shift)->FIRSTKEY(@_) }
d426259c 103sub next_key { (shift)->NEXTKEY(@_) }
f9c33187 104
cd5303b4 105sub _clear {
106 my $self = shift;
107
108 while ( my $key = $self->first_key ) {
109 $self->_engine->delete_key( $self, $key, $key );
110 }
111
112 return;
113}
114
f9c33187 115sub _copy_node {
898fd1fd 116 my $self = shift;
f9c33187 117 my ($db_temp) = @_;
118
119 my $key = $self->first_key();
120 while ($key) {
121 my $value = $self->get($key);
122 $self->_copy_value( \$db_temp->{$key}, $value );
123 $key = $self->next_key($key);
124 }
125
126 return 1;
127}
6fe26b29 128
1291;
130__END__