dovecot-1.1: SEARCH SUBJECT now changes LWSP to spaces to match ...

dovecot at dovecot.org dovecot at dovecot.org
Thu Feb 21 22:51:11 EET 2008


details:   http://hg.dovecot.org/dovecot-1.1/rev/346d4a44c2f4
changeset: 7284:346d4a44c2f4
user:      Timo Sirainen <tss at iki.fi>
date:      Thu Feb 21 22:52:38 2008 +0200
description:
SEARCH SUBJECT now changes LWSP to spaces to match ENVELOPE's subject field.

diffstat:

4 files changed, 50 insertions(+), 22 deletions(-)
src/imap/imap-search.c               |    2 -
src/lib-storage/index/index-search.c |   68 +++++++++++++++++++++++-----------
src/lib-storage/mail-search.c        |    1 
src/lib-storage/mail-search.h        |    1 

diffs (140 lines):

diff -r f70c4d501251 -r 346d4a44c2f4 src/imap/imap-search.c
--- a/src/imap/imap-search.c	Thu Feb 21 22:44:19 2008 +0200
+++ b/src/imap/imap-search.c	Thu Feb 21 22:52:38 2008 +0200
@@ -408,7 +408,7 @@ static bool search_arg_build(struct sear
 			return ARG_NEW_FLAGS(MAIL_SEEN);
 		else if (strcmp(str, "SUBJECT") == 0) {
 			/* <string> */
-			return ARG_NEW_HEADER(SEARCH_HEADER, str);
+			return ARG_NEW_HEADER(SEARCH_HEADER_COMPRESS_LWSP, str);
 		} else if (strcmp(str, "SENTBEFORE") == 0) {
 			/* <date> */
 			return ARG_NEW_DATE(SEARCH_SENTBEFORE);
diff -r f70c4d501251 -r 346d4a44c2f4 src/lib-storage/index/index-search.c
--- a/src/lib-storage/index/index-search.c	Thu Feb 21 22:44:19 2008 +0200
+++ b/src/lib-storage/index/index-search.c	Thu Feb 21 22:52:38 2008 +0200
@@ -328,6 +328,25 @@ msg_search_arg_context(struct index_sear
 	return NULL;
 }
 
+static void compress_lwsp(string_t *dest, const unsigned char *src,
+			  unsigned int src_len)
+{
+	unsigned int i;
+	bool prev_lwsp = TRUE;
+
+	for (i = 0; i < src_len; i++) {
+		if (IS_LWSP(src[i])) {
+			if (!prev_lwsp) {
+				prev_lwsp = TRUE;
+				str_append_c(dest, ' ');
+			}
+		} else {
+			prev_lwsp = FALSE;
+			str_append_c(dest, src[i]);
+		}
+	}
+}
+
 static void search_header_arg(struct mail_search_arg *arg,
 			      struct search_header_context *ctx)
 {
@@ -335,7 +354,6 @@ static void search_header_arg(struct mai
 	struct message_block block;
 	struct message_header_line hdr;
 	int ret;
-	bool match;
 
 	/* first check that the field name matches to argument. */
 	switch (arg->type) {
@@ -357,6 +375,7 @@ static void search_header_arg(struct mai
 
 	case SEARCH_HEADER:
 	case SEARCH_HEADER_ADDRESS:
+	case SEARCH_HEADER_COMPRESS_LWSP:
 		ctx->custom_header = TRUE;
 
 		if (strcasecmp(ctx->hdr->name, arg->hdr_field_name) != 0)
@@ -388,13 +407,18 @@ static void search_header_arg(struct mai
 
 	msg_search_ctx = msg_search_arg_context(ctx->index_context, arg);
 	if (msg_search_ctx == NULL)
-		match = FALSE;
-	else if (arg->type == SEARCH_HEADER_ADDRESS) {
-		/* we have to match against normalized address */
-		T_BEGIN {
-			struct message_address *addr;
-			string_t *str;
-
+		return;
+
+	T_BEGIN {
+		struct message_address *addr;
+		string_t *str;
+
+		switch (arg->type) {
+		case SEARCH_HEADER:
+			/* simple match */
+			break;
+		case SEARCH_HEADER_ADDRESS:
+			/* we have to match against normalized address */
 			addr = message_address_parse(pool_datastack_create(),
 						     ctx->hdr->full_value,
 						     ctx->hdr->full_value_len,
@@ -403,19 +427,21 @@ static void search_header_arg(struct mai
 			message_address_write(str, addr);
 			hdr.value = hdr.full_value = str_data(str);
 			hdr.value_len = hdr.full_value_len = str_len(str);
-			match = message_search_more(msg_search_ctx, &block);
-		} T_END;
-	} else {
-		match = message_search_more(msg_search_ctx, &block);
-	}
-
-	if (match ||
-	    (arg->type != SEARCH_HEADER &&
-	     arg->type != SEARCH_HEADER_ADDRESS)) {
-		/* set only when we definitely know if it's a match */
-		ret = match ? 1 : 0;
-		ARG_SET_RESULT(arg, ret);
-	}
+			break;
+		case SEARCH_HEADER_COMPRESS_LWSP:
+			/* convert LWSP to single spaces */
+			str = t_str_new(hdr.full_value_len);
+			compress_lwsp(str, hdr.full_value, hdr.full_value_len);
+			hdr.value = hdr.full_value = str_data(str);
+			hdr.value_len = hdr.full_value_len = str_len(str);
+			break;
+		default:
+			i_unreached();
+		}
+		ret = message_search_more(msg_search_ctx, &block) ? 1 : 0;
+	} T_END;
+
+	ARG_SET_RESULT(arg, ret);
 }
 
 static void search_header_unmatch(struct mail_search_arg *arg,
diff -r f70c4d501251 -r 346d4a44c2f4 src/lib-storage/mail-search.c
--- a/src/lib-storage/mail-search.c	Thu Feb 21 22:44:19 2008 +0200
+++ b/src/lib-storage/mail-search.c	Thu Feb 21 22:52:38 2008 +0200
@@ -139,6 +139,7 @@ search_arg_analyze(struct mail_search_ar
 		break;
 	case SEARCH_HEADER:
 	case SEARCH_HEADER_ADDRESS:
+	case SEARCH_HEADER_COMPRESS_LWSP:
 		buffer_append(headers, &arg->hdr_field_name,
 			      sizeof(const char *));
 		break;
diff -r f70c4d501251 -r 346d4a44c2f4 src/lib-storage/mail-search.h
--- a/src/lib-storage/mail-search.h	Thu Feb 21 22:44:19 2008 +0200
+++ b/src/lib-storage/mail-search.h	Thu Feb 21 22:52:38 2008 +0200
@@ -30,6 +30,7 @@ enum mail_search_arg_type {
 	/* headers */
 	SEARCH_HEADER,
 	SEARCH_HEADER_ADDRESS,
+	SEARCH_HEADER_COMPRESS_LWSP,
 
 	/* body */
 	SEARCH_BODY,


More information about the dovecot-cvs mailing list