Commit | Line | Data |
065b45be |
1 | package DBM::Deep::Engine::Sector::Index; |
2 | |
9c7d9738 |
3 | use 5.006_000; |
065b45be |
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 ) { |
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 |
27 | sub size { |
28 | my $self = shift; |
badf847c |
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; |
065b45be |
39 | } |
065b45be |
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) = @_; |
a8d2331c |
59 | return $self->base_size + $idx * $self->engine->byte_size; |
065b45be |
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), |
a8d2331c |
73 | $self->read( $self->_loc_for( $idx ), $e->byte_size ), |
065b45be |
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 | |
a8d2331c |
86 | $self->write( $self->_loc_for( $idx ), pack( $e->StP($e->byte_size), $loc ) ); |
065b45be |
87 | } |
88 | |
89 | 1; |
90 | __END__ |