use PublicInbox::Smsg;
use PublicInbox::Eml;
use Fcntl qw(SEEK_SET F_SETFL O_APPEND O_RDWR);
+use PublicInbox::ContentHash qw(git_sha);
sub new {
my ($class) = @_;
sub mitem_kw ($$;$) {
my ($smsg, $mitem, $flagged) = @_;
- my $kw = xap_terms('K', $mitem->get_document);
+ my $kw = xap_terms('K', my $doc = $mitem->get_document);
$kw->{flagged} = 1 if $flagged;
- # we keep the empty array here to prevent expensive work in
+ # we keep the empty {kw} array here to prevent expensive work in
# ->xsmsg_vmd, _unbless_smsg will clobber it iff it's empty
$smsg->{kw} = [ sort keys %$kw ];
+ my $L = xap_terms('L', $doc);
+ $smsg->{L} = [ sort keys %$L ] if scalar(keys %$L);
}
# like over->get_art
my $num = int(($docid - 1) / $nshard) + 1;
my $ibx = $self->{shard2ibx}->[$shard];
my $smsg = $ibx->over->get_art($num);
- return if $smsg->{bytes} == 0;
- mitem_kw($smsg, $mitem) if $ibx->can('msg_keywords');
+ return if $smsg->{bytes} == 0; # external message
+ if ($ibx->can('msg_keywords')) {
+ mitem_kw($smsg, $mitem);
+ }
$smsg;
}
$mset = $srch->mset($mo->{qstr}, $mo);
mset_progress($lei, $desc, $mset->size,
$mset->get_matches_estimated);
+ wait_startq($lei); # wait for keyword updates
my $ids = $srch->mset_to_artnums($mset, $mo);
my $ctx = { ids => $ids };
my $i = 0;
my $smsg = $over->get_art($n) or next;
my $mitem = delete $n2item{$smsg->{num}};
next if $smsg->{bytes} == 0;
- wait_startq($lei); # wait for keyword updates
if ($mitem) {
if ($can_kw) {
mitem_kw($smsg, $mitem, $fl);
} elsif ($fl) {
+ # call ->xsmsg_vmd, later
$smsg->{lei_q_tt_flagged} = 1;
}
}
$mset = $self->mset($mo->{qstr}, $mo);
mset_progress($lei, 'xsearch', $mset->size,
$mset->size, $mset->get_matches_estimated);
+ wait_startq($lei); # wait for keyword updates
for my $mitem ($mset->items) {
my $smsg = smsg_for($self, $mitem) or next;
- wait_startq($lei);
$each_smsg->($smsg, $mitem);
}
} while (_mset_more($mset, $mo));
sub each_remote_eml { # callback for MboxReader->mboxrd
my ($eml, $self, $lei, $each_smsg) = @_;
- if ($self->{import_sto} && !$lei->{ale}->xoids_for($eml, 1)) {
+ my $xoids = $lei->{ale}->xoids_for($eml, 1);
+ if ($self->{import_sto} && !$xoids) {
$self->{import_sto}->ipc_do('add_eml', $eml);
}
my $smsg = bless {}, 'PublicInbox::Smsg';
+ $smsg->{blob} = $xoids ? (keys(%$xoids))[0]
+ : git_sha(1, $eml)->hexdigest;
$smsg->populate($eml);
$smsg->parse_references($eml, mids($eml));
$smsg->{$_} //= '' for qw(from to cc ds subject references mid);
sub ipc_atfork_child {
my ($self) = @_;
- $self->{lei}->lei_atfork_child;
+ $self->{lei}->_lei_atfork_child;
$SIG{__WARN__} = PublicInbox::Eml::warn_ignore_cb();
$self->SUPER::ipc_atfork_child;
}
-sub delete_pkt_op { # OnDestroy callback
- my $unclosed_after_die = delete($_[0])->{pkt_op_p} or return;
- close $unclosed_after_die;
-}
-
sub do_query {
my ($self, $lei) = @_;
my $l2m = $lei->{l2m};
'incr_start_query' => [ \&incr_start_query, $self, $l2m ],
};
$lei->{auth}->op_merge($ops, $l2m) if $l2m && $lei->{auth};
- my $od = PublicInbox::OnDestroy->new($$, \&delete_pkt_op, $lei);
- ($lei->{pkt_op_c}, $lei->{pkt_op_p}) = PublicInbox::PktOp->pair($ops);
+ my $end = $lei->pkt_op_pair($ops);
$lei->{1}->autoflush(1);
$lei->start_pager if delete $lei->{need_pager};
$lei->{ovv}->ovv_begin($lei);
+ die 'BUG: xdb|over open' if $lei->{lse}->{xdb} || $lei->{lse}->{over};
if ($l2m) {
$l2m->pre_augment($lei);
if ($lei->{opt}->{augment} && delete $lei->{early_mua}) {
$lei->oldset, { lei => $lei });
my $op = delete $lei->{pkt_op_c};
delete $lei->{pkt_op_p};
+ @$end = ();
$self->{threads} = $lei->{opt}->{threads};
if ($l2m) {
$l2m->net_merge_complete unless $lei->{auth};