Commit | Line | Data |
065b45be |
1 | #TODO: Convert this to a string |
2 | package DBM::Deep::Engine::Sector::Index; |
3 | |
9c7d9738 |
4 | use 5.006_000; |
065b45be |
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 ) { |
065b45be |
18 | $self->{offset} = $engine->_request_index_sector( $self->size ); |
576320ff |
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 ); |
065b45be |
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__ |