fts-lucene-plugin.c revision 57b523eeb99ed5d7f5002907a409cdef54353ce5
5f5870385cff47efd2f58e7892f251cf13761528Timo Sirainen/* Copyright (c) 2006-2014 Dovecot authors, see the included COPYING file */
b014857be9961acf2d37ef7b76d941b20cc8c2d1Timo Sirainen
b014857be9961acf2d37ef7b76d941b20cc8c2d1Timo Sirainen#include "lib.h"
b014857be9961acf2d37ef7b76d941b20cc8c2d1Timo Sirainen#include "crc32.h"
b014857be9961acf2d37ef7b76d941b20cc8c2d1Timo Sirainen#include "mail-storage-hooks.h"
b014857be9961acf2d37ef7b76d941b20cc8c2d1Timo Sirainen#include "lucene-wrapper.h"
b014857be9961acf2d37ef7b76d941b20cc8c2d1Timo Sirainen#include "fts-lucene-plugin.h"
b014857be9961acf2d37ef7b76d941b20cc8c2d1Timo Sirainen
b014857be9961acf2d37ef7b76d941b20cc8c2d1Timo Sirainenconst char *fts_lucene_plugin_version = DOVECOT_ABI_VERSION;
b014857be9961acf2d37ef7b76d941b20cc8c2d1Timo Sirainen
b014857be9961acf2d37ef7b76d941b20cc8c2d1Timo Sirainenstruct fts_lucene_user_module fts_lucene_user_module =
b014857be9961acf2d37ef7b76d941b20cc8c2d1Timo Sirainen MODULE_CONTEXT_INIT(&mail_user_module_register);
d9076f5939edf5d20a261494b1a861dcbb0d32e2Timo Sirainen
b014857be9961acf2d37ef7b76d941b20cc8c2d1Timo Sirainenstatic int
b014857be9961acf2d37ef7b76d941b20cc8c2d1Timo Sirainenfts_lucene_plugin_init_settings(struct mail_user *user,
b014857be9961acf2d37ef7b76d941b20cc8c2d1Timo Sirainen struct fts_lucene_settings *set,
b014857be9961acf2d37ef7b76d941b20cc8c2d1Timo Sirainen const char *str)
b014857be9961acf2d37ef7b76d941b20cc8c2d1Timo Sirainen{
b014857be9961acf2d37ef7b76d941b20cc8c2d1Timo Sirainen const char *const *tmp;
b014857be9961acf2d37ef7b76d941b20cc8c2d1Timo Sirainen
b014857be9961acf2d37ef7b76d941b20cc8c2d1Timo Sirainen for (tmp = t_strsplit_spaces(str, " "); *tmp != NULL; tmp++) {
b014857be9961acf2d37ef7b76d941b20cc8c2d1Timo Sirainen if (strncmp(*tmp, "default_language=", 17) == 0) {
b014857be9961acf2d37ef7b76d941b20cc8c2d1Timo Sirainen set->default_language =
b014857be9961acf2d37ef7b76d941b20cc8c2d1Timo Sirainen p_strdup(user->pool, *tmp + 17);
b014857be9961acf2d37ef7b76d941b20cc8c2d1Timo Sirainen } else if (strncmp(*tmp, "textcat_conf=", 13) == 0) {
b014857be9961acf2d37ef7b76d941b20cc8c2d1Timo Sirainen set->textcat_conf = p_strdup(user->pool, *tmp + 13);
b014857be9961acf2d37ef7b76d941b20cc8c2d1Timo Sirainen } else if (strncmp(*tmp, "textcat_dir=", 12) == 0) {
b014857be9961acf2d37ef7b76d941b20cc8c2d1Timo Sirainen set->textcat_dir = p_strdup(user->pool, *tmp + 12);
b014857be9961acf2d37ef7b76d941b20cc8c2d1Timo Sirainen } else if (strncmp(*tmp, "whitespace_chars=", 17) == 0) {
b014857be9961acf2d37ef7b76d941b20cc8c2d1Timo Sirainen set->whitespace_chars = p_strdup(user->pool, *tmp + 17);
b014857be9961acf2d37ef7b76d941b20cc8c2d1Timo Sirainen } else if (strcmp(*tmp, "normalize") == 0) {
b014857be9961acf2d37ef7b76d941b20cc8c2d1Timo Sirainen set->normalize = TRUE;
b014857be9961acf2d37ef7b76d941b20cc8c2d1Timo Sirainen } else if (strcmp(*tmp, "no_snowball") == 0) {
b014857be9961acf2d37ef7b76d941b20cc8c2d1Timo Sirainen set->no_snowball = TRUE;
b014857be9961acf2d37ef7b76d941b20cc8c2d1Timo Sirainen } else if (strcmp(*tmp, "mime_parts") == 0) {
b014857be9961acf2d37ef7b76d941b20cc8c2d1Timo Sirainen set->mime_parts = TRUE;
b014857be9961acf2d37ef7b76d941b20cc8c2d1Timo Sirainen } else {
b014857be9961acf2d37ef7b76d941b20cc8c2d1Timo Sirainen i_error("fts_lucene: Invalid setting: %s", *tmp);
b014857be9961acf2d37ef7b76d941b20cc8c2d1Timo Sirainen return -1;
b014857be9961acf2d37ef7b76d941b20cc8c2d1Timo Sirainen }
b014857be9961acf2d37ef7b76d941b20cc8c2d1Timo Sirainen }
b014857be9961acf2d37ef7b76d941b20cc8c2d1Timo Sirainen if (set->textcat_conf != NULL && set->textcat_dir == NULL) {
82d3a1d1594ed93d04d7bf999027b3e5104de6e4Timo Sirainen i_error("fts_lucene: textcat_conf set, but textcat_dir unset");
82d3a1d1594ed93d04d7bf999027b3e5104de6e4Timo Sirainen return -1;
b014857be9961acf2d37ef7b76d941b20cc8c2d1Timo Sirainen }
b014857be9961acf2d37ef7b76d941b20cc8c2d1Timo Sirainen if (set->textcat_conf == NULL && set->textcat_dir != NULL) {
b014857be9961acf2d37ef7b76d941b20cc8c2d1Timo Sirainen i_error("fts_lucene: textcat_dir set, but textcat_conf unset");
b014857be9961acf2d37ef7b76d941b20cc8c2d1Timo Sirainen return -1;
b014857be9961acf2d37ef7b76d941b20cc8c2d1Timo Sirainen }
b014857be9961acf2d37ef7b76d941b20cc8c2d1Timo Sirainen if (set->whitespace_chars == NULL)
b014857be9961acf2d37ef7b76d941b20cc8c2d1Timo Sirainen set->whitespace_chars = "";
b014857be9961acf2d37ef7b76d941b20cc8c2d1Timo Sirainen#ifndef HAVE_LUCENE_STEMMER
b014857be9961acf2d37ef7b76d941b20cc8c2d1Timo Sirainen if (set->default_language != NULL) {
b014857be9961acf2d37ef7b76d941b20cc8c2d1Timo Sirainen i_error("fts_lucene: default_language set, "
b014857be9961acf2d37ef7b76d941b20cc8c2d1Timo Sirainen "but Dovecot built without stemmer support");
b014857be9961acf2d37ef7b76d941b20cc8c2d1Timo Sirainen return -1;
b014857be9961acf2d37ef7b76d941b20cc8c2d1Timo Sirainen }
#else
if (set->default_language == NULL)
set->default_language = "english";
#endif
#ifndef HAVE_LUCENE_TEXTCAT
if (set->textcat_conf != NULL) {
i_error("fts_lucene: textcat_dir set, "
"but Dovecot built without textcat support");
return -1;
}
#endif
return 0;
}
uint32_t fts_lucene_settings_checksum(const struct fts_lucene_settings *set)
{
uint32_t crc;
/* checksum is always different when compiling with/without stemmer */
crc = set->default_language == NULL ? 0 :
crc32_str(set->default_language);
crc = crc32_str_more(crc, set->whitespace_chars);
if (set->normalize)
crc = crc32_str_more(crc, "n");
if (set->no_snowball)
crc = crc32_str_more(crc, "s");
/* don't include mime_parts here, since changing it doesn't
necessarily need the index to be rebuilt */
return crc;
}
static void fts_lucene_mail_user_created(struct mail_user *user)
{
struct fts_lucene_user *fuser;
const char *env;
fuser = p_new(user->pool, struct fts_lucene_user, 1);
env = mail_user_plugin_getenv(user, "fts_lucene");
if (env == NULL)
env = "";
if (fts_lucene_plugin_init_settings(user, &fuser->set, env) < 0) {
/* invalid settings, disabling */
return;
}
MODULE_CONTEXT_SET(user, fts_lucene_user_module, fuser);
}
static struct mail_storage_hooks fts_lucene_mail_storage_hooks = {
.mail_user_created = fts_lucene_mail_user_created
};
void fts_lucene_plugin_init(struct module *module ATTR_UNUSED)
{
fts_backend_register(&fts_backend_lucene);
mail_storage_hooks_add(module, &fts_lucene_mail_storage_hooks);
}
void fts_lucene_plugin_deinit(void)
{
fts_backend_unregister(fts_backend_lucene.name);
mail_storage_hooks_remove(&fts_lucene_mail_storage_hooks);
lucene_shutdown();
}
const char *fts_lucene_plugin_dependencies[] = { "fts", NULL };