+# 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
+ }
+}
+
+sub num_oidbin ($$$) {
+ my ($self, $url, $uid) = @_; # $url MUST have UIDVALIDITY if IMAP
+ my $fid = $self->{fmap}->{$url} //= fid_for($self, $url) // return ();
+ my $sth = $self->{dbh}->prepare_cached(<<EOM, undef, 1);
+SELECT oidbin FROM blob2num WHERE fid = ? AND uid = ? ORDER BY _rowid_
+EOM
+ $sth->execute($fid, $uid);
+ map { $_->[0] } @{$sth->fetchall_arrayref};
+}
+
+sub name_oidbin ($$$) {
+ my ($self, $mdir, $nm) = @_;
+ my $fid = $self->{fmap}->{$mdir} //= fid_for($self, $mdir) // return;
+ my $sth = $self->{dbh}->prepare_cached(<<EOM, undef, 1);
+SELECT oidbin FROM blob2name WHERE fid = ? AND name = ?
+EOM
+ $sth->execute($fid, $nm);
+ map { $_->[0] } @{$sth->fetchall_arrayref};
+}
+
+sub imap_oidhex {
+ my ($self, $lei, $uid_uri) = @_;
+ my $mailbox_uri = $uid_uri->clone;
+ $mailbox_uri->uid(undef);
+ my $folders = [ $$mailbox_uri ];
+ eval { $self->arg2folder($lei, $folders) };
+ $lei->qerr("# no sync information for $mailbox_uri") if $@;
+ map { unpack('H*',$_) } num_oidbin($self, $folders->[0], $uid_uri->uid)