about summary refs log tree commit homepage
path: root/lib
diff options
context:
space:
mode:
authorEric Wong (Contractor, The Linux Foundation) <e@80x24.org>2018-03-03 18:47:47 +0000
committerEric Wong (Contractor, The Linux Foundation) <e@80x24.org>2018-03-03 18:49:17 +0000
commitfa3283debd81490ac1d5e0895fc2d8968e1f110b (patch)
tree8d280acf37198ad3ba8ea50681a7923f071a72a4 /lib
parentae68bf5da734189549bbac3a525845a58e45d77f (diff)
downloadpublic-inbox-fa3283debd81490ac1d5e0895fc2d8968e1f110b.tar.gz
Since Message-IDs are no longer unique within Xapian
(but are within the SQLite Msgmap); favor NNTP article
numbers for internal lookups.  This will prevent us
from finding the "wrong" internal Message-ID.
Diffstat (limited to 'lib')
-rw-r--r--lib/PublicInbox/NNTP.pm29
-rw-r--r--lib/PublicInbox/Search.pm21
2 files changed, 35 insertions, 15 deletions
diff --git a/lib/PublicInbox/NNTP.pm b/lib/PublicInbox/NNTP.pm
index 56d8e010..895e5023 100644
--- a/lib/PublicInbox/NNTP.pm
+++ b/lib/PublicInbox/NNTP.pm
@@ -463,18 +463,16 @@ find_mid:
                 defined $mid or return $err;
         }
 found:
-        my $bytes;
-        my $s = eval { $ng->msg_by_mid($mid, \$bytes) } or return $err;
-        $s = Email::Simple->new($s);
-        my $lines;
+        my $smsg = $ng->search->lookup_article($n) or return $err;
+        my $msg = $ng->msg_by_smsg($smsg) or return $err;
+        my $s = Email::Simple->new($msg);
         if ($set_headers) {
                 set_nntp_headers($s->header_obj, $ng, $n, $mid);
-                $lines = $s->body =~ tr!\n!\n!;
 
                 # must be last
                 $s->body_set('') if ($set_headers == 2);
         }
-        [ $n, $mid, $s, $bytes, $lines, $ng ];
+        [ $n, $mid, $s, $smsg->bytes, $smsg->lines, $ng ];
 }
 
 sub simple_body_write ($$) {
@@ -693,8 +691,8 @@ sub hdr_xref ($$$) { # optimize XHDR Xref [range] for rtin
 }
 
 sub search_header_for {
-        my ($srch, $mid, $field) = @_;
-        my $smsg = $srch->lookup_mail($mid) or return;
+        my ($srch, $num, $field) = @_;
+        my $smsg = $srch->lookup_article($num) or return;
         $smsg->$field;
 }
 
@@ -702,8 +700,8 @@ sub hdr_searchmsg ($$$$) {
         my ($self, $xhdr, $field, $range) = @_;
         if (defined $range && $range =~ /\A<(.+)>\z/) { # Message-ID
                 my ($ng, $n) = mid_lookup($self, $1);
-                return r430 unless $n;
-                my $v = search_header_for($ng->search, $range, $field);
+                return r430 unless defined $n;
+                my $v = search_header_for($ng->search, $n, $field);
                 hdr_mid_response($self, $xhdr, $ng, $n, $range, $v);
         } else { # numeric range
                 $range = $self->{article} unless defined $range;
@@ -803,9 +801,10 @@ sub cmd_xrover ($;$) {
         more($self, '224 Overview information follows');
         long_response($self, $beg, $end, sub {
                 my ($i) = @_;
-                my $mid = $mm->mid_for($$i) or return;
-                my $h = search_header_for($srch, $mid, 'references');
-                more($self, "$$i $h");
+                my $num = $$i;
+                my $h = search_header_for($srch, $num, 'references');
+                defined $h or return;
+                more($self, "$num $h");
         });
 }
 
@@ -829,8 +828,8 @@ sub cmd_over ($;$) {
         my ($self, $range) = @_;
         if ($range && $range =~ /\A<(.+)>\z/) {
                 my ($ng, $n) = mid_lookup($self, $1);
-                my $smsg = $ng->search->lookup_mail($range) or
-                        return '430 No article with that message-id';
+                defined $n or return r430;
+                my $smsg = $ng->search->lookup_article($n) or return r430;
                 more($self, '224 Overview information follows (multi-line)');
 
                 # Only set article number column if it's the current group
diff --git a/lib/PublicInbox/Search.pm b/lib/PublicInbox/Search.pm
index a1c423c8..802984b0 100644
--- a/lib/PublicInbox/Search.pm
+++ b/lib/PublicInbox/Search.pm
@@ -372,6 +372,27 @@ sub lookup_mail { # no ghosts!
         });
 }
 
+sub lookup_article {
+        my ($self, $num) = @_;
+        my $term = 'XNUM'.$num;
+        my $smsg;
+        eval {
+                retry_reopen($self, sub {
+                        my $db = $self->{skel} || $self->{xdb};
+                        my $head = $db->postlist_begin($term);
+                        return if $head == $db->postlist_end($term);
+                        my $doc_id = $head->get_docid;
+                        return unless defined $doc_id;
+                        # raises on error:
+                        my $doc = $db->get_document($doc_id);
+                        $smsg = PublicInbox::SearchMsg->wrap($doc);
+                        $smsg->load_expand;
+                        $smsg->{doc_id} = $doc_id;
+                });
+        };
+        $smsg;
+}
+
 sub each_smsg_by_mid {
         my ($self, $mid, $cb) = @_;
         my $xdb = $self->{xdb};