From 00120655cf38b7981ea65abb73330e338bc78f5b Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Fri, 30 Apr 2010 15:32:50 +0300 Subject: [PATCH] lib-storage: Added support for searching with mailbox GUID. --HG-- branch : HEAD --- src/lib-storage/index/index-search.c | 8 ++++++++ src/lib-storage/mail-search-register-human.c | 9 ++++++++- src/lib-storage/mail-search.c | 2 ++ src/lib-storage/mail-search.h | 1 + 4 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/lib-storage/index/index-search.c b/src/lib-storage/index/index-search.c index 7f90b4c038..00792f4369 100644 --- a/src/lib-storage/index/index-search.c +++ b/src/lib-storage/index/index-search.c @@ -218,6 +218,7 @@ static int search_arg_match_cached(struct index_search_context *ctx, time_t date; int tz_offset; bool have_tz_offset; + uint8_t guid[MAIL_GUID_128_SIZE]; switch (arg->type) { /* internal dates */ @@ -286,6 +287,12 @@ static int search_arg_match_cached(struct index_search_context *ctx, if (strcasecmp(str, "INBOX") == 0) return strcasecmp(arg->value.str, "INBOX") == 0; return strcmp(str, arg->value.str) == 0; + case SEARCH_MAILBOX_GUID: + if (mailbox_get_guid(ctx->mail->box, guid) < 0) + return -1; + + return strcmp(mail_guid_128_to_string(guid), + arg->value.str) == 0; case SEARCH_MAILBOX_GLOB: if (mail_get_special(ctx->mail, MAIL_FETCH_MAILBOX_NAME, &str) < 0) @@ -1182,6 +1189,7 @@ static bool search_arg_is_static(struct mail_search_arg *arg) case SEARCH_TEXT_FAST: case SEARCH_GUID: case SEARCH_MAILBOX: + case SEARCH_MAILBOX_GUID: case SEARCH_MAILBOX_GLOB: return TRUE; } diff --git a/src/lib-storage/mail-search-register-human.c b/src/lib-storage/mail-search-register-human.c index ffcce6ea9c..077e464689 100644 --- a/src/lib-storage/mail-search-register-human.c +++ b/src/lib-storage/mail-search-register-human.c @@ -131,6 +131,12 @@ human_search_mailbox(struct mail_search_build_context *ctx) return mail_search_build_str(ctx, SEARCH_MAILBOX_GLOB); } +static struct mail_search_arg * +human_search_mailbox_guid(struct mail_search_build_context *ctx) +{ + return mail_search_build_str(ctx, SEARCH_MAILBOX_GUID); +} + static const struct mail_search_register_arg human_register_args[] = { { "OR", human_search_or }, @@ -154,7 +160,8 @@ static const struct mail_search_register_arg human_register_args[] = { /* Other Dovecot extensions: */ { "GUID", human_search_guid }, - { "MAILBOX", human_search_mailbox } + { "MAILBOX", human_search_mailbox }, + { "MAILBOX-GUID", human_search_mailbox_guid } }; struct mail_search_register * diff --git a/src/lib-storage/mail-search.c b/src/lib-storage/mail-search.c index ed3bf2df90..bb5de76b45 100644 --- a/src/lib-storage/mail-search.c +++ b/src/lib-storage/mail-search.c @@ -312,6 +312,7 @@ mail_search_arg_dup_one(pool_t pool, const struct mail_search_arg *arg) case SEARCH_TEXT_FAST: case SEARCH_GUID: case SEARCH_MAILBOX: + case SEARCH_MAILBOX_GUID: case SEARCH_MAILBOX_GLOB: new_arg->value.str = p_strdup(pool, arg->value.str); break; @@ -845,6 +846,7 @@ static bool mail_search_arg_one_equals(const struct mail_search_arg *arg1, case SEARCH_TEXT_FAST: case SEARCH_GUID: case SEARCH_MAILBOX: + case SEARCH_MAILBOX_GUID: case SEARCH_MAILBOX_GLOB: /* don't bother doing case-insensitive comparison. it must not be done for guid/mailbox, and for others we should support diff --git a/src/lib-storage/mail-search.h b/src/lib-storage/mail-search.h index 976798424d..4e5021dee6 100644 --- a/src/lib-storage/mail-search.h +++ b/src/lib-storage/mail-search.h @@ -43,6 +43,7 @@ enum mail_search_arg_type { SEARCH_INTHREAD, SEARCH_GUID, SEARCH_MAILBOX, + SEARCH_MAILBOX_GUID, SEARCH_MAILBOX_GLOB }; -- 2.47.3