]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-storage: Added mail_search_args_match_mailbox()
authorTimo Sirainen <tss@iki.fi>
Wed, 28 Apr 2010 19:02:59 +0000 (22:02 +0300)
committerTimo Sirainen <tss@iki.fi>
Wed, 28 Apr 2010 19:02:59 +0000 (22:02 +0300)
--HG--
branch : HEAD

src/lib-storage/mail-search.c
src/lib-storage/mail-search.h

index ab2b2d99f4fcb6739481f5d401e42b1bb813c6f6..ed3bf2df9031a4c2d695c321849c70b70599e153 100644 (file)
@@ -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,
index a7a6960cbcee49bcd8ad4dd762e67d90f5bc3ad4..976798424d119e9c6d208bc90c0161df27537a20 100644 (file)
@@ -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);