dovecot-2.0: lib-storage: Rewrote search query building code to ...

dovecot at dovecot.org dovecot at dovecot.org
Tue Apr 13 18:59:26 EEST 2010


details:   http://hg.dovecot.org/dovecot-2.0/rev/c6db5769942f
changeset: 11144:c6db5769942f
user:      Timo Sirainen <tss at iki.fi>
date:      Tue Apr 13 18:59:23 2010 +0300
description:
lib-storage: Rewrote search query building code to be more modular.

diffstat:

 src/lib-storage/Makefile.am                 |    3 +
 src/lib-storage/mail-search-build.c         |  670 ++-------------------------------
 src/lib-storage/mail-search-build.h         |   10 +
 src/lib-storage/mail-search-register-imap.c |  591 +++++++++++++++++++++++++++++
 src/lib-storage/mail-search-register.c      |   71 +++
 src/lib-storage/mail-search-register.h      |   44 ++
 src/lib-storage/mail-storage-private.h      |    2 +
 src/lib-storage/mail-storage.c              |    4 +
 8 files changed, 774 insertions(+), 621 deletions(-)

diffs (truncated from 1527 to 300 lines):

diff -r 3e427a0c1790 -r c6db5769942f src/lib-storage/Makefile.am
--- a/src/lib-storage/Makefile.am	Tue Apr 13 17:01:12 2010 +0300
+++ b/src/lib-storage/Makefile.am	Tue Apr 13 18:59:23 2010 +0300
@@ -22,6 +22,8 @@
 	mail-namespace.c \
 	mail-search.c \
 	mail-search-build.c \
+	mail-search-register.c \
+	mail-search-register-imap.c \
 	mail-storage.c \
 	mail-storage-hooks.c \
 	mail-storage-settings.c \
@@ -41,6 +43,7 @@
 	mail-namespace.h \
 	mail-search.h \
 	mail-search-build.h \
+	mail-search-register.h \
 	mail-thread.h \
 	mail-storage.h \
 	mail-storage-private.h \
diff -r 3e427a0c1790 -r c6db5769942f src/lib-storage/mail-search-build.c
--- a/src/lib-storage/mail-search-build.c	Tue Apr 13 17:01:12 2010 +0300
+++ b/src/lib-storage/mail-search-build.c	Tue Apr 13 18:59:23 2010 +0300
@@ -1,644 +1,70 @@
 /* Copyright (c) 2002-2010 Dovecot authors, see the included COPYING file */
 
 #include "lib.h"
-#include "ioloop.h"
-#include "imap-date.h"
 #include "imap-arg.h"
-#include "imap-seqset.h"
+#include "mail-storage-private.h"
+#include "mail-search-register.h"
 #include "mail-search-build.h"
-#include "mail-storage.h"
 
 #include <stdlib.h>
 
