File Coverage

blib/lib/DBM/Deep/Sector/File.pm
Criterion Covered Total %
statement 47 49 95.9
branch 14 16 87.5
condition 9 9 100.0
subroutine 12 13 92.3
pod 0 4 0.0
total 82 91 90.1


line stmt bran cond sub pod time code
1             package DBM::Deep::Sector::File;
2              
3 54     54   954 use 5.008_004;
  54         187  
4              
5 54     54   319 use strict;
  54         91  
  54         1861  
6 54     54   231 use warnings FATAL => 'all';
  54         81  
  54         3430  
7              
8 54     54   314 use base qw( DBM::Deep::Sector );
  54         90  
  54         32500  
9              
10 54     54   34467 use DBM::Deep::Sector::File::BucketList ();
  54         162  
  54         1596  
11 54     54   29421 use DBM::Deep::Sector::File::Index ();
  54         193  
  54         1542  
12 54     54   29210 use DBM::Deep::Sector::File::Null ();
  54         180  
  54         1646  
13 54     54   32126 use DBM::Deep::Sector::File::Reference ();
  54         195  
  54         2094  
14 54     54   29792 use DBM::Deep::Sector::File::Scalar ();
  54         194  
  54         23977  
15              
16             my $STALE_SIZE = 2;
17              
18             sub base_size {
19 90344     90344 0 144897 my $self = shift;
20 90344         187050 return $self->engine->SIG_SIZE + $STALE_SIZE;
21             }
22              
23 0     0 0 0 sub free_meth { die "free_meth must be implemented in a child class" }
24              
25             sub free {
26 842     842 0 1657 my $self = shift;
27              
28 842         2198 my $e = $self->engine;
29              
30 842         2718 $e->storage->print_at( $self->offset, $e->SIG_FREE );
31             # Skip staleness counter
32 842         3482 $e->storage->print_at( $self->offset + $self->base_size,
33             chr(0) x ($self->size - $self->base_size),
34             );
35              
36 842         3791 my $free_meth = $self->free_meth;
37 842         2759 $e->$free_meth( $self->offset, $self->size );
38              
39 842         3026 return;
40             }
41              
42             #=head2 load( $offset )
43             #
44             #This will instantiate and return the sector object that represents the data
45             #found at $offset.
46             #
47             #=cut
48              
49             sub load {
50 29012     29012 0 52763 my $self = shift;
51 29012         56023 my ($engine, $offset) = @_;
52              
53             # Add a catch for offset of 0 or 1
54 29012 100 100     119178 return if !$offset || $offset <= 1;
55              
56 29008         74792 my $type = $engine->storage->read_at( $offset, 1 );
57 29008 50       79979 return if $type eq chr(0);
58              
59 29008 100 100     213789 if ( $type eq $engine->SIG_ARRAY || $type eq $engine->SIG_HASH ) {
    100 100        
    100          
    100          
    100          
    50          
60 10838         81562 return DBM::Deep::Sector::File::Reference->new({
61             engine => $engine,
62             type => $type,
63             offset => $offset,
64             });
65             }
66             # XXX Don't we need key_md5 here?
67             elsif ( $type eq $engine->SIG_BLIST ) {
68 7137         46370 return DBM::Deep::Sector::File::BucketList->new({
69             engine => $engine,
70             type => $type,
71             offset => $offset,
72             });
73             }
74             elsif ( $type eq $engine->SIG_INDEX ) {
75 5736         36001 return DBM::Deep::Sector::File::Index->new({
76             engine => $engine,
77             type => $type,
78             offset => $offset,
79             });
80             }
81             elsif ( $type eq $engine->SIG_NULL ) {
82 31         244 return DBM::Deep::Sector::File::Null->new({
83             engine => $engine,
84             type => $type,
85             offset => $offset,
86             });
87             }
88             elsif ( $type eq $engine->SIG_DATA || $type eq $engine->SIG_UNIDATA ) {
89 5261         26974 return DBM::Deep::Sector::File::Scalar->new({
90             engine => $engine,
91             type => $type,
92             offset => $offset,
93             });
94             }
95             # This was deleted from under us, so just return and let the caller figure it out.
96             elsif ( $type eq $engine->SIG_FREE ) {
97 5         44 return;
98             }
99              
100 0           DBM::Deep->_throw_error( "'$offset': Don't know what to do with type '$type'" );
101             }
102              
103             1;
104             __END__