This adds fts_flatcurve { .. } named filter.
Currently just used to allow grouping the settings.
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
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
++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);
}
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;
}
}
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
x->doc->add_term(str_c(hdr_term));
}
- if (!fuser->set.substring_search)
+ if (!fuser->set->substring_search)
break;
}
} T_END;
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
*data = i_tolower(*data);
x->doc->add_term(data);
- if (!fuser->set.substring_search)
+ if (!fuser->set->substring_search)
break;
}
} T_END;
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
* 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;
* See the included COPYING file */
#include "lib.h"
+#include "settings.h"
#include "mail-storage-hooks.h"
#include "str-parse.h"
#include "fts-user.h"
#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 =
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;
#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;
--- /dev/null
+/* 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> */
--- /dev/null
+#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