annotate src/lib-storage/mail-thread.h @ 8146:70b53e9b232e HEAD

Rewrote thread indexing code. It's a lot simpler and takes less disk space. We no longer try to keep a hash table and the entire thread tree stored on disk. Instead we keep a simple Message-ID string (actually just "uid, ref#" pointer) -> unique index number mapping on disk, read it to memory and use it to build the thread tree. After the initial build the thread tree is still updated incrementally.
author Timo Sirainen <tss@iki.fi>
date Mon, 01 Sep 2008 15:17:00 +0300
parents d987e018483b
children 20e6fa42d081
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7796
37f23e0476e2 Moved threading code to lib-storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1 #ifndef MAIL_THREAD_H
37f23e0476e2 Moved threading code to lib-storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2 #define MAIL_THREAD_H
37f23e0476e2 Moved threading code to lib-storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3
7906
d987e018483b Thread code cleanups + fixes
Timo Sirainen <tss@iki.fi>
parents: 7796
diff changeset
4 struct mailbox;
d987e018483b Thread code cleanups + fixes
Timo Sirainen <tss@iki.fi>
parents: 7796
diff changeset
5 struct mail_search_args;
7796
37f23e0476e2 Moved threading code to lib-storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
6 struct mail_thread_context;
37f23e0476e2 Moved threading code to lib-storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
7
37f23e0476e2 Moved threading code to lib-storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
8 enum mail_thread_type {
37f23e0476e2 Moved threading code to lib-storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
9 MAIL_THREAD_NONE,
37f23e0476e2 Moved threading code to lib-storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
10 MAIL_THREAD_ORDEREDSUBJECT,
37f23e0476e2 Moved threading code to lib-storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
11 MAIL_THREAD_REFERENCES,
37f23e0476e2 Moved threading code to lib-storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
12 MAIL_THREAD_REFERENCES2
37f23e0476e2 Moved threading code to lib-storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
13 };
37f23e0476e2 Moved threading code to lib-storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
14
37f23e0476e2 Moved threading code to lib-storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
15 struct mail_thread_child_node {
37f23e0476e2 Moved threading code to lib-storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
16 /* Node's index in mail hash transaction */
37f23e0476e2 Moved threading code to lib-storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
17 uint32_t idx;
37f23e0476e2 Moved threading code to lib-storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
18 /* UID or sequence */
37f23e0476e2 Moved threading code to lib-storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
19 uint32_t uid;
37f23e0476e2 Moved threading code to lib-storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
20 /* Timestamp node was sorted with (depends on thread algorithm) */
37f23e0476e2 Moved threading code to lib-storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
21 time_t sort_date;
37f23e0476e2 Moved threading code to lib-storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
22 };
37f23e0476e2 Moved threading code to lib-storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
23 ARRAY_DEFINE_TYPE(mail_thread_child_node, struct mail_thread_child_node);
37f23e0476e2 Moved threading code to lib-storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
24
7906
d987e018483b Thread code cleanups + fixes
Timo Sirainen <tss@iki.fi>
parents: 7796
diff changeset
25 /* Convert thread type string to enum. Returns TRUE if ok, FALSE if type is
d987e018483b Thread code cleanups + fixes
Timo Sirainen <tss@iki.fi>
parents: 7796
diff changeset
26 unknown. */
d987e018483b Thread code cleanups + fixes
Timo Sirainen <tss@iki.fi>
parents: 7796
diff changeset
27 bool mail_thread_type_parse(const char *str, enum mail_thread_type *type_r);
d987e018483b Thread code cleanups + fixes
Timo Sirainen <tss@iki.fi>
parents: 7796
diff changeset
28
8146
70b53e9b232e Rewrote thread indexing code. It's a lot simpler and takes less disk space.
Timo Sirainen <tss@iki.fi>
parents: 7906
diff changeset
29 /* Build thread from given search arguments. args=NULL searches everything. */
70b53e9b232e Rewrote thread indexing code. It's a lot simpler and takes less disk space.
Timo Sirainen <tss@iki.fi>
parents: 7906
diff changeset
30 int mail_thread_init(struct mailbox *box, struct mail_search_args *args,
7796
37f23e0476e2 Moved threading code to lib-storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
31 struct mail_thread_context **ctx_r);
37f23e0476e2 Moved threading code to lib-storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
32 void mail_thread_deinit(struct mail_thread_context **ctx);
37f23e0476e2 Moved threading code to lib-storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
33
37f23e0476e2 Moved threading code to lib-storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
34 /* Iterate through thread tree. If write_seqs=TRUE, sequences are returned in
37f23e0476e2 Moved threading code to lib-storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
35 mail_thread_child_node.uid instead of UIDs. */
37f23e0476e2 Moved threading code to lib-storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
36 struct mail_thread_iterate_context *
37f23e0476e2 Moved threading code to lib-storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
37 mail_thread_iterate_init(struct mail_thread_context *ctx,
37f23e0476e2 Moved threading code to lib-storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
38 enum mail_thread_type thread_type, bool write_seqs);
37f23e0476e2 Moved threading code to lib-storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
39 /* If child_iter_r is not NULL, it's set to contain another iterator if the
37f23e0476e2 Moved threading code to lib-storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
40 returned node contains children. The returned iterator must be freed
37f23e0476e2 Moved threading code to lib-storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
41 explicitly. */
37f23e0476e2 Moved threading code to lib-storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
42 const struct mail_thread_child_node *
37f23e0476e2 Moved threading code to lib-storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
43 mail_thread_iterate_next(struct mail_thread_iterate_context *iter,
37f23e0476e2 Moved threading code to lib-storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
44 struct mail_thread_iterate_context **child_iter_r);
37f23e0476e2 Moved threading code to lib-storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
45 /* Returns number of nodes in the current iterator. */
37f23e0476e2 Moved threading code to lib-storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
46 unsigned int
37f23e0476e2 Moved threading code to lib-storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
47 mail_thread_iterate_count(struct mail_thread_iterate_context *iter);
37f23e0476e2 Moved threading code to lib-storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
48 /* Free the iterator. Iterators don't reference other iterators, so it doesn't
37f23e0476e2 Moved threading code to lib-storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
49 matter in which order they're freed. */
37f23e0476e2 Moved threading code to lib-storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
50 int mail_thread_iterate_deinit(struct mail_thread_iterate_context **iter);
37f23e0476e2 Moved threading code to lib-storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
51
37f23e0476e2 Moved threading code to lib-storage.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
52 #endif