diff options
Diffstat (limited to 'lib/PublicInbox/NNTP.pm')
-rw-r--r-- | lib/PublicInbox/NNTP.pm | 23 |
1 files changed, 15 insertions, 8 deletions
diff --git a/lib/PublicInbox/NNTP.pm b/lib/PublicInbox/NNTP.pm index 39ff5257..8eec6b91 100644 --- a/lib/PublicInbox/NNTP.pm +++ b/lib/PublicInbox/NNTP.pm @@ -413,14 +413,21 @@ sub xref ($$$) { my $nntpd = $self->{nntpd}; my $cur_ngname = $cur_ibx->{newsgroup}; my $ret = "$nntpd->{servername} $cur_ngname:$smsg->{num}"; - - my $mid = $smsg->{mid}; - my $groups = $nntpd->{pi_config}->{-by_newsgroup}; - for my $xngname (@{$nntpd->{groupnames}}) { - next if $cur_ngname eq $xngname; - my $xibx = $groups->{$xngname} or next; - my $num = eval { $xibx->mm->num_for($mid) } or next; - $ret .= " $xngname:$num"; + if (my $ALL = $nntpd->{pi_config}->ALL) { + if (my $ary = $ALL->nntp_xref_for($cur_ibx, $smsg)) { + $ret .= join(' ', '', @$ary) if scalar(@$ary); + } + # better off wrong than slow if there's thousands of groups, + # so no fallback to the slow path below: + } else { # slow path + my $mid = $smsg->{mid}; + my $groups = $nntpd->{pi_config}->{-by_newsgroup}; + for my $xngname (@{$nntpd->{groupnames}}) { + next if $cur_ngname eq $xngname; + my $xibx = $groups->{$xngname} or next; + my $num = eval { $xibx->mm->num_for($mid) } or next; + $ret .= " $xngname:$num"; + } } $ret; } |