All the tests now pass with the broken out classes
[dbsrgits/DBM-Deep.git] / lib / DBM / Deep / Engine / Sector / Index.pm
index e937233..a985bd8 100644 (file)
@@ -1,12 +1,16 @@
 package DBM::Deep::Engine::Sector::Index;
 
-use 5.006_000;
+use base qw( DBM::Deep::Engine::Sector );
 
-use strict;
-use warnings FATAL => 'all';
+my $STALE_SIZE = 2;
 
-use DBM::Deep::Engine::Sector;
-our @ISA = qw( DBM::Deep::Engine::Sector );
+# Please refer to the pack() documentation for further information
+my %StP = (
+    1 => 'C', # Unsigned char value (no order needed as it's just one byte)
+    2 => 'n', # Unsigned short in "network" (big-endian) order
+    4 => 'N', # Unsigned long in "network" (big-endian) order
+    8 => 'Q', # Usigned quad (no order specified, presumably machine-dependent)
+);
 
 sub _init {
     my $self = shift;
@@ -14,16 +18,20 @@ sub _init {
     my $engine = $self->engine;
 
     unless ( $self->offset ) {
-        $self->{offset} = $engine->_request_index_sector( $self->size );
+        my $leftover = $self->size - $self->base_size;
 
-        $self->write( 0, $engine->SIG_INDEX );
+        $self->{offset} = $engine->_request_index_sector( $self->size );
+        $engine->storage->print_at( $self->offset, $engine->SIG_INDEX ); # Sector type
+        # Skip staleness counter
+        $engine->storage->print_at( $self->offset + $self->base_size,
+            chr(0) x $leftover, # Zero-fill the rest
+        );
     }
 
     return $self;
 }
 
 #XXX Change here
-#XXX Why? -RobK, 2008-06-18
 sub size {
     my $self = shift;
     unless ( $self->{size} ) {
@@ -50,7 +58,7 @@ sub free {
 sub _loc_for {
     my $self = shift;
     my ($idx) = @_;
-    return $self->base_size + $idx * $self->engine->byte_size;
+    return $self->offset + $self->base_size + $idx * $self->engine->byte_size;
 }
 
 sub get_entry {
@@ -63,8 +71,8 @@ sub get_entry {
         if $idx < 0 || $idx >= $e->hash_chars;
 
     return unpack(
-        $e->StP($e->byte_size),
-        $self->read( $self->_loc_for( $idx ), $e->byte_size ),
+        $StP{$e->byte_size},
+        $e->storage->read_at( $self->_loc_for( $idx ), $e->byte_size ),
     );
 }
 
@@ -77,7 +85,10 @@ sub set_entry {
     DBM::Deep->_throw_error( "set_entry: Out of range ($idx)" )
         if $idx < 0 || $idx >= $e->hash_chars;
 
-    $self->write( $self->_loc_for( $idx ), pack( $e->StP($e->byte_size), $loc ) );
+    $self->engine->storage->print_at(
+        $self->_loc_for( $idx ),
+        pack( $StP{$e->byte_size}, $loc ),
+    );
 }
 
 1;