From: Carl Worth Date: Sun, 25 Oct 2009 07:25:59 +0000 (-0700) Subject: Drop the storage of thread ID(s) in a value. X-Git-Tag: 0.1~718 X-Git-Url: https://git.notmuchmail.org/git?p=notmuch;a=commitdiff_plain;h=1c2bac747e4da6cb8383aa3ad5e377af4cce603f Drop the storage of thread ID(s) in a value. Now that we are iterating over the thread terms instead, we can drop this redundant storage (which should shrink our database a tiny bit). --- diff --git a/database.cc b/database.cc index aaad7105..751e2d99 100644 --- a/database.cc +++ b/database.cc @@ -192,26 +192,34 @@ find_unique_document (notmuch_database_t *notmuch, return NOTMUCH_PRIVATE_STATUS_SUCCESS; } +/* XXX: Should rewrite this to accept a notmuch_message_t* instead of + * a Xapian:Document and then we could just use + * notmuch_message_get_thread_ids instead of duplicating its logic + * here. */ static void insert_thread_id (GHashTable *thread_ids, Xapian::Document doc) { string value_string; - const char *value, *id, *comma; - - value_string = doc.get_value (NOTMUCH_VALUE_THREAD); - value = value_string.c_str(); - if (strlen (value)) { - id = value; - while (*id) { - comma = strchr (id, ','); - if (comma == NULL) - comma = id + strlen (id); - g_hash_table_insert (thread_ids, - strndup (id, comma - id), NULL); - id = comma; - if (*id) - id++; - } + Xapian::TermIterator i; + const char *prefix_str = _find_prefix ("thread"); + char prefix; + + assert (strlen (prefix_str) == 1); + + prefix = *prefix_str; + + i = doc.termlist_begin (); + i.skip_to (prefix_str); + + while (1) { + if (i == doc.termlist_end ()) + break; + value_string = *i; + if (value_string.empty () || value_string[0] != prefix) + break; + g_hash_table_insert (thread_ids, + strdup (value_string.c_str () + 1), NULL); + i++; } } diff --git a/message.cc b/message.cc index 1d9dfeda..80832cae 100644 --- a/message.cc +++ b/message.cc @@ -292,26 +292,7 @@ void _notmuch_message_add_thread_id (notmuch_message_t *message, const char *thread_id) { - std::string id_str; - _notmuch_message_add_term (message, "thread", thread_id); - - id_str = message->doc.get_value (NOTMUCH_VALUE_THREAD); - - if (id_str.empty ()) { - message->doc.add_value (NOTMUCH_VALUE_THREAD, thread_id); - } else { - size_t pos; - - /* Think about using a hash here if there's any performance - * problem. */ - pos = id_str.find (thread_id); - if (pos == std::string::npos) { - id_str.append (","); - id_str.append (thread_id); - message->doc.add_value (NOTMUCH_VALUE_THREAD, id_str); - } - } } static void @@ -351,7 +332,6 @@ _notmuch_message_ensure_thread_id (notmuch_message_t *message) thread_id_generate (&thread_id); _notmuch_message_add_term (message, "thread", thread_id.str); - message->doc.add_value (NOTMUCH_VALUE_THREAD, thread_id.str); } /* Synchronize changes made to message->doc out into the database. */ diff --git a/notmuch-private.h b/notmuch-private.h index 602d1a9e..1302cd30 100644 --- a/notmuch-private.h +++ b/notmuch-private.h @@ -40,6 +40,7 @@ NOTMUCH_BEGIN_DECLS #include #include #include +#include #include @@ -71,8 +72,7 @@ NOTMUCH_BEGIN_DECLS typedef enum { NOTMUCH_VALUE_TIMESTAMP = 0, - NOTMUCH_VALUE_MESSAGE_ID, - NOTMUCH_VALUE_THREAD + NOTMUCH_VALUE_MESSAGE_ID } notmuch_value_t; /* Xapian (with flint backend) complains if we provide a term longer