about summary refs log tree commit homepage
path: root/lib/PublicInbox/Msgmap.pm
diff options
context:
space:
mode:
authorEric Wong <e@yhbt.net>2020-06-10 07:04:03 +0000
committerEric Wong <e@yhbt.net>2020-06-13 07:55:45 +0000
commiteab4dfdda4eeea9a54aa674510fa11789c5f91c8 (patch)
tree877861f4afd21b76bcd903ebe26db34332b249e9 /lib/PublicInbox/Msgmap.pm
parentacb6cf984053115ed6dc5ed673786ed99e1f098d (diff)
downloadpublic-inbox-eab4dfdda4eeea9a54aa674510fa11789c5f91c8.tar.gz
msgmap: split ->max into its own method
There's enough places where we only care about the max NNTP
article number to warrant avoiding a call into SQLite.

Using ->num_highwater in read-only packages such as
PublicInbox::IMAP is also incorrect, since that memoizes
and won't pick up changes made by other processes.
Diffstat (limited to 'lib/PublicInbox/Msgmap.pm')
-rw-r--r--lib/PublicInbox/Msgmap.pm20
1 files changed, 11 insertions, 9 deletions
diff --git a/lib/PublicInbox/Msgmap.pm b/lib/PublicInbox/Msgmap.pm
index a2ffe720..d115cbce 100644
--- a/lib/PublicInbox/Msgmap.pm
+++ b/lib/PublicInbox/Msgmap.pm
@@ -55,8 +55,7 @@ sub new_file {
                 $dbh->begin_work;
                 $self->created_at(time) unless $self->created_at;
 
-                my (undef, $max) = $self->minmax();
-                $max ||= 0;
+                my $max = $self->max // 0;
                 $self->num_highwater($max);
                 $dbh->commit;
         }
@@ -159,17 +158,20 @@ sub num_for {
         $sth->fetchrow_array;
 }
 
+sub max {
+        my $sth = $_[0]->{dbh}->prepare_cached('SELECT MAX(num) FROM msgmap',
+                                                undef, 1);
+        $sth->execute;
+        $sth->fetchrow_array;
+}
+
 sub minmax {
-        my ($self) = @_;
-        my $dbh = $self->{dbh};
         # breaking MIN and MAX into separate queries speeds up from 250ms
         # to around 700us with 2.7million messages.
-        my $sth = $dbh->prepare_cached('SELECT MIN(num) FROM msgmap', undef, 1);
-        $sth->execute;
-        my $min = $sth->fetchrow_array;
-        $sth = $dbh->prepare_cached('SELECT MAX(num) FROM msgmap', undef, 1);
+        my $sth = $_[0]->{dbh}->prepare_cached('SELECT MIN(num) FROM msgmap',
+                                                undef, 1);
         $sth->execute;
-        ($min, $sth->fetchrow_array);
+        ($sth->fetchrow_array, max($_[0]));
 }
 
 sub mid_delete {