Mercurial > dovecot > original-hg > dovecot-1.2
changeset 7655:ec49260ed4ee HEAD
SEARCH UPDATE: Convert seqsets in saved results to uidsets so that they can
be matched correctly later if messages are expunged.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sat, 07 Jun 2008 01:35:02 +0300 |
parents | 1004a3555a03 |
children | eb0f45d0c9f2 |
files | src/lib-storage/mail-search.c src/lib-storage/mail-search.h src/lib-storage/mailbox-search-result.c |
diffstat | 3 files changed, 42 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-storage/mail-search.c Sat Jun 07 01:34:16 2008 +0300 +++ b/src/lib-storage/mail-search.c Sat Jun 07 01:35:02 2008 +0300 @@ -133,6 +133,45 @@ mail_search_args_deinit_sub(args, args->args); } +static void mail_search_args_seq2uid_sub(struct mail_search_args *args, + struct mail_search_arg *arg, + ARRAY_TYPE(seq_range) *uids) +{ + for (; arg != NULL; arg = arg->next) { + switch (arg->type) { + case SEARCH_SEQSET: + array_clear(uids); + mailbox_get_uid_range(args->box, + &arg->value.seqset, uids); + + /* replace sequences with UIDs in the existing array. + this way it's possible to switch between uidsets and + seqsets constantly without leaking memory */ + arg->type = SEARCH_UIDSET; + array_clear(&arg->value.seqset); + array_append_array(&arg->value.seqset, uids); + break; + case SEARCH_SUB: + case SEARCH_OR: + mail_search_args_seq2uid_sub(args, arg->value.subargs, + uids); + break; + default: + break; + } + } +} + +void mail_search_args_seq2uid(struct mail_search_args *args) +{ + T_BEGIN { + ARRAY_TYPE(seq_range) uids; + + t_array_init(&uids, 128); + mail_search_args_seq2uid_sub(args, args->args, &uids); + } T_END; +} + void mail_search_args_ref(struct mail_search_args *args) { i_assert(args->refcount > 0);
--- a/src/lib-storage/mail-search.h Sat Jun 07 01:34:16 2008 +0300 +++ b/src/lib-storage/mail-search.h Sat Jun 07 01:35:02 2008 +0300 @@ -109,6 +109,8 @@ const ARRAY_TYPE(seq_range) *search_saved_uidset); /* Free keywords. The args can initialized afterwards again if needed. */ 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); void mail_search_args_ref(struct mail_search_args *args); void mail_search_args_unref(struct mail_search_args **args);
--- a/src/lib-storage/mailbox-search-result.c Sat Jun 07 01:34:16 2008 +0300 +++ b/src/lib-storage/mailbox-search-result.c Sat Jun 07 01:35:02 2008 +0300 @@ -89,6 +89,7 @@ i_array_init(&result->removed_uids, 32); i_array_init(&result->added_uids, 32); } + mail_search_args_seq2uid(result->search_args); } void mailbox_search_results_initial_done(struct mail_search_context *ctx)