dovecot-2.2: fts: Create filters earlier
dovecot at dovecot.org
dovecot at dovecot.org
Sat May 9 08:32:02 UTC 2015
details: http://hg.dovecot.org/dovecot-2.2/rev/abbd71252175
changeset: 18548:abbd71252175
user: Teemu Huovila <teemu.huovila at dovecot.fi>
date: Sat May 09 10:53:25 2015 +0300
description:
fts: Create filters earlier
This builds on the assumption that early initialization will be made
less costly, in a coming change.
diffstat:
src/plugins/fts/fts-build-mail.c | 10 +++-------
src/plugins/fts/fts-search-args.c | 8 --------
src/plugins/fts/fts-user.c | 38 +++++++++++++++++++-------------------
src/plugins/fts/fts-user.h | 8 +++-----
4 files changed, 25 insertions(+), 39 deletions(-)
diffs (152 lines):
diff -r 6ec2073bbf5c -r abbd71252175 src/plugins/fts/fts-build-mail.c
--- a/src/plugins/fts/fts-build-mail.c Fri May 08 16:00:16 2015 +0300
+++ b/src/plugins/fts/fts-build-mail.c Sat May 09 10:53:25 2015 +0300
@@ -299,7 +299,6 @@
{
struct mail_user *user = ctx->update_ctx->backend->ns->user;
const struct fts_language *lang;
- const char *error;
int ret;
if (ctx->cur_user_lang != NULL) {
@@ -310,12 +309,9 @@
/* wait for more data */
return 0;
} else {
- if (fts_user_language_get(user, lang, &ctx->cur_user_lang,
- &error) < 0) {
- i_error("fts: Can't index input because of invalid language '%s' config: %s",
- lang->name, error);
- return -1;
- }
+ ctx->cur_user_lang = fts_user_language_find(user, lang);
+ i_assert(ctx->cur_user_lang != NULL);
+
if (ctx->pending_input->used > 0) {
if (fts_build_add_tokens_with_filter(ctx,
ctx->pending_input->data,
diff -r 6ec2073bbf5c -r abbd71252175 src/plugins/fts/fts-search-args.c
--- a/src/plugins/fts/fts-search-args.c Fri May 08 16:00:16 2015 +0300
+++ b/src/plugins/fts/fts-search-args.c Sat May 09 10:53:25 2015 +0300
@@ -151,15 +151,7 @@
int fts_search_args_expand(struct fts_backend *backend,
struct mail_search_args *args)
{
- const char *error;
- /* we need to know all the possible languages for building the
- search query. each search word queried by passing it through each
- language's filters. */
- if (fts_user_languages_fill_all(backend->ns->user, &error) < 0) {
- i_error("fts_dovecot: Failed to initialize languages: %s", error);
- return -1;
- }
fts_search_args_expand_tree(backend, args->pool, &args->args);
/* we'll need to re-simplify the args if we changed anything */
diff -r 6ec2073bbf5c -r abbd71252175 src/plugins/fts/fts-user.c
--- a/src/plugins/fts/fts-user.c Fri May 08 16:00:16 2015 +0300
+++ b/src/plugins/fts/fts-user.c Sat May 09 10:53:25 2015 +0300
@@ -114,12 +114,13 @@
return 0;
}
-static struct fts_user_language *
-fts_user_language_find(struct fts_user *fuser,
+struct fts_user_language *
+fts_user_language_find(struct mail_user *user,
const struct fts_language *lang)
{
struct fts_user_language *const *user_langp;
-
+ struct fts_user *fuser = FTS_USER_CONTEXT(user);
+
array_foreach(&fuser->languages, user_langp) {
if (strcmp((*user_langp)->lang->name, lang->name) == 0)
return *user_langp;
@@ -127,19 +128,13 @@
return NULL;
}
-int fts_user_language_get(struct mail_user *user,
- const struct fts_language *lang,
- struct fts_user_language **user_lang_r,
- const char **error_r)
+static int fts_user_language_create(struct mail_user *user,
+ struct fts_user *fuser,
+ const struct fts_language *lang,
+ const char **error_r)
{
- struct fts_user *fuser = FTS_USER_CONTEXT(user);
+ struct fts_filter *filter;
struct fts_user_language *user_lang;
- struct fts_filter *filter;
-
- *user_lang_r = fts_user_language_find(fuser, lang);
- if (*user_lang_r != NULL)
- return 0;
-
if (fts_user_create_filters(user, lang, &filter, error_r) < 0)
return -1;
@@ -148,18 +143,17 @@
user_lang->filter = filter;
array_append(&fuser->languages, &user_lang, 1);
- *user_lang_r = user_lang;
return 0;
}
-int fts_user_languages_fill_all(struct mail_user *user, const char **error_r)
+static int fts_user_languages_fill_all(struct mail_user *user,
+ struct fts_user *fuser,
+ const char **error_r)
{
- struct fts_user *fuser = FTS_USER_CONTEXT(user);
const struct fts_language *const *langp;
- struct fts_user_language *user_lang;
array_foreach(fts_language_list_get_all(fuser->lang_list), langp) {
- if (fts_user_language_get(user, *langp, &user_lang, error_r) < 0)
+ if (fts_user_language_create(user, fuser, *langp, error_r) < 0)
return -1;
}
return 0;
@@ -196,6 +190,7 @@
int fts_mail_user_init(struct mail_user *user, const char **error_r)
{
struct fts_user *fuser;
+ const char *error;
fuser = p_new(user->pool, struct fts_user, 1);
p_array_init(&fuser->languages, user->pool, 4);
@@ -204,6 +199,11 @@
fts_user_free(fuser);
return -1;
}
+ if (fts_user_languages_fill_all(user, fuser, &error) < 0) {
+ i_error("fts_dovecot: Failed to initialize languages: %s", error);
+ fts_user_free(fuser);
+ return -1;
+ }
MODULE_CONTEXT_SET(user, fts_user_module, fuser);
return 0;
}
diff -r 6ec2073bbf5c -r abbd71252175 src/plugins/fts/fts-user.h
--- a/src/plugins/fts/fts-user.h Fri May 08 16:00:16 2015 +0300
+++ b/src/plugins/fts/fts-user.h Sat May 09 10:53:25 2015 +0300
@@ -7,11 +7,9 @@
};
ARRAY_DEFINE_TYPE(fts_user_language, struct fts_user_language *);
-int fts_user_language_get(struct mail_user *user,
- const struct fts_language *lang,
- struct fts_user_language **user_lang_r,
- const char **error_r);
-int fts_user_languages_fill_all(struct mail_user *user, const char **error_r);
+struct fts_user_language *
+fts_user_language_find(struct mail_user *user,
+ const struct fts_language *lang);
struct fts_language_list *fts_user_get_language_list(struct mail_user *user);
const ARRAY_TYPE(fts_user_language) *
More information about the dovecot-cvs
mailing list