X-Git-Url: https://git.notmuchmail.org/git?p=notmuch;a=blobdiff_plain;f=database.cc;h=442b850d2264874442837fe2ec8e279d03fdc352;hp=e315f8dc08bf0c2d4411efc157ab75c9c26f4865;hb=668f20bdfbaa5ae9caedd3f02017c5637e5e6ff7;hpb=6ccdffcd87b8af0c1c683588612169f5dc776644 diff --git a/database.cc b/database.cc index e315f8dc..442b850d 100644 --- a/database.cc +++ b/database.cc @@ -74,29 +74,67 @@ add_term (Xapian::Document doc, } static void -find_messages_by_term (Xapian::Database *db, - const char *prefix_name, - const char *value, - Xapian::PostingIterator *begin, - Xapian::PostingIterator *end) +find_doc_ids (notmuch_database_t *notmuch, + const char *prefix_name, + const char *value, + Xapian::PostingIterator *begin, + Xapian::PostingIterator *end) { Xapian::PostingIterator i; char *term; term = g_strdup_printf ("%s%s", _find_prefix (prefix_name), value); - *begin = db->postlist_begin (term); + *begin = notmuch->xapian_db->postlist_begin (term); - if (end) - *end = db->postlist_end (term); + *end = notmuch->xapian_db->postlist_end (term); free (term); } -Xapian::Document -find_message_by_docid (Xapian::Database *db, Xapian::docid docid) +static notmuch_private_status_t +find_unique_doc_id (notmuch_database_t *notmuch, + const char *prefix_name, + const char *value, + unsigned int *doc_id) { - return db->get_document (docid); + Xapian::PostingIterator i, end; + + find_doc_ids (notmuch, prefix_name, value, &i, &end); + + if (i == end) { + *doc_id = 0; + return NOTMUCH_PRIVATE_STATUS_NO_DOCUMENT_FOUND; + } else { + *doc_id = *i; + return NOTMUCH_PRIVATE_STATUS_SUCCESS; + } +} + +static Xapian::Document +find_document_for_doc_id (notmuch_database_t *notmuch, unsigned doc_id) +{ + return notmuch->xapian_db->get_document (doc_id); +} + +static notmuch_private_status_t +find_unique_document (notmuch_database_t *notmuch, + const char *prefix_name, + const char *value, + Xapian::Document *document, + unsigned int *doc_id) +{ + notmuch_private_status_t status; + + status = find_unique_doc_id (notmuch, prefix_name, value, doc_id); + + if (status) { + *document = Xapian::Document (); + return status; + } + + *document = find_document_for_doc_id (notmuch, *doc_id); + return NOTMUCH_PRIVATE_STATUS_SUCCESS; } static void @@ -126,15 +164,15 @@ notmuch_message_t * notmuch_database_find_message (notmuch_database_t *notmuch, const char *message_id) { - Xapian::PostingIterator i, end; + notmuch_private_status_t status; + unsigned int doc_id; - find_messages_by_term (notmuch->xapian_db, - "msgid", message_id, &i, &end); + status = find_unique_doc_id (notmuch, "msgid", message_id, &doc_id); - if (i == end) + if (status == NOTMUCH_PRIVATE_STATUS_NO_DOCUMENT_FOUND) return NULL; - return _notmuch_message_create (notmuch, notmuch, *i); + return _notmuch_message_create (notmuch, notmuch, doc_id); } /* Return one or more thread_ids, (as a GPtrArray of strings), for the @@ -149,7 +187,6 @@ 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; @@ -161,9 +198,9 @@ find_thread_ids (notmuch_database_t *notmuch, thread_ids = g_hash_table_new_full (g_str_hash, g_str_equal, free, NULL); - find_messages_by_term (db, "ref", message_id, &child, &children_end); + find_doc_ids (notmuch, "ref", message_id, &child, &children_end); for ( ; child != children_end; child++) { - doc = find_message_by_docid (db, *child); + doc = find_document_for_doc_id (notmuch, *child); insert_thread_id (thread_ids, doc); }