From: Eric Wong Date: Mon, 21 Sep 2015 11:11:08 +0000 (+0000) Subject: nntp: speed up XHDR Xref for rtin X-Git-Tag: v1.0.0~854 X-Git-Url: http://www.git.stargrave.org/?a=commitdiff_plain;h=e2c72e2671d395cbc3fff9cad5c8da4e08367e26;p=public-inbox.git nntp: speed up XHDR Xref for rtin We could also start displaying Xref in XOVER as rtin seems to prefer it. Anyways this is nearly 100 times faster now and requires no DB changes. --- diff --git a/lib/PublicInbox/NNTP.pm b/lib/PublicInbox/NNTP.pm index 79f2c2f8..d5eb4971 100644 --- a/lib/PublicInbox/NNTP.pm +++ b/lib/PublicInbox/NNTP.pm @@ -371,7 +371,7 @@ found: if ($set_headers) { $s->header_set('Newsgroups', $ng->{name}); $s->header_set('Lines', $s->body =~ tr!\n!\n!); - $s->header_set('Xref', "$ng->{domain} $ng->{name}:$n"); + $s->header_set('Xref', xref($ng, $n)); # must be last if ($set_headers == 2) { @@ -562,6 +562,35 @@ sub xhdr_message_id ($$) { # optimize XHDR Message-ID [range] for slrnpull. } } +sub xref ($$) { + my ($ng, $n) = @_; + "$ng->{domain} $ng->{name}:$n" +} + +sub xhdr_xref ($$) { # optimize XHDR Xref [range] for rtin + my ($self, $range) = @_; + + my $ng = $self->{ng}; + my $mm = $ng->mm; + if (defined $range && $range =~ /\A<(.+)>\z/) { # Message-ID + my $n = $mm->num_for($range); + more($self, '221 Header follows'); + more($self, "<$range> ".xref($ng, $n)) if defined $n; + '.'; + } else { # numeric range + $range = $self->{article} unless defined $range; + my $r = get_range($self, $range); + return $r unless ref $r; + my ($beg, $end) = @$r; + more($self, '221 Header follows'); + $self->long_response($beg, $end, sub { + my ($i) = @_; + my $mid = $mm->mid_for($$i); + more($self, "$$i ".xref($ng, $$i)) if defined $mid; + }); + } +} + sub header_obj_for { my ($srch, $mid) = @_; eval { @@ -612,6 +641,8 @@ sub cmd_xhdr ($$;$) { my $sub = lc $header; if ($sub eq 'message-id') { xhdr_message_id($self, $range); + } elsif ($sub eq 'xref') { + xhdr_xref($self, $range); } elsif ($sub =~ /\A(subject|references|date)\z/ && $ng->search) { xhdr_searchmsg($self, $sub, $range); } else {