dovecot: Replaced SEARCH_<flag> with a generic SEARCH_FLAGS. Use...

dovecot at dovecot.org dovecot at dovecot.org
Sat Dec 8 18:34:26 EET 2007


details:   http://hg.dovecot.org/dovecot/rev/659e4a606aae
changeset: 6962:659e4a606aae
user:      Timo Sirainen <tss at iki.fi>
date:      Sat Dec 08 18:26:42 2007 +0200
description:
Replaced SEARCH_<flag> with a generic SEARCH_FLAGS. Use value.size for
SEARCH_LARGER and SEARCH_SMALLER and give an error if it's not a valid
number.

diffstat:

4 files changed, 185 insertions(+), 138 deletions(-)
src/imap/imap-expunge.c              |    3 
src/imap/imap-search.c               |  231 ++++++++++++++++++++++------------
src/lib-storage/index/index-search.c |   78 +++--------
src/lib-storage/mail-search.h        |   11 -

diffs (truncated from 594 to 300 lines):

diff -r 16f761cdc910 -r 659e4a606aae src/imap/imap-expunge.c
--- a/src/imap/imap-expunge.c	Sat Dec 08 17:47:48 2007 +0200
+++ b/src/imap/imap-expunge.c	Sat Dec 08 18:26:42 2007 +0200
@@ -19,7 +19,8 @@ bool imap_expunge(struct mailbox *box, s
 	}
 
 	memset(&search_arg, 0, sizeof(search_arg));
-	search_arg.type = SEARCH_DELETED;
+	search_arg.type = SEARCH_FLAGS;
+	search_arg.value.flags = MAIL_DELETED;
 	search_arg.next = next_search_arg;
 
 	t = mailbox_transaction_begin(box, 0);
diff -r 16f761cdc910 -r 659e4a606aae src/imap/imap-search.c
--- a/src/imap/imap-search.c	Sat Dec 08 17:47:48 2007 +0200
+++ b/src/imap/imap-search.c	Sat Dec 08 18:26:42 2007 +0200
@@ -8,6 +8,8 @@
 #include "imap-parser.h"
 #include "imap-messageset.h"
 
