Mercurial > dovecot > original-hg > dovecot-1.2
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 |
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 | 2 |
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 | 8 #include "mail-search-build.h" |
0 | 9 #include "mail-search.h" |
10 | |
9043 | 11 static struct mail_search_arg * |
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 | 245 static struct mail_search_arg * |
246 mail_search_arg_dup_one(pool_t pool, const struct mail_search_arg *arg) | |
247 { | |
248 struct mail_search_arg *new_arg; | |
249 | |
250 new_arg = p_new(pool, struct mail_search_arg, 1); | |
251 new_arg->type = arg->type; | |
252 new_arg->not = arg->not; | |
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 | 255 |
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 | 260 case SEARCH_OR: |
261 case SEARCH_SUB: | |
262 new_arg->value.subargs = | |
263 mail_search_arg_dup(pool, arg->value.subargs); | |
264 break; | |
265 case SEARCH_ALL: | |
266 break; | |
267 case SEARCH_SEQSET: | |
268 case SEARCH_UIDSET: | |
269 p_array_init(&new_arg->value.seqset, pool, | |
270 array_count(&arg->value.seqset)); | |
271 array_append_array(&new_arg->value.seqset, &arg->value.seqset); | |
272 break; | |
273 case SEARCH_FLAGS: | |
274 new_arg->value.flags = arg->value.flags; | |
275 break; | |
276 case SEARCH_BEFORE: | |
277 case SEARCH_ON: | |
278 case SEARCH_SINCE: | |
279 case SEARCH_SENTBEFORE: | |
280 case SEARCH_SENTON: | |
281 case SEARCH_SENTSINCE: | |
282 new_arg->value.time = arg->value.time; | |
283 break; | |
284 case SEARCH_SMALLER: | |
285 case SEARCH_LARGER: | |
286 new_arg->value.size = arg->value.size; | |
287 break; | |
288 case SEARCH_HEADER: | |
289 case SEARCH_HEADER_ADDRESS: | |
290 case SEARCH_HEADER_COMPRESS_LWSP: | |
291 new_arg->hdr_field_name = p_strdup(pool, arg->hdr_field_name); | |
292 /* fall through */ | |
293 case SEARCH_KEYWORDS: | |
294 case SEARCH_BODY: | |
295 case SEARCH_TEXT: | |
296 case SEARCH_BODY_FAST: | |
297 case SEARCH_TEXT_FAST: | |
298 case SEARCH_GUID: | |
299 case SEARCH_MAILBOX: | |
300 new_arg->value.str = p_strdup(pool, arg->value.str); | |
301 break; | |
302 | |
303 case SEARCH_MODSEQ: | |
304 new_arg->value.modseq = | |
305 p_new(pool, struct mail_search_modseq, 1); | |
306 *new_arg->value.modseq = *arg->value.modseq; | |
307 break; | |
308 } | |
309 return new_arg; | |
310 } | |
311 | |
312 static struct mail_search_arg * | |
313 mail_search_arg_dup(pool_t pool, const struct mail_search_arg *arg) | |
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 | 316 |
317 for (; arg != NULL; arg = arg->next) { | |
318 *dest = mail_search_arg_dup_one(pool, arg); | |
319 dest = &(*dest)->next; | |
320 } | |
321 return new_arg; | |
322 } | |
323 | |
324 struct mail_search_args * | |
325 mail_search_args_dup(const struct mail_search_args *args) | |
326 { | |
327 struct mail_search_args *new_args; | |
328 | |
329 new_args = mail_search_build_init(); | |
330 new_args->charset = p_strdup(new_args->pool, args->charset); | |
331 new_args->simplified = args->simplified; | |
332 new_args->have_inthreads = args->have_inthreads; | |
333 new_args->args = mail_search_arg_dup(new_args->pool, args->args); | |
334 return new_args; | |
335 } | |
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 | 338 { |
339 while (args != NULL) { | |
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 | 353 |
354 args = args->next; | |
355 } | |
356 } | |
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 | 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 | 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 | 365 return; |
366 | |
367 if (arg->type == SEARCH_SUB) { | |
368 /* sublist of conditions */ | |
369 i_assert(arg->value.subargs != NULL); | |
370 | |
371 arg->result = 1; | |
372 subarg = arg->value.subargs; | |
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 | 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 | 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 | 382 break; |
383 } | |
384 | |
385 subarg = subarg->next; | |
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 | 389 } else if (arg->type == SEARCH_OR) { |
390 /* OR-list of conditions */ | |
391 i_assert(arg->value.subargs != NULL); | |
392 | |
393 subarg = arg->value.subargs; | |
1375 | 394 arg->result = 0; |
0 | 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 | 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 | 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 | 405 } |
406 | |
407 subarg = subarg->next; | |
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 | 411 } else { |
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 | 414 } |
415 } | |
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 | 421 { |
422 int result; | |
423 | |
424 result = 1; | |
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 | 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 | 431 } |
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 | 435 } |
436 | |
437 return result; | |
438 } | |
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 | 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 | 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 | 448 return; |
449 | |
450 switch (arg->type) { | |
451 case SEARCH_OR: | |
452 case SEARCH_SUB: | |
453 subarg = arg->value.subargs; | |
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 | 458 } |
459 | |
460 subarg = subarg->next; | |
461 } | |
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 | 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 | 473 break; |
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 | 476 *have_body = TRUE; |
477 break; | |
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 | 480 *have_text = TRUE; |
2415 | 481 *have_body = TRUE; |
0 | 482 break; |
483 default: | |
484 break; | |
485 } | |
486 } | |
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 | 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 | 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 | 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 } |