]> Sergey Matveev's repositories - public-inbox.git/commitdiff
search: stop assuming Message-ID is unique
authorEric Wong (Contractor, The Linux Foundation) <e@80x24.org>
Fri, 16 Feb 2018 02:59:11 +0000 (02:59 +0000)
committerEric Wong (Contractor, The Linux Foundation) <e@80x24.org>
Fri, 16 Feb 2018 02:59:11 +0000 (02:59 +0000)
In general, they are, but there's no way for or general purpose
mail server to enforce that.  This is a step in allowing us
to handle more corner cases which existing lists throw at us.

lib/PublicInbox/ExtMsg.pm
lib/PublicInbox/Search.pm
lib/PublicInbox/SearchIdx.pm

index 4e31ef0f37c178208d1d0b2b9d07d56c8d0f251e..90d68db8fd68ac7bbe8cafca3f7ded8c645c8781 100644 (file)
@@ -46,7 +46,7 @@ sub ext_msg {
                }
 
                # try to find the URL with Xapian to avoid forking
-               my $doc_id = eval { $s->find_unique_doc_id('XMID' . $mid) };
+               my $doc_id = eval { $s->find_first_doc_id('XMID' . $mid) };
                if ($@) {
                        # xapian not configured properly for this repo
                        push @nox, $other;
index 3ec96ca93a35fc966166c3c08ebb872cf3fb27d1..33a1f2d3f36100e6871bb7a4d7599fa63deb3fa0 100644 (file)
@@ -56,7 +56,7 @@ my %bool_pfx_internal = (
 );
 
 my %bool_pfx_external = (
-       mid => 'XMID', # uniQue id (Message-ID)
+       mid => 'XMID', # Message-ID (full/exact)
 );
 
 my %prob_prefix = (
@@ -285,7 +285,7 @@ sub lookup_message {
        my ($self, $mid) = @_;
        $mid = mid_clean($mid);
 
-       my $doc_id = $self->find_unique_doc_id('XMID' . $mid);
+       my $doc_id = $self->find_first_doc_id('XMID' . $mid);
        my $smsg;
        if (defined $doc_id) {
                # raises on error:
@@ -327,6 +327,16 @@ sub find_doc_ids {
        ($db->postlist_begin($termval), $db->postlist_end($termval));
 }
 
+sub find_first_doc_id {
+       my ($self, $termval) = @_;
+
+       my ($begin, $end) = $self->find_doc_ids($termval);
+
+       return undef if $begin->equal($end); # not found
+
+       $begin->get_docid;
+}
+
 # normalize subjects so they are suitable as pathnames for URLs
 # XXX: consider for removal
 sub subject_path {
index fa5057fd6851b5f668ead4b84b5b0ff46f8c0325..265403a30664ee8a3000d8c64372f98656dd4564 100644 (file)
@@ -366,12 +366,14 @@ sub remove_message {
        $mid = mid_clean($mid);
 
        eval {
-               $doc_id = $self->find_unique_doc_id('XMID' . $mid);
-               if (defined $doc_id) {
-                       $db->delete_document($doc_id);
-               } else {
+               my ($head, $tail) = $self->find_doc_ids('XMID' . $mid);
+               if ($head->equal($tail)) {
                        warn "cannot remove non-existent <$mid>\n";
                }
+               for (; $head != $tail; $head->inc) {
+                       my $docid = $head->get_docid;
+                       $db->delete_document($docid);
+               }
        };
 
        if ($@) {