diff options
author | Eric Wong <e@yhbt.net> | 2020-06-10 07:04:03 +0000 |
---|---|---|
committer | Eric Wong <e@yhbt.net> | 2020-06-13 07:55:45 +0000 |
commit | eab4dfdda4eeea9a54aa674510fa11789c5f91c8 (patch) | |
tree | 877861f4afd21b76bcd903ebe26db34332b249e9 /lib/PublicInbox/Msgmap.pm | |
parent | acb6cf984053115ed6dc5ed673786ed99e1f098d (diff) | |
download | public-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.pm | 20 |
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 { |