dovecot-1.2: Added mail_search_args_equal().
dovecot at dovecot.org
dovecot at dovecot.org
Mon Sep 1 15:17:14 EEST 2008
details: http://hg.dovecot.org/dovecot-1.2/rev/ea5f84256c3f
changeset: 8144:ea5f84256c3f
user: Timo Sirainen <tss at iki.fi>
date: Mon Sep 01 15:10:59 2008 +0300
description:
Added mail_search_args_equal().
diffstat:
2 files changed, 104 insertions(+)
src/lib-storage/mail-search.c | 99 +++++++++++++++++++++++++++++++++++++++++
src/lib-storage/mail-search.h | 5 ++
diffs (128 lines):
diff -r 29ed66459a74 -r ea5f84256c3f src/lib-storage/mail-search.c
--- a/src/lib-storage/mail-search.c Mon Sep 01 15:08:43 2008 +0300
+++ b/src/lib-storage/mail-search.c Mon Sep 01 15:10:59 2008 +0300
@@ -6,6 +6,9 @@
#include "mail-index.h"
#include "mail-storage.h"
#include "mail-search.h"
+
+static bool mail_search_arg_equals(const struct mail_search_arg *arg1,
+ const struct mail_search_arg *arg2);
static void
mailbox_uidset_change(struct mail_search_arg *arg, struct mailbox *box,
@@ -615,3 +618,99 @@ void mail_search_args_simplify(struct ma
mail_search_args_simplify_sub(args->args, TRUE);
}
}
+
+static bool mail_search_arg_one_equals(const struct mail_search_arg *arg1,
+ const struct mail_search_arg *arg2)
+{
+ if (arg1->type != arg2->type ||
+ arg1->not != arg2->not)
+ return FALSE;
+
+ switch (arg1->type) {
+ case SEARCH_OR:
+ case SEARCH_SUB:
+ return mail_search_arg_equals(arg1->value.subargs,
+ arg2->value.subargs);
+
+ case SEARCH_ALL:
+ return TRUE;
+ case SEARCH_SEQSET:
+ /* sequences may point to different messages at different times,
+ never assume they match */
+ return FALSE;
+ case SEARCH_UIDSET:
+ return array_cmp(&arg1->value.seqset, &arg2->value.seqset);
+
+ case SEARCH_FLAGS:
+ return arg1->value.flags == arg2->value.flags;
+ case SEARCH_KEYWORDS:
+ return strcasecmp(arg1->value.str, arg2->value.str);
+
+ case SEARCH_BEFORE:
+ case SEARCH_ON:
+ case SEARCH_SINCE:
+ case SEARCH_SENTBEFORE:
+ case SEARCH_SENTON:
+ case SEARCH_SENTSINCE:
+ return arg1->value.time == arg2->value.time;
+
+ case SEARCH_SMALLER:
+ case SEARCH_LARGER:
+ return arg1->value.size == arg2->value.size;
+
+ case SEARCH_HEADER:
+ case SEARCH_HEADER_ADDRESS:
+ case SEARCH_HEADER_COMPRESS_LWSP:
+ if (strcasecmp(arg1->hdr_field_name, arg2->hdr_field_name) != 0)
+ return FALSE;
+ /* fall through */
+ case SEARCH_BODY:
+ case SEARCH_TEXT:
+ case SEARCH_BODY_FAST:
+ case SEARCH_TEXT_FAST:
+ case SEARCH_GUID:
+ case SEARCH_MAILBOX:
+ /* don't bother doing case-insensitive comparison. it must not
+ be done for guid/mailbox, and for others we should support
+ full i18n case-insensitivity (or the active comparator
+ in future). */
+ return strcmp(arg1->value.str, arg2->value.str);
+
+ case SEARCH_MODSEQ: {
+ const struct mail_search_modseq *m1 = arg1->value.modseq;
+ const struct mail_search_modseq *m2 = arg2->value.modseq;
+
+ return m1->modseq == m2->modseq &&
+ m1->type == m2->type;
+ }
+ case SEARCH_INTHREAD:
+ return mail_search_args_equal(arg1->value.search_args,
+ arg2->value.search_args);
+ }
+ i_unreached();
+ return FALSE;
+}
+
+static bool mail_search_arg_equals(const struct mail_search_arg *arg1,
+ const struct mail_search_arg *arg2)
+{
+ while (arg1 != NULL && arg2 != NULL) {
+ if (!mail_search_arg_one_equals(arg1, arg2))
+ return FALSE;
+ arg1 = arg1->next;
+ arg2 = arg2->next;
+ }
+ return arg1 == NULL && arg2 == NULL;
+}
+
+bool mail_search_args_equal(const struct mail_search_args *args1,
+ const struct mail_search_args *args2)
+{
+ i_assert(args1->simplified == args2->simplified);
+ i_assert(args1->box == args2->box);
+
+ if (null_strcmp(args1->charset, args2->charset) != 0)
+ return FALSE;
+
+ return mail_search_arg_equals(args1->args, args2->args);
+}
diff -r 29ed66459a74 -r ea5f84256c3f src/lib-storage/mail-search.h
--- a/src/lib-storage/mail-search.h Mon Sep 01 15:08:43 2008 +0300
+++ b/src/lib-storage/mail-search.h Mon Sep 01 15:10:59 2008 +0300
@@ -122,6 +122,11 @@ void mail_search_args_deinit(struct mail
void mail_search_args_deinit(struct mail_search_args *args);
/* Convert sequence sets in args to UIDs. */
void mail_search_args_seq2uid(struct mail_search_args *args);
+/* Returns TRUE if the two search arguments are fully compatible.
+ Always returns FALSE if there are seqsets, since they may point to different
+ messages depending on when the search is run. */
+bool mail_search_args_equal(const struct mail_search_args *args1,
+ const struct mail_search_args *args2);
void mail_search_args_ref(struct mail_search_args *args);
void mail_search_args_unref(struct mail_search_args **args);
More information about the dovecot-cvs
mailing list