aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Carl Worth <cworth@cworth.org>2009-10-21 15:42:54 -0700
committerGravatar Carl Worth <cworth@cworth.org>2009-10-21 15:42:54 -0700
commit2afd95bfc2ef2241f7ef80b592c349aac67a28d1 (patch)
tree6db93e470142aa12a010acb2d8cfac90b87c3e17
parent6c5054ebee5beb72c22d91a57c66b8ecdc65f7bf (diff)
notmuch_message_get_message_id: Fix to cache result
Previously, this would allocate new memory with every call. That was with talloc, of course, so there wasn't any leaking (eventually). But since we're now calling this internally we want to be a little less wasteful. It's easy enough to just stash the result into the message on the first call, and then just return that on subsequent calls.
-rw-r--r--message.cc24
1 files changed, 19 insertions, 5 deletions
diff --git a/message.cc b/message.cc
index 0efa470a..22c7598d 100644
--- a/message.cc
+++ b/message.cc
@@ -24,6 +24,9 @@
#include <xapian.h>
struct _notmuch_message {
+ notmuch_database_t *notmuch;
+ Xapian::docid doc_id;
+ char *message_id;
Xapian::Document doc;
};
@@ -66,6 +69,7 @@ prefix_t BOOLEAN_PREFIX[] = {
{ "email", "E" },
{ "date", "D" },
{ "label", "L" },
+ { "tag", "L" },
{ "source_id", "I" },
{ "attachment_extension", "O" },
{ "msgid", "Q" },
@@ -114,6 +118,9 @@ _notmuch_message_create (const void *talloc_owner,
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);
@@ -128,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
@@ -166,7 +180,7 @@ 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;