Commit | Line | Data |
f0276afb |
1 | package DBM::Deep::Engine::Sector::Index; |
2 | |
3 | use base qw( DBM::Deep::Engine::Sector ); |
4 | |
5 | sub _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 |
25 | sub 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 | |
34 | sub free_meth { return '_add_free_index_sector' } |
35 | |
36 | sub 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 | |
48 | sub _loc_for { |
49 | my $self = shift; |
50 | my ($idx) = @_; |
51 | return $self->offset + $self->base_size + $idx * $self->engine->byte_size; |
52 | } |
53 | |
54 | sub 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 | |
69 | sub 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 | |
84 | 1; |
85 | __END__ |