about summary refs log tree commit homepage
path: root/lib/PublicInbox/LeiMailSync.pm
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2021-08-31 11:21:20 +0000
committerEric Wong <e@80x24.org>2021-08-31 11:29:09 +0000
commit7f8d7e22ca8b6d1a5499f8782f7f05020d7d3b95 (patch)
tree44c905927cf844ff461b719ec267bfc3744561ac /lib/PublicInbox/LeiMailSync.pm
parent400378627020546759afc6d308f71d3592451414 (diff)
downloadpublic-inbox-7f8d7e22ca8b6d1a5499f8782f7f05020d7d3b95.tar.gz
We need to account for past canonicalization errors and deal
with cases which violate uniqueness constraints in
mail_sync.sqlite3
Diffstat (limited to 'lib/PublicInbox/LeiMailSync.pm')
-rw-r--r--lib/PublicInbox/LeiMailSync.pm17
1 files changed, 15 insertions, 2 deletions
diff --git a/lib/PublicInbox/LeiMailSync.pm b/lib/PublicInbox/LeiMailSync.pm
index 56468c78..275e0cc4 100644
--- a/lib/PublicInbox/LeiMailSync.pm
+++ b/lib/PublicInbox/LeiMailSync.pm
@@ -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 ($$$) {