-sub forget_folder {
- my ($self, $folder) = @_;
- my ($fid, $sth);
- $fid = delete($self->{fmap}->{$folder}) //
- fid_for($self, $folder) // return;
- my $dbh = $self->{dbh};
- $dbh->do('DELETE FROM blob2name WHERE fid = ?', undef, $fid);
- $dbh->do('DELETE FROM blob2num WHERE fid = ?', undef, $fid);
- $dbh->do('DELETE FROM folders WHERE fid = ?', undef, $fid);
+sub forget_folders {
+ my ($self, @folders) = @_;
+ my $lk = $self->lock_for_scope;
+ for my $folder (@folders) {
+ my $fid = delete($self->{fmap}->{$folder}) //
+ fid_for($self, $folder) // next;
+ for my $t (qw(blob2name blob2num folders)) {
+ $self->{dbh}->do("DELETE FROM $t WHERE fid = ?",
+ undef, $fid);
+ }
+ }
+}
+
+# only used for changing canonicalization errors
+sub rename_folder {
+ my ($self, $old, $new) = @_;
+ my $lk = $self->lock_for_scope;
+ my $ofid = delete($self->{fmap}->{$old}) //
+ fid_for($self, $old) // return;
+ 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
+ }