Removed the need for the :flock constants from Fcntl in DBM/Deep.pm
[dbsrgits/DBM-Deep.git] / lib / DBM / Deep / Engine / Sector / Index.pm
CommitLineData
065b45be 1#TODO: Convert this to a string
2package DBM::Deep::Engine::Sector::Index;
3
9c7d9738 4use 5.006_000;
065b45be 5
6use strict;
7use warnings FATAL => 'all';
8
9use DBM::Deep::Engine::Sector;
10our @ISA = qw( DBM::Deep::Engine::Sector );
11
12sub _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
29sub 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
38sub free_meth { return '_add_free_index_sector' }
39
40sub 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
52sub _loc_for {
53 my $self = shift;
54 my ($idx) = @_;
55 return $self->offset + $self->base_size + $idx * $self->engine->byte_size;
56}
57
58sub 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
73sub 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
881;
89__END__