]> git.notmuchmail.org Git - notmuch/blobdiff - lib/database.cc
notmuch: New function to retrieve all tags from the database.
[notmuch] / lib / database.cc
index 3fe12dd50ee65af6d709edc511229a5e9f047e8f..23ddd4ae1314b2186b7839364b06cc0d25b5a575 100644 (file)
@@ -1029,3 +1029,46 @@ notmuch_database_add_message (notmuch_database_t *notmuch,
 
     return ret;
 }
+
+notmuch_tags_t *
+_notmuch_convert_tags (void *ctx, Xapian::TermIterator &i,
+                      Xapian::TermIterator &end)
+{
+    const char *prefix = _find_prefix ("tag");
+    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 (ctx);
+    if (unlikely (tags == NULL))
+       return NULL;
+
+    i.skip_to (prefix);
+
+    while (i != end) {
+       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;
+}
+
+notmuch_tags_t *
+notmuch_database_get_all_tags (notmuch_database_t *db)
+{
+    Xapian::TermIterator i, end;
+    i = db->xapian_db->allterms_begin();
+    end = db->xapian_db->allterms_end();
+    return _notmuch_convert_tags(db, i, end);
+}