]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
virtual: struct virtual_mailbox_vfuncs - Add get_real_mail_uid()
authorMarco Bettini <marco.bettini@open-xchange.com>
Fri, 28 Jul 2023 12:53:59 +0000 (12:53 +0000)
committerMarco Bettini <marco.bettini@open-xchange.com>
Tue, 10 Oct 2023 07:13:49 +0000 (07:13 +0000)
src/lib-storage/mail-storage-private.h
src/plugins/virtual/virtual-storage.c

index 1438ff8e6d903e83702c088436aa0e4b90cc84d3..3f5aa1449c94b8ca62b2ad4cf14e314a562a7bcf 100644 (file)
@@ -228,6 +228,9 @@ struct virtual_mailbox_vfuncs {
                                          bool only_with_msgs);
        uint32_t (*get_virtual_backend_last_uid)(struct mailbox *box,
                                                 struct mailbox *bbox);
+       void (*get_virtual_backend_mail_uid)(struct mailbox *box, uint32_t seq,
+                                            struct mailbox **backend_box_r,
+                                            uint32_t *backend_uid_r);
 };
 
 struct mailbox_vfuncs {
index 62173273959bf249078c65b9a64546e585bbf574..bac3bc6c3301d884589c466f1fea2d55a9e7541f 100644 (file)
@@ -882,6 +882,27 @@ virtual_get_virtual_backend_last_uid(struct mailbox *box, struct mailbox *bbox)
                bbox->name, box->name);
 }
 
+static void
+virtual_get_virtual_backend_mail_uid(struct mailbox *box, uint32_t seq,
+                                    struct mailbox **backend_box_r,
+                                    uint32_t *backend_uid_r)
+{
+       struct virtual_mailbox *mbox =
+               container_of(box, struct virtual_mailbox, box);
+
+       const void *data;
+       mail_index_lookup_ext(box->view, seq, mbox->virtual_ext_id, &data, NULL);
+       i_assert(data != NULL);
+
+       const struct virtual_mail_index_record *vrec = data;
+       struct virtual_backend_box *vbbox;
+       bool found = virtual_backend_box_lookup(mbox, vrec->mailbox_id, &vbbox);
+       i_assert(found);
+
+       *backend_box_r = vbbox->box;
+       *backend_uid_r = vrec->real_uid;
+}
+
 static bool virtual_is_inconsistent(struct mailbox *box)
 {
        struct virtual_mailbox *mbox =
@@ -987,4 +1008,5 @@ struct virtual_mailbox_vfuncs virtual_mailbox_vfuncs = {
        .get_virtual_uid_map = virtual_get_virtual_uid_map,
        .get_virtual_backend_boxes = virtual_get_virtual_backend_boxes,
        .get_virtual_backend_last_uid = virtual_get_virtual_backend_last_uid,
+       .get_virtual_backend_mail_uid = virtual_get_virtual_backend_mail_uid,
 };