sub
reset
{
$_
[0]{breadcrumbs} = [];
return
}
sub
get_sector_iterator {
my
$self
=
shift
;
my
(
$loc
) =
@_
;
my
$sector
=
$self
->{engine}->load_sector(
$loc
)
or
return
;
if
(
$sector
->isa(
'DBM::Deep::Sector::File::Index'
) ) {
return
DBM::Deep::Iterator::File::Index->new({
iterator
=>
$self
,
sector
=>
$sector
,
});
}
elsif
(
$sector
->isa(
'DBM::Deep::Sector::File::BucketList'
) ) {
return
DBM::Deep::Iterator::File::BucketList->new({
iterator
=>
$self
,
sector
=>
$sector
,
});
}
DBM::Deep->_throw_error(
"get_sector_iterator(): Why did $loc make a $sector?"
);
}
sub
get_next_key {
my
$self
=
shift
;
my
(
$obj
) =
@_
;
my
$crumbs
=
$self
->{breadcrumbs};
my
$e
=
$self
->{engine};
unless
(
@$crumbs
) {
my
$sector
=
$e
->load_sector(
$self
->{base_offset} )
or
return
;
if
(
$sector
->staleness !=
$obj
->_staleness ) {
return
;
}
my
$loc
=
$sector
->get_blist_loc
or
return
;
push
@$crumbs
,
$self
->get_sector_iterator(
$loc
);
}
FIND_NEXT_KEY: {
unless
(
@$crumbs
) {
$self
->
reset
;
return
;
}
my
$iterator
=
$crumbs
->[-1];
if
(
$iterator
->at_end ) {
pop
@$crumbs
;
redo
FIND_NEXT_KEY;
}
if
(
$iterator
->isa(
'DBM::Deep::Iterator::File::Index'
) ) {
if
(
my
$next
=
$iterator
->get_next_iterator ) {
push
@$crumbs
,
$next
;
}
redo
FIND_NEXT_KEY;
}
unless
(
$iterator
->isa(
'DBM::Deep::Iterator::File::BucketList'
) ) {
DBM::Deep->_throw_error(
"Should have a bucketlist iterator here - instead have $iterator"
);
}
my
$key
=
$iterator
->get_next_key;
if
(
defined
$key
) {
return
$key
;
}
redo
FIND_NEXT_KEY;
}
DBM::Deep->_throw_error(
"get_next_key(): How did we get here?"
);
}
1;