X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBM%2FDeep%2FEngine%2FSector%2FIndex.pm;h=a985bd85e063b4d199dfbc9d47bffa5436072fd6;hb=a8ee1892e98cea35cbf63bddd1a34d5849e3ca03;hp=a7c9334e7c2868fc330d0528b12dd4ab617eeb8c;hpb=badf847ca0fd2a37bf21caf92454a92d568e3ccf;p=dbsrgits%2FDBM-Deep.git diff --git a/lib/DBM/Deep/Engine/Sector/Index.pm b/lib/DBM/Deep/Engine/Sector/Index.pm index a7c9334..a985bd8 100644 --- a/lib/DBM/Deep/Engine/Sector/Index.pm +++ b/lib/DBM/Deep/Engine/Sector/Index.pm @@ -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,29 +18,27 @@ 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; - if ( ref($self) ) { - unless ( $self->{size} ) { - my $e = $self->engine; - $self->{size} = $self->base_size + $e->byte_size * $e->hash_chars; - } - return $self->{size}; - } - else { - my $e = shift; - return $self->base_size($e) + $e->byte_size * $e->hash_chars; + unless ( $self->{size} ) { + my $e = $self->engine; + $self->{size} = $self->base_size + $e->byte_size * $e->hash_chars; } + return $self->{size}; } sub free_meth { return '_add_free_index_sector' } @@ -56,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 { @@ -69,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 ), ); } @@ -83,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;