dovecot-2.2: lib-storage: Fixed searching message flags with pri...
dovecot at dovecot.org
dovecot at dovecot.org
Mon Jul 2 05:14:36 EEST 2012
details: http://hg.dovecot.org/dovecot-2.2/rev/04c89bb18bdd
changeset: 14704:04c89bb18bdd
user: Timo Sirainen <tss at iki.fi>
date: Mon Jul 02 05:14:22 2012 +0300
description:
lib-storage: Fixed searching message flags with private flags index.
diffstat:
src/lib-storage/index/index-search-private.h | 2 +
src/lib-storage/index/index-search.c | 57 +++++++++++++++++++++++----
2 files changed, 49 insertions(+), 10 deletions(-)
diffs (129 lines):
diff -r c0ff628352d5 -r 04c89bb18bdd src/lib-storage/index/index-search-private.h
--- a/src/lib-storage/index/index-search-private.h Mon Jul 02 05:14:02 2012 +0300
+++ b/src/lib-storage/index/index-search-private.h Mon Jul 02 05:14:22 2012 +0300
@@ -10,6 +10,8 @@
struct mail_index_view *view;
struct mailbox *box;
+ uint32_t pvt_uid, pvt_seq;
+
enum mail_fetch_field extra_wanted_fields;
struct mailbox_header_lookup_ctx *extra_wanted_headers;
diff -r c0ff628352d5 -r 04c89bb18bdd src/lib-storage/index/index-search.c
--- a/src/lib-storage/index/index-search.c Mon Jul 02 05:14:02 2012 +0300
+++ b/src/lib-storage/index/index-search.c Mon Jul 02 05:14:22 2012 +0300
@@ -148,12 +148,29 @@
return 1;
}
+static bool
+index_search_get_pvt(struct index_search_context *ctx, uint32_t uid)
+{
+ if (ctx->pvt_uid == uid)
+ return ctx->pvt_seq != 0;
+ ctx->pvt_uid = uid;
+ ctx->pvt_seq = uid;
+
+ if (ctx->box->view_pvt == NULL) {
+ /* no private view (set by view syncing) -> no private flags */
+ return FALSE;
+ }
+
+ return mail_index_lookup_seq(ctx->mail_ctx.transaction->view_pvt,
+ uid, &ctx->pvt_seq);
+}
+
/* Returns >0 = matched, 0 = not matched, -1 = unknown */
static int search_arg_match_index(struct index_search_context *ctx,
struct mail_search_arg *arg,
const struct mail_index_record *rec)
{
- enum mail_flags flags;
+ enum mail_flags flags, pvt_flags_mask;
uint64_t modseq;
int ret;
@@ -168,6 +185,13 @@
if ((arg->value.flags & MAIL_RECENT) != 0 &&
index_mailbox_is_recent(ctx->box, rec->uid))
flags |= MAIL_RECENT;
+ if (index_search_get_pvt(ctx, rec->uid)) {
+ pvt_flags_mask = mailbox_get_private_flags_mask(ctx->box);
+ flags &= ~pvt_flags_mask;
+ rec = mail_index_lookup(ctx->mail_ctx.transaction->view_pvt,
+ ctx->pvt_seq);
+ flags |= rec->flags & pvt_flags_mask;
+ }
return (flags & arg->value.flags) == arg->value.flags;
case SEARCH_KEYWORDS:
T_BEGIN {
@@ -870,9 +894,21 @@
struct mail_search_arg *args,
uint32_t *seq1, uint32_t *seq2)
{
- const struct mail_index_header *hdr;
+ const struct mail_index_header *hdr_seen, *hdr_del, *hdr_pvt;
+ enum mail_flags pvt_flags_mask;
- hdr = mail_index_get_header(ctx->view);
+ hdr_seen = hdr_del = mail_index_get_header(ctx->view);
+
+ if (ctx->box->view_pvt != NULL) {
+ pvt_flags_mask = mailbox_get_private_flags_mask(ctx->box);
+ index_transaction_init_pvt(ctx->mail_ctx.transaction);
+ hdr_pvt = mail_index_get_header(ctx->mail_ctx.transaction->view_pvt);
+ if ((pvt_flags_mask & MAIL_SEEN) != 0)
+ hdr_seen = hdr_pvt;
+ if ((pvt_flags_mask & MAIL_DELETED) != 0)
+ hdr_del = hdr_pvt;
+ }
+
for (; args != NULL; args = args->next) {
if (args->type != SEARCH_FLAGS) {
if (args->type == SEARCH_ALL) {
@@ -883,10 +919,11 @@
}
if ((args->value.flags & MAIL_SEEN) != 0) {
/* SEEN with 0 seen? */
- if (!args->match_not && hdr->seen_messages_count == 0)
+ if (!args->match_not && hdr_seen->seen_messages_count == 0)
return FALSE;
- if (hdr->seen_messages_count == hdr->messages_count) {
+ if (hdr_seen->seen_messages_count ==
+ hdr_seen->messages_count) {
/* UNSEEN with all seen? */
if (args->match_not)
return FALSE;
@@ -896,17 +933,17 @@
} else if (args->match_not) {
/* UNSEEN with lowwater limiting */
search_limit_lowwater(ctx,
- hdr->first_unseen_uid_lowwater, seq1);
+ hdr_seen->first_unseen_uid_lowwater, seq1);
}
}
if ((args->value.flags & MAIL_DELETED) != 0) {
/* DELETED with 0 deleted? */
if (!args->match_not &&
- hdr->deleted_messages_count == 0)
+ hdr_del->deleted_messages_count == 0)
return FALSE;
- if (hdr->deleted_messages_count ==
- hdr->messages_count) {
+ if (hdr_del->deleted_messages_count ==
+ hdr_del->messages_count) {
/* UNDELETED with all deleted? */
if (args->match_not)
return FALSE;
@@ -916,7 +953,7 @@
} else if (!args->match_not) {
/* DELETED with lowwater limiting */
search_limit_lowwater(ctx,
- hdr->first_deleted_uid_lowwater, seq1);
+ hdr_del->first_deleted_uid_lowwater, seq1);
}
}
}
More information about the dovecot-cvs
mailing list