]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
doveadm fetch/search/etc: Handle "NOT" correctly in search query.
authorTimo Sirainen <tss@iki.fi>
Fri, 30 Apr 2010 13:15:27 +0000 (16:15 +0300)
committerTimo Sirainen <tss@iki.fi>
Fri, 30 Apr 2010 13:15:27 +0000 (16:15 +0300)
--HG--
branch : HEAD

src/doveadm/doveadm-mail-fetch.c
src/doveadm/doveadm-mail-list-iter.c

index 6bb168ba580fc946d614857335e502919f9a340e..ae179efeaead3c2f397865f3591519ba490803ba 100644 (file)
@@ -338,12 +338,14 @@ static bool search_args_have_unique_fetch(struct mail_search_args *args)
                switch (arg->type) {
                case SEARCH_MAILBOX:
                case SEARCH_MAILBOX_GUID:
-                       have_mailbox = TRUE;
+                       if (!arg->not)
+                               have_mailbox = TRUE;
                        break;
                case SEARCH_SEQSET:
                case SEARCH_UIDSET:
                        seqset = array_get(&arg->value.seqset, &count);
-                       if (count == 1 && seqset->seq1 == seqset->seq2)
+                       if (count == 1 && seqset->seq1 == seqset->seq2 &&
+                           !arg->not)
                                have_msg = TRUE;
                        break;
                default:
index 6f3e7057e7bff771647da7b78914cdd3fd3a1b1d..3ade240b5d77f5a6245731e627315a01d6c7c2f6 100644 (file)
@@ -15,7 +15,7 @@ struct doveadm_mail_list_iter {
        struct mailbox_list_iterate_context *iter;
 };
 
-static void
+static int
 search_args_get_mailbox_patterns(const struct mail_search_arg *args,
                                 ARRAY_TYPE(const_string) *patterns)
 {
@@ -28,18 +28,24 @@ search_args_get_mailbox_patterns(const struct mail_search_arg *args,
                case SEARCH_INTHREAD:
                        subargs = args->value.subargs;
                        for (; subargs != NULL; subargs = subargs->next) {
-                               search_args_get_mailbox_patterns(subargs,
-                                                                patterns);
+                               if (!search_args_get_mailbox_patterns(subargs,
+                                                                     patterns))
+                                       return 0;
                        }
                        break;
                case SEARCH_MAILBOX:
                case SEARCH_MAILBOX_GLOB:
+                       if (args->not) {
+                               array_clear(patterns);
+                               return 0;
+                       }
                        array_append(patterns, &args->value.str, 1);
                        break;
                default:
                        break;
                }
        }
+       return 1;
 }
 
 struct doveadm_mail_list_iter *