From 89efc8f4e8d603e4fad3c4c754e23561d82de2c1 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Thu, 25 Jun 2020 10:09:37 +0000 Subject: imap: EXAMINE: avoid potential race conditions We need to rely on num_highwater for UIDNEXT since the highest `num' stored in over.sqlite3 may be rolled back if the most recent messages were spam. We also need to load the uo2m immediately on EXAMINE to ensure EXISTS responses are always consistent with regard to future updates. --- lib/PublicInbox/Over.pm | 18 +++--------------- 1 file changed, 3 insertions(+), 15 deletions(-) (limited to 'lib/PublicInbox/Over.pm') diff --git a/lib/PublicInbox/Over.pm b/lib/PublicInbox/Over.pm index 74c8fb86..e5a980d5 100644 --- a/lib/PublicInbox/Over.pm +++ b/lib/PublicInbox/Over.pm @@ -248,25 +248,13 @@ SELECT MAX(num) FROM over WHERE num > 0 $sth->fetchrow_array // 0; } -sub imap_status { +sub imap_exists { my ($self, $uid_base, $uid_end) = @_; - my $dbh = $self->connect; - my $sth = $dbh->prepare_cached(<<'', undef, 1); + my $sth = $self->connect->prepare_cached(<<'', undef, 1); SELECT COUNT(num) FROM over WHERE num > ? AND num <= ? $sth->execute($uid_base, $uid_end); - my $exists = $sth->fetchrow_array; - - $sth = $dbh->prepare_cached(<<'', undef, 1); -SELECT MAX(num) + 1 FROM over WHERE num <= ? - - $sth->execute($uid_end); - my $uidnext = $sth->fetchrow_array; - - $sth = $dbh->prepare_cached(<<'', undef, 1); -SELECT MAX(num) FROM over WHERE num > 0 - - ($exists, $uidnext, $sth->fetchrow_array // 0); + $sth->fetchrow_array; } sub check_inodes { -- cgit v1.2.3-24-ge0c7