use PublicInbox::MID qw(mid2path);
use Devel::Peek qw(SvREFCNT);
use PublicInbox::MIME;
+use POSIX qw(strftime);
my $cleanup_timer;
eval {
sub mm {
my ($self) = @_;
$self->{mm} ||= eval {
+ require PublicInbox::Msgmap;
_cleanup_later($self);
my $dir = $self->{mainrepo};
if (($self->{version} || 1) >= 2) {
git($self)->check('HEAD:'.$path);
}
+sub mid2num($$) {
+ my ($self, $mid) = @_;
+ my $mm = mm($self) or return;
+ $mm->num_for($mid);
+}
+
+sub smsg_by_mid ($$) {
+ my ($self, $mid) = @_;
+ my $srch = search($self) or return;
+ # favor the Message-ID we used for the NNTP article number:
+ my $num = mid2num($self, $mid);
+ defined $num ? $srch->lookup_article($num) : undef;
+}
+
sub msg_by_mid ($$;$) {
my ($self, $mid, $ref) = @_;
my $srch = search($self) or
- return msg_by_path($self, mid2path($mid), $ref);
- my $smsg;
- $srch->retry_reopen(sub {
- $smsg = $srch->lookup_skeleton($mid) and $smsg->load_expand;
- });
+ return msg_by_path($self, mid2path($mid), $ref);
+ my $smsg = smsg_by_mid($self, $mid);
$smsg ? msg_by_smsg($self, $smsg, $ref) : undef;
}
+sub recent {
+ my ($self, $opts) = @_;
+ my $qs = '';
+ my $srch = search($self);
+ if (!$opts->{offset}) {
+ # this complicated bit cuts /$INBOX/ loading time by
+ # over 400ms on my system:
+ my ($min, $max) = mm($self)->minmax;
+ my $n = $max - $opts->{limit};
+ $n = $min if $n < $min;
+ for (; $qs eq '' && $n >= $min; --$n) {
+ my $smsg = $srch->lookup_article($n) or next;
+ $qs = strftime('d:%Y%m%d..', gmtime($smsg->ts));
+ }
+ }
+ $srch->query($qs, $opts);
+}
+
1;