summaryrefslogtreecommitdiff
path: root/message.cc
diff options
context:
space:
mode:
authorCarl Worth <cworth@cworth.org>2009-10-26 09:13:19 -0700
committerCarl Worth <cworth@cworth.org>2009-10-26 14:02:51 -0700
commit3dce2007887717ec4ec0a1e815591c957acd1ba1 (patch)
tree66a93d1df69c8789c8a9fe25eb396b0fc6a81800 /message.cc
parent46ba33b1159fb48b8360ddae72492cc3162dc999 (diff)
tags: Re-implement tags iterator to avoid having C++ in the interface
We want to be able to iterate over tags stored in various ways, so the previous TermIterator-based tags object just wasn't general enough. The new interface is nice and simple, and involves only C datatypes.
Diffstat (limited to 'message.cc')
-rw-r--r--message.cc37
1 files changed, 35 insertions, 2 deletions
diff --git a/message.cc b/message.cc
index 7fef60a..b95f9d7 100644
--- a/message.cc
+++ b/message.cc
@@ -18,7 +18,7 @@
* Author: Carl Worth <cworth@cworth.org>
*/
-#include "notmuch-private-cxx.h"
+#include "notmuch-private.h"
#include "database-private.h"
#include <xapian.h>
@@ -289,7 +289,40 @@ notmuch_message_get_filename (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_sort (tags);
+
+ _notmuch_tags_reset (tags);
+
+ return tags;
}
void