From: Rob Kinyon Date: Wed, 6 Jan 2010 03:21:23 +0000 (-0500) Subject: (RT #40782) '0' as a hashkey wasn't iterated over correctly. X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=dbsrgits%2FDBM-Deep.git;a=commitdiff_plain;h=0b3cba508e82fa87c17727f29c228c08731d0d12 (RT #40782) '0' as a hashkey wasn't iterated over correctly. --- diff --git a/Changes b/Changes index bc138c5..72340c4 100644 --- a/Changes +++ b/Changes @@ -16,6 +16,7 @@ Revision history for DBM::Deep. large hashes using running with the File backend. ->clear() (on my machine) now takes ( N / 40 ) ** (1.66) seconds. So, clearing 4000 keys (as is the test in t/03_bighash.t) would take ~2070 seconds. + - (RT #40782) Fixed bug when handling a key of '0' (Thanks Sterling!) 1.0019_001 Dec 31 22:00:00 2009 EST (This is the first developer release for 1.0020.) diff --git a/lib/DBM/Deep/Engine.pm b/lib/DBM/Deep/Engine.pm index a42850c..0419be7 100644 --- a/lib/DBM/Deep/Engine.pm +++ b/lib/DBM/Deep/Engine.pm @@ -244,7 +244,7 @@ sub get_next_key { # XXX Need to add logic about resetting the iterator if any key in the # reference has changed - unless ( $prev_key ) { + unless ( defined $prev_key ) { $obj->{iterator} = $self->iterator_class->new({ base_offset => $obj->_base_offset, engine => $self, diff --git a/lib/DBM/Deep/Hash.pm b/lib/DBM/Deep/Hash.pm index 102f367..ec7a7a7 100644 --- a/lib/DBM/Deep/Hash.pm +++ b/lib/DBM/Deep/Hash.pm @@ -105,7 +105,7 @@ sub next_key { (shift)->NEXTKEY(@_) } sub _clear { my $self = shift; - while ( my $key = $self->first_key ) { + while ( defined( my $key = $self->first_key ) ) { $self->_engine->delete_key( $self, $key, $key ); } diff --git a/t/02_hash.t b/t/02_hash.t index 774ab49..f4add2e 100644 --- a/t/02_hash.t +++ b/t/02_hash.t @@ -25,15 +25,15 @@ while ( my $dbm_maker = $dbm_factory->() ) { is( $db->fetch("key2"), undef, "... fetch() works with put()" ); is( $db->{key2}, undef, "... and hash-access also works" ); - $db->store( "key3", "value3" ); - is( $db->get("key3"), "value3", "get() works with store()" ); - is( $db->fetch("key3"), "value3", "... fetch() works with put()" ); - is( $db->{key3}, 'value3', "... and hash-access also works" ); + $db->store( "0", "value3" ); + is( $db->get("0"), "value3", "get() works with store()" ); + is( $db->fetch("0"), "value3", "... fetch() works with put()" ); + is( $db->{0}, 'value3', "... and hash-access also works" ); # Verify that the keyval pairs are still correct. is( $db->{key1}, "value1", "Key1 is still correct" ); is( $db->{key2}, undef, "Key2 is still correct" ); - is( $db->{key3}, 'value3', "Key3 is still correct" ); + is( $db->{0}, 'value3', "Key3 is still correct" ); ok( $db->exists("key1"), "exists() function works" ); ok( exists $db->{key2}, "exists() works against tied hash" ); @@ -66,25 +66,25 @@ while ( my $dbm_maker = $dbm_factory->() ) { is( $temphash->{key1}, 'value1', "First key copied successfully using tied interface" ); is( $temphash->{key2}, undef, "Second key copied successfully" ); - is( $temphash->{key3}, 'value3', "Third key copied successfully" ); + is( $temphash->{0}, 'value3', "Third key copied successfully" ); $temphash = {}; my $key = $db->first_key(); - while ($key) { + while (defined $key) { $temphash->{$key} = $db->get($key); $key = $db->next_key($key); } is( $temphash->{key1}, 'value1', "First key copied successfully using OO interface" ); is( $temphash->{key2}, undef, "Second key copied successfully" ); - is( $temphash->{key3}, 'value3', "Third key copied successfully" ); + is( $temphash->{0}, 'value3', "Third key copied successfully" ); ## # delete keys ## is( delete $db->{key2}, undef, "delete through tied inteface works" ); is( $db->delete("key1"), 'value1', "delete through OO inteface works" ); - is( $db->{key3}, 'value3', "The other key is still there" ); + is( $db->{0}, 'value3', "The other key is still there" ); ok( !exists $db->{key1}, "key1 doesn't exist" ); ok( !exists $db->{key2}, "key2 doesn't exist" );