about summary refs log tree commit homepage
path: root/lib/PublicInbox/LeiMailSync.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/PublicInbox/LeiMailSync.pm')
-rw-r--r--lib/PublicInbox/LeiMailSync.pm20
1 files changed, 10 insertions, 10 deletions
diff --git a/lib/PublicInbox/LeiMailSync.pm b/lib/PublicInbox/LeiMailSync.pm
index d9b9e117..3e725d30 100644
--- a/lib/PublicInbox/LeiMailSync.pm
+++ b/lib/PublicInbox/LeiMailSync.pm
@@ -66,6 +66,7 @@ CREATE TABLE IF NOT EXISTS blob2num (
         oidbin VARBINARY NOT NULL,
         fid INTEGER NOT NULL, /* folder ID */
         uid INTEGER NOT NULL, /* NNTP article number, IMAP UID, MH number */
+        /* not UNIQUE(fid, uid), since we may have broken servers */
         UNIQUE (oidbin, fid, uid)
 )
 
@@ -78,6 +79,7 @@ CREATE TABLE IF NOT EXISTS blob2name (
         oidbin VARBINARY NOT NULL,
         fid INTEGER NOT NULL, /* folder ID */
         name VARBINARY NOT NULL, /* Maildir basename, JMAP blobId */
+        /* not UNIQUE(fid, name), since we may have broken software */
         UNIQUE (oidbin, fid, name)
 )
 
@@ -522,14 +524,14 @@ EOM
         }
 }
 
-sub imap_oidbin ($$$) {
-        my ($self, $url, $uid) = @_; # $url MUST have UIDVALIDITY
-        my $fid = $self->{fmap}->{$url} //= fid_for($self, $url) // return;
+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 = ?
+SELECT oidbin FROM blob2num WHERE fid = ? AND uid = ? ORDER BY _rowid_
 EOM
         $sth->execute($fid, $uid);
-        $sth->fetchrow_array;
+        map { $_->[0] } @{$sth->fetchall_arrayref};
 }
 
 sub name_oidbin ($$$) {
@@ -539,10 +541,10 @@ sub name_oidbin ($$$) {
 SELECT oidbin FROM blob2name WHERE fid = ? AND name = ?
 EOM
         $sth->execute($fid, $nm);
-        $sth->fetchrow_array;
+        map { $_->[0] } @{$sth->fetchall_arrayref};
 }
 
-sub imap_oid {
+sub imap_oidhex {
         my ($self, $lei, $uid_uri) = @_;
         my $mailbox_uri = $uid_uri->clone;
         $mailbox_uri->uid(undef);
@@ -550,12 +552,10 @@ sub imap_oid {
         if (my $err = $self->arg2folder($lei, $folders)) {
                 if ($err->{fail}) {
                         $lei->qerr("# no sync information for $mailbox_uri");
-                        return;
                 }
                 $lei->qerr(@{$err->{qerr}}) if $err->{qerr};
         }
-        my $oidbin = imap_oidbin($self, $folders->[0], $uid_uri->uid);
-        $oidbin ? unpack('H*', $oidbin) : undef;
+        map { unpack('H*',$_) } num_oidbin($self, $folders->[0], $uid_uri->uid)
 }
 
 1;