-struct search_build_data {
-	pool_t pool;
-	const char *error;
-};
+struct mail_search_arg *
+mail_search_build_next(struct mail_search_build_context *ctx,
+		       const struct imap_arg **imap_args)
+{
+	struct mail_search_arg **subargs, *sarg;
+	const struct imap_arg *listargs;
+	const char *key;
+	const struct mail_search_register_arg *reg_arg;
+	mail_search_register_fallback_t *fallback;
 
-static struct mail_search_arg *
-search_arg_new(pool_t pool, enum mail_search_arg_type type)
-{
-	struct mail_search_arg *arg;
-
-	arg = p_new(pool, struct mail_search_arg, 1);
-	arg->type = type;
-
-	return arg;
-}
-
-static bool
-arg_get_next(struct search_build_data *data, const struct imap_arg **args,
-	     const char **value_r)
-{
-	if (IMAP_ARG_IS_EOL(*args)) {
-		data->error = "Missing parameter for argument";
-		return FALSE;
-	}
-	if (!imap_arg_get_astring(*args, value_r)) {
-		data->error = "Invalid parameter for argument";
-		return FALSE;
+	if (IMAP_ARG_IS_EOL(*imap_args)) {
+		ctx->error = "Missing argument";
+		return NULL;
 	}
 
-	*args += 1;
-	return TRUE;
-}
-
-#define ARG_NEW_SINGLE(type) \
-	arg_new_single(data, next_sarg, type)
-static bool
-arg_new_single(struct search_build_data *data,
-	       struct mail_search_arg **next_sarg,
-	       enum mail_search_arg_type type)
-{
-	*next_sarg = search_arg_new(data->pool, type);
-	return TRUE;
-}
-
-#define ARG_NEW_STR(type) \
-	arg_new_str(data, args, next_sarg, type)
-static bool
-arg_new_str(struct search_build_data *data,
-	    const struct imap_arg **args, struct mail_search_arg **next_sarg,
-	    enum mail_search_arg_type type)
-{
-	struct mail_search_arg *sarg;
-	const char *value;
-
-	*next_sarg = sarg = search_arg_new(data->pool, type);
-	if (!arg_get_next(data, args, &value))
-		return FALSE;
-	sarg->value.str = p_strdup(data->pool, value);
-	return TRUE;
-}
-
-#define ARG_NEW_FLAGS(flags) \
-	arg_new_flags(data, next_sarg, flags)
-static bool
-arg_new_flags(struct search_build_data *data,
-	      struct mail_search_arg **next_sarg, enum mail_flags flags)
-{
-	struct mail_search_arg *sarg;
-
-	*next_sarg = sarg = search_arg_new(data->pool, SEARCH_FLAGS);
-	sarg->value.flags = flags;
-	return TRUE;
-}
-
-#define ARG_NEW_SIZE(type) \
-	arg_new_size(data, args, next_sarg, type)
-static bool
-arg_new_size(struct search_build_data *data,
-	     const struct imap_arg **args, struct mail_search_arg **next_sarg,
-	     enum mail_search_arg_type type)
-{
-	struct mail_search_arg *sarg;
-	const char *value;
-
-	*next_sarg = sarg = search_arg_new(data->pool, type);
-	if (!arg_get_next(data, args, &value))
-		return FALSE;
-
-	if (str_to_uoff(value, &sarg->value.size) < 0) {
-		data->error = "Invalid search size parameter";
-		return FALSE;
-	}
-	return TRUE;
-}
-
-#define ARG_NEW_DATE(type, date_type) \
-	arg_new_date(data, args, next_sarg, type, date_type)
-static bool
-arg_new_date(struct search_build_data *data,
-	     const struct imap_arg **args, struct mail_search_arg **next_sarg,
-	     enum mail_search_arg_type type,
-	     enum mail_search_date_type date_type)
-{
-	struct mail_search_arg *sarg;
-	const char *value;
-
-	*next_sarg = sarg = search_arg_new(data->pool, type);
-	if (!arg_get_next(data, args, &value))
-		return FALSE;
-	if (!imap_parse_date(value, &sarg->value.time)) {
-		data->error = "Invalid search date parameter";
-		return FALSE;
-	}
-	sarg->value.date_type = date_type;
-	return TRUE;
-}
-
-#define ARG_NEW_INTERVAL(type) \
-	arg_new_interval(data, args, next_sarg, type)
-static bool
-arg_new_interval(struct search_build_data *data,
-		 const struct imap_arg **args,
-		 struct mail_search_arg **next_sarg,
-		 enum mail_search_arg_type type)
-{
-	struct mail_search_arg *sarg;
-	const char *value;
-	uint32_t interval;
-
-	*next_sarg = sarg = search_arg_new(data->pool, type);
-	if (!arg_get_next(data, args, &value))
-		return FALSE;
-
-	if (str_to_uint32(value, &interval) < 0 || interval == 0) {
-		data->error = "Invalid search interval parameter";
-		return FALSE;
-	}
-	sarg->value.search_flags = MAIL_SEARCH_ARG_FLAG_USE_TZ;
-	sarg->value.time = ioloop_time - interval;
-	return TRUE;
-}
-
-#define ARG_NEW_HEADER(type, hdr_name) \
-	arg_new_header(data, args, next_sarg, type, hdr_name)
-static bool
-arg_new_header(struct search_build_data *data,
-	       const struct imap_arg **args, struct mail_search_arg **next_sarg,
-	       enum mail_search_arg_type type, const char *hdr_name)
-{
-	struct mail_search_arg *sarg;
-	const char *value;
-
-	*next_sarg = sarg = search_arg_new(data->pool, type);
-	if (!arg_get_next(data, args, &value))
-		return FALSE;
-
-	sarg->hdr_field_name = p_strdup(data->pool, hdr_name);
-	sarg->value.str = p_strdup(data->pool, value);
-	return TRUE;
-}
-
-static bool
-arg_modseq_set_name(struct search_build_data *data,
-		    struct mail_search_arg *sarg, const char *name)
-{
-	name = t_str_lcase(name);
-	if (strncmp(name, "/flags/", 7) != 0) {
-		data->error = "Invalid MODSEQ entry";
-		return FALSE;
-	}
-	name += 7;
-
-	if (*name == '\\') {
-		/* system flag */
-		name++;
-		if (strcmp(name, "answered") == 0)
-			sarg->value.flags = MAIL_ANSWERED;
-		else if (strcmp(name, "flagged") == 0)
-			sarg->value.flags = MAIL_FLAGGED;
-		else if (strcmp(name, "deleted") == 0)
-			sarg->value.flags = MAIL_DELETED;
-		else if (strcmp(name, "seen") == 0)
-			sarg->value.flags = MAIL_SEEN;
-		else if (strcmp(name, "draft") == 0)
-			sarg->value.flags = MAIL_DRAFT;
-		else {
-			data->error = "Invalid MODSEQ system flag";
-			return FALSE;
-		}
-		return TRUE;
-	}
-	sarg->value.str = p_strdup(data->pool, name);
-	return TRUE;
-}
-
-static bool
-arg_modseq_set_type(struct search_build_data *data,
-		    struct mail_search_modseq *modseq, const char *name)
-{
-	if (strcasecmp(name, "all") == 0)
-		modseq->type = MAIL_SEARCH_MODSEQ_TYPE_ANY;
-	else if (strcasecmp(name, "priv") == 0)
-		modseq->type = MAIL_SEARCH_MODSEQ_TYPE_PRIVATE;
-	else if (strcasecmp(name, "shared") == 0)
-		modseq->type = MAIL_SEARCH_MODSEQ_TYPE_SHARED;
-	else {
-		data->error = "Invalid MODSEQ type";
-		return FALSE;
-	}
-	return TRUE;
-}
-
-#define ARG_NEW_MODSEQ() \
-	arg_new_modseq(data, args, next_sarg)
-static bool
-arg_new_modseq(struct search_build_data *data,
-	       const struct imap_arg **args, struct mail_search_arg **next_sarg)
-{
-	struct mail_search_arg *sarg;
-	const char *value;
-
-	*next_sarg = sarg = search_arg_new(data->pool, SEARCH_MODSEQ);
-	if (!arg_get_next(data, args, &value))
-		return FALSE;
-
-	sarg->value.modseq = p_new(data->pool, struct mail_search_modseq, 1);
-	if ((*args)[-1].type == IMAP_ARG_STRING) {
-		/* <name> <type> */
-		if (!arg_modseq_set_name(data, sarg, value))
-			return FALSE;
-
-		if (!arg_get_next(data, args, &value))
-			return FALSE;
-		if (!arg_modseq_set_type(data, sarg->value.modseq, value))
-			return FALSE;
-
-		if (!arg_get_next(data, args, &value))
-			return FALSE;
-	}
-	if (str_to_uint64(value, &sarg->value.modseq->modseq) < 0) {
-		data->error = "Invalid MODSEQ value";
-		return FALSE;
-	}
-	return TRUE;
-}
-
-static bool search_arg_build(struct search_build_data *data,
-			     const struct imap_arg **args,
-			     struct mail_search_arg **next_sarg)
-{


More information about the dovecot-cvs mailing list