]> git.notmuchmail.org Git - notmuch/blobdiff - message.cc
notmuch_message_get_message_id: Fix to cache result
[notmuch] / message.cc
index cce304ce29fc9199faa8b3616945e3e21bd74278..22c7598d05e6d721b31e3791e569e7da8bf4a210 100644 (file)
@@ -24,6 +24,9 @@
 #include <xapian.h>
 
 struct _notmuch_message {
+    notmuch_database_t *notmuch;
+    Xapian::docid doc_id;
+    char *message_id;
     Xapian::Document doc;
 };
 
@@ -32,6 +35,11 @@ struct _notmuch_tags {
     Xapian::TermIterator iterator_end;
 };
 
+struct _notmuch_thread_ids {
+    char *current;
+    char *next;
+};
+
 #define ARRAY_SIZE(arr) (sizeof (arr) / sizeof (arr[0]))
 
 /* These prefix values are specifically chosen to be compatible
@@ -61,6 +69,7 @@ prefix_t BOOLEAN_PREFIX[] = {
     { "email", "E" },
     { "date", "D" },
     { "label", "L" },
+    { "tag", "L" },
     { "source_id", "I" },
     { "attachment_extension", "O" },
     { "msgid", "Q" },
@@ -99,16 +108,19 @@ _notmuch_message_destructor (notmuch_message_t *message)
 }
 
 notmuch_message_t *
-_notmuch_message_create (notmuch_results_t *owner,
+_notmuch_message_create (const void *talloc_owner,
                         notmuch_database_t *notmuch,
-                        Xapian::docid doc_id)
+                        unsigned int doc_id)
 {
     notmuch_message_t *message;
 
-    message = talloc (owner, notmuch_message_t);
+    message = talloc (talloc_owner, notmuch_message_t);
     if (unlikely (message == NULL))
        return NULL;
 
+    message->notmuch = notmuch;
+    message->doc_id = doc_id;
+    message->message_id = NULL; /* lazily created */
     new (&message->doc) Xapian::Document;
 
     talloc_set_destructor (message, _notmuch_message_destructor);
@@ -123,12 +135,19 @@ notmuch_message_get_message_id (notmuch_message_t *message)
 {
     Xapian::TermIterator i;
 
+    if (message->message_id)
+       return message->message_id;
+
     i = message->doc.termlist_begin ();
-    i.skip_to ("Q");
-    if (i != message->doc.termlist_end ())
-       return talloc_strdup (message, (*i).c_str () + 1);
-    else
+    i.skip_to (_find_prefix ("msgid"));
+
+    /* XXX: This should really be an internal error, but we'll need to
+     * fix the add_message side of things first. */
+    if (i == message->doc.termlist_end ())
        return NULL;
+
+    message->message_id = talloc_strdup (message, (*i).c_str () + 1);
+    return message->message_id;
 }
 
 /* We end up having to call the destructors explicitly because we had
@@ -161,12 +180,31 @@ notmuch_message_get_tags (notmuch_message_t *message)
     talloc_set_destructor (tags, _notmuch_tags_destructor);
 
     tags->iterator = message->doc.termlist_begin ();
-    tags->iterator.skip_to ("L");
+    tags->iterator.skip_to (_find_prefix ("tag"));
     tags->iterator_end = message->doc.termlist_end ();
 
     return tags;
 }
 
+notmuch_thread_ids_t *
+notmuch_message_get_thread_ids (notmuch_message_t *message)
+{
+    notmuch_thread_ids_t *thread_ids;
+    const char *id_str;
+
+    thread_ids = talloc (message, notmuch_thread_ids_t);
+    if (unlikely (thread_ids == NULL))
+       return NULL;
+
+    id_str = message->doc.get_value (NOTMUCH_VALUE_THREAD).c_str ();
+    thread_ids->next = talloc_strdup (message, id_str);
+
+    /* Initialize thread_ids->current and terminate first ID. */
+    notmuch_thread_ids_advance (thread_ids);
+
+    return thread_ids;
+}
+
 void
 notmuch_message_destroy (notmuch_message_t *message)
 {
@@ -205,3 +243,30 @@ notmuch_tags_destroy (notmuch_tags_t *tags)
 {
     talloc_free (tags);
 }
+
+notmuch_bool_t
+notmuch_thread_ids_has_more (notmuch_thread_ids_t *thread_ids)
+{
+    if (thread_ids->current == NULL || *thread_ids->current == '\0')
+       return FALSE;
+    else
+       return TRUE;
+}
+
+const char *
+notmuch_thread_ids_get (notmuch_thread_ids_t *thread_ids)
+{
+    return thread_ids->current;
+}
+
+void
+notmuch_thread_ids_advance (notmuch_thread_ids_t *thread_ids)
+{
+    thread_ids->current = strsep (&thread_ids->next, ",");
+}
+
+void
+notmuch_thread_ids_destroy (notmuch_thread_ids_t *thread_ids)
+{
+    talloc_free (thread_ids);
+}