changeset 13221:bf55c954ba3b

fts: Added "doveadm fts optimize" command.
author Timo Sirainen <tss@iki.fi>
date Thu, 11 Aug 2011 18:10:33 +0300
parents 19d8ec0db2e3
children 83699b38229b
files src/plugins/fts/Makefile.am src/plugins/fts/doveadm-fts.c src/plugins/fts/fts-storage.c src/plugins/fts/fts-storage.h
diffstat 4 files changed, 110 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/plugins/fts/Makefile.am	Thu Aug 11 18:05:56 2011 +0300
+++ b/src/plugins/fts/Makefile.am	Thu Aug 11 18:10:33 2011 +0300
@@ -1,13 +1,16 @@
 pkglibexecdir = $(libexecdir)/dovecot
+doveadm_moduledir = $(moduledir)/doveadm
 
 AM_CPPFLAGS = \
 	-I$(top_srcdir)/src/lib \
 	-I$(top_srcdir)/src/lib-mail \
 	-I$(top_srcdir)/src/lib-index \
 	-I$(top_srcdir)/src/lib-storage \
-	-I$(top_srcdir)/src/lib-storage/index
+	-I$(top_srcdir)/src/lib-storage/index \
+	-I$(top_srcdir)/src/doveadm
 
 NOPLUGIN_LDFLAGS =
+lib20_doveadm_fts_plugin_la_LDFLAGS = -module -avoid-version
 lib20_fts_plugin_la_LDFLAGS = -module -avoid-version
 
 module_LTLIBRARIES = \
@@ -47,3 +50,9 @@
 
 pkglibexec_SCRIPTS = decode2text.sh
 EXTRA_DIST = $(pkglibexec_SCRIPTS)
+
+doveadm_module_LTLIBRARIES = \
+	lib20_doveadm_fts_plugin.la
+
+lib20_doveadm_fts_plugin_la_SOURCES = \
+	doveadm-fts.c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/plugins/fts/doveadm-fts.c	Thu Aug 11 18:10:33 2011 +0300
@@ -0,0 +1,90 @@
+/* Copyright (c) 2011 Dovecot authors, see the included COPYING file */
+
+#include "lib.h"
+#include "mail-namespace.h"
+#include "fts-storage.h"
+#include "doveadm-mail.h"
+
+struct doveadm_fts_cmd_context {
+	struct doveadm_mail_cmd_context ctx;
+	bool get_match_me;
+};
+
+const char *doveadm_fts_plugin_version = DOVECOT_VERSION;
+
+void doveadm_fts_plugin_init(struct module *module);
+void doveadm_fts_plugin_deinit(void);
+
+static int
+fts_namespace_find(struct mail_user *user, const char *ns_prefix,
+		   struct mail_namespace **ns_r)
+{
+	struct mail_namespace *ns;
+
+	if (ns_prefix == NULL)
+		ns = mail_namespace_find_inbox(user->namespaces);
+	else {
+		ns = mail_namespace_find_prefix(user->namespaces, ns_prefix);
+		if (ns == NULL) {
+			i_error("Namespace prefix not found: %s", ns_prefix);
+			return -1;
+		}
+	}
+
+	if (fts_list_backend(ns->list) == NULL) {
+		i_error("fts not enabled for user's namespace %s", ns_prefix);
+		return -1;
+	}
+	*ns_r = ns;
+	return 0;
+}
+
+static void
+cmd_fts_optimize_run(struct doveadm_mail_cmd_context *ctx,
+		     struct mail_user *user)
+{
+	const char *ns_prefix = ctx->args[0];
+	struct mail_namespace *ns;
+	struct fts_backend *backend;
+
+	if (fts_namespace_find(user, ns_prefix, &ns) < 0)
+		return;
+	backend = fts_list_backend(ns->list);
+	if (fts_backend_optimize(backend) < 0)
+		i_error("fts optimize failed");
+}
+
+static void
+cmd_fts_optimize_init(struct doveadm_mail_cmd_context *ctx ATTR_UNUSED,
+		      const char *const args[])
+{
+	if (str_array_length(args) > 1)
+		doveadm_mail_help_name("fts optimize");
+}
+
+static struct doveadm_mail_cmd_context *
+cmd_fts_optimize_alloc(void)
+{
+	struct doveadm_mail_cmd_context *ctx;
+
+	ctx = doveadm_mail_cmd_alloc(struct doveadm_mail_cmd_context);
+	ctx->v.run = cmd_fts_optimize_run;
+	ctx->v.init = cmd_fts_optimize_init;
+	return ctx;
+}
+
+static struct doveadm_mail_cmd fts_commands[] = {
+	{ cmd_fts_optimize_alloc, "fts optimize", "[<namespace>]" }
+};
+
+void doveadm_fts_plugin_init(struct module *module ATTR_UNUSED)
+{
+	unsigned int i;
+
+	for (i = 0; i < N_ELEMENTS(fts_commands); i++)
+		doveadm_mail_register_cmd(&fts_commands[i]);
+}
+
+void doveadm_fts_plugin_deinit(void)
+{
+}
--- a/src/plugins/fts/fts-storage.c	Thu Aug 11 18:05:56 2011 +0300
+++ b/src/plugins/fts/fts-storage.c	Thu Aug 11 18:10:33 2011 +0300
@@ -528,3 +528,10 @@
 
 	return flist->backend;
 }
+
+struct fts_backend *fts_list_backend(struct mailbox_list *list)
+{
+	struct fts_mailbox_list *flist = FTS_LIST_CONTEXT(list);
+
+	return flist == NULL ? NULL : flist->backend;
+}
--- a/src/plugins/fts/fts-storage.h	Thu Aug 11 18:05:56 2011 +0300
+++ b/src/plugins/fts/fts-storage.h	Thu Aug 11 18:10:33 2011 +0300
@@ -44,8 +44,10 @@
 void fts_search_analyze(struct fts_search_context *fctx);
 /* Perform the actual index lookup and update definite_uids and maybe_uids. */
 void fts_search_lookup(struct fts_search_context *fctx);
-/* Returns FTS backend for the given mailbox. */
+/* Returns FTS backend for the given mailbox (assumes it has one). */
 struct fts_backend *fts_mailbox_backend(struct mailbox *box);
+/* Returns FTS backend for the given mailbox list, or NULL if it has none. */
+struct fts_backend *fts_list_backend(struct mailbox_list *list);
 
 void fts_mail_allocated(struct mail *mail);
 void fts_mailbox_allocated(struct mailbox *box);