]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
fts-flatcurve: Convert plugin settings to regular settings
authorMarco Bettini <marco.bettini@open-xchange.com>
Tue, 21 Nov 2023 15:23:51 +0000 (15:23 +0000)
committerAki Tuomi <aki.tuomi@open-xchange.com>
Wed, 12 Feb 2025 10:34:11 +0000 (12:34 +0200)
This adds fts_flatcurve { .. } named filter.
Currently just used to allow grouping the settings.

src/plugins/fts-flatcurve/Makefile.am
src/plugins/fts-flatcurve/fts-backend-flatcurve-xapian.cc
src/plugins/fts-flatcurve/fts-backend-flatcurve.c
src/plugins/fts-flatcurve/fts-flatcurve-plugin.c
src/plugins/fts-flatcurve/fts-flatcurve-plugin.h
src/plugins/fts-flatcurve/fts-flatcurve-settings.c [new file with mode: 0644]
src/plugins/fts-flatcurve/fts-flatcurve-settings.h [new file with mode: 0644]

index ce759a933c2efc542bf7c4e584aebe3f8a510cb1..e271a64f9cb83bb90ee3c7688d173c31789c6086 100644 (file)
@@ -30,12 +30,14 @@ lib21_fts_flatcurve_plugin_la_LIBADD = \
 
 lib21_fts_flatcurve_plugin_la_SOURCES = \
        fts-flatcurve-plugin.c \
+       fts-flatcurve-settings.c \
        fts-backend-flatcurve.c \
        fts-backend-flatcurve-xapian.cc
 
 noinst_HEADERS = \
        doveadm-dump-flatcurve.h \
        fts-flatcurve-plugin.h \
+       fts-flatcurve-settings.h \
        fts-backend-flatcurve.h \
        fts-backend-flatcurve-xapian.h
 
index f4bb2650f305cf9a41dec43d992928b7cbe5bec4..30661426d063e3682bf6f69f34a902f03051b87b 100644 (file)
@@ -494,8 +494,8 @@ static bool
 fts_flatcurve_xapian_need_optimize(struct flatcurve_fts_backend *backend)
 {
        if (backend->fuser == NULL) return FALSE;
-       if (backend->fuser->set.optimize_limit == 0) return FALSE;
-       return backend->xapian->shards >= backend->fuser->set.optimize_limit;
+       if (backend->fuser->set->optimize_limit == 0) return FALSE;
+       return backend->xapian->shards >= backend->fuser->set->optimize_limit;
 }
 
 static void
@@ -1265,17 +1265,17 @@ fts_flatcurve_xapian_check_commit_limit(struct flatcurve_fts_backend *backend,
        ++xdb->changes;
 
        if (xdb->type == FLATCURVE_XAPIAN_DB_TYPE_CURRENT &&
-           fuser->set.rotate_count > 0 &&
-           xdb->dbw->get_doccount() >= fuser->set.rotate_count) {
+           fuser->set->rotate_count > 0 &&
+           xdb->dbw->get_doccount() >= fuser->set->rotate_count) {
                return fts_flatcurve_xapian_close_db(
                        backend, xdb, FLATCURVE_XAPIAN_DB_CLOSE_ROTATE, error_r);
        }
 
-       if (fuser->set.commit_limit > 0 &&
-           x->doc_updates >= fuser->set.commit_limit) {
+       if (fuser->set->commit_limit > 0 &&
+           x->doc_updates >= fuser->set->commit_limit) {
                e_debug(backend->event,
                        "Committing DB as update limit was reached; limit=%d",
-                       fuser->set.commit_limit);
+                       fuser->set->commit_limit);
                return fts_flatcurve_xapian_close_dbs(
                        backend, FLATCURVE_XAPIAN_DB_CLOSE_WDB_COMMIT, error_r);
        }
@@ -1398,8 +1398,8 @@ fts_flatcurve_xapian_close_db(struct flatcurve_fts_backend *backend,
 
                if (xdb->type == FLATCURVE_XAPIAN_DB_TYPE_CURRENT) {
                        if (HAS_ALL_BITS(opts, FLATCURVE_XAPIAN_DB_CLOSE_ROTATE) ||
-                               (backend->fuser->set.rotate_time > 0 &&
-                                elapsed > backend->fuser->set.rotate_time))
+                               (backend->fuser->set->rotate_time > 0 &&
+                                elapsed > backend->fuser->set->rotate_time))
                                rotate = TRUE;
                }
        }
