diff options
author | Bart Trojanowski <bart@jukie.net> | 2009-11-27 17:49:54 -0500 |
---|---|---|
committer | Bart Trojanowski <bart@jukie.net> | 2009-11-27 17:49:54 -0500 |
commit | 7a215c2de81e95798ecadd982eecf05e647c3988 (patch) | |
tree | 86c47f448111eb03b81123c14740c4a2ebad6856 /lib | |
parent | 16a00de92421e1397e5089d9e9f41b44f4f51c22 (diff) | |
parent | b7898b0c2a1038a9a0214dcac18c873a21070ccc (diff) |
Merge remote branch 'origin/master' into vim
Diffstat (limited to 'lib')
-rw-r--r-- | lib/database-private.h | 13 | ||||
-rw-r--r-- | lib/database.cc | 43 | ||||
-rw-r--r-- | lib/message.cc | 34 | ||||
-rw-r--r-- | lib/messages.c | 40 | ||||
-rw-r--r-- | lib/notmuch.h | 25 |
5 files changed, 124 insertions, 31 deletions
diff --git a/lib/database-private.h b/lib/database-private.h index 431966fb..643b0507 100644 --- a/lib/database-private.h +++ b/lib/database-private.h @@ -35,4 +35,17 @@ struct _notmuch_database { Xapian::ValueRangeProcessor *value_range_processor; }; +/* Convert tags from Xapian internal format to notmuch format. + * + * The function gets a TermIterator as argument and uses that iterator to find + * all tag terms in the object. The tags are then converted to a + * notmuch_tags_t list and returned. The function needs to allocate memory for + * the resulting list and it uses the argument ctx as talloc context. + * + * The function returns NULL on failure. + */ +notmuch_tags_t * +_notmuch_convert_tags (void *ctx, Xapian::TermIterator &i, + Xapian::TermIterator &end); + #endif diff --git a/lib/database.cc b/lib/database.cc index 3fe12dd5..23ddd4ae 100644 --- a/lib/database.cc +++ b/lib/database.cc @@ -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); +} diff --git a/lib/message.cc b/lib/message.cc index e0834f1c..b708c181 100644 --- a/lib/message.cc +++ b/lib/message.cc @@ -482,38 +482,10 @@ notmuch_message_get_date (notmuch_message_t *message) notmuch_tags_t * notmuch_message_get_tags (notmuch_message_t *message) { - 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 (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; + i = message->doc.termlist_begin(); + end = message->doc.termlist_end(); + return _notmuch_convert_tags(message, i, end); } void diff --git a/lib/messages.c b/lib/messages.c index 54c0ab07..aa92535f 100644 --- a/lib/messages.c +++ b/lib/messages.c @@ -20,6 +20,8 @@ #include "notmuch-private.h" +#include <glib.h> + /* Create a new notmuch_message_list_t object, with 'ctx' as its * talloc owner. * @@ -140,3 +142,41 @@ notmuch_messages_destroy (notmuch_messages_t *messages) { talloc_free (messages); } + + +notmuch_tags_t * +notmuch_messages_collect_tags (notmuch_messages_t *messages) +{ + notmuch_tags_t *tags, *msg_tags; + notmuch_message_t *msg; + GHashTable *htable; + GList *keys, *l; + const char *tag; + + tags = _notmuch_tags_create (messages); + if (tags == NULL) return NULL; + + htable = g_hash_table_new_full (g_str_hash, g_str_equal, free, NULL); + + while ((msg = notmuch_messages_get (messages))) { + msg_tags = notmuch_message_get_tags (msg); + while ((tag = notmuch_tags_get (msg_tags))) { + g_hash_table_insert (htable, xstrdup (tag), NULL); + notmuch_tags_advance (msg_tags); + } + notmuch_tags_destroy (msg_tags); + notmuch_message_destroy (msg); + notmuch_messages_advance (messages); + } + + keys = g_hash_table_get_keys (htable); + for (l = keys; l; l = l->next) { + _notmuch_tags_add_tag (tags, (char *)l->data); + } + + g_list_free (keys); + g_hash_table_destroy (htable); + + _notmuch_tags_prepare_iterator (tags); + return tags; +} diff --git a/lib/notmuch.h b/lib/notmuch.h index 3974820c..e4f39929 100644 --- a/lib/notmuch.h +++ b/lib/notmuch.h @@ -280,6 +280,16 @@ notmuch_message_t * notmuch_database_find_message (notmuch_database_t *database, const char *message_id); +/* Return a list of all tags found in the database. + * + * This function creates a list of all tags found in the database. The + * resulting list contains all tags from all messages found in the database. + * + * On error this function returns NULL. + */ +notmuch_tags_t * +notmuch_database_get_all_tags (notmuch_database_t *db); + /* Create a new query for 'database'. * * Here, 'database' should be an open database, (see @@ -625,6 +635,21 @@ notmuch_messages_advance (notmuch_messages_t *messages); void notmuch_messages_destroy (notmuch_messages_t *messages); +/* Return a list of tags from all messages. + * + * The resulting list is guaranteed not to contain duplicated tags. + * + * WARNING: You can no longer iterate over messages after calling this + * function, because the iterator will point at the end of the list. + * We do not have a function to reset the iterator yet and the only + * way how you can iterate over the list again is to recreate the + * message list. + * + * The function returns NULL on error. + */ +notmuch_tags_t * +notmuch_messages_collect_tags (notmuch_messages_t *messages); + /* Get the message ID of 'message'. * * The returned string belongs to 'message' and as such, should not be |