From: Timo Sirainen Date: Wed, 28 Apr 2010 19:02:59 +0000 (+0300) Subject: lib-storage: Added mail_search_args_match_mailbox() X-Git-Tag: 2.0.beta5~75 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=e2f6850678a97f0048c962d8f1ce0edd809b7ac6;p=thirdparty%2Fdovecot%2Fcore.git lib-storage: Added mail_search_args_match_mailbox() --HG-- branch : HEAD --- diff --git a/src/lib-storage/mail-search.c b/src/lib-storage/mail-search.c index ab2b2d99f4..ed3bf2df90 100644 --- a/src/lib-storage/mail-search.c +++ b/src/lib-storage/mail-search.c @@ -524,6 +524,65 @@ mail_search_args_analyze(struct mail_search_arg *args, return buffer_get_data(headers, NULL); } +static bool +mail_search_args_match_mailbox_arg(const struct mail_search_arg *arg, + const char *vname, char sep) +{ + const struct mail_search_arg *subarg; + bool ret; + + switch (arg->type) { + case SEARCH_OR: + subarg = arg->value.subargs; + for (; subarg != NULL; subarg = subarg->next) { + if (mail_search_args_match_mailbox_arg(subarg, + vname, sep)) + return TRUE; + } + return FALSE; + case SEARCH_SUB: + case SEARCH_INTHREAD: + subarg = arg->value.subargs; + for (; subarg != NULL; subarg = subarg->next) { + if (!mail_search_args_match_mailbox_arg(subarg, + vname, sep)) + return FALSE; + } + return TRUE; + case SEARCH_MAILBOX: + ret = strcmp(arg->value.str, vname) == 0; + return ret != arg->not; + case SEARCH_MAILBOX_GLOB: { + T_BEGIN { + struct imap_match_glob *glob; + + glob = imap_match_init(pool_datastack_create(), + arg->value.str, TRUE, sep); + ret = imap_match(glob, vname) == IMAP_MATCH_YES; + } T_END; + return ret != arg->not; + } + default: + break; + } + return TRUE; +} + +bool mail_search_args_match_mailbox(struct mail_search_args *args, + const char *vname, char sep) +{ + const struct mail_search_arg *arg; + + if (!args->simplified) + mail_search_args_simplify(args); + + for (arg = args->args; arg != NULL; arg = arg->next) { + if (!mail_search_args_match_mailbox_arg(arg, vname, sep)) + return FALSE; + } + return TRUE; +} + static struct mail_keywords * mail_search_keywords_merge(struct mailbox *box, struct mail_keywords **_kw1, diff --git a/src/lib-storage/mail-search.h b/src/lib-storage/mail-search.h index a7a6960cbc..976798424d 100644 --- a/src/lib-storage/mail-search.h +++ b/src/lib-storage/mail-search.h @@ -168,6 +168,11 @@ const char *const * mail_search_args_analyze(struct mail_search_arg *args, bool *have_headers, bool *have_body); +/* Returns FALSE if search query contains MAILBOX[_GLOB] args such that the + query can never match any messages in the given mailbox. */ +bool mail_search_args_match_mailbox(struct mail_search_args *args, + const char *vname, char sep); + /* Simplify/optimize search arguments. Afterwards all OR/SUB args are guaranteed to have not=FALSE. */ void mail_search_args_simplify(struct mail_search_args *args);