begin_work, rollback, and commit now properly lock the database
[dbsrgits/DBM-Deep.git] / lib / DBM / Deep / Engine / Sector / FileHeader.pm
index ae56c0f..fe70e6a 100644 (file)
@@ -183,15 +183,63 @@ sub request_sector {
     }
 
     # Need to load the new sector so we can read from it.
-    my $new_sector = $self->engine->storage->read_at( $loc, $size );
+    my $new_sector = $self->engine->get_data( $loc, $size );
 
     # Read the new head after the signature and the staleness counter
-    my $new_head = substr( $new_sector, $e->SIG_SIZE + $DBM::Deep::Engine::STALE_SIZE, $e->byte_size );
+    my $new_head = substr( $$new_sector, $e->SIG_SIZE + $DBM::Deep::Engine::STALE_SIZE, $e->byte_size );
 
     $self->write( $e->chains_loc + $chains_offset, $new_head );
 
     return $loc;
 }
 
+sub read_txn_slots {
+    my $self = shift;
+    my $e = $self->engine;
+    my $bl = $e->txn_bitfield_len;
+    my $num_bits = $bl * 8;
+    my @x = split '', unpack( 'b'.$num_bits, $self->read( $e->trans_loc, $bl ) );
+    return @x;
+}
+
+sub write_txn_slots {
+    my $self = shift;
+    my $e = $self->engine;
+    my $num_bits = $e->txn_bitfield_len * 8;
+    $self->write( $e->trans_loc,
+        pack( 'b'.$num_bits, join('', @_) ),
+    );
+}
+
+sub get_txn_staleness_counter {
+    my $self = shift;
+    my ($trans_id) = @_;
+
+    # Hardcode staleness of 0 for the HEAD
+    return 0 unless $trans_id;
+
+    my $e = $self->engine;
+    return unpack( $e->StP($DBM::Deep::Engine::STALE_SIZE),
+        $self->read(
+            $e->trans_loc + $e->txn_bitfield_len + $DBM::Deep::Engine::STALE_SIZE * ($trans_id - 1),
+            $DBM::Deep::Engine::STALE_SIZE,
+        )
+    );
+}
+
+sub inc_txn_staleness_counter {
+    my $self = shift;
+    my ($trans_id) = @_;
+
+    # Hardcode staleness of 0 for the HEAD
+    return 0 unless $trans_id;
+
+    my $e = $self->engine;
+    $self->write(
+        $e->trans_loc + $e->txn_bitfield_len + $DBM::Deep::Engine::STALE_SIZE * ($trans_id - 1),
+        pack( $e->StP($DBM::Deep::Engine::STALE_SIZE), $self->get_txn_staleness_counter( $trans_id ) + 1 ),
+    );
+}
+
 1;
 __END__