fts-lucene-plugin.c revision bd63b5b860658b01b1f46f26d406e1e4a9dc019a
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch/* Copyright (c) 2006-2012 Dovecot authors, see the included COPYING file */
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch#include "lib.h"
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch#include "crc32.h"
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch#include "mail-storage-hooks.h"
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch#include "lucene-wrapper.h"
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch#include "fts-lucene-plugin.h"
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Boschconst char *fts_lucene_plugin_version = DOVECOT_ABI_VERSION;
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Boschstruct fts_lucene_user_module fts_lucene_user_module =
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch MODULE_CONTEXT_INIT(&mail_user_module_register);
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Boschstatic int
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Boschfts_lucene_plugin_init_settings(struct mail_user *user,
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch struct fts_lucene_settings *set,
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch const char *str)
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch{
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch const char *const *tmp;
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch for (tmp = t_strsplit_spaces(str, " "); *tmp != NULL; tmp++) {
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch if (strncmp(*tmp, "default_language=", 17) == 0) {
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch set->default_language =
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch p_strdup(user->pool, *tmp + 17);
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch } else if (strncmp(*tmp, "textcat_conf=", 13) == 0) {
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch set->textcat_conf = p_strdup(user->pool, *tmp + 13);
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch } else if (strncmp(*tmp, "textcat_dir=", 12) == 0) {
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch set->textcat_dir = p_strdup(user->pool, *tmp + 12);
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch } else if (strncmp(*tmp, "whitespace_chars=", 17) == 0) {
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch set->whitespace_chars = p_strdup(user->pool, *tmp + 17);
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch } else if (strcmp(*tmp, "normalize") == 0) {
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch set->normalize = TRUE;
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch } else {
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch i_error("fts_lucene: Invalid setting: %s", *tmp);
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch return -1;
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch }
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch }
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch if (set->textcat_conf != NULL && set->textcat_dir == NULL) {
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch i_error("fts_lucene: textcat_conf set, but textcat_dir unset");
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch return -1;
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch }
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch if (set->textcat_conf == NULL && set->textcat_dir != NULL) {
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch i_error("fts_lucene: textcat_dir set, but textcat_conf unset");
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch return -1;
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch }
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch if (set->whitespace_chars == NULL)
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch set->whitespace_chars = "";
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch#ifndef HAVE_LUCENE_STEMMER
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch if (set->default_language != NULL) {
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch i_error("fts_lucene: default_language set, "
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch "but Dovecot built without stemmer support");
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch return -1;
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch }
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch if (set->normalize) {
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch i_error("fts_lucene: normalize not currently supported "
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch "without stemmer support");
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch return -1;
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch }
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch#else
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch if (set->default_language == NULL)
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch set->default_language = "english";
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch#endif
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch#ifndef HAVE_LUCENE_TEXTCAT
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch if (set->textcat_conf != NULL) {
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch i_error("fts_lucene: textcat_dir set, "
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch "but Dovecot built without textcat support");
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch return -1;
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch }
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch#endif
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch return 0;
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch}
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Boschuint32_t fts_lucene_settings_checksum(const struct fts_lucene_settings *set)
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch{
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch uint32_t crc;
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch /* checksum is always different when compiling with/without stemmer */
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch crc = set->default_language == NULL ? 0 :
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch crc32_str(set->default_language);
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch crc = crc32_str_more(crc, set->whitespace_chars);
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch if (set->normalize)
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch crc = crc32_str_more(crc, "n");
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch return crc;
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch}
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Boschstatic void fts_lucene_mail_user_created(struct mail_user *user)
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch{
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch struct fts_lucene_user *fuser;
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch const char *env;
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch fuser = p_new(user->pool, struct fts_lucene_user, 1);
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch env = mail_user_plugin_getenv(user, "fts_lucene");
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch if (env == NULL)
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch env = "";
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch if (fts_lucene_plugin_init_settings(user, &fuser->set, env) < 0) {
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch /* invalid settings, disabling */
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch return;
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch }
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch MODULE_CONTEXT_SET(user, fts_lucene_user_module, fuser);
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch}
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Boschstatic struct mail_storage_hooks fts_lucene_mail_storage_hooks = {
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch .mail_user_created = fts_lucene_mail_user_created
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch};
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Boschvoid fts_lucene_plugin_init(struct module *module ATTR_UNUSED)
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch{
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch fts_backend_register(&fts_backend_lucene);
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch mail_storage_hooks_add(module, &fts_lucene_mail_storage_hooks);
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch}
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Boschvoid fts_lucene_plugin_deinit(void)
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch{
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch fts_backend_unregister(fts_backend_lucene.name);
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch mail_storage_hooks_remove(&fts_lucene_mail_storage_hooks);
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch lucene_shutdown();
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch}
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Boschconst char *fts_lucene_plugin_dependencies[] = { "fts", NULL };
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch