mail-search.c revision e2f6850678a97f0048c962d8f1ce0edd809b7ac6
8871c97974dd4e682c7b8d5cff0bbc5b024f56f2Timo Sirainen/* Copyright (c) 2002-2010 Dovecot authors, see the included COPYING file */
8871c97974dd4e682c7b8d5cff0bbc5b024f56f2Timo Sirainenmail_search_arg_dup(pool_t pool, const struct mail_search_arg *arg);
8871c97974dd4e682c7b8d5cff0bbc5b024f56f2Timo Sirainenstatic bool mail_search_arg_equals(const struct mail_search_arg *arg1,
8871c97974dd4e682c7b8d5cff0bbc5b024f56f2Timo Sirainenmailbox_uidset_change(struct mail_search_arg *arg, struct mailbox *box,
8871c97974dd4e682c7b8d5cff0bbc5b024f56f2Timo Sirainen const ARRAY_TYPE(seq_range) *search_saved_uidset)
8871c97974dd4e682c7b8d5cff0bbc5b024f56f2Timo Sirainen unsigned int i, count;
8871c97974dd4e682c7b8d5cff0bbc5b024f56f2Timo Sirainen if (arg->value.str != NULL && strcmp(arg->value.str, "$") == 0) {
8871c97974dd4e682c7b8d5cff0bbc5b024f56f2Timo Sirainen /* SEARCHRES: Replace with saved uidset */
8871c97974dd4e682c7b8d5cff0bbc5b024f56f2Timo Sirainen array_append_array(&arg->value.seqset, search_saved_uidset);
8871c97974dd4e682c7b8d5cff0bbc5b024f56f2Timo Sirainen /* make a copy of the UIDs */
8871c97974dd4e682c7b8d5cff0bbc5b024f56f2Timo Sirainen /* empty set, keep it */
8871c97974dd4e682c7b8d5cff0bbc5b024f56f2Timo Sirainen memcpy(uids, array_idx(&arg->value.seqset, 0), sizeof(*uids) * count);
8871c97974dd4e682c7b8d5cff0bbc5b024f56f2Timo Sirainen /* put them back to the range as sequences */
8871c97974dd4e682c7b8d5cff0bbc5b024f56f2Timo Sirainen for (i = 0; i < count; i++) {
8871c97974dd4e682c7b8d5cff0bbc5b024f56f2Timo Sirainen mailbox_get_seq_range(box, uids[i].seq1, uids[i].seq2,
8871c97974dd4e682c7b8d5cff0bbc5b024f56f2Timo Sirainen /* make sure the last message is in the range */
8871c97974dd4e682c7b8d5cff0bbc5b024f56f2Timo Sirainen seq_range_array_add(&arg->value.seqset, 0, seq2);
8871c97974dd4e682c7b8d5cff0bbc5b024f56f2Timo Sirainenmail_search_args_init_sub(struct mail_search_args *args,
8871c97974dd4e682c7b8d5cff0bbc5b024f56f2Timo Sirainen const ARRAY_TYPE(seq_range) *search_saved_uidset)
8871c97974dd4e682c7b8d5cff0bbc5b024f56f2Timo Sirainen /* modseq with keyword */
8871c97974dd4e682c7b8d5cff0bbc5b024f56f2Timo Sirainen /* simplification should have unnested all
8871c97974dd4e682c7b8d5cff0bbc5b024f56f2Timo Sirainen inthreads, so we'll assume that
8871c97974dd4e682c7b8d5cff0bbc5b024f56f2Timo Sirainen have_inthreads=FALSE */
8871c97974dd4e682c7b8d5cff0bbc5b024f56f2Timo Sirainen /* fall through */
8871c97974dd4e682c7b8d5cff0bbc5b024f56f2Timo Sirainen mail_search_args_init_sub(args, arg->value.subargs,
case SEARCH_MODSEQ:
case SEARCH_KEYWORDS:
case SEARCH_MAILBOX_GLOB:
case SEARCH_INTHREAD:
case SEARCH_SUB:
case SEARCH_OR:
case SEARCH_SEQSET:
case SEARCH_SUB:
case SEARCH_OR:
case SEARCH_INTHREAD:
uids);
T_BEGIN {
} T_END;
static struct mail_search_arg *
case SEARCH_INTHREAD:
case SEARCH_OR:
case SEARCH_SUB:
case SEARCH_ALL:
case SEARCH_SEQSET:
case SEARCH_UIDSET:
case SEARCH_FLAGS:
case SEARCH_BEFORE:
case SEARCH_ON:
case SEARCH_SINCE:
case SEARCH_SMALLER:
case SEARCH_LARGER:
case SEARCH_HEADER:
case SEARCH_HEADER_ADDRESS:
case SEARCH_KEYWORDS:
case SEARCH_BODY:
case SEARCH_TEXT:
case SEARCH_BODY_FAST:
case SEARCH_TEXT_FAST:
case SEARCH_GUID:
case SEARCH_MAILBOX:
case SEARCH_MAILBOX_GLOB:
case SEARCH_MODSEQ:
return new_arg;
static struct mail_search_arg *
return new_arg;
struct mail_search_args *
return new_args;
if (!full_reset)
void *context)
void *context)
int result;
return result;
case SEARCH_OR:
case SEARCH_SUB:
case SEARCH_BEFORE:
case SEARCH_ON:
case SEARCH_SINCE:
case SEARCH_HEADER:
case SEARCH_HEADER_ADDRESS:
case SEARCH_BODY:
case SEARCH_BODY_FAST:
case SEARCH_TEXT:
case SEARCH_TEXT_FAST:
bool have_text;
return NULL;
bool ret;
case SEARCH_OR:
return TRUE;
return FALSE;
case SEARCH_SUB:
case SEARCH_INTHREAD:
return FALSE;
return TRUE;
case SEARCH_MAILBOX:
case SEARCH_MAILBOX_GLOB: {
T_BEGIN {
} T_END;
return TRUE;
return FALSE;
return TRUE;
static struct mail_keywords *
T_BEGIN {
&new_indexes);
} T_END;
return new_kw;
!parent_and) {
!parent_and) {
case SEARCH_SUB:
case SEARCH_OR:
case SEARCH_INTHREAD:
return FALSE;
if (!parent_and) {
return TRUE;
return FALSE;
case SEARCH_OR:
case SEARCH_SUB:
case SEARCH_ALL:
return TRUE;
case SEARCH_SEQSET:
return FALSE;
case SEARCH_UIDSET:
case SEARCH_FLAGS:
case SEARCH_KEYWORDS:
case SEARCH_BEFORE:
case SEARCH_ON:
case SEARCH_SINCE:
case SEARCH_SMALLER:
case SEARCH_LARGER:
case SEARCH_HEADER:
case SEARCH_HEADER_ADDRESS:
return FALSE;
case SEARCH_BODY:
case SEARCH_TEXT:
case SEARCH_BODY_FAST:
case SEARCH_TEXT_FAST:
case SEARCH_GUID:
case SEARCH_MAILBOX:
case SEARCH_MAILBOX_GLOB:
case SEARCH_MODSEQ: {
case SEARCH_INTHREAD:
i_unreached();
return FALSE;
return FALSE;
return FALSE;