We need to account for past canonicalization errors and deal
with cases which violate uniqueness constraints in
mail_sync.sqlite3
---
 lib/PublicInbox/LeiMailSync.pm | 17 +++++++++++++++--
 1 file 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 ($$$) {
--
unsubscribe: one-click, see List-Unsubscribe header
archive: https://public-inbox.org/meta/

Reply via email to