]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/LeiStore.pm
lei rm: new command to remove messages from index
[public-inbox.git] / lib / PublicInbox / LeiStore.pm
index af5edbc24732817eb3b2dcfd51b4d9da2dacc17d..6888afb40d3568a9003e9ccf51d4e5d171d5aeaa 100644 (file)
@@ -183,7 +183,7 @@ sub add_eml_vmd {
        \@docids;
 }
 
-sub remove_eml_vmd {
+sub remove_eml_vmd { # remove just the VMD
        my ($self, $eml, $vmd) = @_;
        my ($eidx, $tl) = eidx_init($self);
        my @docids = _docids_for($self, $eml);
@@ -204,6 +204,33 @@ sub set_sync_info {
        })->set_src($oidhex, $folder, $id);
 }
 
+sub _remove_if_local { # git->cat_async arg
+       my ($bref, $oidhex, $type, $size, $self) = @_;
+       $self->{im}->remove($bref) if $bref;
+}
+
+# remove the entire message from the index, does not touch mail_sync.sqlite3
+sub remove_eml {
+       my ($self, $eml) = @_;
+       my $im = $self->importer; # may create new epoch
+       my ($eidx, $tl) = eidx_init($self);
+       my $oidx = $eidx->{oidx};
+       my @docids = _docids_for($self, $eml);
+       my $git = $eidx->git;
+       for my $docid (@docids) {
+               my $xr3 = $oidx->get_xref3($docid, 1);
+               for my $row (@$xr3) {
+                       my (undef, undef, $oidbin) = @$row;
+                       my $oidhex = unpack('H*', $oidbin);
+                       $git->cat_async($oidhex, \&_remove_if_local, $self);
+               }
+               $eidx->idx_shard($docid)->ipc_do('xdb_remove', $docid);
+               $oidx->delete_by_num($docid);
+       }
+       $git->cat_async_wait;
+       \@docids;
+}
+
 sub add_eml {
        my ($self, $eml, $vmd, $xoids) = @_;
        my $im = $self->{-fake_im} // $self->importer; # may create new epoch