$self;
}
-sub reopen { $_[0]->{xdb}->reopen }
+sub reopen {
+ my ($self) = @_;
+ $self->{xdb}->reopen;
+ if (my $skel = $self->{skel}) {
+ $skel->reopen;
+ }
+}
# read-only
sub query {
sub get_thread {
my ($self, $mid, $opts) = @_;
- my $smsg = eval { $self->lookup_skeleton($mid) };
+ my $smsg = retry_reopen($self, sub { lookup_skeleton($self, $mid) });
return { total => 0, msgs => [] } unless $smsg;
my $qtid = Search::Xapian::Query->new('G' . $smsg->thread_id);
# always sort threads by timestamp, this makes life easier
# for the threading algorithm (in SearchThread.pm)
$opts->{asc} = 1;
-
+ $opts->{enquire} = enquire_skel($self);
_do_enquire($self, $qtid, $opts);
}
if (ref($@) eq 'Search::Xapian::DatabaseModifiedError') {
reopen($self);
} else {
+ warn "ref: ", ref($@), "\n";
die;
}
}
sub _enquire_once {
my ($self, $query, $opts) = @_;
- my $enquire = $self->enquire;
+ my $enquire = $opts->{enquire} || enquire($self);
if (defined $query) {
$query = Search::Xapian::Query->new(OP_AND,$query,$mail_query);
} else {
$self->{enquire} ||= Search::Xapian::Enquire->new($self->{xdb});
}
+sub enquire_skel {
+ my ($self) = @_;
+ if (my $skel = $self->{skel}) {
+ $self->{enquire_skel} ||= Search::Xapian::Enquire->new($skel);
+ } else {
+ enquire($self);
+ }
+}
+
sub help {
my ($self) = @_;
$self->qp; # parse altids