Fixed a couple of overlooks in reading an existing file's header.
[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;
29 unless ( $self->{size} ) {
30 my $e = $self->engine;
31 $self->{size} = $self->base_size + $e->byte_size * $e->hash_chars;
32 }
33 return $self->{size};
34}
35
36sub free_meth { return '_add_free_index_sector' }
37
38sub free {
39 my $self = shift;
40 my $e = $self->engine;
41
42 for my $i ( 0 .. $e->hash_chars - 1 ) {
43 my $l = $self->get_entry( $i ) or next;
44 $e->_load_sector( $l )->free;
45 }
46
47 $self->SUPER::free();
48}
49
50sub _loc_for {
51 my $self = shift;
52 my ($idx) = @_;
a8d2331c 53 return $self->base_size + $idx * $self->engine->byte_size;
065b45be 54}
55
56sub get_entry {
57 my $self = shift;
58 my ($idx) = @_;
59
60 my $e = $self->engine;
61
62 DBM::Deep->_throw_error( "get_entry: Out of range ($idx)" )
63 if $idx < 0 || $idx >= $e->hash_chars;
64
65 return unpack(
66 $e->StP($e->byte_size),
a8d2331c 67 $self->read( $self->_loc_for( $idx ), $e->byte_size ),
065b45be 68 );
69}
70
71sub set_entry {
72 my $self = shift;
73 my ($idx, $loc) = @_;
74
75 my $e = $self->engine;
76
77 DBM::Deep->_throw_error( "set_entry: Out of range ($idx)" )
78 if $idx < 0 || $idx >= $e->hash_chars;
79
a8d2331c 80 $self->write( $self->_loc_for( $idx ), pack( $e->StP($e->byte_size), $loc ) );
065b45be 81}
82
831;
84__END__