diff options
-rw-r--r-- | lib/PublicInbox/IMAPTracker.pm | 16 | ||||
-rw-r--r-- | lib/PublicInbox/NetReader.pm | 11 |
2 files changed, 15 insertions, 12 deletions
diff --git a/lib/PublicInbox/IMAPTracker.pm b/lib/PublicInbox/IMAPTracker.pm index bcf7af2e..fe813582 100644 --- a/lib/PublicInbox/IMAPTracker.pm +++ b/lib/PublicInbox/IMAPTracker.pm @@ -39,12 +39,20 @@ sub dbh_new ($) { $dbh; } -sub get_last ($) { - my ($self) = @_; - my $sth = $self->{dbh}->prepare_cached(<<'', undef, 1); +sub get_last ($;$) { + my ($self, $validity) = @_; + my $sth; + if (defined $validity) { + $sth = $self->{dbh}->prepare_cached(<<'', undef, 1); +SELECT uid_validity, uid FROM imap_last WHERE url = ? AND uid_validity = ? + + $sth->execute($self->{url}, $validity); + } else { + $sth = $self->{dbh}->prepare_cached(<<'', undef, 1); SELECT uid_validity, uid FROM imap_last WHERE url = ? - $sth->execute($self->{url}); + $sth->execute($self->{url}); + } $sth->fetchrow_array; } diff --git a/lib/PublicInbox/NetReader.pm b/lib/PublicInbox/NetReader.pm index c7b43f01..39129b34 100644 --- a/lib/PublicInbox/NetReader.pm +++ b/lib/PublicInbox/NetReader.pm @@ -397,17 +397,12 @@ sub _imap_fetch_all ($$$) { $r_uidnext //= $mic->uidnext($mbx) // return "E: $uri cannot get UIDNEXT"; my $itrk = _itrk($self, $uri); - my ($l_uidval, $l_uid) = $itrk ? $itrk->get_last : (); - $l_uidval //= $r_uidval; # first time + my $l_uid; + $l_uid = $itrk->get_last($r_uidval) if $itrk; $l_uid //= 0; - if ($l_uidval != $r_uidval) { - return "E: $uri UIDVALIDITY mismatch\n". - "E: local=$l_uidval != remote=$r_uidval"; - } my $r_uid = $r_uidnext - 1; if ($l_uid > $r_uid) { - return "E: $uri local UID exceeds remote ($l_uid > $r_uid)\n". - "E: $uri strangely, UIDVALIDLITY matches ($l_uidval)\n"; + return "E: $uri local UID exceeds remote ($l_uid > $r_uid)\n"; } return if $l_uid >= $r_uid; # nothing to do $l_uid ||= 1; |