First transaction test file passes
[dbsrgits/DBM-Deep.git] / lib / DBM / Deep / Engine3.pm
index baf3aee..90044b0 100644 (file)
@@ -353,7 +353,7 @@ sub rollback {
         my $read_loc = $entry
           + $self->hash_size
           + $self->byte_size
-          + $self->trans_id * ( 2 * $self->byte_size );
+          + $self->trans_id * ( $self->byte_size + 4 );
 
         my $data_loc = $self->storage->read_at( $read_loc, $self->byte_size );
         $data_loc = unpack( $StP{$self->byte_size}, $data_loc );
@@ -395,12 +395,12 @@ sub commit {
         my $head_loc = $self->storage->read_at( $base, $self->byte_size );
         $head_loc = unpack( $StP{$self->byte_size}, $head_loc );
         my $trans_loc = $self->storage->read_at(
-            $base + $self->trans_id * ( 2 * $self->byte_size ), $self->byte_size,
+            $base + $self->trans_id * ( $self->byte_size + 4 ), $self->byte_size,
         );
 
         $self->storage->print_at( $base, $trans_loc );
         $self->storage->print_at(
-            $base + $self->trans_id * ( 2 * $self->byte_size ),
+            $base + $self->trans_id * ( $self->byte_size + 4 ),
             pack( $StP{$self->byte_size} . ' N', (0) x 2 ),
         );
 
@@ -740,6 +740,7 @@ sub get_next_key {
         #XXX Think this through!
         my $loc =  $sector->get_data_location_for({
             idx => $idx,
+            allow_head => 1,
         });
         unless ( $loc ) {
             $crumbs->[-1][1]++;
@@ -1226,7 +1227,7 @@ sub bucket_size {
     unless ( $self->{bucket_size} ) {
         my $e = $self->engine;
         # Key + head (location) + transactions (location + staleness-counter)
-        my $location_size = $e->byte_size + $e->num_txns * ( 2 * $e->byte_size );
+        my $location_size = $e->byte_size + $e->num_txns * ( $e->byte_size + 4 );
         $self->{bucket_size} = $e->hash_size + $location_size;
     }
     return $self->{bucket_size};
@@ -1303,7 +1304,7 @@ sub write_md5 {
     my $loc = $spot
       + $engine->hash_size
       + $engine->byte_size
-      + $args->{trans_id} * ( 2 * $engine->byte_size );
+      + $args->{trans_id} * ( $engine->byte_size + 4 );
 
     $engine->storage->print_at( $loc,
         pack( $StP{$engine->byte_size}, $args->{value}->offset ),
@@ -1326,7 +1327,7 @@ sub mark_deleted {
     my $loc = $spot
       + $engine->hash_size
       + $engine->byte_size
-      + $args->{trans_id} * ( 2 * $engine->byte_size );
+      + $args->{trans_id} * ( $engine->byte_size + 4 );
 
     $engine->storage->print_at( $loc,
         pack( $StP{$engine->byte_size}, 1 ), # 1 is the marker for deleted
@@ -1382,11 +1383,11 @@ sub get_data_location_for {
       + $args->{idx} * $self->bucket_size
       + $e->hash_size
       + $e->byte_size
-      + $args->{trans_id} * ( 2 * $e->byte_size );
+      + $args->{trans_id} * ( $e->byte_size + 4 );
 
     my $buffer = $e->storage->read_at(
         $spot,
-        2 * $e->byte_size,
+        $e->byte_size + 4,
     );
     my ($loc, $staleness) = unpack( $StP{$e->byte_size} . ' N', $buffer );
 
@@ -1405,6 +1406,7 @@ sub get_data_location_for {
         return $self->get_data_location_for({
             trans_id   => 0,
             allow_head => 1,
+            idx        => $args->{idx},
         });
     }
     return $loc <= 1 ? 0 : $loc;