sub xpfx { $all_pfx{$_[0]} }
-our %PFX2TERM_RMAP;
-my %meta_pfx = (mid => 1, thread => 1, path => 1);
-while (my ($k, $v) = each %all_pfx) {
- $PFX2TERM_RMAP{$v} = $k if $meta_pfx{$k};
-}
-
my $mail_query = Search::Xapian::Query->new(xpfx('type') . 'mail');
sub xdir {
}
$opts ||= {};
$opts->{limit} ||= 1000;
+
+ # always sort threads by timestamp, this makes life easier
+ # for the threading algorithm (in SearchThread.pm)
+ $opts->{asc} = 1;
+
_do_enquire($self, $qtid, $opts);
}
-sub _do_enquire {
- my ($self, $query, $opts) = @_;
+sub retry_reopen {
+ my ($self, $cb) = @_;
my $ret;
for (1..10) {
- eval { $ret = _enquire_once($self, $query, $opts) };
+ eval { $ret = $cb->() };
return $ret unless $@;
# Exception: The revision being read has been discarded -
# you should call Xapian::Database::reopen()
- if (index($@, 'Xapian::Database::reopen') >= 0) {
+ if (ref($@) eq 'Search::Xapian::DatabaseModifiedError') {
reopen($self);
} else {
- die $@;
+ die;
}
}
}
+sub _do_enquire {
+ my ($self, $query, $opts) = @_;
+ retry_reopen($self, sub { _enquire_once($self, $query, $opts) });
+}
+
sub _enquire_once {
my ($self, $query, $opts) = @_;
my $enquire = $self->enquire;
# raises on error:
my $doc = $self->{xdb}->get_document($doc_id);
$smsg = PublicInbox::SearchMsg->wrap($doc, $mid);
- $smsg->doc_id($doc_id);
+ $smsg->{doc_id} = $doc_id;
}
$smsg;
}
sub lookup_mail { # no ghosts!
my ($self, $mid) = @_;
- my $smsg = lookup_message($self, $mid) or return;
- PublicInbox::SearchMsg->load_doc($smsg->{doc});
+ retry_reopen($self, sub {
+ my $smsg = lookup_message($self, $mid) or return;
+ PublicInbox::SearchMsg->load_doc($smsg->{doc});
+ });
}
sub find_unique_doc_id {