(RT #40782) '0' as a hashkey wasn't iterated over correctly.
Rob Kinyon [Wed, 6 Jan 2010 03:21:23 +0000 (22:21 -0500)]
Changes
lib/DBM/Deep/Engine.pm
lib/DBM/Deep/Hash.pm
t/02_hash.t

diff --git a/Changes b/Changes
index bc138c5..72340c4 100644 (file)
--- 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.)
index a42850c..0419be7 100644 (file)
@@ -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,
index 102f367..ec7a7a7 100644 (file)
@@ -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 );
     }
 
index 774ab49..f4add2e 100644 (file)
@@ -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" );