From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: X-Spam-Status: No, score=-4.0 required=3.0 tests=ALL_TRUSTED,BAYES_00 shortcircuit=no autolearn=ham autolearn_force=no version=3.4.0 Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id BCDCA1FAF9 for ; Tue, 6 Mar 2018 08:42:43 +0000 (UTC) From: "Eric Wong (Contractor, The Linux Foundation)" To: meta@public-inbox.org Subject: [PATCH 22/34] nntp: use NNTP article numbers for lookups Date: Tue, 6 Mar 2018 08:42:30 +0000 Message-Id: <20180306084242.19988-23-e@80x24.org> In-Reply-To: <20180306084242.19988-1-e@80x24.org> References: <20180306084242.19988-1-e@80x24.org> List-Id: 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. --- lib/PublicInbox/NNTP.pm | 29 ++++++++++++++--------------- lib/PublicInbox/Search.pm | 21 +++++++++++++++++++++ 2 files changed, 35 insertions(+), 15 deletions(-) diff --git a/lib/PublicInbox/NNTP.pm b/lib/PublicInbox/NNTP.pm index 56d8e01..895e502 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 a1c423c..802984b 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}; -- EW