annotate src/lib-storage/mail-search.c @ 9354:687ac828b964 HEAD

lib-index: modseqs weren't tracked properly within session when changes were done.
author Timo Sirainen <tss@iki.fi>
date Tue, 01 Sep 2009 13:05:03 -0400
parents 77aab257cea2
children 28cea4c5158a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8590
b9faf4db2a9f Updated copyright notices to include year 2009.
Timo Sirainen <tss@iki.fi>
parents: 8144
diff changeset
1 /* Copyright (c) 2002-2009 Dovecot authors, see the included COPYING file */
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3 #include "lib.h"
6965
ae369569e7de SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents: 6964
diff changeset
4 #include "array.h"
1672
8920600a8cfc Index cache file rewrite. It's not finished yet and mbox support is
Timo Sirainen <tss@iki.fi>
parents: 1375
diff changeset
5 #include "buffer.h"
6965
ae369569e7de SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents: 6964
diff changeset
6 #include "mail-index.h"
7642
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
7 #include "mail-storage.h"
9043
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
8 #include "mail-search-build.h"
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
9 #include "mail-search.h"
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
10
9043
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
11 static struct mail_search_arg *
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
12 mail_search_arg_dup(pool_t pool, const struct mail_search_arg *arg);
8144
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
13 static bool mail_search_arg_equals(const struct mail_search_arg *arg1,
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
14 const struct mail_search_arg *arg2);
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
15
7642
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
16 static void
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
17 mailbox_uidset_change(struct mail_search_arg *arg, struct mailbox *box,
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
18 const ARRAY_TYPE(seq_range) *search_saved_uidset)
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
19 {
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
20 struct seq_range *uids;
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
21 unsigned int i, count;
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
22 uint32_t seq1, seq2;
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
23
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
24 if (arg->value.str != NULL && strcmp(arg->value.str, "$") == 0) {
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
25 /* SEARCHRES: Replace with saved uidset */
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
26 array_clear(&arg->value.seqset);
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
27 if (search_saved_uidset == NULL ||
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
28 !array_is_created(search_saved_uidset))
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
29 return;
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
30
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
31 array_append_array(&arg->value.seqset, search_saved_uidset);
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
32 return;
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
33 }
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
34
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
35 arg->type = SEARCH_SEQSET;
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
36
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
37 /* make a copy of the UIDs */
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
38 count = array_count(&arg->value.seqset);
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
39 if (count == 0) {
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
40 /* empty set, keep it */
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
41 return;
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
42 }
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
43 uids = t_new(struct seq_range, count);
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
44 memcpy(uids, array_idx(&arg->value.seqset, 0), sizeof(*uids) * count);
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
45
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
46 /* put them back to the range as sequences */
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
47 array_clear(&arg->value.seqset);
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
48 for (i = 0; i < count; i++) {
7653
f8e902acfbae Renamed mailbox_get_uids() to mailbox_get_seq_range().
Timo Sirainen <tss@iki.fi>
parents: 7647
diff changeset
49 mailbox_get_seq_range(box, uids[i].seq1, uids[i].seq2,
f8e902acfbae Renamed mailbox_get_uids() to mailbox_get_seq_range().
Timo Sirainen <tss@iki.fi>
parents: 7647
diff changeset
50 &seq1, &seq2);
7642
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
51 if (seq1 != 0) {
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
52 seq_range_array_add_range(&arg->value.seqset,
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
53 seq1, seq2);
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
54 }
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
55 if (uids[i].seq2 == (uint32_t)-1) {
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
56 /* make sure the last message is in the range */
7653
f8e902acfbae Renamed mailbox_get_uids() to mailbox_get_seq_range().
Timo Sirainen <tss@iki.fi>
parents: 7647
diff changeset
57 mailbox_get_seq_range(box, 1, (uint32_t)-1,
f8e902acfbae Renamed mailbox_get_uids() to mailbox_get_seq_range().
Timo Sirainen <tss@iki.fi>
parents: 7647
diff changeset
58 &seq1, &seq2);
7642
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
59 seq_range_array_add(&arg->value.seqset, 0, seq2);
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
60 }
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
61 }
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
62 }
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
63
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
64 static void
7908
1e69c84a1e5a Search code cleanups and minor optimizations.
Timo Sirainen <tss@iki.fi>
parents: 7655
diff changeset
65 mail_search_args_init_sub(struct mail_search_args *args,
1e69c84a1e5a Search code cleanups and minor optimizations.
Timo Sirainen <tss@iki.fi>
parents: 7655
diff changeset
66 struct mail_search_arg *arg,
1e69c84a1e5a Search code cleanups and minor optimizations.
Timo Sirainen <tss@iki.fi>
parents: 7655
diff changeset
67 bool change_uidsets,
7642
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
68 const ARRAY_TYPE(seq_range) *search_saved_uidset)
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
69 {
7909
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
70 struct mail_search_args *thread_args;
7642
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
71 const char *keywords[2];
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
72
7908
1e69c84a1e5a Search code cleanups and minor optimizations.
Timo Sirainen <tss@iki.fi>
parents: 7655
diff changeset
73 for (; arg != NULL; arg = arg->next) {
1e69c84a1e5a Search code cleanups and minor optimizations.
Timo Sirainen <tss@iki.fi>
parents: 7655
diff changeset
74 switch (arg->type) {
7642
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
75 case SEARCH_UIDSET:
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
76 if (change_uidsets) T_BEGIN {
7908
1e69c84a1e5a Search code cleanups and minor optimizations.
Timo Sirainen <tss@iki.fi>
parents: 7655
diff changeset
77 mailbox_uidset_change(arg, args->box,
7642
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
78 search_saved_uidset);
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
79 } T_END;
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
80 break;
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
81 case SEARCH_MODSEQ:
7908
1e69c84a1e5a Search code cleanups and minor optimizations.
Timo Sirainen <tss@iki.fi>
parents: 7655
diff changeset
82 if (arg->value.str == NULL)
7642
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
83 break;
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
84 /* modseq with keyword */
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
85 case SEARCH_KEYWORDS:
7908
1e69c84a1e5a Search code cleanups and minor optimizations.
Timo Sirainen <tss@iki.fi>
parents: 7655
diff changeset
86 keywords[0] = arg->value.str;
7642
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
87 keywords[1] = NULL;
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
88
7908
1e69c84a1e5a Search code cleanups and minor optimizations.
Timo Sirainen <tss@iki.fi>
parents: 7655
diff changeset
89 i_assert(arg->value.keywords == NULL);
1e69c84a1e5a Search code cleanups and minor optimizations.
Timo Sirainen <tss@iki.fi>
parents: 7655
diff changeset
90 arg->value.keywords =
1e69c84a1e5a Search code cleanups and minor optimizations.
Timo Sirainen <tss@iki.fi>
parents: 7655
diff changeset
91 mailbox_keywords_create_valid(args->box,
1e69c84a1e5a Search code cleanups and minor optimizations.
Timo Sirainen <tss@iki.fi>
parents: 7655
diff changeset
92 keywords);
7642
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
93 break;
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
94
7909
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
95 case SEARCH_INTHREAD:
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
96 thread_args = arg->value.search_args;
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
97 if (thread_args == NULL) {
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
98 arg->value.search_args = thread_args =
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
99 p_new(args->pool,
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
100 struct mail_search_args, 1);
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
101 thread_args->pool = args->pool;
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
102 thread_args->args = arg->value.subargs;
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
103 thread_args->charset = args->charset;
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
104 thread_args->simplified = TRUE;
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
105 /* simplification should have unnested all
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
106 inthreads, so we'll assume that
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
107 have_inthreads=FALSE */
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
108 }
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
109 thread_args->refcount++;
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
110 thread_args->box = args->box;
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
111 /* fall through */
7642
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
112 case SEARCH_SUB:
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
113 case SEARCH_OR:
7908
1e69c84a1e5a Search code cleanups and minor optimizations.
Timo Sirainen <tss@iki.fi>
parents: 7655
diff changeset
114 mail_search_args_init_sub(args, arg->value.subargs,
7642
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
115 change_uidsets,
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
116 search_saved_uidset);
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
117 break;
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
118 default:
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
119 break;
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
120 }
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
121 }
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
122 }
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
123
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
124 void mail_search_args_init(struct mail_search_args *args,
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
125 struct mailbox *box, bool change_uidsets,
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
126 const ARRAY_TYPE(seq_range) *search_saved_uidset)
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
127 {
8951
77fb2731830b mail_search_args_[de]init() calls stack now. Last unref is still allowed without deiniting.
Timo Sirainen <tss@iki.fi>
parents: 8932
diff changeset
128 if (args->init_refcount++ > 0) {
7908
1e69c84a1e5a Search code cleanups and minor optimizations.
Timo Sirainen <tss@iki.fi>
parents: 7655
diff changeset
129 i_assert(args->box == box);
1e69c84a1e5a Search code cleanups and minor optimizations.
Timo Sirainen <tss@iki.fi>
parents: 7655
diff changeset
130 return;
1e69c84a1e5a Search code cleanups and minor optimizations.
Timo Sirainen <tss@iki.fi>
parents: 7655
diff changeset
131 }
1e69c84a1e5a Search code cleanups and minor optimizations.
Timo Sirainen <tss@iki.fi>
parents: 7655
diff changeset
132
7642
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
133 args->box = box;
7908
1e69c84a1e5a Search code cleanups and minor optimizations.
Timo Sirainen <tss@iki.fi>
parents: 7655
diff changeset
134 if (!args->simplified)
1e69c84a1e5a Search code cleanups and minor optimizations.
Timo Sirainen <tss@iki.fi>
parents: 7655
diff changeset
135 mail_search_args_simplify(args);
1e69c84a1e5a Search code cleanups and minor optimizations.
Timo Sirainen <tss@iki.fi>
parents: 7655
diff changeset
136 mail_search_args_init_sub(args, args->args, change_uidsets,
7642
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
137 search_saved_uidset);
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
138 }
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
139
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
140 static void mail_search_args_deinit_sub(struct mail_search_args *args,
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
141 struct mail_search_arg *arg)
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
142 {
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
143 for (; arg != NULL; arg = arg->next) {
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
144 switch (arg->type) {
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
145 case SEARCH_MODSEQ:
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
146 case SEARCH_KEYWORDS:
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
147 if (arg->value.keywords == NULL)
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
148 break;
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
149 mailbox_keywords_free(args->box, &arg->value.keywords);
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
150 break;
7909
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
151 case SEARCH_INTHREAD:
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
152 i_assert(arg->value.search_args->refcount > 0);
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
153 if (args->refcount == 0 &&
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
154 arg->value.search_result != NULL) {
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
155 mailbox_search_result_free(
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
156 &arg->value.search_result);
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
157 }
9063
172cfd750a40 SEARCH INTREAD: Crashfix when deinitializing.
Timo Sirainen <tss@iki.fi>
parents: 9043
diff changeset
158 arg->value.search_args->refcount--;
172cfd750a40 SEARCH INTREAD: Crashfix when deinitializing.
Timo Sirainen <tss@iki.fi>
parents: 9043
diff changeset
159 arg->value.search_args->box = NULL;
7909
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
160 /* fall through */
7642
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
161 case SEARCH_SUB:
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
162 case SEARCH_OR:
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
163 mail_search_args_deinit_sub(args, arg->value.subargs);
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
164 break;
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
165 default:
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
166 break;
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
167 }
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
168 }
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
169 }
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
170
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
171 void mail_search_args_deinit(struct mail_search_args *args)
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
172 {
8951
77fb2731830b mail_search_args_[de]init() calls stack now. Last unref is still allowed without deiniting.
Timo Sirainen <tss@iki.fi>
parents: 8932
diff changeset
173 i_assert(args->init_refcount > 0);
77fb2731830b mail_search_args_[de]init() calls stack now. Last unref is still allowed without deiniting.
Timo Sirainen <tss@iki.fi>
parents: 8932
diff changeset
174 if (--args->init_refcount > 0)
7647
879208fdc7e3 Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents: 7642
diff changeset
175 return;
879208fdc7e3 Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents: 7642
diff changeset
176
7642
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
177 mail_search_args_deinit_sub(args, args->args);
7908
1e69c84a1e5a Search code cleanups and minor optimizations.
Timo Sirainen <tss@iki.fi>
parents: 7655
diff changeset
178 args->box = NULL;
7642
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
179 }
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
180
7655
ec49260ed4ee SEARCH UPDATE: Convert seqsets in saved results to uidsets so that they can
Timo Sirainen <tss@iki.fi>
parents: 7653
diff changeset
181 static void mail_search_args_seq2uid_sub(struct mail_search_args *args,
ec49260ed4ee SEARCH UPDATE: Convert seqsets in saved results to uidsets so that they can
Timo Sirainen <tss@iki.fi>
parents: 7653
diff changeset
182 struct mail_search_arg *arg,
ec49260ed4ee SEARCH UPDATE: Convert seqsets in saved results to uidsets so that they can
Timo Sirainen <tss@iki.fi>
parents: 7653
diff changeset
183 ARRAY_TYPE(seq_range) *uids)
ec49260ed4ee SEARCH UPDATE: Convert seqsets in saved results to uidsets so that they can
Timo Sirainen <tss@iki.fi>
parents: 7653
diff changeset
184 {
ec49260ed4ee SEARCH UPDATE: Convert seqsets in saved results to uidsets so that they can
Timo Sirainen <tss@iki.fi>
parents: 7653
diff changeset
185 for (; arg != NULL; arg = arg->next) {
ec49260ed4ee SEARCH UPDATE: Convert seqsets in saved results to uidsets so that they can
Timo Sirainen <tss@iki.fi>
parents: 7653
diff changeset
186 switch (arg->type) {
ec49260ed4ee SEARCH UPDATE: Convert seqsets in saved results to uidsets so that they can
Timo Sirainen <tss@iki.fi>
parents: 7653
diff changeset
187 case SEARCH_SEQSET:
ec49260ed4ee SEARCH UPDATE: Convert seqsets in saved results to uidsets so that they can
Timo Sirainen <tss@iki.fi>
parents: 7653
diff changeset
188 array_clear(uids);
ec49260ed4ee SEARCH UPDATE: Convert seqsets in saved results to uidsets so that they can
Timo Sirainen <tss@iki.fi>
parents: 7653
diff changeset
189 mailbox_get_uid_range(args->box,
ec49260ed4ee SEARCH UPDATE: Convert seqsets in saved results to uidsets so that they can
Timo Sirainen <tss@iki.fi>
parents: 7653
diff changeset
190 &arg->value.seqset, uids);
ec49260ed4ee SEARCH UPDATE: Convert seqsets in saved results to uidsets so that they can
Timo Sirainen <tss@iki.fi>
parents: 7653
diff changeset
191
ec49260ed4ee SEARCH UPDATE: Convert seqsets in saved results to uidsets so that they can
Timo Sirainen <tss@iki.fi>
parents: 7653
diff changeset
192 /* replace sequences with UIDs in the existing array.
ec49260ed4ee SEARCH UPDATE: Convert seqsets in saved results to uidsets so that they can
Timo Sirainen <tss@iki.fi>
parents: 7653
diff changeset
193 this way it's possible to switch between uidsets and
ec49260ed4ee SEARCH UPDATE: Convert seqsets in saved results to uidsets so that they can
Timo Sirainen <tss@iki.fi>
parents: 7653
diff changeset
194 seqsets constantly without leaking memory */
ec49260ed4ee SEARCH UPDATE: Convert seqsets in saved results to uidsets so that they can
Timo Sirainen <tss@iki.fi>
parents: 7653
diff changeset
195 arg->type = SEARCH_UIDSET;
ec49260ed4ee SEARCH UPDATE: Convert seqsets in saved results to uidsets so that they can
Timo Sirainen <tss@iki.fi>
parents: 7653
diff changeset
196 array_clear(&arg->value.seqset);
ec49260ed4ee SEARCH UPDATE: Convert seqsets in saved results to uidsets so that they can
Timo Sirainen <tss@iki.fi>
parents: 7653
diff changeset
197 array_append_array(&arg->value.seqset, uids);
ec49260ed4ee SEARCH UPDATE: Convert seqsets in saved results to uidsets so that they can
Timo Sirainen <tss@iki.fi>
parents: 7653
diff changeset
198 break;
ec49260ed4ee SEARCH UPDATE: Convert seqsets in saved results to uidsets so that they can
Timo Sirainen <tss@iki.fi>
parents: 7653
diff changeset
199 case SEARCH_SUB:
ec49260ed4ee SEARCH UPDATE: Convert seqsets in saved results to uidsets so that they can
Timo Sirainen <tss@iki.fi>
parents: 7653
diff changeset
200 case SEARCH_OR:
7909
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
201 case SEARCH_INTHREAD:
7655
ec49260ed4ee SEARCH UPDATE: Convert seqsets in saved results to uidsets so that they can
Timo Sirainen <tss@iki.fi>
parents: 7653
diff changeset
202 mail_search_args_seq2uid_sub(args, arg->value.subargs,
ec49260ed4ee SEARCH UPDATE: Convert seqsets in saved results to uidsets so that they can
Timo Sirainen <tss@iki.fi>
parents: 7653
diff changeset
203 uids);
ec49260ed4ee SEARCH UPDATE: Convert seqsets in saved results to uidsets so that they can
Timo Sirainen <tss@iki.fi>
parents: 7653
diff changeset
204 break;
ec49260ed4ee SEARCH UPDATE: Convert seqsets in saved results to uidsets so that they can
Timo Sirainen <tss@iki.fi>
parents: 7653
diff changeset
205 default:
ec49260ed4ee SEARCH UPDATE: Convert seqsets in saved results to uidsets so that they can
Timo Sirainen <tss@iki.fi>
parents: 7653
diff changeset
206 break;
ec49260ed4ee SEARCH UPDATE: Convert seqsets in saved results to uidsets so that they can
Timo Sirainen <tss@iki.fi>
parents: 7653
diff changeset
207 }
ec49260ed4ee SEARCH UPDATE: Convert seqsets in saved results to uidsets so that they can
Timo Sirainen <tss@iki.fi>
parents: 7653
diff changeset
208 }
ec49260ed4ee SEARCH UPDATE: Convert seqsets in saved results to uidsets so that they can
Timo Sirainen <tss@iki.fi>
parents: 7653
diff changeset
209 }
ec49260ed4ee SEARCH UPDATE: Convert seqsets in saved results to uidsets so that they can
Timo Sirainen <tss@iki.fi>
parents: 7653
diff changeset
210
ec49260ed4ee SEARCH UPDATE: Convert seqsets in saved results to uidsets so that they can
Timo Sirainen <tss@iki.fi>
parents: 7653
diff changeset
211 void mail_search_args_seq2uid(struct mail_search_args *args)
ec49260ed4ee SEARCH UPDATE: Convert seqsets in saved results to uidsets so that they can
Timo Sirainen <tss@iki.fi>
parents: 7653
diff changeset
212 {
ec49260ed4ee SEARCH UPDATE: Convert seqsets in saved results to uidsets so that they can
Timo Sirainen <tss@iki.fi>
parents: 7653
diff changeset
213 T_BEGIN {
ec49260ed4ee SEARCH UPDATE: Convert seqsets in saved results to uidsets so that they can
Timo Sirainen <tss@iki.fi>
parents: 7653
diff changeset
214 ARRAY_TYPE(seq_range) uids;
ec49260ed4ee SEARCH UPDATE: Convert seqsets in saved results to uidsets so that they can
Timo Sirainen <tss@iki.fi>
parents: 7653
diff changeset
215
ec49260ed4ee SEARCH UPDATE: Convert seqsets in saved results to uidsets so that they can
Timo Sirainen <tss@iki.fi>
parents: 7653
diff changeset
216 t_array_init(&uids, 128);
ec49260ed4ee SEARCH UPDATE: Convert seqsets in saved results to uidsets so that they can
Timo Sirainen <tss@iki.fi>
parents: 7653
diff changeset
217 mail_search_args_seq2uid_sub(args, args->args, &uids);
ec49260ed4ee SEARCH UPDATE: Convert seqsets in saved results to uidsets so that they can
Timo Sirainen <tss@iki.fi>
parents: 7653
diff changeset
218 } T_END;
ec49260ed4ee SEARCH UPDATE: Convert seqsets in saved results to uidsets so that they can
Timo Sirainen <tss@iki.fi>
parents: 7653
diff changeset
219 }
ec49260ed4ee SEARCH UPDATE: Convert seqsets in saved results to uidsets so that they can
Timo Sirainen <tss@iki.fi>
parents: 7653
diff changeset
220
7642
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
221 void mail_search_args_ref(struct mail_search_args *args)
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
222 {
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
223 i_assert(args->refcount > 0);
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
224
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
225 args->refcount++;
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
226 }
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
227
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
228 void mail_search_args_unref(struct mail_search_args **_args)
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
229 {
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
230 struct mail_search_args *args = *_args;
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
231
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
232 i_assert(args->refcount > 0);
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
233
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
234 *_args = NULL;
8951
77fb2731830b mail_search_args_[de]init() calls stack now. Last unref is still allowed without deiniting.
Timo Sirainen <tss@iki.fi>
parents: 8932
diff changeset
235 if (--args->refcount > 0) {
77fb2731830b mail_search_args_[de]init() calls stack now. Last unref is still allowed without deiniting.
Timo Sirainen <tss@iki.fi>
parents: 8932
diff changeset
236 i_assert(args->init_refcount <= args->refcount);
7642
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
237 return;
8951
77fb2731830b mail_search_args_[de]init() calls stack now. Last unref is still allowed without deiniting.
Timo Sirainen <tss@iki.fi>
parents: 8932
diff changeset
238 }
77fb2731830b mail_search_args_[de]init() calls stack now. Last unref is still allowed without deiniting.
Timo Sirainen <tss@iki.fi>
parents: 8932
diff changeset
239 i_assert(args->init_refcount <= 1);
77fb2731830b mail_search_args_[de]init() calls stack now. Last unref is still allowed without deiniting.
Timo Sirainen <tss@iki.fi>
parents: 8932
diff changeset
240 if (args->init_refcount == 1)
77fb2731830b mail_search_args_[de]init() calls stack now. Last unref is still allowed without deiniting.
Timo Sirainen <tss@iki.fi>
parents: 8932
diff changeset
241 mail_search_args_deinit(args);
7642
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
242 pool_unref(&args->pool);
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
243 }
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7284
diff changeset
244
9043
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
245 static struct mail_search_arg *
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
246 mail_search_arg_dup_one(pool_t pool, const struct mail_search_arg *arg)
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
247 {
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
248 struct mail_search_arg *new_arg;
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
249
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
250 new_arg = p_new(pool, struct mail_search_arg, 1);
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
251 new_arg->type = arg->type;
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
252 new_arg->not = arg->not;
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
253 new_arg->match_always = arg->match_always;
9063
172cfd750a40 SEARCH INTREAD: Crashfix when deinitializing.
Timo Sirainen <tss@iki.fi>
parents: 9043
diff changeset
254 new_arg->value.search_flags = arg->value.search_flags;
9043
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
255
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
256 switch (arg->type) {
9063
172cfd750a40 SEARCH INTREAD: Crashfix when deinitializing.
Timo Sirainen <tss@iki.fi>
parents: 9043
diff changeset
257 case SEARCH_INTHREAD:
172cfd750a40 SEARCH INTREAD: Crashfix when deinitializing.
Timo Sirainen <tss@iki.fi>
parents: 9043
diff changeset
258 new_arg->value.thread_type = arg->value.thread_type;
172cfd750a40 SEARCH INTREAD: Crashfix when deinitializing.
Timo Sirainen <tss@iki.fi>
parents: 9043
diff changeset
259 /* fall through */
9043
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
260 case SEARCH_OR:
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
261 case SEARCH_SUB:
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
262 new_arg->value.subargs =
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
263 mail_search_arg_dup(pool, arg->value.subargs);
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
264 break;
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
265 case SEARCH_ALL:
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
266 break;
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
267 case SEARCH_SEQSET:
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
268 case SEARCH_UIDSET:
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
269 p_array_init(&new_arg->value.seqset, pool,
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
270 array_count(&arg->value.seqset));
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
271 array_append_array(&new_arg->value.seqset, &arg->value.seqset);
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
272 break;
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
273 case SEARCH_FLAGS:
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
274 new_arg->value.flags = arg->value.flags;
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
275 break;
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
276 case SEARCH_BEFORE:
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
277 case SEARCH_ON:
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
278 case SEARCH_SINCE:
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
279 case SEARCH_SENTBEFORE:
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
280 case SEARCH_SENTON:
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
281 case SEARCH_SENTSINCE:
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
282 new_arg->value.time = arg->value.time;
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
283 break;
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
284 case SEARCH_SMALLER:
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
285 case SEARCH_LARGER:
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
286 new_arg->value.size = arg->value.size;
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
287 break;
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
288 case SEARCH_HEADER:
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
289 case SEARCH_HEADER_ADDRESS:
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
290 case SEARCH_HEADER_COMPRESS_LWSP:
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
291 new_arg->hdr_field_name = p_strdup(pool, arg->hdr_field_name);
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
292 /* fall through */
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
293 case SEARCH_KEYWORDS:
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
294 case SEARCH_BODY:
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
295 case SEARCH_TEXT:
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
296 case SEARCH_BODY_FAST:
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
297 case SEARCH_TEXT_FAST:
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
298 case SEARCH_GUID:
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
299 case SEARCH_MAILBOX:
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
300 new_arg->value.str = p_strdup(pool, arg->value.str);
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
301 break;
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
302
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
303 case SEARCH_MODSEQ:
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
304 new_arg->value.modseq =
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
305 p_new(pool, struct mail_search_modseq, 1);
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
306 *new_arg->value.modseq = *arg->value.modseq;
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
307 break;
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
308 }
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
309 return new_arg;
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
310 }
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
311
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
312 static struct mail_search_arg *
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
313 mail_search_arg_dup(pool_t pool, const struct mail_search_arg *arg)
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
314 {
9097
77aab257cea2 mail_search_args_dup(): Don't return broken results if there are no search args.
Timo Sirainen <tss@iki.fi>
parents: 9063
diff changeset
315 struct mail_search_arg *new_arg = NULL, **dest = &new_arg;
9043
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
316
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
317 for (; arg != NULL; arg = arg->next) {
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
318 *dest = mail_search_arg_dup_one(pool, arg);
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
319 dest = &(*dest)->next;
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
320 }
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
321 return new_arg;
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
322 }
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
323
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
324 struct mail_search_args *
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
325 mail_search_args_dup(const struct mail_search_args *args)
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
326 {
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
327 struct mail_search_args *new_args;
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
328
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
329 new_args = mail_search_build_init();
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
330 new_args->charset = p_strdup(new_args->pool, args->charset);
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
331 new_args->simplified = args->simplified;
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
332 new_args->have_inthreads = args->have_inthreads;
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
333 new_args->args = mail_search_arg_dup(new_args->pool, args->args);
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
334 return new_args;
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
335 }
ef33393452f7 Added mail_search_args_dup().
Timo Sirainen <tss@iki.fi>
parents: 8951
diff changeset
336
3863
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 3300
diff changeset
337 void mail_search_args_reset(struct mail_search_arg *args, bool full_reset)
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
338 {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
339 while (args != NULL) {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
340 if (args->type == SEARCH_OR || args->type == SEARCH_SUB)
1844
4c2678dd65f1 Some optimizations to messageset handling in search.
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
341 mail_search_args_reset(args->value.subargs, full_reset);
4c2678dd65f1 Some optimizations to messageset handling in search.
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
342
4c2678dd65f1 Some optimizations to messageset handling in search.
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
343 if (!args->match_always)
4c2678dd65f1 Some optimizations to messageset handling in search.
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
344 args->result = -1;
4c2678dd65f1 Some optimizations to messageset handling in search.
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
345 else {
4c2678dd65f1 Some optimizations to messageset handling in search.
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
346 if (!full_reset)
4c2678dd65f1 Some optimizations to messageset handling in search.
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
347 args->result = 1;
4c2678dd65f1 Some optimizations to messageset handling in search.
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
348 else {
4c2678dd65f1 Some optimizations to messageset handling in search.
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
349 args->match_always = FALSE;
4c2678dd65f1 Some optimizations to messageset handling in search.
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
350 args->result = -1;
4c2678dd65f1 Some optimizations to messageset handling in search.
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
351 }
4c2678dd65f1 Some optimizations to messageset handling in search.
Timo Sirainen <tss@iki.fi>
parents: 1782
diff changeset
352 }
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
353
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
354 args = args->next;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
355 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
356 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
357
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 877
diff changeset
358 static void search_arg_foreach(struct mail_search_arg *arg,
4903
204d7edc7cdc Added context parameter type safety checks for most callback APIs.
Timo Sirainen <tss@iki.fi>
parents: 4431
diff changeset
359 mail_search_foreach_callback_t *callback,
953
411006be3c66 Naming change for function typedefs.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
360 void *context)
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
361 {
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 877
diff changeset
362 struct mail_search_arg *subarg;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
363
1069
8024a2cdc406 Several search fixes, mostly related to matching multiple conditions.
Timo Sirainen <tss@iki.fi>
parents: 988
diff changeset
364 if (arg->result != -1)
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
365 return;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
366
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
367 if (arg->type == SEARCH_SUB) {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
368 /* sublist of conditions */
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
369 i_assert(arg->value.subargs != NULL);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
370
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
371 arg->result = 1;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
372 subarg = arg->value.subargs;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
373 while (subarg != NULL) {
1069
8024a2cdc406 Several search fixes, mostly related to matching multiple conditions.
Timo Sirainen <tss@iki.fi>
parents: 988
diff changeset
374 if (subarg->result == -1)
953
411006be3c66 Naming change for function typedefs.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
375 search_arg_foreach(subarg, callback, context);
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
376
1069
8024a2cdc406 Several search fixes, mostly related to matching multiple conditions.
Timo Sirainen <tss@iki.fi>
parents: 988
diff changeset
377 if (subarg->result == -1)
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
378 arg->result = -1;
4431
2461061327ed NOT condition wasn't handled correctly in SEARCH.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3863
diff changeset
379 else if (subarg->result == 0) {
1069
8024a2cdc406 Several search fixes, mostly related to matching multiple conditions.
Timo Sirainen <tss@iki.fi>
parents: 988
diff changeset
380 /* didn't match */
8024a2cdc406 Several search fixes, mostly related to matching multiple conditions.
Timo Sirainen <tss@iki.fi>
parents: 988
diff changeset
381 arg->result = 0;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
382 break;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
383 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
384
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
385 subarg = subarg->next;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
386 }
4431
2461061327ed NOT condition wasn't handled correctly in SEARCH.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3863
diff changeset
387 if (arg->not && arg->result != -1)
2461061327ed NOT condition wasn't handled correctly in SEARCH.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3863
diff changeset
388 arg->result = !arg->result;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
389 } else if (arg->type == SEARCH_OR) {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
390 /* OR-list of conditions */
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
391 i_assert(arg->value.subargs != NULL);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
392
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
393 subarg = arg->value.subargs;
1375
a3521f4ca773 SEARCH OR fixes.
Timo Sirainen <tss@iki.fi>
parents: 1069
diff changeset
394 arg->result = 0;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
395 while (subarg != NULL) {
1069
8024a2cdc406 Several search fixes, mostly related to matching multiple conditions.
Timo Sirainen <tss@iki.fi>
parents: 988
diff changeset
396 if (subarg->result == -1)
953
411006be3c66 Naming change for function typedefs.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
397 search_arg_foreach(subarg, callback, context);
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
398
4431
2461061327ed NOT condition wasn't handled correctly in SEARCH.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3863
diff changeset
399 if (subarg->result == -1)
1375
a3521f4ca773 SEARCH OR fixes.
Timo Sirainen <tss@iki.fi>
parents: 1069
diff changeset
400 arg->result = -1;
4431
2461061327ed NOT condition wasn't handled correctly in SEARCH.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3863
diff changeset
401 else if (subarg->result > 0) {
2461061327ed NOT condition wasn't handled correctly in SEARCH.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3863
diff changeset
402 /* matched */
2461061327ed NOT condition wasn't handled correctly in SEARCH.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3863
diff changeset
403 arg->result = 1;
2461061327ed NOT condition wasn't handled correctly in SEARCH.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3863
diff changeset
404 break;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
405 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
406
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
407 subarg = subarg->next;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
408 }
4431
2461061327ed NOT condition wasn't handled correctly in SEARCH.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3863
diff changeset
409 if (arg->not && arg->result != -1)
2461061327ed NOT condition wasn't handled correctly in SEARCH.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3863
diff changeset
410 arg->result = !arg->result;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
411 } else {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
412 /* just a single condition */
953
411006be3c66 Naming change for function typedefs.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
413 callback(arg, context);
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
414 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
415 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
416
4903
204d7edc7cdc Added context parameter type safety checks for most callback APIs.
Timo Sirainen <tss@iki.fi>
parents: 4431
diff changeset
417 #undef mail_search_args_foreach
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 877
diff changeset
418 int mail_search_args_foreach(struct mail_search_arg *args,
4903
204d7edc7cdc Added context parameter type safety checks for most callback APIs.
Timo Sirainen <tss@iki.fi>
parents: 4431
diff changeset
419 mail_search_foreach_callback_t *callback,
953
411006be3c66 Naming change for function typedefs.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
420 void *context)
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
421 {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
422 int result;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
423
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
424 result = 1;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
425 for (; args != NULL; args = args->next) {
953
411006be3c66 Naming change for function typedefs.
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
426 search_arg_foreach(args, callback, context);
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
427
1069
8024a2cdc406 Several search fixes, mostly related to matching multiple conditions.
Timo Sirainen <tss@iki.fi>
parents: 988
diff changeset
428 if (args->result == 0) {
8024a2cdc406 Several search fixes, mostly related to matching multiple conditions.
Timo Sirainen <tss@iki.fi>
parents: 988
diff changeset
429 /* didn't match */
8024a2cdc406 Several search fixes, mostly related to matching multiple conditions.
Timo Sirainen <tss@iki.fi>
parents: 988
diff changeset
430 return 0;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
431 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
432
1069
8024a2cdc406 Several search fixes, mostly related to matching multiple conditions.
Timo Sirainen <tss@iki.fi>
parents: 988
diff changeset
433 if (args->result == -1)
8024a2cdc406 Several search fixes, mostly related to matching multiple conditions.
Timo Sirainen <tss@iki.fi>
parents: 988
diff changeset
434 result = -1;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
435 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
436
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
437 return result;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
438 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
439
1672
8920600a8cfc Index cache file rewrite. It's not finished yet and mbox support is
Timo Sirainen <tss@iki.fi>
parents: 1375
diff changeset
440 static void
8920600a8cfc Index cache file rewrite. It's not finished yet and mbox support is
Timo Sirainen <tss@iki.fi>
parents: 1375
diff changeset
441 search_arg_analyze(struct mail_search_arg *arg, buffer_t *headers,
3863
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 3300
diff changeset
442 bool *have_body, bool *have_text)
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
443 {
1672
8920600a8cfc Index cache file rewrite. It's not finished yet and mbox support is
Timo Sirainen <tss@iki.fi>
parents: 1375
diff changeset
444 static const char *date_hdr = "Date";
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 877
diff changeset
445 struct mail_search_arg *subarg;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
446
1069
8024a2cdc406 Several search fixes, mostly related to matching multiple conditions.
Timo Sirainen <tss@iki.fi>
parents: 988
diff changeset
447 if (arg->result != -1)
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
448 return;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
449
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
450 switch (arg->type) {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
451 case SEARCH_OR:
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
452 case SEARCH_SUB:
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
453 subarg = arg->value.subargs;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
454 while (subarg != NULL) {
1069
8024a2cdc406 Several search fixes, mostly related to matching multiple conditions.
Timo Sirainen <tss@iki.fi>
parents: 988
diff changeset
455 if (subarg->result == -1) {
1672
8920600a8cfc Index cache file rewrite. It's not finished yet and mbox support is
Timo Sirainen <tss@iki.fi>
parents: 1375
diff changeset
456 search_arg_analyze(subarg, headers,
3300
23fceec1e5c9 Some possible fix for HEADER searches and cleanup
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
457 have_body, have_text);
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
458 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
459
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
460 subarg = subarg->next;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
461 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
462 break;
408
e057845d94ca Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
463 case SEARCH_SENTBEFORE:
e057845d94ca Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
464 case SEARCH_SENTON:
e057845d94ca Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents: 10
diff changeset
465 case SEARCH_SENTSINCE:
1672
8920600a8cfc Index cache file rewrite. It's not finished yet and mbox support is
Timo Sirainen <tss@iki.fi>
parents: 1375
diff changeset
466 buffer_append(headers, &date_hdr, sizeof(const char *));
8920600a8cfc Index cache file rewrite. It's not finished yet and mbox support is
Timo Sirainen <tss@iki.fi>
parents: 1375
diff changeset
467 break;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
468 case SEARCH_HEADER:
1672
8920600a8cfc Index cache file rewrite. It's not finished yet and mbox support is
Timo Sirainen <tss@iki.fi>
parents: 1375
diff changeset
469 case SEARCH_HEADER_ADDRESS:
7284
346d4a44c2f4 SEARCH SUBJECT now changes LWSP to spaces to match ENVELOPE's subject field.
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
470 case SEARCH_HEADER_COMPRESS_LWSP:
1672
8920600a8cfc Index cache file rewrite. It's not finished yet and mbox support is
Timo Sirainen <tss@iki.fi>
parents: 1375
diff changeset
471 buffer_append(headers, &arg->hdr_field_name,
8920600a8cfc Index cache file rewrite. It's not finished yet and mbox support is
Timo Sirainen <tss@iki.fi>
parents: 1375
diff changeset
472 sizeof(const char *));
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
473 break;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
474 case SEARCH_BODY:
4942
b382b21409b5 Added support for X-BODY-FAST and X-TEXT-FAST SEARCH arguments. FTS plugin
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
475 case SEARCH_BODY_FAST:
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
476 *have_body = TRUE;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
477 break;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
478 case SEARCH_TEXT:
4942
b382b21409b5 Added support for X-BODY-FAST and X-TEXT-FAST SEARCH arguments. FTS plugin
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
479 case SEARCH_TEXT_FAST:
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
480 *have_text = TRUE;
2415
0b296005452e SEARCH TEXT was broken
Timo Sirainen <tss@iki.fi>
parents: 1844
diff changeset
481 *have_body = TRUE;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
482 break;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
483 default:
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
484 break;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
485 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
486 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
487
1672
8920600a8cfc Index cache file rewrite. It's not finished yet and mbox support is
Timo Sirainen <tss@iki.fi>
parents: 1375
diff changeset
488 const char *const *
8920600a8cfc Index cache file rewrite. It's not finished yet and mbox support is
Timo Sirainen <tss@iki.fi>
parents: 1375
diff changeset
489 mail_search_args_analyze(struct mail_search_arg *args,
3863
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 3300
diff changeset
490 bool *have_headers, bool *have_body)
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
491 {
1672
8920600a8cfc Index cache file rewrite. It's not finished yet and mbox support is
Timo Sirainen <tss@iki.fi>
parents: 1375
diff changeset
492 const char *null = NULL;
8920600a8cfc Index cache file rewrite. It's not finished yet and mbox support is
Timo Sirainen <tss@iki.fi>
parents: 1375
diff changeset
493 buffer_t *headers;
3863
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 3300
diff changeset
494 bool have_text;
1672
8920600a8cfc Index cache file rewrite. It's not finished yet and mbox support is
Timo Sirainen <tss@iki.fi>
parents: 1375
diff changeset
495
8920600a8cfc Index cache file rewrite. It's not finished yet and mbox support is
Timo Sirainen <tss@iki.fi>
parents: 1375
diff changeset
496 *have_headers = *have_body = have_text = FALSE;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
497
2708
f1e9f3ec8135 Buffer API change: we no longer support limited sized buffers where
Timo Sirainen <tss@iki.fi>
parents: 2415
diff changeset
498 headers = buffer_create_dynamic(pool_datastack_create(), 128);
3300
23fceec1e5c9 Some possible fix for HEADER searches and cleanup
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
499 for (; args != NULL; args = args->next)
23fceec1e5c9 Some possible fix for HEADER searches and cleanup
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
500 search_arg_analyze(args, headers, have_body, &have_text);
1672
8920600a8cfc Index cache file rewrite. It's not finished yet and mbox support is
Timo Sirainen <tss@iki.fi>
parents: 1375
diff changeset
501
3300
23fceec1e5c9 Some possible fix for HEADER searches and cleanup
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
502 *have_headers = have_text || headers->used != 0;
23fceec1e5c9 Some possible fix for HEADER searches and cleanup
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
503
23fceec1e5c9 Some possible fix for HEADER searches and cleanup
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
504 if (headers->used == 0 || have_text)
1672
8920600a8cfc Index cache file rewrite. It's not finished yet and mbox support is
Timo Sirainen <tss@iki.fi>
parents: 1375
diff changeset
505 return NULL;
8920600a8cfc Index cache file rewrite. It's not finished yet and mbox support is
Timo Sirainen <tss@iki.fi>
parents: 1375
diff changeset
506
8920600a8cfc Index cache file rewrite. It's not finished yet and mbox support is
Timo Sirainen <tss@iki.fi>
parents: 1375
diff changeset
507 buffer_append(headers, &null, sizeof(const char *));
8920600a8cfc Index cache file rewrite. It's not finished yet and mbox support is
Timo Sirainen <tss@iki.fi>
parents: 1375
diff changeset
508 return buffer_get_data(headers, NULL);
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
509 }
6899
69babcc2fb80 Simplify search arguments immediately when calling mailbox_search_init().
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
510
6965
ae369569e7de SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents: 6964
diff changeset
511 static struct mail_keywords *
ae369569e7de SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents: 6964
diff changeset
512 mail_search_keywords_merge(struct mail_keywords **_kw1,
ae369569e7de SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents: 6964
diff changeset
513 struct mail_keywords **_kw2)
ae369569e7de SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents: 6964
diff changeset
514 {
ae369569e7de SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents: 6964
diff changeset
515 struct mail_keywords *kw1 = *_kw1, *kw2 = *_kw2;
ae369569e7de SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents: 6964
diff changeset
516 struct mail_keywords *new_kw;
ae369569e7de SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents: 6964
diff changeset
517
ae369569e7de SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents: 6964
diff changeset
518 i_assert(kw1->index == kw2->index);
7226
e6693a0ec8e1 Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
519 T_BEGIN {
6965
ae369569e7de SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents: 6964
diff changeset
520 ARRAY_TYPE(keyword_indexes) new_indexes;
ae369569e7de SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents: 6964
diff changeset
521 unsigned int i, j;
ae369569e7de SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents: 6964
diff changeset
522
ae369569e7de SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents: 6964
diff changeset
523 t_array_init(&new_indexes, kw1->count + kw2->count + 1);
ae369569e7de SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents: 6964
diff changeset
524 array_append(&new_indexes, kw1->idx, kw1->count);
ae369569e7de SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents: 6964
diff changeset
525 for (i = 0; i < kw2->count; i++) {
ae369569e7de SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents: 6964
diff changeset
526 /* don't add duplicates */
ae369569e7de SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents: 6964
diff changeset
527 for (j = 0; j < kw1->count; j++) {
ae369569e7de SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents: 6964
diff changeset
528 if (kw1->idx[j] == kw2->idx[i])
ae369569e7de SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents: 6964
diff changeset
529 break;
ae369569e7de SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents: 6964
diff changeset
530 }
ae369569e7de SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents: 6964
diff changeset
531 if (j == kw1->count)
ae369569e7de SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents: 6964
diff changeset
532 array_append(&new_indexes, kw2->idx+i, 1);
ae369569e7de SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents: 6964
diff changeset
533 }
ae369569e7de SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents: 6964
diff changeset
534 new_kw = mail_index_keywords_create_from_indexes(kw1->index,
ae369569e7de SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents: 6964
diff changeset
535 &new_indexes);
7226
e6693a0ec8e1 Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
536 } T_END;
6965
ae369569e7de SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents: 6964
diff changeset
537 mail_index_keywords_free(_kw1);
ae369569e7de SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents: 6964
diff changeset
538 mail_index_keywords_free(_kw2);
ae369569e7de SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents: 6964
diff changeset
539 return new_kw;
ae369569e7de SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents: 6964
diff changeset
540 }
ae369569e7de SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents: 6964
diff changeset
541
6899
69babcc2fb80 Simplify search arguments immediately when calling mailbox_search_init().
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
542 static void
69babcc2fb80 Simplify search arguments immediately when calling mailbox_search_init().
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
543 mail_search_args_simplify_sub(struct mail_search_arg *args, bool parent_and)
69babcc2fb80 Simplify search arguments immediately when calling mailbox_search_init().
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
544 {
6963
5fb86ed98860 Merge SEARCH_FLAGS arguments when possible.
Timo Sirainen <tss@iki.fi>
parents: 6899
diff changeset
545 struct mail_search_arg *sub, *prev = NULL;
5fb86ed98860 Merge SEARCH_FLAGS arguments when possible.
Timo Sirainen <tss@iki.fi>
parents: 6899
diff changeset
546 struct mail_search_arg *prev_flags_arg, *prev_not_flags_arg;
6965
ae369569e7de SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents: 6964
diff changeset
547 struct mail_search_arg *prev_kw_arg, *prev_not_kw_arg;
6899
69babcc2fb80 Simplify search arguments immediately when calling mailbox_search_init().
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
548
6963
5fb86ed98860 Merge SEARCH_FLAGS arguments when possible.
Timo Sirainen <tss@iki.fi>
parents: 6899
diff changeset
549 prev_flags_arg = prev_not_flags_arg = NULL;
6965
ae369569e7de SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents: 6964
diff changeset
550 prev_kw_arg = prev_not_kw_arg = NULL;
7908
1e69c84a1e5a Search code cleanups and minor optimizations.
Timo Sirainen <tss@iki.fi>
parents: 7655
diff changeset
551 while (args != NULL) {
6899
69babcc2fb80 Simplify search arguments immediately when calling mailbox_search_init().
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
552 if (args->not && (args->type == SEARCH_SUB ||
69babcc2fb80 Simplify search arguments immediately when calling mailbox_search_init().
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
553 args->type == SEARCH_OR)) {
69babcc2fb80 Simplify search arguments immediately when calling mailbox_search_init().
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
554 /* neg(p and q and ..) == neg(p) or neg(q) or ..
69babcc2fb80 Simplify search arguments immediately when calling mailbox_search_init().
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
555 neg(p or q or ..) == neg(p) and neg(q) and .. */
69babcc2fb80 Simplify search arguments immediately when calling mailbox_search_init().
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
556 args->type = args->type == SEARCH_SUB ?
69babcc2fb80 Simplify search arguments immediately when calling mailbox_search_init().
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
557 SEARCH_OR : SEARCH_SUB;
69babcc2fb80 Simplify search arguments immediately when calling mailbox_search_init().
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
558 args->not = FALSE;
69babcc2fb80 Simplify search arguments immediately when calling mailbox_search_init().
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
559 sub = args->value.subargs;
69babcc2fb80 Simplify search arguments immediately when calling mailbox_search_init().
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
560 for (; sub != NULL; sub = sub->next)
69babcc2fb80 Simplify search arguments immediately when calling mailbox_search_init().
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
561 sub->not = !sub->not;
69babcc2fb80 Simplify search arguments immediately when calling mailbox_search_init().
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
562 }
69babcc2fb80 Simplify search arguments immediately when calling mailbox_search_init().
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
563
69babcc2fb80 Simplify search arguments immediately when calling mailbox_search_init().
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
564 if ((args->type == SEARCH_SUB && parent_and) ||
7908
1e69c84a1e5a Search code cleanups and minor optimizations.
Timo Sirainen <tss@iki.fi>
parents: 7655
diff changeset
565 (args->type == SEARCH_OR && !parent_and) ||
1e69c84a1e5a Search code cleanups and minor optimizations.
Timo Sirainen <tss@iki.fi>
parents: 7655
diff changeset
566 ((args->type == SEARCH_SUB || args->type == SEARCH_OR) &&
1e69c84a1e5a Search code cleanups and minor optimizations.
Timo Sirainen <tss@iki.fi>
parents: 7655
diff changeset
567 args->value.subargs->next == NULL)) {
6899
69babcc2fb80 Simplify search arguments immediately when calling mailbox_search_init().
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
568 /* p and (q and ..) == p and q and ..
7908
1e69c84a1e5a Search code cleanups and minor optimizations.
Timo Sirainen <tss@iki.fi>
parents: 7655
diff changeset
569 p or (q or ..) == p or q or ..
1e69c84a1e5a Search code cleanups and minor optimizations.
Timo Sirainen <tss@iki.fi>
parents: 7655
diff changeset
570 (p) = p */
6899
69babcc2fb80 Simplify search arguments immediately when calling mailbox_search_init().
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
571 sub = args->value.subargs;
69babcc2fb80 Simplify search arguments immediately when calling mailbox_search_init().
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
572 for (; sub->next != NULL; sub = sub->next) ;
69babcc2fb80 Simplify search arguments immediately when calling mailbox_search_init().
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
573 sub->next = args->next;
69babcc2fb80 Simplify search arguments immediately when calling mailbox_search_init().
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
574 *args = *args->value.subargs;
69babcc2fb80 Simplify search arguments immediately when calling mailbox_search_init().
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
575 continue;
69babcc2fb80 Simplify search arguments immediately when calling mailbox_search_init().
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
576 }
69babcc2fb80 Simplify search arguments immediately when calling mailbox_search_init().
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
577
7909
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
578 if (args->type == SEARCH_SUB ||
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
579 args->type == SEARCH_OR ||
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
580 args->type == SEARCH_INTHREAD) {
6899
69babcc2fb80 Simplify search arguments immediately when calling mailbox_search_init().
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
581 mail_search_args_simplify_sub(args->value.subargs,
7909
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
582 args->type != SEARCH_OR);
6899
69babcc2fb80 Simplify search arguments immediately when calling mailbox_search_init().
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
583 }
6963
5fb86ed98860 Merge SEARCH_FLAGS arguments when possible.
Timo Sirainen <tss@iki.fi>
parents: 6899
diff changeset
584
5fb86ed98860 Merge SEARCH_FLAGS arguments when possible.
Timo Sirainen <tss@iki.fi>
parents: 6899
diff changeset
585 /* merge all flags arguments */
6964
b9d674728523 We can't always merge SEARCH_FLAGS.
Timo Sirainen <tss@iki.fi>
parents: 6963
diff changeset
586 if (args->type == SEARCH_FLAGS && !args->not && parent_and) {
6963
5fb86ed98860 Merge SEARCH_FLAGS arguments when possible.
Timo Sirainen <tss@iki.fi>
parents: 6899
diff changeset
587 if (prev_flags_arg == NULL)
5fb86ed98860 Merge SEARCH_FLAGS arguments when possible.
Timo Sirainen <tss@iki.fi>
parents: 6899
diff changeset
588 prev_flags_arg = args;
5fb86ed98860 Merge SEARCH_FLAGS arguments when possible.
Timo Sirainen <tss@iki.fi>
parents: 6899
diff changeset
589 else {
5fb86ed98860 Merge SEARCH_FLAGS arguments when possible.
Timo Sirainen <tss@iki.fi>
parents: 6899
diff changeset
590 prev_flags_arg->value.flags |=
5fb86ed98860 Merge SEARCH_FLAGS arguments when possible.
Timo Sirainen <tss@iki.fi>
parents: 6899
diff changeset
591 args->value.flags;
5fb86ed98860 Merge SEARCH_FLAGS arguments when possible.
Timo Sirainen <tss@iki.fi>
parents: 6899
diff changeset
592 prev->next = args->next;
5fb86ed98860 Merge SEARCH_FLAGS arguments when possible.
Timo Sirainen <tss@iki.fi>
parents: 6899
diff changeset
593 args = args->next;
5fb86ed98860 Merge SEARCH_FLAGS arguments when possible.
Timo Sirainen <tss@iki.fi>
parents: 6899
diff changeset
594 continue;
5fb86ed98860 Merge SEARCH_FLAGS arguments when possible.
Timo Sirainen <tss@iki.fi>
parents: 6899
diff changeset
595 }
6964
b9d674728523 We can't always merge SEARCH_FLAGS.
Timo Sirainen <tss@iki.fi>
parents: 6963
diff changeset
596 } else if (args->type == SEARCH_FLAGS && args->not &&
b9d674728523 We can't always merge SEARCH_FLAGS.
Timo Sirainen <tss@iki.fi>
parents: 6963
diff changeset
597 !parent_and) {
6963
5fb86ed98860 Merge SEARCH_FLAGS arguments when possible.
Timo Sirainen <tss@iki.fi>
parents: 6899
diff changeset
598 if (prev_not_flags_arg == NULL)
5fb86ed98860 Merge SEARCH_FLAGS arguments when possible.
Timo Sirainen <tss@iki.fi>
parents: 6899
diff changeset
599 prev_not_flags_arg = args;
5fb86ed98860 Merge SEARCH_FLAGS arguments when possible.
Timo Sirainen <tss@iki.fi>
parents: 6899
diff changeset
600 else {
5fb86ed98860 Merge SEARCH_FLAGS arguments when possible.
Timo Sirainen <tss@iki.fi>
parents: 6899
diff changeset
601 prev_not_flags_arg->value.flags |=
5fb86ed98860 Merge SEARCH_FLAGS arguments when possible.
Timo Sirainen <tss@iki.fi>
parents: 6899
diff changeset
602 args->value.flags;
5fb86ed98860 Merge SEARCH_FLAGS arguments when possible.
Timo Sirainen <tss@iki.fi>
parents: 6899
diff changeset
603 prev->next = args->next;
5fb86ed98860 Merge SEARCH_FLAGS arguments when possible.
Timo Sirainen <tss@iki.fi>
parents: 6899
diff changeset
604 args = args->next;
5fb86ed98860 Merge SEARCH_FLAGS arguments when possible.
Timo Sirainen <tss@iki.fi>
parents: 6899
diff changeset
605 continue;
5fb86ed98860 Merge SEARCH_FLAGS arguments when possible.
Timo Sirainen <tss@iki.fi>
parents: 6899
diff changeset
606 }
5fb86ed98860 Merge SEARCH_FLAGS arguments when possible.
Timo Sirainen <tss@iki.fi>
parents: 6899
diff changeset
607 }
5fb86ed98860 Merge SEARCH_FLAGS arguments when possible.
Timo Sirainen <tss@iki.fi>
parents: 6899
diff changeset
608
6965
ae369569e7de SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents: 6964
diff changeset
609 /* merge all keywords arguments */
ae369569e7de SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents: 6964
diff changeset
610 if (args->type == SEARCH_KEYWORDS && !args->not && parent_and) {
ae369569e7de SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents: 6964
diff changeset
611 if (prev_kw_arg == NULL)
ae369569e7de SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents: 6964
diff changeset
612 prev_kw_arg = args;
ae369569e7de SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents: 6964
diff changeset
613 else {
ae369569e7de SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents: 6964
diff changeset
614 prev_kw_arg->value.keywords =
ae369569e7de SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents: 6964
diff changeset
615 mail_search_keywords_merge(
ae369569e7de SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents: 6964
diff changeset
616 &prev_kw_arg->value.keywords,
ae369569e7de SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents: 6964
diff changeset
617 &args->value.keywords);
ae369569e7de SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents: 6964
diff changeset
618 prev->next = args->next;
ae369569e7de SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents: 6964
diff changeset
619 args = args->next;
ae369569e7de SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents: 6964
diff changeset
620 continue;
ae369569e7de SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents: 6964
diff changeset
621 }
ae369569e7de SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents: 6964
diff changeset
622 } else if (args->type == SEARCH_KEYWORDS && args->not &&
ae369569e7de SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents: 6964
diff changeset
623 !parent_and) {
ae369569e7de SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents: 6964
diff changeset
624 if (prev_not_kw_arg == NULL)
ae369569e7de SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents: 6964
diff changeset
625 prev_not_kw_arg = args;
ae369569e7de SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents: 6964
diff changeset
626 else {
ae369569e7de SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents: 6964
diff changeset
627 prev_not_kw_arg->value.keywords =
ae369569e7de SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents: 6964
diff changeset
628 mail_search_keywords_merge(
ae369569e7de SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents: 6964
diff changeset
629 &prev_not_kw_arg->value.keywords,
ae369569e7de SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents: 6964
diff changeset
630 &args->value.keywords);
ae369569e7de SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents: 6964
diff changeset
631 prev->next = args->next;
ae369569e7de SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents: 6964
diff changeset
632 args = args->next;
ae369569e7de SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents: 6964
diff changeset
633 continue;
ae369569e7de SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents: 6964
diff changeset
634 }
ae369569e7de SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents: 6964
diff changeset
635 }
ae369569e7de SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents: 6964
diff changeset
636
6963
5fb86ed98860 Merge SEARCH_FLAGS arguments when possible.
Timo Sirainen <tss@iki.fi>
parents: 6899
diff changeset
637 prev = args;
6899
69babcc2fb80 Simplify search arguments immediately when calling mailbox_search_init().
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
638 args = args->next;
69babcc2fb80 Simplify search arguments immediately when calling mailbox_search_init().
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
639 }
69babcc2fb80 Simplify search arguments immediately when calling mailbox_search_init().
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
640 }
69babcc2fb80 Simplify search arguments immediately when calling mailbox_search_init().
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
641
7909
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
642 static bool
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
643 mail_search_args_unnest_inthreads(struct mail_search_args *args,
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
644 struct mail_search_arg **argp,
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
645 bool parent_inthreads, bool parent_and)
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
646 {
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
647 struct mail_search_arg *arg, *thread_arg, *or_arg;
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
648 bool child_inthreads = FALSE, non_inthreads = FALSE;
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
649
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
650 for (arg = *argp; arg != NULL; arg = arg->next) {
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
651 switch (arg->type) {
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
652 case SEARCH_SUB:
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
653 case SEARCH_OR:
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
654 if (!mail_search_args_unnest_inthreads(args,
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
655 &arg->value.subargs, parent_inthreads,
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
656 arg->type != SEARCH_OR)) {
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
657 arg->result = 1;
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
658 child_inthreads = TRUE;
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
659 } else {
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
660 arg->result = 0;
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
661 non_inthreads = TRUE;
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
662 }
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
663 break;
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
664 case SEARCH_INTHREAD:
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
665 if (mail_search_args_unnest_inthreads(args,
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
666 &arg->value.subargs, TRUE, TRUE)) {
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
667 /* children converted to SEARCH_INTHREADs */
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
668 arg->type = SEARCH_SUB;
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
669 }
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
670 args->have_inthreads = TRUE;
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
671 arg->result = 1;
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
672 child_inthreads = TRUE;
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
673 break;
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
674 default:
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
675 arg->result = 0;
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
676 non_inthreads = TRUE;
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
677 break;
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
678 }
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
679 }
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
680
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
681 if (!parent_inthreads || !child_inthreads || !non_inthreads)
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
682 return FALSE;
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
683
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
684 /* put all non-INTHREADs under a single INTHREAD */
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
685 thread_arg = p_new(args->pool, struct mail_search_arg, 1);
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
686 thread_arg->type = SEARCH_INTHREAD;
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
687
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
688 while (*argp != NULL) {
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
689 arg = *argp;
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
690 argp = &(*argp)->next;
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
691
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
692 if (arg->result == 0) {
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
693 /* not an INTHREAD or a SUB/OR with only INTHREADs */
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
694 arg->next = thread_arg->value.subargs;
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
695 thread_arg->value.subargs = arg;
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
696 }
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
697 }
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
698 if (!parent_and) {
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
699 /* We want to OR the args */
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
700 or_arg = p_new(args->pool, struct mail_search_arg, 1);
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
701 or_arg->type = SEARCH_OR;
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
702 or_arg->value.subargs = thread_arg->value.subargs;
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
703 thread_arg->value.subargs = or_arg;
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
704 }
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
705 return TRUE;
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
706 }
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
707
7908
1e69c84a1e5a Search code cleanups and minor optimizations.
Timo Sirainen <tss@iki.fi>
parents: 7655
diff changeset
708 void mail_search_args_simplify(struct mail_search_args *args)
6899
69babcc2fb80 Simplify search arguments immediately when calling mailbox_search_init().
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
709 {
7908
1e69c84a1e5a Search code cleanups and minor optimizations.
Timo Sirainen <tss@iki.fi>
parents: 7655
diff changeset
710 args->simplified = TRUE;
7909
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
711
7908
1e69c84a1e5a Search code cleanups and minor optimizations.
Timo Sirainen <tss@iki.fi>
parents: 7655
diff changeset
712 mail_search_args_simplify_sub(args->args, TRUE);
7909
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
713 if (mail_search_args_unnest_inthreads(args, &args->args,
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
714 FALSE, TRUE)) {
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
715 /* we may have added some extra SUBs that could be dropped */
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
716 mail_search_args_simplify_sub(args->args, TRUE);
bf9c51edbc66 Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents: 7908
diff changeset
717 }
6899
69babcc2fb80 Simplify search arguments immediately when calling mailbox_search_init().
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
718 }
8144
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
719
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
720 static bool mail_search_arg_one_equals(const struct mail_search_arg *arg1,
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
721 const struct mail_search_arg *arg2)
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
722 {
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
723 if (arg1->type != arg2->type ||
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
724 arg1->not != arg2->not)
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
725 return FALSE;
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
726
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
727 switch (arg1->type) {
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
728 case SEARCH_OR:
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
729 case SEARCH_SUB:
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
730 return mail_search_arg_equals(arg1->value.subargs,
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
731 arg2->value.subargs);
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
732
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
733 case SEARCH_ALL:
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
734 return TRUE;
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
735 case SEARCH_SEQSET:
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
736 /* sequences may point to different messages at different times,
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
737 never assume they match */
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
738 return FALSE;
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
739 case SEARCH_UIDSET:
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
740 return array_cmp(&arg1->value.seqset, &arg2->value.seqset);
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
741
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
742 case SEARCH_FLAGS:
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
743 return arg1->value.flags == arg2->value.flags;
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
744 case SEARCH_KEYWORDS:
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
745 return strcasecmp(arg1->value.str, arg2->value.str);
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
746
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
747 case SEARCH_BEFORE:
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
748 case SEARCH_ON:
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
749 case SEARCH_SINCE:
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
750 case SEARCH_SENTBEFORE:
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
751 case SEARCH_SENTON:
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
752 case SEARCH_SENTSINCE:
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
753 return arg1->value.time == arg2->value.time;
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
754
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
755 case SEARCH_SMALLER:
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
756 case SEARCH_LARGER:
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
757 return arg1->value.size == arg2->value.size;
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
758
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
759 case SEARCH_HEADER:
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
760 case SEARCH_HEADER_ADDRESS:
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
761 case SEARCH_HEADER_COMPRESS_LWSP:
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
762 if (strcasecmp(arg1->hdr_field_name, arg2->hdr_field_name) != 0)
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
763 return FALSE;
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
764 /* fall through */
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
765 case SEARCH_BODY:
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
766 case SEARCH_TEXT:
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
767 case SEARCH_BODY_FAST:
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
768 case SEARCH_TEXT_FAST:
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
769 case SEARCH_GUID:
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
770 case SEARCH_MAILBOX:
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
771 /* don't bother doing case-insensitive comparison. it must not
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
772 be done for guid/mailbox, and for others we should support
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
773 full i18n case-insensitivity (or the active comparator
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
774 in future). */
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
775 return strcmp(arg1->value.str, arg2->value.str);
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
776
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
777 case SEARCH_MODSEQ: {
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
778 const struct mail_search_modseq *m1 = arg1->value.modseq;
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
779 const struct mail_search_modseq *m2 = arg2->value.modseq;
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
780
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
781 return m1->modseq == m2->modseq &&
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
782 m1->type == m2->type;
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
783 }
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
784 case SEARCH_INTHREAD:
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
785 return mail_search_args_equal(arg1->value.search_args,
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
786 arg2->value.search_args);
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
787 }
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
788 i_unreached();
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
789 return FALSE;
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
790 }
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
791
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
792 static bool mail_search_arg_equals(const struct mail_search_arg *arg1,
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
793 const struct mail_search_arg *arg2)
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
794 {
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
795 while (arg1 != NULL && arg2 != NULL) {
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
796 if (!mail_search_arg_one_equals(arg1, arg2))
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
797 return FALSE;
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
798 arg1 = arg1->next;
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
799 arg2 = arg2->next;
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
800 }
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
801 return arg1 == NULL && arg2 == NULL;
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
802 }
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
803
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
804 bool mail_search_args_equal(const struct mail_search_args *args1,
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
805 const struct mail_search_args *args2)
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
806 {
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
807 i_assert(args1->simplified == args2->simplified);
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
808 i_assert(args1->box == args2->box);
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
809
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
810 if (null_strcmp(args1->charset, args2->charset) != 0)
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
811 return FALSE;
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
812
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
813 return mail_search_arg_equals(args1->args, args2->args);
ea5f84256c3f Added mail_search_args_equal().
Timo Sirainen <tss@iki.fi>
parents: 7909
diff changeset
814 }