]> Sergey Matveev's repositories - public-inbox.git/commitdiff
nntp: speed up XHDR Xref for rtin
authorEric Wong <e@80x24.org>
Mon, 21 Sep 2015 11:11:08 +0000 (11:11 +0000)
committerEric Wong <e@80x24.org>
Mon, 21 Sep 2015 11:37:02 +0000 (11:37 +0000)
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.

lib/PublicInbox/NNTP.pm

index 79f2c2f8e3edc5b191c57c7e7f38018b349c6d53..d5eb4971b845568fa8fbbe8482eff2201889f202 100644 (file)
@@ -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 {