Added description to a test
[dbsrgits/DBM-Deep.git] / lib / DBM / Deep / Engine / Sector / Index.pm
1 package DBM::Deep::Engine::Sector::Index;
2
3 use 5.006_000;
4
5 use strict;
6 use warnings FATAL => 'all';
7
8 use DBM::Deep::Engine::Sector;
9 our @ISA = qw( DBM::Deep::Engine::Sector );
10
11 sub _init {
12     my $self = shift;
13
14     my $engine = $self->engine;
15
16     unless ( $self->offset ) {
17         $self->{offset} = $engine->_request_index_sector( $self->size );
18
19         $self->write( 0, $engine->SIG_INDEX );
20     }
21
22     return $self;
23 }
24
25 #XXX Change here
26 #XXX Why? -RobK, 2008-06-18
27 sub size {
28     my $self = shift;
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;
39     }
40 }
41
42 sub free_meth { return '_add_free_index_sector' }
43
44 sub 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
56 sub _loc_for {
57     my $self = shift;
58     my ($idx) = @_;
59     return $self->base_size + $idx * $self->engine->byte_size;
60 }
61
62 sub 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),
73         $self->read( $self->_loc_for( $idx ), $e->byte_size ),
74     );
75 }
76
77 sub 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
86     $self->write( $self->_loc_for( $idx ), pack( $e->StP($e->byte_size), $loc ) );
87 }
88
89 1;
90 __END__