dovecot: Merge SEARCH_FLAGS arguments when possible.

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


details:   http://hg.dovecot.org/dovecot/rev/5fb86ed98860
changeset: 6963:5fb86ed98860
user:      Timo Sirainen <tss at iki.fi>
date:      Sat Dec 08 18:34:23 2007 +0200
description:
Merge SEARCH_FLAGS arguments when possible.

diffstat:

1 file changed, 29 insertions(+), 2 deletions(-)
src/lib-storage/mail-search.c |   31 +++++++++++++++++++++++++++++--

diffs (48 lines):

diff -r 659e4a606aae -r 5fb86ed98860 src/lib-storage/mail-search.c
--- a/src/lib-storage/mail-search.c	Sat Dec 08 18:26:42 2007 +0200
+++ b/src/lib-storage/mail-search.c	Sat Dec 08 18:34:23 2007 +0200
@@ -180,8 +180,10 @@ static void
 static void
 mail_search_args_simplify_sub(struct mail_search_arg *args, bool parent_and)
 {
-	struct mail_search_arg *sub;
-
+	struct mail_search_arg *sub, *prev = NULL;
+	struct mail_search_arg *prev_flags_arg, *prev_not_flags_arg;
+
+	prev_flags_arg = prev_not_flags_arg = NULL;
 	for (; args != NULL;) {
 		if (args->not && (args->type == SEARCH_SUB ||
 				  args->type == SEARCH_OR)) {
@@ -210,6 +212,31 @@ mail_search_args_simplify_sub(struct mai
 			mail_search_args_simplify_sub(args->value.subargs,
 						      args->type == SEARCH_SUB);
 		}
+
+		/* merge all flags arguments */
+		if (args->type == SEARCH_FLAGS && !args->not) {
+			if (prev_flags_arg == NULL)
+				prev_flags_arg = args;
+			else {
+				prev_flags_arg->value.flags |=
+					args->value.flags;
+				prev->next = args->next;
+				args = args->next;
+				continue;
+			}
+		} else if (args->type == SEARCH_FLAGS && args->not) {
+			if (prev_not_flags_arg == NULL)
+				prev_not_flags_arg = args;
+			else {
+				prev_not_flags_arg->value.flags |=
+					args->value.flags;
+				prev->next = args->next;
+				args = args->next;
+				continue;
+			}
+		}
+
+		prev = args;
 		args = args->next;
 	}
 }


More information about the dovecot-cvs mailing list