summaryrefslogtreecommitdiff
path: root/message.cc
diff options
context:
space:
mode:
authorCarl Worth <cworth@cworth.org>2009-10-26 22:25:45 -0700
committerCarl Worth <cworth@cworth.org>2009-10-26 22:53:39 -0700
commit31db02a8c1afdb025da6e0e7e62630ffffc69eb7 (patch)
tree6d2b3ccd0aa7db1bc52ad46a35adb67c5cfe056c /message.cc
parent9c4efa8487d292268d9ae6a089b1063c6e82e6e4 (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.cc53
1 files changed, 50 insertions, 3 deletions
diff --git a/message.cc b/message.cc
index 6b6141f..6e15b51 100644
--- a/message.cc
+++ b/message.cc
@@ -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);