]> Sergey Matveev's repositories - public-inbox.git/commitdiff
lei_mail_sync: make rename_folder more robust
authorEric Wong <e@80x24.org>
Tue, 31 Aug 2021 11:21:20 +0000 (11:21 +0000)
committerEric Wong <e@80x24.org>
Tue, 31 Aug 2021 11:29:09 +0000 (11:29 +0000)
We need to account for past canonicalization errors and deal
with cases which violate uniqueness constraints in
mail_sync.sqlite3

lib/PublicInbox/LeiMailSync.pm

index 56468c78fd66fa2b115bce568ed8d546557b46f9..275e0cc4c433ce6b27fa43ee86984b5147885d6f 100644 (file)
@@ -412,11 +412,24 @@ sub forget_folder {
 # only used for changing canonicalization errors
 sub rename_folder {
        my ($self, $old, $new) = @_;
-       my $fid = delete($self->{fmap}->{$old}) //
+       my $ofid = delete($self->{fmap}->{$old}) //
                fid_for($self, $old) // return;
-       $self->{dbh}->do(<<EOM, undef, $new, $fid);
+       eval {
+               $self->{dbh}->do(<<EOM, undef, $new, $ofid);
 UPDATE folders SET loc = ? WHERE fid = ?
 EOM
+       };
+       if ($@ =~ /\bunique\b/i) {
+               my $nfid = $self->{fmap}->{$new} // fid_for($self, $new);
+               for my $t (qw(blob2name blob2num)) {
+                       $self->{dbh}->do(<<EOM, undef, $nfid, $ofid);
+UPDATE OR REPLACE $t SET fid = ? WHERE fid = ?
+EOM
+               }
+               $self->{dbh}->do(<<EOM, undef, $ofid);
+DELETE FROM folders WHERE fid = ?
+EOM
+       }
 }
 
 sub imap_oidbin ($$$) {