about summary refs log tree commit homepage
diff options
context:
space:
mode:
authorEric Wong (Contractor, The Linux Foundation) <e@80x24.org>2018-04-03 11:09:11 +0000
committerEric Wong (Contractor, The Linux Foundation) <e@80x24.org>2018-04-03 12:06:15 +0000
commit445d2062a60959a04b55d7d1fe4439eff23cd44d (patch)
tree653eea288da968a04561224bc1ba079ed644ded3
parent0dceebd0a85774c92af247e6da5e2f5a0ee8417c (diff)
downloadpublic-inbox-445d2062a60959a04b55d7d1fe4439eff23cd44d.tar.gz
id_batch had a an overly complicated interface, replace it
with id_batch which is simpler and takes advantage of
selectcol_arrayref in DBI.  This allows simplification of
callers and the diffstat agrees with me.
-rw-r--r--lib/PublicInbox/Mbox.pm11
-rw-r--r--lib/PublicInbox/Msgmap.pm19
-rw-r--r--lib/PublicInbox/NNTP.pm12
-rw-r--r--t/nntpd.t1
-rw-r--r--t/v2writable.t7
5 files changed, 22 insertions, 28 deletions
diff --git a/lib/PublicInbox/Mbox.pm b/lib/PublicInbox/Mbox.pm
index 0be19685..c66ccaa7 100644
--- a/lib/PublicInbox/Mbox.pm
+++ b/lib/PublicInbox/Mbox.pm
@@ -166,14 +166,7 @@ sub mbox_all {
         return sub { need_gzip(@_) } if $@;
         if ($query eq '') {
                 my $prev = 0;
-                my $msgs = [];
-                my $cb = sub {
-                        $ctx->{-inbox}->mm->id_batch($prev, sub {
-                                $msgs = $_[0];
-                        });
-                        $prev = $msgs->[-1] if @$msgs;
-                        $msgs;
-                };
+                my $cb = sub { $ctx->{-inbox}->mm->ids_after(\$prev) };
                 return PublicInbox::MboxGz->response($ctx, $cb, 'all');
         }
         my $opts = { offset => 0 };
@@ -244,7 +237,7 @@ sub getline {
         do {
                 # work on existing result set
                 while (defined(my $smsg = shift @$msgs)) {
-                        # id_batch may return integers
+                        # ids_after may return integers
                         ref($smsg) or
                                 $smsg = $ctx->{srch}->{over_ro}->get_art($smsg);
 
diff --git a/lib/PublicInbox/Msgmap.pm b/lib/PublicInbox/Msgmap.pm
index dea95731..26565d45 100644
--- a/lib/PublicInbox/Msgmap.pm
+++ b/lib/PublicInbox/Msgmap.pm
@@ -186,17 +186,14 @@ sub create_tables {
 }
 
 # used by NNTP.pm
-sub id_batch {
-        my ($self, $num, $cb) = @_;
-        my $dbh = $self->{dbh};
-        my $sth = $dbh->prepare('SELECT num FROM msgmap WHERE num > ? '.
-                                'ORDER BY num ASC LIMIT 1000');
-        $sth->execute($num);
-        my $ary = $sth->fetchall_arrayref;
-        @$ary = map { $_->[0] } @$ary;
-        my $nr = scalar @$ary;
-        $cb->($ary) if $nr;
-        $nr;
+sub ids_after {
+        my ($self, $num) = @_;
+        my $ids = $self->{dbh}->selectcol_arrayref(<<'', undef, $$num);
+SELECT num FROM msgmap WHERE num > ?
+ORDER BY num ASC LIMIT 1000
+
+        $$num = $ids->[-1] if @$ids;
+        $ids;
 }
 
 # only used for mapping external serial numbers (e.g. articles from gmane)
diff --git a/lib/PublicInbox/NNTP.pm b/lib/PublicInbox/NNTP.pm
index ff6d8958..b91cda1d 100644
--- a/lib/PublicInbox/NNTP.pm
+++ b/lib/PublicInbox/NNTP.pm
@@ -34,7 +34,6 @@ my $LIST_HEADERS = join("\r\n", @OVERVIEW,
                         qw(:bytes :lines Xref To Cc)) . "\r\n";
 
 # disable commands with easy DoS potential:
-# LISTGROUP could get pretty bad, too...
 my %DISABLED; # = map { $_ => 1 } qw(xover list_overview_fmt newnews xhdr);
 
 my $EXPMAP; # fd -> [ idle_time, $self ]
@@ -225,15 +224,12 @@ sub cmd_listgroup ($;$) {
         }
 
         $self->{ng} or return '412 no newsgroup selected';
+        my $n = 0;
         long_response($self, 0, long_response_limit, sub {
                 my ($i) = @_;
-                my $nr = $self->{ng}->mm->id_batch($$i, sub {
-                        my ($ary) = @_;
-                        more($self, join("\r\n", @$ary));
-                });
-
-                # -1 to adjust for implicit increment in long_response
-                $$i = $nr ? $$i + $nr - 1 : long_response_limit;
+                my $ary = $self->{ng}->mm->ids_after(\$n);
+                scalar @$ary or return ($$i = long_response_limit);
+                more($self, join("\r\n", @$ary));
         });
 }
 
diff --git a/t/nntpd.t b/t/nntpd.t
index de781d74..c6e34ed3 100644
--- a/t/nntpd.t
+++ b/t/nntpd.t
@@ -123,6 +123,7 @@ EOF
         my $list = $n->list;
         is_deeply($list, { $group => [ qw(1 1 n) ] }, 'LIST works');
         is_deeply([$n->group($group)], [ qw(0 1 1), $group ], 'GROUP works');
+        is_deeply($n->listgroup($group), [1], 'listgroup OK');
 
         %opts = (
                 PeerAddr => $host_port,
diff --git a/t/v2writable.t b/t/v2writable.t
index 1e8e4042..62947351 100644
--- a/t/v2writable.t
+++ b/t/v2writable.t
@@ -189,6 +189,13 @@ EOF
                 is($nn{$mid}++, 0, "MID is unique in NEWNEWS");
         }
         is_deeply([sort keys %nn], [sort keys %uniq]);
+
+        my %lg;
+        foreach my $num (@{$n->listgroup($group)}) {
+                is($lg{$num}++, 0, "num is unique in LISTGROUP");
+        }
+        is_deeply([sort keys %lg], [sort keys %$x],
+                'XOVER and LISTGROUPS return the same article numbers');
 };
 {
         local $ENV{NPROC} = 2;