about summary refs log tree commit homepage
diff options
context:
space:
mode:
-rw-r--r--lib/PublicInbox/POP3.pm15
1 files changed, 12 insertions, 3 deletions
diff --git a/lib/PublicInbox/POP3.pm b/lib/PublicInbox/POP3.pm
index 60eedea7..203c91a6 100644
--- a/lib/PublicInbox/POP3.pm
+++ b/lib/PublicInbox/POP3.pm
@@ -148,12 +148,21 @@ sub _stat_cache ($) {
         my ($self) = @_;
         my ($beg, $end) = (($self->{uid_dele} // -1) + 1, $self->{uid_max});
         PublicInbox::IMAP::uid_clamp($self, \$beg, \$end);
-        my $opt = { limit => PublicInbox::IMAP::UID_SLICE };
-        my $m = $self->{ibx}->over(1)->do_get(<<'', $opt, $beg, $end);
+        my (@cache, $m);
+        my $sth = $self->{ibx}->over(1)->dbh->prepare_cached(<<'', undef, 1);
 SELECT num,ddd FROM over WHERE num >= ? AND num <= ?
 ORDER BY num ASC
 
-        [ map { ($_->{num}, $_->{bytes} + 0, $_->{blob}) } @$m ];
+        $sth->execute($beg, $end);
+        do {
+                $m = $sth->fetchall_arrayref({}, 1000);
+                for my $x (@$m) {
+                        PublicInbox::Over::load_from_row($x);
+                        push(@cache, $x->{num}, $x->{bytes} + 0, $x->{blob});
+                        undef $x; # saves ~1.5M memory w/ 50k messages
+                }
+        } while (scalar(@$m) && ($beg = $cache[-3] + 1));
+        \@cache;
 }
 
 sub cmd_stat {