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.
#include <xapian.h>
struct _notmuch_message {
#include <xapian.h>
struct _notmuch_message {
+ notmuch_database_t *notmuch;
+ Xapian::docid doc_id;
+ char *message_id;
{ "email", "E" },
{ "date", "D" },
{ "label", "L" },
{ "email", "E" },
{ "date", "D" },
{ "label", "L" },
{ "source_id", "I" },
{ "attachment_extension", "O" },
{ "msgid", "Q" },
{ "source_id", "I" },
{ "attachment_extension", "O" },
{ "msgid", "Q" },
if (unlikely (message == NULL))
return NULL;
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);
new (&message->doc) Xapian::Document;
talloc_set_destructor (message, _notmuch_message_destructor);
{
Xapian::TermIterator i;
{
Xapian::TermIterator i;
+ if (message->message_id)
+ return message->message_id;
+
i = message->doc.termlist_begin ();
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 ())
+
+ 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
}
/* We end up having to call the destructors explicitly because we had
talloc_set_destructor (tags, _notmuch_tags_destructor);
tags->iterator = message->doc.termlist_begin ();
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;
tags->iterator_end = message->doc.termlist_end ();
return tags;