diff options
author | Carl Worth <cworth@cworth.org> | 2009-10-26 22:25:45 -0700 |
---|---|---|
committer | Carl Worth <cworth@cworth.org> | 2009-10-26 22:53:39 -0700 |
commit | 31db02a8c1afdb025da6e0e7e62630ffffc69eb7 (patch) | |
tree | 6d2b3ccd0aa7db1bc52ad46a35adb67c5cfe056c /message.cc | |
parent | 9c4efa8487d292268d9ae6a089b1063c6e82e6e4 (diff) |
notmuch restore: Fix to remove all tags before adding tags.
This means that the restore operation will now properly pick up the
removal of tags indicated by the tag just not being present in the
dump file.
We added a few new public functions in order to support this:
notmuch_message_freeze
notmuch_message_remove_all_tags
notmuch_message_thaw
Diffstat (limited to 'message.cc')
-rw-r--r-- | message.cc | 53 |
1 files changed, 50 insertions, 3 deletions
@@ -26,6 +26,7 @@ struct _notmuch_message { notmuch_database_t *notmuch; Xapian::docid doc_id; + int frozen; char *message_id; char *thread_id; char *filename; @@ -33,7 +34,6 @@ struct _notmuch_message { Xapian::Document doc; }; - /* "128 bits of thread-id ought to be enough for anybody" */ #define NOTMUCH_THREAD_ID_BITS 128 #define NOTMUCH_THREAD_ID_DIGITS (NOTMUCH_THREAD_ID_BITS / 4) @@ -100,6 +100,8 @@ _notmuch_message_create (const void *talloc_owner, message->notmuch = notmuch; message->doc_id = doc_id; + message->frozen = 0; + /* Each of these will be lazily created as needed. */ message->message_id = NULL; message->thread_id = NULL; @@ -487,7 +489,8 @@ notmuch_message_add_tag (notmuch_message_t *message, const char *tag) status); } - _notmuch_message_sync (message); + if (! message->frozen) + _notmuch_message_sync (message); return NOTMUCH_STATUS_SUCCESS; } @@ -509,12 +512,56 @@ notmuch_message_remove_tag (notmuch_message_t *message, const char *tag) status); } - _notmuch_message_sync (message); + if (! message->frozen) + _notmuch_message_sync (message); return NOTMUCH_STATUS_SUCCESS; } void +notmuch_message_remove_all_tags (notmuch_message_t *message) +{ + notmuch_private_status_t status; + notmuch_tags_t *tags; + const char *tag; + + for (tags = notmuch_message_get_tags (message); + notmuch_tags_has_more (tags); + notmuch_tags_advance (tags)) + { + tag = notmuch_tags_get (tags); + + status = _notmuch_message_remove_term (message, "tag", tag); + if (status) { + INTERNAL_ERROR ("_notmuch_message_remove_term return unexpected value: %d\n", + status); + } + } + + if (! message->frozen) + _notmuch_message_sync (message); +} + +void +notmuch_message_freeze (notmuch_message_t *message) +{ + message->frozen++; +} + +notmuch_status_t +notmuch_message_thaw (notmuch_message_t *message) +{ + if (message->frozen > 0) { + message->frozen--; + if (message->frozen == 0) + _notmuch_message_sync (message); + return NOTMUCH_STATUS_SUCCESS; + } else { + return NOTMUCH_STATUS_UNBALANCED_FREEZE_THAW; + } +} + +void notmuch_message_destroy (notmuch_message_t *message) { talloc_free (message); |