]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-storage: Added X-REAL-UID search parameter.
authorTimo Sirainen <tss@iki.fi>
Tue, 14 Oct 2014 16:39:50 +0000 (09:39 -0700)
committerTimo Sirainen <tss@iki.fi>
Tue, 14 Oct 2014 16:39:50 +0000 (09:39 -0700)
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

index 9510f98a5e178d4fa2aa8ff45a3856e6faea9029..baa51b962c52ead56d3f6fb88679f48f41953be6 100644 (file)
@@ -357,6 +357,13 @@ static int search_arg_match_cached(struct index_search_context *ctx,
                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 @@ static bool search_arg_is_static(struct mail_search_arg *arg)
        case SEARCH_MAILBOX:
        case SEARCH_MAILBOX_GUID:
        case SEARCH_MAILBOX_GLOB:
+       case SEARCH_REAL_UID:
                return TRUE;
        }
        return FALSE;
index 60e6b663f1334be72ebb9f783eb06d34a0292668..231f385f88c7c33098f30ac4b413f55dfa997649 100644 (file)
@@ -501,6 +501,25 @@ imap_search_x_mailbox(struct mail_search_build_context *ctx)
        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 @@ static const struct mail_search_register_arg imap_register_args[] = {
        /* 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)
index a216f6acd45cabf0c58b1d1ec74fc127e55350d2..017ba4d6eb79a9e40e46c4770305ea62140cfb4d 100644 (file)
@@ -283,6 +283,7 @@ mail_search_arg_dup_one(pool_t pool, const struct mail_search_arg *arg)
                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 @@ static bool mail_search_arg_one_equals(const struct mail_search_arg *arg1,
                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;
index 2d2639788ed76a47ca4451bb9d63bafce963fb28..954a98e3a3c0dfb940eda089629d66c95b1384e4 100644 (file)
@@ -42,7 +42,8 @@ enum mail_search_arg_type {
        SEARCH_GUID,
        SEARCH_MAILBOX,
        SEARCH_MAILBOX_GUID,
-       SEARCH_MAILBOX_GLOB
+       SEARCH_MAILBOX_GLOB,
+       SEARCH_REAL_UID
 };
 
 enum mail_search_date_type {