All sectors now use a string to create themselves
[dbsrgits/DBM-Deep.git] / lib / DBM / Deep / Engine / Sector / Index.pm
1 #TODO: Convert this to a string
2 package DBM::Deep::Engine::Sector::Index;
3
4 use 5.006_000;
5
6 use strict;
7 use warnings FATAL => 'all';
8
9 use DBM::Deep::Engine::Sector;
10 our @ISA = qw( DBM::Deep::Engine::Sector );
11
12 sub _init {
13     my $self = shift;
14
15     my $engine = $self->engine;
16
17     unless ( $self->offset ) {
18         $self->{offset} = $engine->_request_index_sector( $self->size );
19
20         my $string = chr(0) x $self->size;
21         substr( $string, 0, 1, $engine->SIG_INDEX );
22         $engine->storage->print_at( $self->offset, $string );
23     }
24
25     return $self;
26 }
27
28 #XXX Change here
29 sub size {
30     my $self = shift;
31     unless ( $self->{size} ) {
32         my $e = $self->engine;
33         $self->{size} = $self->base_size + $e->byte_size * $e->hash_chars;
34     }
35     return $self->{size};
36 }
37
38 sub free_meth { return '_add_free_index_sector' }
39
40 sub free {
41     my $self = shift;
42     my $e = $self->engine;
43
44     for my $i ( 0 .. $e->hash_chars - 1 ) {
45         my $l = $self->get_entry( $i ) or next;
46         $e->_load_sector( $l )->free;
47     }
48
49     $self->SUPER::free();
50 }
51
52 sub _loc_for {
53     my $self = shift;
54     my ($idx) = @_;
55     return $self->offset + $self->base_size + $idx * $self->engine->byte_size;
56 }
57
58 sub get_entry {
59     my $self = shift;
60     my ($idx) = @_;
61
62     my $e = $self->engine;
63
64     DBM::Deep->_throw_error( "get_entry: Out of range ($idx)" )
65         if $idx < 0 || $idx >= $e->hash_chars;
66
67     return unpack(
68         $e->StP($e->byte_size),
69         $e->storage->read_at( $self->_loc_for( $idx ), $e->byte_size ),
70     );
71 }
72
73 sub set_entry {
74     my $self = shift;
75     my ($idx, $loc) = @_;
76
77     my $e = $self->engine;
78
79     DBM::Deep->_throw_error( "set_entry: Out of range ($idx)" )
80         if $idx < 0 || $idx >= $e->hash_chars;
81
82     $self->engine->storage->print_at(
83         $self->_loc_for( $idx ),
84         pack( $e->StP($e->byte_size), $loc ),
85     );
86 }
87
88 1;
89 __END__