]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
fts: storage - Use fts-settings for backend_name
authorMarco Bettini <marco.bettini@open-xchange.com>
Mon, 27 Nov 2023 19:20:06 +0000 (19:20 +0000)
committerAki Tuomi <aki.tuomi@open-xchange.com>
Wed, 12 Feb 2025 10:34:11 +0000 (12:34 +0200)
src/plugins/fts/fts-storage.c
src/plugins/fts/fts-user.c
src/plugins/fts/fts-user.h

index 1a2fe2ff54554464a1147fed64ecdc818848f2be..625cd5ae99f8695024a5b176f07fc9246f0f1813 100644 (file)
@@ -5,6 +5,7 @@
 #include "str.h"
 #include "strescape.h"
 #include "write-full.h"
+#include "settings.h"
 #include "mail-search-build.h"
 #include "mail-storage.h"
 #include "mailbox-list-private.h"
@@ -17,6 +18,7 @@
 #include "fts-user.h"
 #include "fts-storage.h"
 #include "hash.h"
+#include "fts-user.h"
 
 
 #define FTS_CONTEXT(obj) \
@@ -36,8 +38,6 @@
 struct fts_mailbox_list {
        union mailbox_list_module_context module_ctx;
        struct fts_backend *backend;
-
-       const char *backend_name;
        struct fts_backend_update_context *update_ctx;
        unsigned int update_ctx_refcount;
 
@@ -875,49 +875,53 @@ static void fts_mailbox_list_deinit(struct mailbox_list *list)
        flist->module_ctx.super.deinit(list);
 }
 
-static int
-fts_init_namespace(struct fts_mailbox_list *flist, struct mail_namespace *ns,
-                  const char **error_r)
+static void
+fts_init_namespace(struct fts_mailbox_list *flist, struct mail_namespace *ns)
 {
        struct fts_backend *backend;
-       if (fts_backend_init(flist->backend_name, ns, error_r, &backend) < 0) {
+       const char *error;
+
+       const struct fts_settings *set;
+       if (fts_user_try_get_settings(ns->user, &set) < 0) {
                flist->failed = TRUE;
-               return -1;
+               e_error(ns->list->event,
+                       "fts: Failed to initialize backend, "
+                       "could not retrieve settings.");
+       } else if (fts_backend_init(set->driver, ns, &error, &backend) < 0) {
+               flist->failed = TRUE;
+               e_error(ns->list->event,
+                       "fts: Failed to initialize backend '%s': %s",
+                       set->driver, error);
+       } else {
+               flist->backend = backend;
+               if ((flist->backend->flags & FTS_BACKEND_FLAG_FUZZY_SEARCH) != 0)
+                       ns->user->fuzzy_search = TRUE;
        }
-       flist->backend = backend;
-       if ((flist->backend->flags & FTS_BACKEND_FLAG_FUZZY_SEARCH) != 0)
-               ns->user->fuzzy_search = TRUE;
-       return 0;
 }
 
 void fts_mail_namespaces_added(struct mail_namespace *ns)
 {
-       while(ns != NULL) {
+       for(; ns != NULL; ns = ns->next) {
                struct fts_mailbox_list *flist = FTS_LIST_CONTEXT(ns->list);
-               const char *error;
-
-               if (flist != NULL && !flist->failed && flist->backend == NULL &&
-                   fts_init_namespace(flist, ns, &error) < 0) {
-                       e_error(ns->list->event,
-                               "fts: Failed to initialize backend '%s': %s",
-                               flist->backend_name, error);
-               }
-               ns = ns->next;
+               if (flist != NULL && !flist->failed && flist->backend == NULL)
+                       fts_init_namespace(flist, ns);
        }
 }
 
 void
 fts_mailbox_list_created(struct mailbox_list *list)
 {
-       const char *name = mail_user_plugin_getenv(list->ns->user, "fts");
-       const char *path;
-
-       if (name == NULL || name[0] == '\0') {
+       const struct fts_settings *set;
+       /* This specific check is only a quick bypass. The actual validity
+          of the settings will be checked later in fts_init_namespace() */
+       if (fts_user_try_get_settings(list->ns->user, &set) == 0 &&
+           *set->driver == '\0') {
                e_debug(list->event,
-                       "fts: No fts setting - plugin disabled");
+                       "fts: No fts_driver setting - plugin disabled");
                return;
        }
 
+       const char *path;
        if (!mailbox_list_get_root_path(list, MAILBOX_LIST_PATH_TYPE_INDEX, &path)) {
                e_debug(list->event,
                        "fts: Indexes disabled for namespace %s",
@@ -930,7 +934,6 @@ fts_mailbox_list_created(struct mailbox_list *list)
 
        flist = p_new(list->pool, struct fts_mailbox_list, 1);
        flist->module_ctx.super = *v;
-       flist->backend_name = name;
        list->vlast = &flist->module_ctx.super;
        v->deinit = fts_mailbox_list_deinit;
        MODULE_CONTEXT_SET(list, fts_mailbox_list_module, flist);
index 19afa0c387d2cde5139b21227e43447dcad85b06..e83f99e62c1c6950096877948329112f83916975 100644 (file)
@@ -357,6 +357,15 @@ bool fts_user_autoindex_exclude(struct mailbox *box)
        return mailbox_match_plugin_exclude(fuser->autoindex_exclude, box);
 }
 
+int fts_user_try_get_settings(struct mail_user *user,
+                             const struct fts_settings **set_r)
+{
+       struct fts_user *fuser = FTS_USER_CONTEXT(user);
+       if (fuser == NULL) return -1;
+       *set_r = fuser->set;
+       return 0;
+}
+
 static void fts_user_language_free(struct fts_user_language *user_lang)
 {
        if (user_lang->filter != NULL)
@@ -413,12 +422,9 @@ int fts_mail_user_init(struct mail_user *user, bool initialize_libfts,
                return 0;
        }
 
-       const char *error;
        const struct fts_settings *set;
-       if (settings_get(user->event, &fts_setting_parser_info, 0, &set, &error) < 0) {
-               e_error(user->event, "%s", error);
+       if (settings_get(user->event, &fts_setting_parser_info, 0, &set, error_r) < 0)
                return -1;
-       }
 
        fuser = p_new(user->pool, struct fts_user, 1);
        fuser->set = set;
index 78f8657f3c5063acd3e5d95272c0909249965d8f..1ba3763a716a05fbf4b7a1221db11ff0815e0ff0 100644 (file)
@@ -21,6 +21,8 @@ const ARRAY_TYPE(fts_user_language) *
 fts_user_get_data_languages(struct mail_user *user);
 
 const struct fts_settings *fts_user_get_settings(struct mail_user *user);
+int fts_user_try_get_settings(struct mail_user *user,
+                             const struct fts_settings **set_r);
 
 bool fts_user_autoindex_exclude(struct mailbox *box);
 size_t fts_mail_user_message_max_size(struct mail_user *user);