-# ensure there's no stale Xapian docs by treating $over as canonical
-sub over_check {
- my ($self, $over) = @_;
- begin_txn_lazy($self);
- my $sth = $over->dbh->prepare(<<'');
-SELECT COUNT(*) FROM over WHERE num = ?
-
- my $xdb = $self->{xdb};
- my $cur = $xdb->postlist_begin('');
- my $end = $xdb->postlist_end('');
- my $xdir = $self->xdir;
- for (; $cur != $end; $cur++) {
- my $docid = $cur->get_docid;
- $sth->execute($docid);
- my $x = $sth->fetchrow_array;
- next if $x > 0;
- warn "I: removing $xdir #$docid, not in `over'\n";
- $xdb->delete_document($docid);
- }
-}
-
-sub reindex_xap { # git->cat_async callback
- my ($bref, $oid, $type, $size, $ary) = @_;
- my ($ibx_id, $oidhex, $req, $more) = @$ary;
- my $self = $req->{self} // die 'BUG: {self} missing';
- my $eidx = $self->{eidx} // die 'BUG: {eidx} missing';
- my $eidx_key = $self->{-eidx_key_for}->{$ibx_id} //
- die "BUG: bad ibx_id=$ibx_id ($oid)";
-
- my $docid = $req->{docid};
- local $eidx->{current_info} = "#$docid $oid";
- return if is_bad_blob($oid, $type, $size, $oidhex);
- if (my $doc = $req->{doc}) { # modify existing doc
- $req->{tg_isset} //= do { # for existing documents in {xdb}
- term_generator($self)->set_document($doc);
- 1;
- };
- $doc->add_boolean_term('O'.$eidx_key);
- index_list_id($self, $doc, PublicInbox::Eml->new($bref));
- } else { # first time seeing this doc
- my $smsg = $self->{eidx}->over->get_art($docid) //
- die "BUG: #$docid ($oid) not in over";
- $smsg->{bytes} = $size + crlf_adjust($$bref);
- $smsg->{eidx_key} = $eidx_key;
- my $eml = PublicInbox::Eml->new($bref);
- $req->{doc} = eml2doc($self, $eml, $smsg);
- $req->{tg_isset} = 1; # eml2doc calls $tg->set_document
- }
- return if $more;
- my $doc = delete($req->{doc}) or return; # all bad blobs!
- $eidx->{transact_bytes} += $size;
- $self->{xdb}->replace_document($req->{docid}, $doc);
-}
-
-sub reindex_docid {
- my ($self, $docid) = @_;
- my $eidx = $self->{eidx} // die 'BUG: {eidx} missing';
- my $eidx_key_for = $self->{-eidx_key_for} //= do {
- my %eidx_key_for = map {
- $_->[0] => $_->[1];
- } @{$eidx->over->dbh->selectall_arrayref(<<'')};
-SELECT ibx_id,eidx_key FROM inboxes
-
- \%eidx_key_for;
- };
-
- begin_txn_lazy($self);
- my $doc = eval { $self->{xdb}->get_document($docid) };
- my $req = { doc => $doc, self => $self, docid => $docid };
- my $sth = $eidx->over->dbh->prepare_cached(<<'', undef, 1);
-SELECT ibx_id,oidbin FROM xref3 WHERE docid = ? ORDER BY ibx_id ASC
-
- $sth->execute($docid);
- my $rows = $sth->fetchall_arrayref;
- while (my $row = shift(@$rows)) {
- my ($ibx_id, $oidbin) = @$row;
- my $oidhex = unpack('H*', $oidbin);
- $eidx->git->cat_async($oidhex, \&reindex_xap,
- [ $ibx_id, $oidhex, $req, scalar(@$rows) ]);
- }
- if ($eidx->{transact_bytes} >= $eidx->{batch_bytes}) {
- commit_txn_lazy($self);
- }
-}
-