diff options
author | Carl Worth <cworth@cworth.org> | 2009-10-26 09:13:19 -0700 |
---|---|---|
committer | Carl Worth <cworth@cworth.org> | 2009-10-26 14:02:51 -0700 |
commit | 3dce2007887717ec4ec0a1e815591c957acd1ba1 (patch) | |
tree | 66a93d1df69c8789c8a9fe25eb396b0fc6a81800 /message.cc | |
parent | 46ba33b1159fb48b8360ddae72492cc3162dc999 (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.cc | 37 |
1 files changed, 35 insertions, 2 deletions
@@ -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 |