File Coverage

blib/lib/DBM/Deep/Iterator/File.pm
Criterion Covered Total %
statement 49 53 92.4
branch 22 26 84.6
condition n/a
subroutine 8 8 100.0
pod 2 3 66.6
total 81 90 90.0


line stmt bran cond sub pod time code
1             package DBM::Deep::Iterator::File;
2              
3 23     23   179 use strict;
  23         48  
  23         857  
4 23     23   125 use warnings FATAL => 'all';
  23         152  
  23         1120  
5              
6 23     23   204 use base qw( DBM::Deep::Iterator );
  23         42  
  23         2088  
7              
8 23     23   11146 use DBM::Deep::Iterator::File::BucketList ();
  23         128  
  23         522  
9 23     23   10712 use DBM::Deep::Iterator::File::Index ();
  23         55  
  23         10015  
10              
11 308     308 1 678 sub reset { $_[0]{breadcrumbs} = []; return }
  308         541  
12              
13             sub get_sector_iterator {
14 346     346 0 582 my $self = shift;
15 346         619 my ($loc) = @_;
16              
17 346 50       1023 my $sector = $self->{engine}->load_sector( $loc )
18             or return;
19              
20 346 100       2123 if ( $sector->isa( 'DBM::Deep::Sector::File::Index' ) ) {
    50          
21 15         85 return DBM::Deep::Iterator::File::Index->new({
22             iterator => $self,
23             sector => $sector,
24             });
25             }
26             elsif ( $sector->isa( 'DBM::Deep::Sector::File::BucketList' ) ) {
27 331         1481 return DBM::Deep::Iterator::File::BucketList->new({
28             iterator => $self,
29             sector => $sector,
30             });
31             }
32              
33 0         0 DBM::Deep->_throw_error( "get_sector_iterator(): Why did $loc make a $sector?" );
34             }
35              
36             sub get_next_key {
37 541     541 1 816 my $self = shift;
38 541         894 my ($obj) = @_;
39              
40 541         844 my $crumbs = $self->{breadcrumbs};
41 541         804 my $e = $self->{engine};
42              
43 541 100       1201 unless ( @$crumbs ) {
44             # This will be a Reference sector
45             my $sector = $e->load_sector( $self->{base_offset} )
46             # If no sector is found, this must have been deleted from under us.
47 158 100       681 or return;
48              
49 157 50       566 if ( $sector->staleness != $obj->_staleness ) {
50 0         0 return;
51             }
52              
53 157 100       589 my $loc = $sector->get_blist_loc
54             or return;
55              
56 151         503 push @$crumbs, $self->get_sector_iterator( $loc );
57             }
58              
59             FIND_NEXT_KEY: {
60             # We're at the end.
61 534 100       869 unless ( @$crumbs ) {
  5987         11469  
62 150         508 $self->reset;
63 150         513 return;
64             }
65              
66 5837         8595 my $iterator = $crumbs->[-1];
67              
68             # This level is done.
69 5837 100       12888 if ( $iterator->at_end ) {
70 345         628 pop @$crumbs;
71 345         1641 redo FIND_NEXT_KEY;
72             }
73              
74 5492 100       20512 if ( $iterator->isa( 'DBM::Deep::Iterator::File::Index' ) ) {
75             # If we don't have any more, it will be caught at the
76             # prior check.
77 210 100       430 if ( my $next = $iterator->get_next_iterator ) {
78 195         416 push @$crumbs, $next;
79             }
80 210         389 redo FIND_NEXT_KEY;
81             }
82              
83 5282 50       11727 unless ( $iterator->isa( 'DBM::Deep::Iterator::File::BucketList' ) ) {
84 0         0 DBM::Deep->_throw_error(
85             "Should have a bucketlist iterator here - instead have $iterator"
86             );
87             }
88              
89             # At this point, we have a BucketList iterator
90 5282         10468 my $key = $iterator->get_next_key;
91 5282 100       11500 if ( defined $key ) {
92 384         1428 return $key;
93             }
94             #XXX else { $iterator->set_to_end() } ?
95              
96             # We hit the end of the bucketlist iterator, so redo
97 4898         8321 redo FIND_NEXT_KEY;
98             }
99              
100 0           DBM::Deep->_throw_error( "get_next_key(): How did we get here?" );
101             }
102              
103             1;
104             __END__