From: Marco Bettini Date: Tue, 18 Jul 2023 08:00:34 +0000 (+0000) Subject: fts: fts_backend_is_uid_indexed() - Handle virtual folders specifically X-Git-Tag: 2.4.0~2537 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ad618987eccd59f5ad5d758499fd999512ffba25;p=thirdparty%2Fdovecot%2Fcore.git fts: fts_backend_is_uid_indexed() - Handle virtual folders specifically --- diff --git a/src/plugins/fts/fts-api.c b/src/plugins/fts/fts-api.c index 19c47e4649..b3ff475675 100644 --- a/src/plugins/fts/fts-api.c +++ b/src/plugins/fts/fts-api.c @@ -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);