sub disconnect {
my ($self) = @_;
if (my $dbh = delete $self->{dbh}) {
+ delete $self->{-get_art};
$self->{filename} = $dbh->sqlite_db_filename;
}
}
sub get_art {
my ($self, $num) = @_;
- my $dbh = $self->connect;
- my $sth = $dbh->prepare_cached(<<'', undef, 1);
+ # caching $sth ourselves is faster than prepare_cached
+ my $sth = $self->{-get_art} //= $self->connect->prepare(<<'');
SELECT num,ds,ts,ddd FROM over WHERE num = ? LIMIT 1
$sth->execute($num);
$sth->execute($$id, $$prev);
my $num = $sth->fetchrow_array or return;
$$prev = $num;
-
- $sth = $dbh->prepare_cached(<<"", undef, 1);
-SELECT num,ts,ds,ddd FROM over WHERE num = ? LIMIT 1
-
- $sth->execute($num);
- my $smsg = $sth->fetchrow_hashref or return;
- load_from_row($smsg);
+ get_art($self, $num);
}
# IMAP search, this is limited by callers to UID_SLICE size (50K)
my $st = pack('dd', $st[0], $st[1]);
# don't actually reopen, just let {dbh} be recreated later
- if ($st ne ($self->{st} // $st)) {
- delete($self->{dbh});
- $self->{filename} = $f;
- }
+ disconnect($self) if $st ne ($self->{st} // $st);
} else {
warn "W: stat $f: $!\n";
}
use PublicInbox::WwwStream qw(html_oneshot);
use PublicInbox::SearchThread;
use PublicInbox::SearchQuery;
+use PublicInbox::Search qw(mdocid);
my %rmap_inc;
sub mbox_results {
my $pfx = ' ' x $pad;
my $res = \($ctx->{-html_tip});
my $ibx = $ctx->{-inbox};
- my $srch = $ibx->search;
+ my $over = $ibx->over;
+ my $nshard = $ibx->search->{nshard} // 1;
my $obfs_ibx = $ibx->{obfuscate} ? $ibx : undef;
foreach my $m ($mset->items) {
my $rank = sprintf("%${pad}d", $m->get_rank + 1);
my $pct = get_pct($m);
- my $smsg = PublicInbox::Smsg::from_mitem($m, $srch);
+ my $num = mdocid($nshard, $m);
+ my $smsg = $over->get_art($num, 1);
unless ($smsg) {
eval {
- $m = "$m ".$m->get_docid . " expired\n";
+ $m = "$m $num expired\n";
$ctx->{env}->{'psgi.errors'}->print($m);
};
next;
}
+ PublicInbox::Smsg::psgi_cull($smsg);
my $s = ascii_html($smsg->{subject});
my $f = ascii_html($smsg->{from_name});
if ($obfs_ibx) {