]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
fts: fts_backend_refresh() - Refresh also underlying backends for virtual mailboxes
authorMarco Bettini <marco.bettini@open-xchange.com>
Tue, 18 Jul 2023 07:59:07 +0000 (07:59 +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
src/plugins/fts/fts-api.h
src/plugins/fts/fts-search.c

index a4d481f636dbbc11be00ab1f408777e31c326df0..9d7bc06323cf2694298913a59d3473e1b979f328 100644 (file)
@@ -9,6 +9,7 @@
 #include "mailbox-list-iter.h"
 #include "mail-search.h"
 #include "fts-api-private.h"
+#include "fts-storage.h"
 
 struct event_category event_category_fts = {
        .name = "fts",
@@ -252,9 +253,44 @@ int fts_backend_update_build_more(struct fts_backend_update_context *ctx,
        return ret;
 }
 
-int fts_backend_refresh(struct fts_backend *backend)
+static int fts_backend_cmp(struct fts_backend *const *lhs_i,
+                          struct fts_backend *const *rhs_i)
 {
-       return backend->v.refresh(backend);
+       struct fts_backend *lhs = *lhs_i;
+       struct fts_backend *rhs = *rhs_i;
+       return lhs < rhs ? -1 : lhs > rhs ? 1 : 0;
+}
+
+static int fts_backend_virtual_refresh(struct mailbox *box)
+{
+       ARRAY_TYPE(mailboxes) mailboxes;
+       t_array_init(&mailboxes, 8);
+       box->virtual_vfuncs->get_virtual_backend_boxes(box, &mailboxes, TRUE);
+
+       ARRAY(struct fts_backend *) backends;
+       t_array_init(&backends, 4);
+       struct mailbox *bbox;
+       array_foreach_elem(&mailboxes, bbox) {
+               struct fts_backend *backend = fts_list_backend(bbox->list);
+               if (array_lsearch(&backends, &backend, fts_backend_cmp) != NULL)
+                       continue;
+
+               array_push_back(&backends, &backend);
+               if (fts_backend_refresh(backend, bbox) < 0)
+                       return -1;
+       }
+       return 0;
+}
+
+int fts_backend_refresh(struct fts_backend *backend, struct mailbox *box)
+{
+       int ret = 0;
+       T_BEGIN {
+               ret = backend->v.refresh(backend);
+               if (ret == 0 && box->virtual_vfuncs != NULL)
+                       ret = fts_backend_virtual_refresh(box);
+       } T_END;
+       return ret;
 }
 
 int fts_backend_reset_last_uids(struct fts_backend *backend)
index 6ae54501d4ef08e287d3c80c8f601ef4a2fdcbd8..1ac6ddb5044d053811bf3ecfdca45c81572bfe68 100644 (file)
@@ -140,7 +140,7 @@ int fts_backend_update_build_more(struct fts_backend_update_context *ctx,
 
 /* Refresh index to make sure we see latest changes from lookups.
    Returns 0 if ok, -1 if error. */
-int fts_backend_refresh(struct fts_backend *backend);
+int fts_backend_refresh(struct fts_backend *backend, struct mailbox *box);
 /* Go through the entire index and make sure all mails are indexed,
    and delete any extra mails in the index. */
 int fts_backend_rescan(struct fts_backend *backend);
index c7197cc2efa8b3409d140818dbae34138561daa5..c87d7573c6f90b191ded7955a03d51d28fb306af 100644 (file)
@@ -362,7 +362,7 @@ int fts_search_get_first_missing_uid(struct fts_backend *backend,
 
                /* UID doesn't seem to be indexed yet.
                   Refresh FTS and check again. */
-               if (fts_backend_refresh(backend) < 0)
+               if (fts_backend_refresh(backend, box) < 0)
                        return -1;
        }
        i_unreached();