File Coverage

blib/lib/DBM/Deep/Sector/File/Index.pm
Criterion Covered Total %
statement 35 42 83.3
branch 6 10 60.0
condition 2 6 33.3
subroutine 8 10 80.0
pod 0 5 0.0
total 51 73 69.8


line stmt bran cond sub pod time code
1             package DBM::Deep::Sector::File::Index;
2              
3 54     54   379 use strict;
  54         135  
  54         2353  
4 54     54   323 use warnings FATAL => 'all';
  54         111  
  54         3566  
5              
6 54     54   299 use base qw( DBM::Deep::Sector::File );
  54         157  
  54         38959  
7              
8             my $STALE_SIZE = 2;
9              
10             # Please refer to the pack() documentation for further information
11             my %StP = (
12             1 => 'C', # Unsigned char value (no order needed as it's just one byte)
13             2 => 'n', # Unsigned short in "network" (big-endian) order
14             4 => 'N', # Unsigned long in "network" (big-endian) order
15             8 => 'Q', # Usigned quad (no order specified, presumably machine-dependent)
16             );
17              
18             sub _init {
19 5753     5753   10220 my $self = shift;
20              
21 5753         13850 my $engine = $self->engine;
22              
23 5753 100       13556 unless ( $self->offset ) {
24 14         52 my $leftover = $self->size - $self->base_size;
25              
26 14         72 $self->{offset} = $engine->_request_index_sector( $self->size );
27 14         63 $engine->storage->print_at( $self->offset, $engine->SIG_INDEX ); # Sector type
28             # Skip staleness counter
29 14         186 $engine->storage->print_at( $self->offset + $self->base_size,
30             chr(0) x $leftover, # Zero-fill the rest
31             );
32             }
33              
34 5753         12937 return $self;
35             }
36              
37             #XXX Change here
38             sub size {
39 31     31 0 54 my $self = shift;
40 31 100       110 unless ( $self->{size} ) {
41 17         65 my $e = $self->engine;
42 17         82 $self->{size} = $self->base_size + $e->byte_size * $e->hash_chars;
43             }
44 31         116 return $self->{size};
45             }
46              
47 0     0 0 0 sub free_meth { return '_add_free_index_sector' }
48              
49             sub free {
50 0     0 0 0 my $self = shift;
51 0         0 my $e = $self->engine;
52              
53 0         0 for my $i ( 0 .. $e->hash_chars - 1 ) {
54 0 0       0 my $l = $self->get_entry( $i ) or next;
55 0         0 $e->load_sector( $l )->free;
56             }
57              
58 0         0 $self->SUPER::free();
59             }
60              
61             sub _loc_for {
62 10508     10508   15837 my $self = shift;
63 10508         17215 my ($idx) = @_;
64 10508         22628 return $self->offset + $self->base_size + $idx * $self->engine->byte_size;
65             }
66              
67             sub get_entry {
68 9561     9561 0 15924 my $self = shift;
69 9561         69495 my ($idx) = @_;
70              
71 9561         20100 my $e = $self->engine;
72              
73 9561 50 33     34519 DBM::Deep->_throw_error( "get_entry: Out of range ($idx)" )
74             if $idx < 0 || $idx >= $e->hash_chars;
75              
76             return unpack(
77 9561         22521 $StP{$e->byte_size},
78             $e->storage->read_at( $self->_loc_for( $idx ), $e->byte_size ),
79             );
80             }
81              
82             sub set_entry {
83 947     947 0 1785 my $self = shift;
84 947         1957 my ($idx, $loc) = @_;
85              
86 947         2230 my $e = $self->engine;
87              
88 947 50 33     3698 DBM::Deep->_throw_error( "set_entry: Out of range ($idx)" )
89             if $idx < 0 || $idx >= $e->hash_chars;
90              
91             $self->engine->storage->print_at(
92             $self->_loc_for( $idx ),
93 947         2114 pack( $StP{$e->byte_size}, $loc ),
94             );
95             }
96              
97             1;
98             __END__