# long_cb: long_response private data
package PublicInbox::NNTP;
use strict;
+use v5.10.1;
use parent qw(PublicInbox::DS);
use PublicInbox::MID qw(mid_escape $MID_EXTRACT);
use PublicInbox::Eml;
} else {
greet($self);
}
- $self->update_idle_time;
$self;
}
sub listgroup_range_i {
my ($self, $beg, $end) = @_;
- my $r = $self->{ibx}->mm->msg_range($beg, $end, 'num');
+ my $r = $self->{ibx}->mm(1)->msg_range($beg, $end, 'num');
scalar(@$r) or return;
$self->msg_more(join('', map { "$_->[0]\r\n" } @$r));
1;
sub listgroup_all_i {
my ($self, $num) = @_;
- my $ary = $self->{ibx}->mm->ids_after($num);
+ my $ary = $self->{ibx}->over(1)->ids_after($num);
scalar(@$ary) or return;
more($self, join("\r\n", @$ary));
1;
$gmt = 1;
}
my ($YYYY, $MM, $DD);
- if (bytes::length($date) == 8) { # RFC 3977 allows YYYYMMDD
+ if (length($date) == 8) { # RFC 3977 allows YYYYMMDD
($YYYY, $MM, $DD) = unpack('A4A2A2', $date);
} else { # legacy clients send YYMMDD
my $YY;
sub group_line ($$) {
my ($self, $ibx) = @_;
- my ($min, $max) = $ibx->mm->minmax;
+ my ($min, $max) = $ibx->mm(1)->minmax;
more($self, "$ibx->{newsgroup} $max $min n");
}
$nntpd->idler_start;
$self->{ibx} = $ibx;
- my ($min, $max) = $ibx->mm->minmax;
+ my ($min, $max) = $ibx->mm(1)->minmax;
$self->{article} = $min;
my $est_size = $max - $min;
"211 $est_size $min $max $group";
defined $n or return '420 no current article has been selected';
$n += $off;
- my $mid = $ibx->mm->mid_for($n);
- unless ($mid) {
+ my $mid = $ibx->mm(1)->mid_for($n) // do {
$n = $off > 0 ? 'next' : 'previous';
return "421 no $n article in this group";
- }
+ };
$self->{article} = $n;
"223 $n <$mid> article retrieved - request text separately";
}
$by_addr->{lc($_)} // ()
} (PublicInbox::Address::emails($smsg->{$f} // ''));
for my $ibx (@ibxs) {
- my $ngname = $ibx->{newsgroup} // next;
- next if defined $xref->{$ngname};
- $xref->{$ngname} = eval { $ibx->mm->num_for($mid) };
+ $xref->{$ibx->{newsgroup}} //=
+ $ibx->mm(1)->num_for($mid);
}
}
}
$xref = { $cur_ng => $smsg->{num} };
my $mid = $smsg->{mid};
for my $ibx (values %{$nntpd->{pi_cfg}->{-by_newsgroup}}) {
- next if defined($xref->{$ibx->{newsgroup}});
- my $num = eval { $ibx->mm->num_for($mid) } // next;
- $xref->{$ibx->{newsgroup}} = $num;
+ $xref->{$ibx->{newsgroup}} //=
+ $ibx->mm(1)->num_for($mid);
}
}
my $ret = "$nntpd->{servername} $cur_ng:".delete($xref->{$cur_ng});
- $ret .= " $_:$xref->{$_}" for (sort keys %$xref);
+ for my $ng (sort keys %$xref) {
+ my $num = $xref->{$ng} // next;
+ $ret .= " $ng:$num";
+ }
$ret;
}
return '412 no newsgroup has been selected';
}
found:
- my $smsg = $ibx->over->get_art($n) or return $err;
+ my $smsg = $ibx->over(1)->get_art($n) or return $err;
$smsg->{-ibx} = $ibx;
if ($code == 223) { # STAT
set_art($self, $n);
my $ibx = $self->{ibx} or return '412 no news group has been selected';
defined $range or return '420 No article(s) selected';
my ($beg, $end);
- my ($min, $max) = $ibx->mm->minmax;
+ my ($min, $max) = $ibx->mm(1)->minmax;
if ($range =~ /\A([0-9]+)\z/) {
$beg = $end = $1;
} elsif ($range =~ /\A([0-9]+)-\z/) {
out($self, " deferred[$fd] aborted - %0.6f", $elapsed);
$self->close;
} elsif ($more) { # $self->{wbuf}:
- $self->update_idle_time;
-
# COMPRESS users all share the same DEFLATE context.
# Flush it here to ensure clients don't see
# each other's data
sub hdr_msgid_range_i {
my ($self, $beg, $end) = @_;
- my $r = $self->{ibx}->mm->msg_range($beg, $end);
+ my $r = $self->{ibx}->mm(1)->msg_range($beg, $end);
@$r or return;
$self->msg_more(join('', map { "$_->[0] <$_->[1]>\r\n" } @$r));
1;
my ($self, $mid) = @_;
my $cur_ibx = $self->{ibx};
if ($cur_ibx) {
- my $n = $cur_ibx->mm->num_for($mid);
+ my $n = $cur_ibx->mm(1)->num_for($mid);
return ($cur_ibx, $n) if defined $n;
}
my $pi_cfg = $self->{nntpd}->{pi_cfg};
} else { # slow path for non-ALL users
for my $ibx (values %{$pi_cfg->{-by_newsgroup}}) {
next if defined $cur_ibx && $ibx eq $cur_ibx;
- my $n = $ibx->mm->num_for($mid);
+ my $n = $ibx->mm(1)->num_for($mid);
return ($ibx, $n) if defined $n;
}
}
sub xref_range_i {
my ($self, $beg, $end) = @_;
my $ibx = $self->{ibx};
- my $msgs = $ibx->over->query_xover($$beg, $end);
+ my $msgs = $ibx->over(1)->query_xover($$beg, $end);
scalar(@$msgs) or return;
$$beg = $msgs->[-1]->{num} + 1;
$self->msg_more(join('', map {
my $mid = $1;
my ($ibx, $n) = mid_lookup($self, $mid);
return r430 unless $n;
- my $smsg = $ibx->over->get_art($n) or return;
+ my $smsg = $ibx->over(1)->get_art($n) or return;
hdr_mid_response($self, $xhdr, $ibx, $n, $range,
xref($self, $ibx, $smsg));
} else { # numeric range
}
sub over_header_for {
- my ($over, $num, $field) = @_;
- my $smsg = $over->get_art($num) or return;
+ my ($ibx, $num, $field) = @_;
+ my $smsg = $ibx->over(1)->get_art($num) or return;
return PublicInbox::Smsg::date($smsg) if $field eq 'date';
$smsg->{$field};
}
sub smsg_range_i {
my ($self, $beg, $end, $field) = @_;
- my $over = $self->{ibx}->over;
- my $msgs = $over->query_xover($$beg, $end);
+ my $msgs = $self->{ibx}->over(1)->query_xover($$beg, $end);
scalar(@$msgs) or return;
my $tmp = '';
if (defined $range && $range =~ $ONE_MSGID) {
my ($ibx, $n) = mid_lookup($self, $1);
return r430 unless defined $n;
- my $v = over_header_for($ibx->over, $n, $field);
+ my $v = over_header_for($ibx, $n, $field);
hdr_mid_response($self, $xhdr, $ibx, $n, $range, $v);
} else { # numeric range
$range = $self->{article} unless defined $range;
sub xrover_i {
my ($self, $beg, $end) = @_;
- my $h = over_header_for($self->{ibx}->over, $$beg, 'references');
+ my $h = over_header_for($self->{ibx}, $$beg, 'references');
more($self, "$$beg $h") if defined($h);
$$beg++ < $end;
}
if ($range && $range =~ $ONE_MSGID) {
my ($ibx, $n) = mid_lookup($self, $1);
defined $n or return r430;
- my $smsg = $ibx->over->get_art($n) or return r430;
+ my $smsg = $ibx->over(1)->get_art($n) or return r430;
more($self, '224 Overview information follows (multi-line)');
# Only set article number column if it's the current group
sub xover_i {
my ($self, $beg, $end) = @_;
my $ibx = $self->{ibx};
- my $msgs = $ibx->over->query_xover($$beg, $end);
+ my $msgs = $ibx->over(1)->query_xover($$beg, $end);
my $nr = scalar @$msgs or return;
# OVERVIEW.FMT
}
} else { # slow path, no point in using long_response
for my $ibx (values %$groups) {
- my $n = $ibx->mm->num_for($mid) // next;
+ my $n = $ibx->mm(1)->num_for($mid) // next;
push @paths, "$ibx->{newsgroup}/$n";
}
}
return unless $self->flush_write && $self->{sock} && !$self->{long_cb};
- $self->update_idle_time;
# only read more requests if we've drained the write buffer,
# otherwise we can be buffering infinitely w/o backpressure
out($self, "[$fd] %s - %0.6f$pending", $line, now() - $t0);
return $self->close if $r < 0;
$self->rbuf_idle($rbuf);
- $self->update_idle_time;
# maybe there's more pipelined data, or we'll have
# to register it for socket-readiness notifications
$self->requeue unless $pending;
}
-# for graceful shutdown in PublicInbox::Daemon:
-sub busy {
- my ($self, $now) = @_;
- ($self->{rbuf} || $self->{wbuf} || $self->not_idle_long($now));
+sub busy { # for graceful shutdown in PublicInbox::Daemon:
+ my ($self) = @_;
+ defined($self->{rbuf}) || defined($self->{wbuf})
}
1;