-# Copyright (C) 2020 all contributors <meta@public-inbox.org>
+# Copyright (C) 2020-2021 all contributors <meta@public-inbox.org>
# License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
#
# Local storage (cache/memo) for lei(1), suitable for personal/private
use PublicInbox::Import;
use PublicInbox::InboxWritable;
use PublicInbox::V2Writable;
-use PublicInbox::ContentHash qw(content_hash);
-use PublicInbox::MID qw(mids);
+use PublicInbox::ContentHash qw(content_hash content_digest);
+use PublicInbox::MID qw(mids mids_in);
use PublicInbox::LeiSearch;
use List::Util qw(max);
my (undef, $dir, $opt) = @_;
my $eidx = PublicInbox::ExtSearchIdx->new($dir, $opt);
my $self = bless { priv_eidx => $eidx }, __PACKAGE__;
- if ($opt->{creat}) {
- PublicInbox::SearchIdx::load_xapian_writable();
- eidx_init($self);
- }
+ eidx_init($self) if $opt->{creat};
$self;
}
$eidx;
}
+# when a message has no Message-IDs at all, this is needed for
+# unsent Draft messages, at least
+sub _fake_mid_for ($$) {
+ my ($eml, $dig) = @_;
+ my $mids = mids_in($eml, qw(X-Alt-Message-ID Resent-Message-ID));
+ $eml->{-lei_fake_mid} =
+ $mids->[0] // PublicInbox::Import::digest2mid($dig, $eml);
+}
+
sub _docids_for ($$) {
my ($self, $eml) = @_;
my %docids;
- my $chash = content_hash($eml);
+ my $dig = content_digest($eml);
+ my $chash = $dig->clone->digest;
my $eidx = eidx_init($self);
my $oidx = $eidx->{oidx};
my $im = $self->{im};
- for my $mid (@{mids($eml)}) {
+ my $mids = mids($eml);
+ $mids->[0] //= _fake_mid_for($eml, $dig);
+ for my $mid (@$mids) {
my ($id, $prev);
while (my $cur = $oidx->next_by_mid($mid, \$id, \$prev)) {
my $oid = $cur->{blob};
my $eidx = eidx_init($self);
my @docids = _docids_for($self, $eml);
for my $docid (@docids) {
- $eidx->idx_shard($docid)->shard_set_keywords($docid, @kw);
+ $eidx->idx_shard($docid)->ipc_do('set_keywords', $docid, @kw);
}
\@docids;
}
my $eidx = eidx_init($self);
my @docids = _docids_for($self, $eml);
for my $docid (@docids) {
- $eidx->idx_shard($docid)->shard_add_keywords($docid, @kw);
+ $eidx->idx_shard($docid)->ipc_do('add_keywords', $docid, @kw);
}
\@docids;
}
my $eidx = eidx_init($self);
my @docids = _docids_for($self, $eml);
for my $docid (@docids) {
- $eidx->idx_shard($docid)->shard_remove_keywords($docid, @kw);
+ $eidx->idx_shard($docid)->ipc_do('remove_keywords', $docid, @kw)
}
\@docids;
}
for my $docid (@docids) {
my $idx = $eidx->idx_shard($docid);
$oidx->add_xref3($docid, -1, $smsg->{blob}, '.');
- $idx->shard_add_eidx_info($docid, '.', $eml); # List-Id
- $idx->shard_add_keywords($docid, @kw) if @kw;
+ # add_eidx_info for List-Id
+ $idx->ipc_do('add_eidx_info', $docid, '.', $eml);
+ $idx->ipc_do('add_keywords', $docid, @kw) if @kw;
}
\@docids;
} else {
$oidx->add_xref3($smsg->{num}, -1, $smsg->{blob}, '.');
my $idx = $eidx->idx_shard($smsg->{num});
$idx->index_raw($msgref, $eml, $smsg);
- $idx->shard_add_keywords($smsg->{num}, @kw) if @kw;
+ $idx->ipc_do('add_keywords', $smsg->{num}, @kw) if @kw;
$smsg;
}
}