]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
fts: fts_backend_is_uid_indexed() - Handle virtual folders specifically
authorMarco Bettini <marco.bettini@open-xchange.com>
Tue, 18 Jul 2023 08:00:34 +0000 (08:00 +0000)
committerMarco Bettini <marco.bettini@open-xchange.com>
Tue, 10 Oct 2023 07:13:49 +0000 (07:13 +0000)
src/plugins/fts/fts-api.c

index 19c47e4649d5e07ba2f6603a4431501d304fd984..b3ff47567522c932ebe9c016eb0f1a1b26b1b87e 100644 (file)
@@ -133,10 +133,45 @@ int fts_backend_get_last_uid(struct fts_backend *backend, struct mailbox *box,
        return backend->v.get_last_uid(backend, box, last_uid_r);
 }
 
+static int
+fts_backend_is_uid_indexed_virtual(struct mailbox *box,
+                                  uint32_t *last_indexed_uid_r)
+{
+       const struct virtual_mailbox_vfuncs *v = box->virtual_vfuncs;
+
+       ARRAY_TYPE(mailboxes) mailboxes;
+       t_array_init(&mailboxes, 8);
+       v->get_virtual_backend_boxes(box, &mailboxes, TRUE);
+
+       struct mailbox *bbox;
+       array_foreach_elem(&mailboxes, bbox) {
+               uint32_t last_uid, unused ATTR_UNUSED;
+
+               last_uid = v->get_virtual_backend_last_uid(box, bbox);
+               struct fts_backend *backend = fts_list_backend(bbox->list);
+               int ret = fts_backend_is_uid_indexed(backend, bbox, last_uid,
+                                                    &unused);
+
+               if (ret == 0) {
+                       /* we have no idea what corresponds in the virtual box
+                          to the backend box uid last_uid - so we simply set
+                          the last_indexed_uid_r to 0 to trigger a reindex */
+                       *last_indexed_uid_r = 0;
+               }
+
+               if (ret <= 0)
+                       return ret;
+       }
+       return 1;
+}
+
 int fts_backend_is_uid_indexed(struct fts_backend *backend, struct mailbox *box,
                               uint32_t uid, uint32_t *last_indexed_uid_r)
 {
-       if (box->virtual_vfuncs == NULL && backend->v.is_uid_indexed != NULL)
+       if (box->virtual_vfuncs != NULL)
+               return fts_backend_is_uid_indexed_virtual(box, last_indexed_uid_r);
+
+       if (backend->v.is_uid_indexed != NULL)
                return backend->v.is_uid_indexed(backend, box, uid,
                                                 last_indexed_uid_r);