fts-user.c (dovecot-2.3.16) | : | fts-user.c (dovecot-2.3.17) | ||
---|---|---|---|---|
/* Copyright (c) 2015-2018 Dovecot authors, see the included COPYING file */ | /* Copyright (c) 2015-2018 Dovecot authors, see the included COPYING file */ | |||
#include "lib.h" | #include "lib.h" | |||
#include "module-context.h" | #include "module-context.h" | |||
#include "mail-user.h" | #include "mail-user.h" | |||
#include "mail-storage-private.h" | ||||
#include "mailbox-match-plugin.h" | ||||
#include "fts-language.h" | #include "fts-language.h" | |||
#include "fts-filter.h" | #include "fts-filter.h" | |||
#include "fts-tokenizer.h" | #include "fts-tokenizer.h" | |||
#include "fts-user.h" | #include "fts-user.h" | |||
#define FTS_USER_CONTEXT(obj) \ | #define FTS_USER_CONTEXT(obj) \ | |||
MODULE_CONTEXT(obj, fts_user_module) | MODULE_CONTEXT(obj, fts_user_module) | |||
struct fts_user { | struct fts_user { | |||
union mail_user_module_context module_ctx; | union mail_user_module_context module_ctx; | |||
int refcount; | int refcount; | |||
struct fts_language_list *lang_list; | struct fts_language_list *lang_list; | |||
struct fts_user_language *data_lang; | struct fts_user_language *data_lang; | |||
ARRAY_TYPE(fts_user_language) languages, data_languages; | ARRAY_TYPE(fts_user_language) languages, data_languages; | |||
struct mailbox_match_plugin *autoindex_exclude; | ||||
}; | }; | |||
static MODULE_CONTEXT_DEFINE_INIT(fts_user_module, | static MODULE_CONTEXT_DEFINE_INIT(fts_user_module, | |||
&mail_user_module_register); | &mail_user_module_register); | |||
static const char *const *str_keyvalues_to_array(const char *str) | static const char *const *str_keyvalues_to_array(const char *str) | |||
{ | { | |||
const char *key, *value, *const *keyvalues; | const char *key, *value, *const *keyvalues; | |||
ARRAY_TYPE(const_string) arr; | ARRAY_TYPE(const_string) arr; | |||
unsigned int i; | unsigned int i; | |||
skipping to change at line 339 | skipping to change at line 343 | |||
} | } | |||
struct fts_user_language *fts_user_get_data_lang(struct mail_user *user) | struct fts_user_language *fts_user_get_data_lang(struct mail_user *user) | |||
{ | { | |||
struct fts_user *fuser = FTS_USER_CONTEXT(user); | struct fts_user *fuser = FTS_USER_CONTEXT(user); | |||
i_assert(fuser != NULL); | i_assert(fuser != NULL); | |||
return fuser->data_lang; | return fuser->data_lang; | |||
} | } | |||
bool fts_user_autoindex_exclude(struct mailbox *box) | ||||
{ | ||||
struct fts_user *fuser = FTS_USER_CONTEXT(box->storage->user); | ||||
return mailbox_match_plugin_exclude(fuser->autoindex_exclude, box); | ||||
} | ||||
static void fts_user_language_free(struct fts_user_language *user_lang) | static void fts_user_language_free(struct fts_user_language *user_lang) | |||
{ | { | |||
if (user_lang->filter != NULL) | if (user_lang->filter != NULL) | |||
fts_filter_unref(&user_lang->filter); | fts_filter_unref(&user_lang->filter); | |||
if (user_lang->index_tokenizer != NULL) | if (user_lang->index_tokenizer != NULL) | |||
fts_tokenizer_unref(&user_lang->index_tokenizer); | fts_tokenizer_unref(&user_lang->index_tokenizer); | |||
if (user_lang->search_tokenizer != NULL) | if (user_lang->search_tokenizer != NULL) | |||
fts_tokenizer_unref(&user_lang->search_tokenizer); | fts_tokenizer_unref(&user_lang->search_tokenizer); | |||
} | } | |||
static void fts_user_free(struct fts_user *fuser) | static void fts_user_free(struct fts_user *fuser) | |||
{ | { | |||
struct fts_user_language *user_lang; | struct fts_user_language *user_lang; | |||
if (fuser->lang_list != NULL) | if (fuser->lang_list != NULL) | |||
fts_language_list_deinit(&fuser->lang_list); | fts_language_list_deinit(&fuser->lang_list); | |||
array_foreach_elem(&fuser->languages, user_lang) | if (array_is_created(&fuser->languages)) { | |||
fts_user_language_free(user_lang); | array_foreach_elem(&fuser->languages, user_lang) | |||
fts_user_language_free(user_lang); | ||||
} | ||||
mailbox_match_plugin_deinit(&fuser->autoindex_exclude); | ||||
} | } | |||
int fts_mail_user_init(struct mail_user *user, const char **error_r) | static int | |||
fts_mail_user_init_libfts(struct mail_user *user, struct fts_user *fuser, | ||||
const char **error_r) | ||||
{ | ||||
p_array_init(&fuser->languages, user->pool, 4); | ||||
if (fts_user_init_languages(user, fuser, error_r) < 0 || | ||||
fts_user_init_data_language(user, fuser, error_r) < 0) | ||||
return -1; | ||||
if (fts_user_languages_fill_all(user, fuser, error_r) < 0) | ||||
return -1; | ||||
return 0; | ||||
} | ||||
int fts_mail_user_init(struct mail_user *user, bool initialize_libfts, | ||||
const char **error_r) | ||||
{ | { | |||
struct fts_user *fuser = FTS_USER_CONTEXT(user); | struct fts_user *fuser = FTS_USER_CONTEXT(user); | |||
if (fuser != NULL) { | if (fuser != NULL) { | |||
/* multiple fts plugins are loaded */ | /* multiple fts plugins are loaded */ | |||
fuser->refcount++; | fuser->refcount++; | |||
return 0; | return 0; | |||
} | } | |||
fuser = p_new(user->pool, struct fts_user, 1); | fuser = p_new(user->pool, struct fts_user, 1); | |||
fuser->refcount = 1; | fuser->refcount = 1; | |||
p_array_init(&fuser->languages, user->pool, 4); | if (initialize_libfts) { | |||
if (fts_mail_user_init_libfts(user, fuser, error_r) < 0) { | ||||
if (fts_user_init_languages(user, fuser, error_r) < 0 || | fts_user_free(fuser); | |||
fts_user_init_data_language(user, fuser, error_r) < 0) { | return -1; | |||
fts_user_free(fuser); | } | |||
return -1; | ||||
} | ||||
if (fts_user_languages_fill_all(user, fuser, error_r) < 0) { | ||||
fts_user_free(fuser); | ||||
return -1; | ||||
} | } | |||
fuser->autoindex_exclude = | ||||
mailbox_match_plugin_init(user, "fts_autoindex_exclude"); | ||||
MODULE_CONTEXT_SET(user, fts_user_module, fuser); | MODULE_CONTEXT_SET(user, fts_user_module, fuser); | |||
return 0; | return 0; | |||
} | } | |||
void fts_mail_user_deinit(struct mail_user *user) | void fts_mail_user_deinit(struct mail_user *user) | |||
{ | { | |||
struct fts_user *fuser = FTS_USER_CONTEXT(user); | struct fts_user *fuser = FTS_USER_CONTEXT(user); | |||
if (fuser != NULL) { | if (fuser != NULL) { | |||
End of changes. 7 change blocks. | ||||
13 lines changed or deleted | 39 lines changed or added |