X-Git-Url: https://git.notmuchmail.org/git?p=notmuch;a=blobdiff_plain;f=database.cc;h=77b2eff22973073aa511c2d0c0baa31d20190e31;hp=00b03731206289b171736dd8f9c4044a67f8f0a8;hb=c58ee818b5e116d00172c8406149106c97c2e377;hpb=22b2265cacb2930c11b75282046707355446788e diff --git a/database.cc b/database.cc index 00b03731..77b2eff2 100644 --- a/database.cc +++ b/database.cc @@ -111,19 +111,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 +134,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 +157,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 +180,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 +516,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));