1 package DBM::Deep::Iterator;
6 use warnings FATAL => 'all';
10 use DBM::Deep::Iterator::Index;
11 use DBM::Deep::Iterator::BucketList;
19 engine => $args->{engine},
20 base_offset => $args->{base_offset},
23 Scalar::Util::weaken( $self->{engine} );
28 sub reset { $_[0]{breadcrumbs} = [] }
30 sub get_sector_iterator {
34 my $sector = $self->{engine}->_load_sector( $loc )
37 if ( $sector->isa( 'DBM::Deep::Engine::Sector::Index' ) ) {
38 return DBM::Deep::Iterator::Index->new({
43 elsif ( $sector->isa( 'DBM::Deep::Engine::Sector::BucketList' ) ) {
44 return DBM::Deep::Iterator::BucketList->new({
50 DBM::Deep->_throw_error( "get_sector_iterator(): Why did $loc make a $sector?" );
57 my $crumbs = $self->{breadcrumbs};
58 my $e = $self->{engine};
61 # This will be a Reference sector
62 my $sector = $e->_load_sector( $self->{base_offset} )
63 # If no sector is found, thist must have been deleted from under us.
66 if ( $sector->staleness != $obj->_staleness ) {
70 my $loc = $sector->get_blist_loc
73 push @$crumbs, $self->get_sector_iterator( $loc );
83 my $iterator = $crumbs->[-1];
86 if ( $iterator->at_end ) {
91 if ( $iterator->isa( 'DBM::Deep::Iterator::Index' ) ) {
92 # If we don't have any more, it will be caught at the
94 if ( my $next = $iterator->get_next_iterator ) {
100 unless ( $iterator->isa( 'DBM::Deep::Iterator::BucketList' ) ) {
101 DBM::Deep->_throw_error(
102 "Should have a bucketlist iterator here - instead have $iterator"
106 # At this point, we have a BucketList iterator
107 my $key = $iterator->get_next_key;
108 if ( defined $key ) {
111 #XXX else { $iterator->set_to_end() } ?
113 # We hit the end of the bucketlist iterator, so redo
117 DBM::Deep->_throw_error( "get_next_key(): How did we get here?" );