changeset 7284:346d4a44c2f4 HEAD

SEARCH SUBJECT now changes LWSP to spaces to match ENVELOPE's subject field.
author Timo Sirainen <tss@iki.fi>
date Thu, 21 Feb 2008 22:52:38 +0200
parents f70c4d501251
children 958e377fc1dc
files src/imap/imap-search.c src/lib-storage/index/index-search.c src/lib-storage/mail-search.c src/lib-storage/mail-search.h
diffstat 4 files changed, 48 insertions(+), 20 deletions(-) [+]
line wrap: on
line diff
--- 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 @@
 			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);
--- 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 @@
 	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 @@
 	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 @@
 
 	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 @@
 
 	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 @@
 			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);
-	}
+			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;
 
-	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);
-	}
+	ARG_SET_RESULT(arg, ret);
 }
 
 static void search_header_unmatch(struct mail_search_arg *arg,
--- 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 @@
 		break;
 	case SEARCH_HEADER:
 	case SEARCH_HEADER_ADDRESS:
+	case SEARCH_HEADER_COMPRESS_LWSP:
 		buffer_append(headers, &arg->hdr_field_name,
 			      sizeof(const char *));
 		break;
--- 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 @@
 	/* headers */
 	SEARCH_HEADER,
 	SEARCH_HEADER_ADDRESS,
+	SEARCH_HEADER_COMPRESS_LWSP,
 
 	/* body */
 	SEARCH_BODY,