@@ -1668,7 +1668,7 @@ fts_flatcurve_xapian_index_header(struct flatcurve_fts_backend_update_context *c
                const unsigned char *end = data + size;
                for(; end > data; data += uni_utf8_char_bytes((unsigned char) *data)) {
                        size_t len = end - data;
-                       if (len < fuser->set.min_term_size)
+                       if (len < fuser->set->min_term_size)
                                break;
 
                        /* Capital ASCII letters at the beginning of a Xapian
@@ -1690,7 +1690,7 @@ fts_flatcurve_xapian_index_header(struct flatcurve_fts_backend_update_context *c
                                x->doc->add_term(str_c(hdr_term));
                        }
 
-                       if (!fuser->set.substring_search)
+                       if (!fuser->set->substring_search)
                                break;
                }
        } T_END;
@@ -1719,7 +1719,7 @@ fts_flatcurve_xapian_index_body(struct flatcurve_fts_backend_update_context *ctx
                const char *end = data + str_len(term);
                for(; end > data; data += uni_utf8_char_bytes((unsigned char) *data)) {
                        size_t len = end - data;
-                       if (len < fuser->set.min_term_size)
+                       if (len < fuser->set->min_term_size)
                                break;
 
                        /* Capital ASCII letters at the beginning of a Xapian term are
@@ -1729,7 +1729,7 @@ fts_flatcurve_xapian_index_body(struct flatcurve_fts_backend_update_context *ctx
                        *data = i_tolower(*data);
                        x->doc->add_term(data);
 
-                       if (!fuser->set.substring_search)
+                       if (!fuser->set->substring_search)
                                break;
                }
        } T_END;
index ef0bdabfd79b5f7b9199941e456b9239a0ad3969..f8a651596a2be1e406b86441690373c36c87ba79 100644 (file)
@@ -313,7 +313,7 @@ fts_backend_flatcurve_update_build_more(struct fts_backend_update_context *_ctx,
        if (_ctx->failed || ctx->skip_uid)
                return -1;
 
-       if (size < ctx->backend->fuser->set.min_term_size)
+       if (size < ctx->backend->fuser->set->min_term_size)
                return 0;
 
        /* Xapian has a hard limit of "245 bytes", at least with the glass
@@ -321,7 +321,7 @@ fts_backend_flatcurve_update_build_more(struct fts_backend_update_context *_ctx,
         * are realistically going to search with more than 10s of
         * characters. Therefore, limit term size (via a configurable
         * value). */
-       size = I_MIN(size, ctx->backend->fuser->set.max_term_size);
+       size = I_MIN(size, ctx->backend->fuser->set->max_term_size);
 
        const char *error;
        int ret;
index 940058eea9a976c87ae44b23705c24df940c322a..72563803338bd66634240cabe61c97cfa6d64877 100644 (file)
@@ -2,6 +2,7 @@
  * See the included COPYING file */
 
 #include "lib.h"
+#include "settings.h"
 #include "mail-storage-hooks.h"
 #include "str-parse.h"
 #include "fts-user.h"
@@ -9,27 +10,6 @@
 #include "fts-backend-flatcurve-xapian.h"
 #include "fts-flatcurve-plugin.h"
 
-#define FTS_FLATCURVE_PLUGIN_COMMIT_LIMIT "fts_flatcurve_commit_limit"
-#define FTS_FLATCURVE_COMMIT_LIMIT_DEFAULT 500
-
-#define FTS_FLATCURVE_PLUGIN_MAX_TERM_SIZE "fts_flatcurve_max_term_size"
-#define FTS_FLATCURVE_MAX_TERM_SIZE_DEFAULT 30
-#define FTS_FLATCURVE_MAX_TERM_SIZE_MAX 200
-
-#define FTS_FLATCURVE_PLUGIN_MIN_TERM_SIZE "fts_flatcurve_min_term_size"
-#define FTS_FLATCURVE_MIN_TERM_SIZE_DEFAULT 2
-
-#define FTS_FLATCURVE_PLUGIN_OPTIMIZE_LIMIT "fts_flatcurve_optimize_limit"
-#define FTS_FLATCURVE_OPTIMIZE_LIMIT_DEFAULT 10
-
-#define FTS_FLATCURVE_PLUGIN_ROTATE_COUNT "fts_flatcurve_rotate_count"
-#define FTS_FLATCURVE_ROTATE_SIZE_DEFAULT 5000
-
-#define FTS_FLATCURVE_PLUGIN_ROTATE_TIME "fts_flatcurve_rotate_time"
-#define FTS_FLATCURVE_ROTATE_TIME_DEFAULT 5000
-
-#define FTS_FLATCURVE_PLUGIN_SUBSTRING_SEARCH "fts_flatcurve_substring_search"
-
 const char *fts_flatcurve_plugin_version = DOVECOT_ABI_VERSION;
 
 struct fts_flatcurve_user_module fts_flatcurve_user_module =
@@ -41,104 +21,31 @@ static void fts_flatcurve_mail_user_deinit(struct mail_user *user)
                FTS_FLATCURVE_USER_CONTEXT_REQUIRE(user);
 
        fts_mail_user_deinit(user);
+       settings_free(fuser->set);
        fuser->module_ctx.super.deinit(user);
 }
 
-static int
-fts_flatcurve_plugin_init_settings(struct mail_user *user,
-                                  struct fts_flatcurve_settings *set,
-                                  const char **error_r)
-{
-       const char *pset;
-       unsigned int val;
-
-       set->commit_limit = FTS_FLATCURVE_COMMIT_LIMIT_DEFAULT;
-       pset = mail_user_plugin_getenv(user, FTS_FLATCURVE_PLUGIN_COMMIT_LIMIT);
-       if (pset != NULL) {
-               if (str_to_uint(pset, &val) < 0) {
-                       *error_r = t_strdup_printf("Invalid %s: %s",
-                               FTS_FLATCURVE_PLUGIN_COMMIT_LIMIT, pset);
-                       return -1;
-               }
-               set->commit_limit = val;
-       }
-
-       set->max_term_size = FTS_FLATCURVE_MAX_TERM_SIZE_DEFAULT;
-       pset = mail_user_plugin_getenv(user, FTS_FLATCURVE_PLUGIN_MAX_TERM_SIZE);
-       if (pset != NULL) {
-               if (str_to_uint(pset, &val) < 0) {
-                       *error_r = t_strdup_printf("Invalid %s: %s",
-                               FTS_FLATCURVE_PLUGIN_MAX_TERM_SIZE, pset);
-                       return -1;
-               }
-               set->max_term_size = I_MIN(val, FTS_FLATCURVE_MAX_TERM_SIZE_MAX);
-       }
-
-       set->min_term_size = FTS_FLATCURVE_MIN_TERM_SIZE_DEFAULT;
-       pset = mail_user_plugin_getenv(user, FTS_FLATCURVE_PLUGIN_MIN_TERM_SIZE);
-       if (pset != NULL) {
-               if (str_to_uint(pset, &val) < 0) {
-                       *error_r = t_strdup_printf("Invalid %s: %s",
-                               FTS_FLATCURVE_PLUGIN_MIN_TERM_SIZE, pset);
-                       return -1;
-               }
-               set->min_term_size = val;
-       }
-
-       set->optimize_limit = FTS_FLATCURVE_OPTIMIZE_LIMIT_DEFAULT;
-       pset = mail_user_plugin_getenv(user, FTS_FLATCURVE_PLUGIN_OPTIMIZE_LIMIT);
-       if (pset != NULL) {
-               if (str_to_uint(pset, &val) < 0) {
-                       *error_r = t_strdup_printf("Invalid %s: %s",
-                               FTS_FLATCURVE_PLUGIN_OPTIMIZE_LIMIT, pset);
-                       return -1;
-               }
-               set->optimize_limit = val;
-       }
-
-       set->rotate_count = FTS_FLATCURVE_ROTATE_SIZE_DEFAULT;
-       pset = mail_user_plugin_getenv(user, FTS_FLATCURVE_PLUGIN_ROTATE_COUNT);
-       if (pset != NULL) {
-               if (str_to_uint(pset, &val) < 0) {
-                       *error_r = t_strdup_printf("Invalid %s: %s",
-                               FTS_FLATCURVE_PLUGIN_ROTATE_COUNT, pset);
-                       return -1;
-               }
-               set->rotate_count = val;
-       }
-
-       set->rotate_time = FTS_FLATCURVE_ROTATE_TIME_DEFAULT;
-       pset = mail_user_plugin_getenv(user, FTS_FLATCURVE_PLUGIN_ROTATE_TIME);
-       if (pset != NULL) {
-               const char *error;
-               if (str_parse_get_interval_msecs(pset, &val, &error) < 0) {
-                       *error_r = t_strdup_printf("Invalid %s: %s",
-                               FTS_FLATCURVE_PLUGIN_ROTATE_TIME, error);
-                       return -1;
-               }
-               set->rotate_time = val;
-       }
-
-       set->substring_search = mail_user_plugin_getenv_bool(
-               user, FTS_FLATCURVE_PLUGIN_SUBSTRING_SEARCH);
-
-       return 0;
-}
-
 static void fts_flatcurve_mail_user_created(struct mail_user *user)
 {
        struct mail_user_vfuncs *v = user->vlast;
        struct fts_flatcurve_user *fuser;
        const char *error;
+       struct fts_flatcurve_settings *set;
 
-       fuser = p_new(user->pool, struct fts_flatcurve_user, 1);
+       if (settings_get(user->event, &fts_flatcurve_setting_parser_info, 0,
+                        &set, &error) < 0) {
+               e_error(user->event, "%s", error);
+               return;
+       }
 
-       if (fts_flatcurve_plugin_init_settings(user, &fuser->set, &error) < 0 ||
-           fts_mail_user_init(user, TRUE, &error) < 0) {
+       if (fts_mail_user_init(user, TRUE, &error) < 0) {
                e_error(user->event, FTS_FLATCURVE_DEBUG_PREFIX "%s", error);
+               settings_free(set);
                return;
        }
 
+       fuser = p_new(user->pool, struct fts_flatcurve_user, 1);
+       fuser->set = set;
        fuser->module_ctx.super = *v;
        user->vlast = &fuser->module_ctx.super;
        v->deinit = fts_flatcurve_mail_user_deinit;
index 42519be0f1bca512fe7f3e679a2917ddf665b408..8d80266fe29051f71f8c99ec968094e18dd16e5d 100644 (file)
@@ -8,26 +8,17 @@
 #include "mail-user.h"
 #include "lib.h"
 #include "fts-api-private.h"
+#include "fts-flatcurve-settings.h"
 
 #define FTS_FLATCURVE_USER_CONTEXT(obj) \
        MODULE_CONTEXT(obj, fts_flatcurve_user_module)
 #define FTS_FLATCURVE_USER_CONTEXT_REQUIRE(obj) \
        MODULE_CONTEXT_REQUIRE(obj, fts_flatcurve_user_module)
 
-struct fts_flatcurve_settings {
-       unsigned int commit_limit;
-       unsigned int max_term_size;
-       unsigned int min_term_size;
-       unsigned int optimize_limit;
-       unsigned int rotate_count;
-       unsigned int rotate_time;
-       bool substring_search;
-};
-
 struct fts_flatcurve_user {
        union mail_user_module_context module_ctx;
        struct flatcurve_fts_backend *backend;
-       struct fts_flatcurve_settings set;
+       struct fts_flatcurve_settings *set;
 };
 
 extern struct fts_backend fts_backend_flatcurve;
diff --git a/src/plugins/fts-flatcurve/fts-flatcurve-settings.c b/src/plugins/fts-flatcurve/fts-flatcurve-settings.c
new file mode 100644 (file)
index 0000000..fc2e756
--- /dev/null
@@ -0,0 +1,71 @@
+/* Copyright (c) 2023 Dovecot Oy, see the included COPYING file */
+
+#include "lib.h"
+#include "settings-parser.h"
+#include "fts-flatcurve-settings.h"
+
+#undef DEF
+#define DEF(type, name) \
+       SETTING_DEFINE_STRUCT_##type("fts_flatcurve_"#name, name, struct fts_flatcurve_settings)
+
+/* <settings checks> */
+#define FTS_FLATCURVE_MAX_TERM_SIZE_MAX 200
+/* </settings checks> */
+
+static const struct setting_define fts_flatcurve_setting_defines[] = {
+       /* For now this filter just allows grouping the settings
+          like it is possible in the other fts_backends. */
+       { .type = SET_FILTER_NAME, .key = FTS_FLATCURVE_FILTER },
+       DEF(UINT, commit_limit),
+       DEF(UINT, max_term_size),
+       DEF(UINT, min_term_size),
+       DEF(UINT, optimize_limit),
+       DEF(UINT, rotate_count),
+       DEF(TIME_MSECS, rotate_time),
+       DEF(BOOL, substring_search),
+       SETTING_DEFINE_LIST_END
+};
+
+static const struct fts_flatcurve_settings fts_flatcurve_default_settings = {
+       .commit_limit     =   500,
+       .max_term_size    =    30,
+       .min_term_size    =     2,
+       .optimize_limit   =    10,
+       .rotate_count     =  5000,
+       .rotate_time      =  5000,
+       .substring_search = FALSE,
+};
+
+/* <settings checks> */
+static bool fts_flatcurve_settings_check(void *_set, pool_t pool,
+                                        const char **error_r);
+/* </settings checks> */
+
+const struct setting_parser_info fts_flatcurve_setting_parser_info = {
+       .name = "fts_flatcurve",
+
+       .defines = fts_flatcurve_setting_defines,
+       .defaults = &fts_flatcurve_default_settings,
+       .check_func = fts_flatcurve_settings_check,
+
+       .struct_size = sizeof(struct fts_flatcurve_settings),
+       .pool_offset1 = 1 + offsetof(struct fts_flatcurve_settings, pool),
+};
+
+/* <settings checks> */
+static bool fts_flatcurve_settings_check(void *_set, pool_t pool ATTR_UNUSED,
+                                        const char **error_r)
+{
+       struct fts_flatcurve_settings *set = _set;
+
+       if (set->max_term_size > FTS_FLATCURVE_MAX_TERM_SIZE_MAX) {
+               *error_r = t_strdup_printf(
+                       "Invalid fts_flatcurve_max_term_size '%u', "
+                       "allowed values: 0..%d",
+                       set->max_term_size, FTS_FLATCURVE_MAX_TERM_SIZE_MAX);
+               return FALSE;
+       }
+
+       return TRUE;
+}
+/* </settings checks> */
diff --git a/src/plugins/fts-flatcurve/fts-flatcurve-settings.h b/src/plugins/fts-flatcurve/fts-flatcurve-settings.h
new file mode 100644 (file)
index 0000000..b020399
--- /dev/null
@@ -0,0 +1,21 @@
+#ifndef FTS_FLATCURVE_SETTINGS_H
+#define FTS_FLATCURVE_SETTINGS_H
+
+/* <settings checks> */
+#define FTS_FLATCURVE_FILTER "fts_flatcurve"
+/* </settings checks> */
+
+struct fts_flatcurve_settings {
+       pool_t pool;
+       unsigned int commit_limit;
+       unsigned int max_term_size;
+       unsigned int min_term_size;
+       unsigned int optimize_limit;
+       unsigned int rotate_count;
+       unsigned int rotate_time;
+       bool substring_search;
+};
+
+extern const struct setting_parser_info fts_flatcurve_setting_parser_info;
+
+#endif