aboutsummaryrefslogtreecommitdiffhomepage
path: root/message.cc
diff options
context:
space:
mode:
authorGravatar Carl Worth <cworth@cworth.org>2009-10-21 15:53:38 -0700
committerGravatar Carl Worth <cworth@cworth.org>2009-10-21 15:56:33 -0700
commitdefd216487bb6549d6e866fe578d2c3d3de77fd6 (patch)
tree6a24e3ecf499f806042eb49eea7a195053f6e24c /message.cc
parent0bbfa570147d2f0aa9d7e2afa1109526efdb353f (diff)
Add notmuch_message_add_tag and notmuch_message_remove_tag
With these two added, we now have enough functionality in the library to implement "notmuch restore".
Diffstat (limited to 'message.cc')
-rw-r--r--message.cc100
1 files changed, 100 insertions, 0 deletions
diff --git a/message.cc b/message.cc
index 22c7598d..338d953f 100644
--- a/message.cc
+++ b/message.cc
@@ -205,6 +205,106 @@ notmuch_message_get_thread_ids (notmuch_message_t *message)
return thread_ids;
}
+/* Synchronize changes made to message->doc into the database. */
+static void
+_notmuch_message_sync (notmuch_message_t *message)
+{
+ Xapian::WritableDatabase *db = message->notmuch->xapian_db;
+
+ db->replace_document (message->doc_id, message->doc);
+}
+
+notmuch_private_status_t
+_notmuch_message_add_term (notmuch_message_t *message,
+ const char *prefix_name,
+ const char *value)
+{
+
+ char *term;
+
+ if (value == NULL)
+ return NOTMUCH_PRIVATE_STATUS_NULL_POINTER;
+
+ term = talloc_asprintf (message, "%s%s",
+ _find_prefix (prefix_name), value);
+
+ if (strlen (term) > NOTMUCH_TERM_MAX)
+ return NOTMUCH_PRIVATE_STATUS_TERM_TOO_LONG;
+
+ message->doc.add_term (term);
+ _notmuch_message_sync (message);
+
+ talloc_free (term);
+
+ return NOTMUCH_PRIVATE_STATUS_SUCCESS;
+}
+
+notmuch_private_status_t
+_notmuch_message_remove_term (notmuch_message_t *message,
+ const char *prefix_name,
+ const char *value)
+{
+ char *term;
+
+ if (value == NULL)
+ return NOTMUCH_PRIVATE_STATUS_NULL_POINTER;
+
+ term = talloc_asprintf (message, "%s%s",
+ _find_prefix (prefix_name), value);
+
+ if (strlen (term) > NOTMUCH_TERM_MAX)
+ return NOTMUCH_PRIVATE_STATUS_TERM_TOO_LONG;
+
+ message->doc.remove_term (term);
+ _notmuch_message_sync (message);
+
+ talloc_free (term);
+
+ return NOTMUCH_PRIVATE_STATUS_SUCCESS;
+}
+
+notmuch_status_t
+notmuch_message_add_tag (notmuch_message_t *message, const char *tag)
+{
+ notmuch_private_status_t status;
+
+ if (tag == NULL)
+ return NOTMUCH_STATUS_NULL_POINTER;
+
+ if (strlen (tag) > NOTMUCH_TAG_MAX)
+ return NOTMUCH_STATUS_TAG_TOO_LONG;
+
+ status = _notmuch_message_add_term (message, "tag", tag);
+ if (status) {
+ fprintf (stderr, "Internal error: _notmuch_message_add_term return unexpected value: %d\n",
+ status);
+ exit (1);
+ }
+
+ return NOTMUCH_STATUS_SUCCESS;
+}
+
+notmuch_status_t
+notmuch_message_remove_tag (notmuch_message_t *message, const char *tag)
+{
+ notmuch_private_status_t status;
+
+ if (tag == NULL)
+ return NOTMUCH_STATUS_NULL_POINTER;
+
+ if (strlen (tag) > NOTMUCH_TAG_MAX)
+ return NOTMUCH_STATUS_TAG_TOO_LONG;
+
+ status = _notmuch_message_remove_term (message, "tag", tag);
+ if (status) {
+ fprintf (stderr, "Internal error: _notmuch_message_remove_term return unexpected value: %d\n",
+ status);
+ exit (1);
+ }
+
+ return NOTMUCH_STATUS_SUCCESS;
+}
+
void
notmuch_message_destroy (notmuch_message_t *message)
{