* Author: Carl Worth <cworth@cworth.org>
*/
-#include "notmuch-private-cxx.h"
+#include "notmuch-private.h"
#include "database-private.h"
#include <xapian.h>
char *message_id;
char *thread_id;
char *filename;
+ notmuch_message_file_t *message_file;
Xapian::Document doc;
};
message->notmuch = notmuch;
message->doc_id = doc_id;
- message->message_id = NULL; /* lazily created */
- message->thread_id = NULL; /* lazily created */
- message->filename = NULL; /* lazily created */
+
+ /* Each of these will be lazily created as needed. */
+ message->message_id = NULL;
+ message->thread_id = NULL;
+ message->filename = NULL;
+ message->message_file = NULL;
/* This is C++'s creepy "placement new", which is really just an
* ugly way to call a constructor for a pre-allocated object. So
return message->message_id;
}
+const char *
+_notmuch_message_get_subject (notmuch_message_t *message)
+{
+ if (! message->message_file) {
+ notmuch_message_file_t *message_file;
+ const char *filename;
+
+ filename = notmuch_message_get_filename (message);
+ if (unlikely (filename == NULL))
+ return NULL;
+
+ message_file = _notmuch_message_file_open_ctx (message, filename);
+ if (unlikely (message_file == NULL))
+ return NULL;
+
+ message->message_file = message_file;
+ }
+
+ return notmuch_message_file_get_header (message->message_file,
+ "subject");
+}
+
const char *
notmuch_message_get_thread_id (notmuch_message_t *message)
{
notmuch_tags_t *
notmuch_message_get_tags (notmuch_message_t *message)
{
- return _notmuch_tags_create_terms (message, message->doc, "tag");
+ const char *prefix = _find_prefix ("tag");
+ Xapian::TermIterator i, end;
+ notmuch_tags_t *tags;
+ std::string tag;
+
+ /* Currently this iteration is written with the assumption that
+ * "tag" has a single-character prefix. */
+ assert (strlen (prefix) == 1);
+
+ tags = _notmuch_tags_create (message);
+ if (unlikely (tags == NULL))
+ return NULL;
+
+ i = message->doc.termlist_begin ();
+ end = message->doc.termlist_end ();
+
+ i.skip_to (prefix);
+
+ while (1) {
+ tag = *i;
+
+ if (tag.empty () || tag[0] != *prefix)
+ break;
+
+ _notmuch_tags_add_tag (tags, tag.c_str () + 1);
+
+ i++;
+ }
+
+ _notmuch_tags_prepare_iterator (tags);
+
+ return tags;
}
void