+#include <stdlib.h>
+
 struct search_build_data {
 	pool_t pool;
         struct mailbox *box;
@@ -63,58 +65,125 @@ search_arg_new(pool_t pool, enum mail_se
 	return arg;
 }
 
-#define ARG_NEW(type) \
-	arg_new(data, args, next_sarg, type, TRUE, NULL)
-
-#define ARG_NEW_FLAG(type) \
-	arg_new(data, args, next_sarg, type, FALSE, NULL)
-
-#define ARG_NEW_HEADER(type, hdr_name) \
-	arg_new(data, args, next_sarg, type, TRUE, hdr_name)
-
-static bool arg_new(struct search_build_data *data,
-		    const struct imap_arg **args,
-		    struct mail_search_arg **next_sarg,
-		    enum mail_search_arg_type type, bool have_value,
-		    const char *hdr_name)
-{
-	struct mail_search_arg *sarg;
-
-	*next_sarg = sarg = search_arg_new(data->pool, type);
-	if (!have_value)
-		return TRUE;
-
+static bool
+arg_get_next(struct search_build_data *data, const struct imap_arg **args,
+	     const char **value_r)
+{
 	if ((*args)->type == IMAP_ARG_EOL) {
 		data->error = "Missing parameter for argument";
 		return FALSE;
 	}
-
 	if ((*args)->type != IMAP_ARG_ATOM &&
 	    (*args)->type != IMAP_ARG_STRING) {
 		data->error = "Invalid parameter for argument";
 		return FALSE;
 	}
 
-	switch (type) {
-	case SEARCH_BEFORE:
-	case SEARCH_ON:
-	case SEARCH_SINCE:
-	case SEARCH_SENTBEFORE:
-	case SEARCH_SENTON:
-	case SEARCH_SENTSINCE:
-		if (!imap_parse_date(IMAP_ARG_STR(*args), &sarg->value.time)) {
-			data->error = "Invalid search date parameter";
-			return FALSE;
-		}
-	default:
-		sarg->value.str = p_strdup(data->pool, IMAP_ARG_STR(*args));
-		break;
-	}
+	*value_r = IMAP_ARG_STR(*args);
 	*args += 1;
-
-	if (hdr_name != NULL)
-                sarg->hdr_field_name = p_strdup(data->pool, hdr_name);
-
+	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;
+	char *p;
+
+	*next_sarg = sarg = search_arg_new(data->pool, type);
+	if (!arg_get_next(data, args, &value))
+		return FALSE;
+
+	sarg->value.size = strtoull(value, &p, 10);
+	if (*p != '\0') {
+		data->error = "Invalid search size parameter";
+		return FALSE;
+	}
+	return TRUE;
+}
+
+#define ARG_NEW_DATE(type) \
+	arg_new_date(data, args, next_sarg, 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)
+{
+	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;
+	}
+	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;
 }
 
@@ -171,9 +240,9 @@ static bool search_arg_build(struct sear
 	switch (*str) {
 	case 'A':
 		if (strcmp(str, "ANSWERED") == 0)
-			return ARG_NEW_FLAG(SEARCH_ANSWERED);
+			return ARG_NEW_FLAGS(MAIL_ANSWERED);
 		else if (strcmp(str, "ALL") == 0)
-			return ARG_NEW_FLAG(SEARCH_ALL);
+			return ARG_NEW_SINGLE(SEARCH_ALL);
 		break;
 	case 'B':
 		if (strcmp(str, "BODY") == 0) {
@@ -181,12 +250,12 @@ static bool search_arg_build(struct sear
 			if (IMAP_ARG_TYPE_IS_STRING((*args)->type) &&
 			    *IMAP_ARG_STR(*args) == '\0') {
 				*args += 1;
-				return ARG_NEW_FLAG(SEARCH_ALL);
-			}
-			return ARG_NEW(SEARCH_BODY);
+				return ARG_NEW_SINGLE(SEARCH_ALL);
+			}
+			return ARG_NEW_STR(SEARCH_BODY);
 		} else if (strcmp(str, "BEFORE") == 0) {
 			/* <date> */
-			return ARG_NEW(SEARCH_BEFORE);
+			return ARG_NEW_DATE(SEARCH_BEFORE);
 		} else if (strcmp(str, "BCC") == 0) {
 			/* <string> */
 			return ARG_NEW_HEADER(SEARCH_HEADER_ADDRESS, str);
@@ -200,13 +269,13 @@ static bool search_arg_build(struct sear
 		break;
 	case 'D':
 		if (strcmp(str, "DELETED") == 0)
-			return ARG_NEW_FLAG(SEARCH_DELETED);
+			return ARG_NEW_FLAGS(MAIL_DELETED);
 		else if (strcmp(str, "DRAFT") == 0)
-			return ARG_NEW_FLAG(SEARCH_DRAFT);
+			return ARG_NEW_FLAGS(MAIL_DRAFT);
 		break;
 	case 'F':
 		if (strcmp(str, "FLAGGED") == 0)
-			return ARG_NEW_FLAG(SEARCH_FLAGGED);
+			return ARG_NEW_FLAGS(MAIL_FLAGGED);
 		else if (strcmp(str, "FROM") == 0) {
 			/* <string> */
 			return ARG_NEW_HEADER(SEARCH_HEADER_ADDRESS, str);
@@ -235,13 +304,13 @@ static bool search_arg_build(struct sear
 	case 'K':
 		if (strcmp(str, "KEYWORD") == 0) {
 			/* <flag> */
-			return ARG_NEW(SEARCH_KEYWORD);
+			return ARG_NEW_STR(SEARCH_KEYWORD);
 		}
 		break;
 	case 'L':
 		if (strcmp(str, "LARGER") == 0) {
 			/* <n> */
-			return ARG_NEW(SEARCH_LARGER);
+			return ARG_NEW_SIZE(SEARCH_LARGER);
 		}
 		break;
 	case 'N':
@@ -255,9 +324,11 @@ static bool search_arg_build(struct sear
 			*next_sarg = search_arg_new(data->pool, SEARCH_SUB);
 
 			subargs = &(*next_sarg)->value.subargs;
-			*subargs = search_arg_new(data->pool, SEARCH_RECENT);
+			*subargs = search_arg_new(data->pool, SEARCH_FLAGS);
+			(*subargs)->value.flags = MAIL_RECENT;
 			(*subargs)->next = search_arg_new(data->pool,
-							  SEARCH_SEEN);
+							  SEARCH_FLAGS);
+			(*subargs)->next->value.flags = MAIL_SEEN;
 			(*subargs)->next->not = TRUE;
 			return TRUE;
 		}
@@ -292,10 +363,10 @@ static bool search_arg_build(struct sear
 			return TRUE;
 		} if (strcmp(str, "ON") == 0) {
 			/* <date> */
-			return ARG_NEW(SEARCH_ON);
+			return ARG_NEW_DATE(SEARCH_ON);
 		} if (strcmp(str, "OLD") == 0) {
 			/* OLD == NOT RECENT */
-			if (!ARG_NEW_FLAG(SEARCH_RECENT))
+			if (!ARG_NEW_FLAGS(MAIL_RECENT))
 				return FALSE;
 
 			(*next_sarg)->not = TRUE;
@@ -304,29 +375,29 @@ static bool search_arg_build(struct sear
 		break;
 	case 'R':
 		if (strcmp(str, "RECENT") == 0)
-			return ARG_NEW_FLAG(SEARCH_RECENT);
+			return ARG_NEW_FLAGS(MAIL_RECENT);
 		break;
 	case 'S':
 		if (strcmp(str, "SEEN") == 0)
-			return ARG_NEW_FLAG(SEARCH_SEEN);
+			return ARG_NEW_FLAGS(MAIL_SEEN);
 		else if (strcmp(str, "SUBJECT") == 0) {
 			/* <string> */
 			return ARG_NEW_HEADER(SEARCH_HEADER, str);
 		} else if (strcmp(str, "SENTBEFORE") == 0) {
 			/* <date> */
-			return ARG_NEW(SEARCH_SENTBEFORE);
+			return ARG_NEW_DATE(SEARCH_SENTBEFORE);
 		} else if (strcmp(str, "SENTON") == 0) {


More information about the dovecot-cvs mailing list