Hash tests pass again with header being read and cached
[dbsrgits/DBM-Deep.git] / lib / DBM / Deep / Engine / Sector / Index.pm
CommitLineData
065b45be 1package DBM::Deep::Engine::Sector::Index;
2
9c7d9738 3use 5.006_000;
065b45be 4
5use strict;
6use warnings FATAL => 'all';
7
8use DBM::Deep::Engine::Sector;
9our @ISA = qw( DBM::Deep::Engine::Sector );
10
11sub _init {
12 my $self = shift;
13
14 my $engine = $self->engine;
15
16 unless ( $self->offset ) {
065b45be 17 $self->{offset} = $engine->_request_index_sector( $self->size );
576320ff 18
a8d2331c 19 $self->write( 0, $engine->SIG_INDEX );
065b45be 20 }
21
22 return $self;
23}
24
25#XXX Change here
a8d2331c 26#XXX Why? -RobK, 2008-06-18
065b45be 27sub size {
28 my $self = shift;
badf847c 29 if ( ref($self) ) {
30 unless ( $self->{size} ) {
31 my $e = $self->engine;
32 $self->{size} = $self->base_size + $e->byte_size * $e->hash_chars;
33 }
34 return $self->{size};
35 }
36 else {
37 my $e = shift;
38 return $self->base_size($e) + $e->byte_size * $e->hash_chars;
065b45be 39 }
065b45be 40}
41
42sub free_meth { return '_add_free_index_sector' }
43
44sub free {
45 my $self = shift;
46 my $e = $self->engine;
47
48 for my $i ( 0 .. $e->hash_chars - 1 ) {
49 my $l = $self->get_entry( $i ) or next;
50 $e->_load_sector( $l )->free;
51 }
52
53 $self->SUPER::free();
54}
55
56sub _loc_for {
57 my $self = shift;
58 my ($idx) = @_;
a8d2331c 59 return $self->base_size + $idx * $self->engine->byte_size;
065b45be 60}
61
62sub get_entry {
63 my $self = shift;
64 my ($idx) = @_;
65
66 my $e = $self->engine;
67
68 DBM::Deep->_throw_error( "get_entry: Out of range ($idx)" )
69 if $idx < 0 || $idx >= $e->hash_chars;
70
71 return unpack(
72 $e->StP($e->byte_size),
a8d2331c 73 $self->read( $self->_loc_for( $idx ), $e->byte_size ),
065b45be 74 );
75}
76
77sub set_entry {
78 my $self = shift;
79 my ($idx, $loc) = @_;
80
81 my $e = $self->engine;
82
83 DBM::Deep->_throw_error( "set_entry: Out of range ($idx)" )
84 if $idx < 0 || $idx >= $e->hash_chars;
85
a8d2331c 86 $self->write( $self->_loc_for( $idx ), pack( $e->StP($e->byte_size), $loc ) );
065b45be 87}
88
891;
90__END__