Checking in breakout of the various packages in DBM::Deep::Engine and documentation...
[dbsrgits/DBM-Deep.git] / lib / DBM / Deep / Engine / Sector / Index.pm
CommitLineData
f0276afb 1package DBM::Deep::Engine::Sector::Index;
2
3use base qw( DBM::Deep::Engine::Sector );
4
5sub _init {
6 my $self = shift;
7
8 my $engine = $self->engine;
9
10 unless ( $self->offset ) {
11 my $leftover = $self->size - $self->base_size;
12
13 $self->{offset} = $engine->_request_index_sector( $self->size );
14 $engine->storage->print_at( $self->offset, $engine->SIG_INDEX ); # Sector type
15 # Skip staleness counter
16 $engine->storage->print_at( $self->offset + $self->base_size,
17 chr(0) x $leftover, # Zero-fill the rest
18 );
19 }
20
21 return $self;
22}
23
24#XXX Change here
25sub size {
26 my $self = shift;
27 unless ( $self->{size} ) {
28 my $e = $self->engine;
29 $self->{size} = $self->base_size + $e->byte_size * $e->hash_chars;
30 }
31 return $self->{size};
32}
33
34sub free_meth { return '_add_free_index_sector' }
35
36sub free {
37 my $self = shift;
38 my $e = $self->engine;
39
40 for my $i ( 0 .. $e->hash_chars - 1 ) {
41 my $l = $self->get_entry( $i ) or next;
42 $e->_load_sector( $l )->free;
43 }
44
45 $self->SUPER::free();
46}
47
48sub _loc_for {
49 my $self = shift;
50 my ($idx) = @_;
51 return $self->offset + $self->base_size + $idx * $self->engine->byte_size;
52}
53
54sub get_entry {
55 my $self = shift;
56 my ($idx) = @_;
57
58 my $e = $self->engine;
59
60 DBM::Deep->_throw_error( "get_entry: Out of range ($idx)" )
61 if $idx < 0 || $idx >= $e->hash_chars;
62
63 return unpack(
64 $StP{$e->byte_size},
65 $e->storage->read_at( $self->_loc_for( $idx ), $e->byte_size ),
66 );
67}
68
69sub set_entry {
70 my $self = shift;
71 my ($idx, $loc) = @_;
72
73 my $e = $self->engine;
74
75 DBM::Deep->_throw_error( "set_entry: Out of range ($idx)" )
76 if $idx < 0 || $idx >= $e->hash_chars;
77
78 $self->engine->storage->print_at(
79 $self->_loc_for( $idx ),
80 pack( $StP{$e->byte_size}, $loc ),
81 );
82}
83
841;
85__END__