]> git.notmuchmail.org Git - notmuch/blobdiff - database.cc
Merge branch from fixing up bugs after bisecting.
[notmuch] / database.cc
index 00b03731206289b171736dd8f9c4044a67f8f0a8..6d62109e73c11e758987c5203839e2ef91aa8291 100644 (file)
 
 using namespace std;
 
+const char *
+notmuch_status_to_string (notmuch_status_t status)
+{
+    switch (status) {
+    case NOTMUCH_STATUS_SUCCESS:
+       return "No error occurred";
+    case NOTMUCH_STATUS_XAPIAN_EXCEPTION:
+       return "A Xapian exception occurred";
+    case NOTMUCH_STATUS_FILE_NOT_EMAIL:
+       return "File is not an email";
+    case NOTMUCH_STATUS_NULL_POINTER:
+       return "Erroneous NULL pointer";
+    case NOTMUCH_STATUS_TAG_TOO_LONG:
+       return "Tag value is too long";
+    default:
+    case NOTMUCH_STATUS_LAST_STATUS:
+       return "Unknown error status value";
+    }
+}
+
 /* "128 bits of thread-id ought to be enough for anybody" */
 #define NOTMUCH_THREAD_ID_BITS  128
 #define NOTMUCH_THREAD_ID_DIGITS (NOTMUCH_THREAD_ID_BITS / 4)
@@ -64,6 +84,8 @@ thread_id_generate (thread_id_t *thread_id)
     }
 }
 
+/* XXX: We should drop this function and convert all callers to call
+ * _notmuch_message_add_term instead. */
 static void
 add_term (Xapian::Document doc,
          const char *prefix_name,
@@ -111,19 +133,6 @@ find_message_by_docid (Xapian::Database *db, Xapian::docid docid)
     return db->get_document (docid);
 }
 
-Xapian::Document
-find_message_by_message_id (Xapian::Database *db, const char *message_id)
-{
-    Xapian::PostingIterator i, end;
-
-    find_messages_by_term (db, "msgid", message_id, &i, &end);
-
-    if (i != end)
-       return find_message_by_docid (db, *i);
-    else
-       return Xapian::Document ();
-}
-
 static void
 insert_thread_id (GHashTable *thread_ids, Xapian::Document doc)
 {
@@ -147,6 +156,21 @@ insert_thread_id (GHashTable *thread_ids, Xapian::Document doc)
     }
 }
 
+notmuch_message_t *
+notmuch_database_find_message (notmuch_database_t *notmuch,
+                              const char *message_id)
+{
+    Xapian::PostingIterator i, end;
+
+    find_messages_by_term (notmuch->xapian_db,
+                          "msgid", message_id, &i, &end);
+
+    if (i == end)
+       return NULL;
+
+    return _notmuch_message_create (notmuch, notmuch, *i);
+}
+
 /* Return one or more thread_ids, (as a GPtrArray of strings), for the
  * given message based on looking into the database for any messages
  * referenced in parents, and also for any messages in the database
@@ -155,10 +179,11 @@ insert_thread_id (GHashTable *thread_ids, Xapian::Document doc)
  * Caller should free all strings in the array and the array itself,
  * (g_ptr_array_free) when done. */
 static GPtrArray *
-find_thread_ids (Xapian::Database *db,
+find_thread_ids (notmuch_database_t *notmuch,
                 GPtrArray *parents,
                 const char *message_id)
 {
+    Xapian::WritableDatabase *db = notmuch->xapian_db;
     Xapian::PostingIterator child, children_end;
     Xapian::Document doc;
     GHashTable *thread_ids;
@@ -177,9 +202,25 @@ find_thread_ids (Xapian::Database *db,
     }
 
     for (i = 0; i < parents->len; i++) {
+       notmuch_message_t *parent;
+       notmuch_thread_ids_t *ids;
+
        parent_message_id = (char *) g_ptr_array_index (parents, i);
-       doc = find_message_by_message_id (db, parent_message_id);
-       insert_thread_id (thread_ids, doc);
+       parent = notmuch_database_find_message (notmuch, parent_message_id);
+       if (parent == NULL)
+           continue;
+
+       for (ids = notmuch_message_get_thread_ids (parent);
+            notmuch_thread_ids_has_more (ids);
+            notmuch_thread_ids_advance (ids))
+       {
+           const char *id;
+
+           id = notmuch_thread_ids_get (ids);
+           g_hash_table_insert (thread_ids, strdup (id), NULL);
+       }
+
+       notmuch_message_destroy (parent);
     }
 
     result = g_ptr_array_new ();
@@ -497,7 +538,7 @@ notmuch_database_add_message (notmuch_database_t *notmuch,
            message_id = NULL;
        }
 
-       thread_ids = find_thread_ids (db, parents, message_id);
+       thread_ids = find_thread_ids (notmuch, parents, message_id);
 
        for (i = 0; i < parents->len; i++)
            g_free (g_ptr_array_index (parents, i));