aboutsummaryrefslogtreecommitdiffhomepage
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/message.cc4
-rw-r--r--lib/messages.c17
-rw-r--r--lib/notmuch-private.h6
-rw-r--r--lib/notmuch.h13
-rw-r--r--lib/query.cc10
-rw-r--r--lib/thread.cc64
6 files changed, 55 insertions, 59 deletions
diff --git a/lib/message.cc b/lib/message.cc
index 320901f7..8720c1b5 100644
--- a/lib/message.cc
+++ b/lib/message.cc
@@ -462,9 +462,9 @@ notmuch_message_get_thread_id (notmuch_message_t *message)
void
_notmuch_message_add_reply (notmuch_message_t *message,
- notmuch_message_node_t *reply)
+ notmuch_message_t *reply)
{
- _notmuch_message_list_append (message->replies, reply);
+ _notmuch_message_list_add_message (message->replies, reply);
}
notmuch_messages_t *
diff --git a/lib/messages.c b/lib/messages.c
index 11218648..0eee5690 100644
--- a/lib/messages.c
+++ b/lib/messages.c
@@ -42,19 +42,7 @@ _notmuch_message_list_create (const void *ctx)
return list;
}
-/* Append a single 'node' to the end of 'list'.
- */
-void
-_notmuch_message_list_append (notmuch_message_list_t *list,
- notmuch_message_node_t *node)
-{
- *(list->tail) = node;
- list->tail = &node->next;
-}
-
-/* Allocate a new node for 'message' and append it to the end of
- * 'list'.
- */
+/* Append 'message' to the end of 'list'. */
void
_notmuch_message_list_add_message (notmuch_message_list_t *list,
notmuch_message_t *message)
@@ -64,7 +52,8 @@ _notmuch_message_list_add_message (notmuch_message_list_t *list,
node->message = message;
node->next = NULL;
- _notmuch_message_list_append (list, node);
+ *(list->tail) = node;
+ list->tail = &node->next;
}
notmuch_messages_t *
diff --git a/lib/notmuch-private.h b/lib/notmuch-private.h
index 7a409f54..f38ccb39 100644
--- a/lib/notmuch-private.h
+++ b/lib/notmuch-private.h
@@ -429,10 +429,6 @@ notmuch_message_list_t *
_notmuch_message_list_create (const void *ctx);
void
-_notmuch_message_list_append (notmuch_message_list_t *list,
- notmuch_message_node_t *node);
-
-void
_notmuch_message_list_add_message (notmuch_message_list_t *list,
notmuch_message_t *message);
@@ -462,7 +458,7 @@ _notmuch_doc_id_set_remove (notmuch_doc_id_set_t *doc_ids,
void
_notmuch_message_add_reply (notmuch_message_t *message,
- notmuch_message_node_t *reply);
+ notmuch_message_t *reply);
/* sha1.c */
diff --git a/lib/notmuch.h b/lib/notmuch.h
index 3633bedd..37393367 100644
--- a/lib/notmuch.h
+++ b/lib/notmuch.h
@@ -719,20 +719,21 @@ int
notmuch_thread_get_total_messages (notmuch_thread_t *thread);
/* Get a notmuch_messages_t iterator for the top-level messages in
- * 'thread'.
+ * 'thread' in oldest-first order.
*
* This iterator will not necessarily iterate over all of the messages
* in the thread. It will only iterate over the messages in the thread
* which are not replies to other messages in the thread.
- *
- * To iterate over all messages in the thread, the caller will need to
- * iterate over the result of notmuch_message_get_replies for each
- * top-level message (and do that recursively for the resulting
- * messages, etc.).
*/
notmuch_messages_t *
notmuch_thread_get_toplevel_messages (notmuch_thread_t *thread);
+/* Get a notmuch_thread_t iterator for all messages in 'thread' in
+ * oldest-first order.
+ */
+notmuch_messages_t *
+notmuch_thread_get_messages (notmuch_thread_t *thread);
+
/* Get the number of messages in 'thread' that matched the search.
*
* This count includes only the messages in this thread that were
diff --git a/lib/query.cc b/lib/query.cc
index e9c1a2d1..7381a545 100644
--- a/lib/query.cc
+++ b/lib/query.cc
@@ -39,12 +39,12 @@ typedef struct _notmuch_mset_messages {
} notmuch_mset_messages_t;
struct _notmuch_doc_id_set {
- unsigned int *bitmap;
+ unsigned char *bitmap;
unsigned int bound;
};
-#define DOCIDSET_WORD(bit) ((bit) / sizeof (unsigned int))
-#define DOCIDSET_BIT(bit) ((bit) % sizeof (unsigned int))
+#define DOCIDSET_WORD(bit) ((bit) / CHAR_BIT)
+#define DOCIDSET_BIT(bit) ((bit) % CHAR_BIT)
struct visible _notmuch_threads {
notmuch_query_t *query;
@@ -359,11 +359,11 @@ _notmuch_doc_id_set_init (void *ctx,
GArray *arr)
{
unsigned int max = 0;
- unsigned int *bitmap;
+ unsigned char *bitmap;
for (unsigned int i = 0; i < arr->len; i++)
max = MAX(max, g_array_index (arr, unsigned int, i));
- bitmap = talloc_zero_array (ctx, unsigned int, 1 + max / sizeof (*bitmap));
+ bitmap = talloc_zero_array (ctx, unsigned char, DOCIDSET_WORD(max) + 1);
if (bitmap == NULL)
return FALSE;
diff --git a/lib/thread.cc b/lib/thread.cc
index e976d643..c126aac8 100644
--- a/lib/thread.cc
+++ b/lib/thread.cc
@@ -35,7 +35,11 @@ struct visible _notmuch_thread {
char *authors;
GHashTable *tags;
+ /* All messages, oldest first. */
notmuch_message_list_t *message_list;
+ /* Top-level messages, oldest first. */
+ notmuch_message_list_t *toplevel_list;
+
GHashTable *message_hash;
int total_messages;
int matched_messages;
@@ -345,29 +349,22 @@ _thread_add_matched_message (notmuch_thread_t *thread,
}
static void
-_resolve_thread_relationships (unused (notmuch_thread_t *thread))
+_resolve_thread_relationships (notmuch_thread_t *thread)
{
- notmuch_message_node_t **prev, *node;
+ notmuch_message_node_t *node;
notmuch_message_t *message, *parent;
const char *in_reply_to;
- prev = &thread->message_list->head;
- while ((node = *prev)) {
+ for (node = thread->message_list->head; node; node = node->next) {
message = node->message;
in_reply_to = _notmuch_message_get_in_reply_to (message);
if (in_reply_to && strlen (in_reply_to) &&
g_hash_table_lookup_extended (thread->message_hash,
in_reply_to, NULL,
(void **) &parent))
- {
- *prev = node->next;
- if (thread->message_list->tail == &node->next)
- thread->message_list->tail = prev;
- node->next = NULL;
- _notmuch_message_add_reply (parent, node);
- } else {
- prev = &((*prev)->next);
- }
+ _notmuch_message_add_reply (parent, message);
+ else
+ _notmuch_message_list_add_message (thread->toplevel_list, message);
}
/* XXX: After scanning through the entire list looking for parents
@@ -406,7 +403,8 @@ _notmuch_thread_create (void *ctx,
notmuch_string_list_t *exclude_terms,
notmuch_sort_t sort)
{
- notmuch_thread_t *thread;
+ void *local = talloc_new (ctx);
+ notmuch_thread_t *thread = NULL;
notmuch_message_t *seed_message;
const char *thread_id;
char *thread_id_query_string;
@@ -415,24 +413,23 @@ _notmuch_thread_create (void *ctx,
notmuch_messages_t *messages;
notmuch_message_t *message;
- seed_message = _notmuch_message_create (ctx, notmuch, seed_doc_id, NULL);
+ seed_message = _notmuch_message_create (local, notmuch, seed_doc_id, NULL);
if (! seed_message)
INTERNAL_ERROR ("Thread seed message %u does not exist", seed_doc_id);
thread_id = notmuch_message_get_thread_id (seed_message);
- thread_id_query_string = talloc_asprintf (ctx, "thread:%s", thread_id);
+ thread_id_query_string = talloc_asprintf (local, "thread:%s", thread_id);
if (unlikely (thread_id_query_string == NULL))
- return NULL;
+ goto DONE;
- thread_id_query = notmuch_query_create (notmuch, thread_id_query_string);
+ thread_id_query = talloc_steal (
+ local, notmuch_query_create (notmuch, thread_id_query_string));
if (unlikely (thread_id_query == NULL))
- return NULL;
+ goto DONE;
- talloc_free (thread_id_query_string);
-
- thread = talloc (ctx, notmuch_thread_t);
+ thread = talloc (local, notmuch_thread_t);
if (unlikely (thread == NULL))
- return NULL;
+ goto DONE;
talloc_set_destructor (thread, _notmuch_thread_destructor);
@@ -451,8 +448,12 @@ _notmuch_thread_create (void *ctx,
free, NULL);
thread->message_list = _notmuch_message_list_create (thread);
- if (unlikely (thread->message_list == NULL))
- return NULL;
+ thread->toplevel_list = _notmuch_message_list_create (thread);
+ if (unlikely (thread->message_list == NULL ||
+ thread->toplevel_list == NULL)) {
+ thread = NULL;
+ goto DONE;
+ }
thread->message_hash = g_hash_table_new_full (g_str_hash, g_str_equal,
free, NULL);
@@ -489,18 +490,27 @@ _notmuch_thread_create (void *ctx,
_notmuch_message_close (message);
}
- notmuch_query_destroy (thread_id_query);
-
_resolve_thread_authors_string (thread);
_resolve_thread_relationships (thread);
+ /* Commit to returning thread. */
+ talloc_steal (ctx, thread);
+
+ DONE:
+ talloc_free (local);
return thread;
}
notmuch_messages_t *
notmuch_thread_get_toplevel_messages (notmuch_thread_t *thread)
{
+ return _notmuch_messages_create (thread->toplevel_list);
+}
+
+notmuch_messages_t *
+notmuch_thread_get_messages (notmuch_thread_t *thread)
+{
return _notmuch_messages_create (thread->message_list);
}