changeset 17949:98b5ccc539b5

lib-storage: Added X-REAL-UID search parameter.
author Timo Sirainen <tss@iki.fi>
date Tue, 14 Oct 2014 09:39:50 -0700
parents c8fd499023ef
children 6dad1f6e8930
files src/lib-storage/index/index-search.c src/lib-storage/mail-search-register-imap.c src/lib-storage/mail-search.c src/lib-storage/mail-search.h
diffstat 4 files changed, 34 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-storage/index/index-search.c	Tue Oct 14 09:36:15 2014 -0700
+++ b/src/lib-storage/index/index-search.c	Tue Oct 14 09:39:50 2014 -0700
@@ -357,6 +357,13 @@
 		if (mail_get_special(ctx->cur_mail, MAIL_FETCH_GUID, &str) < 0)
 			return -1;
 		return strcmp(str, arg->value.str) == 0;
+	case SEARCH_REAL_UID: {
+		struct mail *real_mail;
+
+		if (mail_get_backend_mail(ctx->cur_mail, &real_mail) < 0)
+			return -1;
+		return seq_range_exists(&arg->value.seqset, real_mail->uid);
+	}
 	default:
 		return -1;
 	}
@@ -1347,6 +1354,7 @@
 	case SEARCH_MAILBOX:
 	case SEARCH_MAILBOX_GUID:
 	case SEARCH_MAILBOX_GLOB:
+	case SEARCH_REAL_UID:
 		return TRUE;
 	}
 	return FALSE;
--- a/src/lib-storage/mail-search-register-imap.c	Tue Oct 14 09:36:15 2014 -0700
+++ b/src/lib-storage/mail-search-register-imap.c	Tue Oct 14 09:39:50 2014 -0700
@@ -501,6 +501,25 @@
 	return sarg;
 }
 
+static struct mail_search_arg *
+imap_search_x_real_uid(struct mail_search_build_context *ctx)
+{
+	struct mail_search_arg *sarg;
+
+	/* <message set> */
+	sarg = mail_search_build_str(ctx, SEARCH_REAL_UID);
+	if (sarg == NULL)
+		return NULL;
+
+	p_array_init(&sarg->value.seqset, ctx->pool, 16);
+	if (imap_seq_set_parse(sarg->value.str,
+			       &sarg->value.seqset) < 0) {
+		ctx->_error = "Invalid X-REAL-UID messageset";
+		return NULL;
+	}
+	return sarg;
+}
+
 static const struct mail_search_register_arg imap_register_args[] = {
 	/* argument set operations */
 	{ "NOT", imap_search_not },
@@ -572,7 +591,8 @@
 	/* Other Dovecot extensions: */
 	{ "INTHREAD", imap_search_inthread },
 	{ "X-GUID", imap_search_x_guid },
-	{ "X-MAILBOX", imap_search_x_mailbox }
+	{ "X-MAILBOX", imap_search_x_mailbox },
+	{ "X-REAL-UID", imap_search_x_real_uid }
 };
 
 static struct mail_search_register *mail_search_register_init_imap(void)
--- a/src/lib-storage/mail-search.c	Tue Oct 14 09:36:15 2014 -0700
+++ b/src/lib-storage/mail-search.c	Tue Oct 14 09:39:50 2014 -0700
@@ -283,6 +283,7 @@
 		break;
 	case SEARCH_SEQSET:
 	case SEARCH_UIDSET:
+	case SEARCH_REAL_UID:
 		p_array_init(&new_arg->value.seqset, pool,
 			     array_count(&arg->value.seqset));
 		array_append_array(&new_arg->value.seqset, &arg->value.seqset);
@@ -759,6 +760,8 @@
 		return FALSE;
 	case SEARCH_UIDSET:
 		return array_cmp(&arg1->value.seqset, &arg2->value.seqset);
+	case SEARCH_REAL_UID:
+		return array_cmp(&arg1->value.seqset, &arg2->value.seqset);
 
 	case SEARCH_FLAGS:
 		return arg1->value.flags == arg2->value.flags;
--- a/src/lib-storage/mail-search.h	Tue Oct 14 09:36:15 2014 -0700
+++ b/src/lib-storage/mail-search.h	Tue Oct 14 09:39:50 2014 -0700
@@ -42,7 +42,8 @@
 	SEARCH_GUID,
 	SEARCH_MAILBOX,
 	SEARCH_MAILBOX_GUID,
-	SEARCH_MAILBOX_GLOB
+	SEARCH_MAILBOX_GLOB,
+	SEARCH_REAL_UID
 };
 
 enum mail_search_date_type {