From f93b7218c3e2d11c5b3cdd4c367a42ca7a7ede77 Mon Sep 17 00:00:00 2001 From: Carl Worth Date: Thu, 7 Jan 2010 10:19:44 -0800 Subject: lib: Consolidate checks for read-only database. Previously, many checks were deep in the library just before a cast operation. These have now been replaced with internal errors and new checks have instead been added at the beginning of all top-levelentry points requiring a read-write database. The new checks now also use a single function for checking and printing the error message. This will give us a convenient location to extend the check, (such as based on database version as well). --- lib/message.cc | 67 +++++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 48 insertions(+), 19 deletions(-) (limited to 'lib/message.cc') diff --git a/lib/message.cc b/lib/message.cc index 0fc54668..ea9c8bd9 100644 --- a/lib/message.cc +++ b/lib/message.cc @@ -174,11 +174,6 @@ _notmuch_message_create_for_message_id (notmuch_database_t *notmuch, unsigned int doc_id; char *term; - if (notmuch->mode == NOTMUCH_DATABASE_MODE_READ_ONLY) { - *status_ret = NOTMUCH_PRIVATE_STATUS_READONLY_DATABASE; - return NULL; - } - *status_ret = NOTMUCH_PRIVATE_STATUS_SUCCESS; message = notmuch_database_find_message (notmuch, message_id); @@ -192,6 +187,9 @@ _notmuch_message_create_for_message_id (notmuch_database_t *notmuch, return NULL; } + if (notmuch->mode == NOTMUCH_DATABASE_MODE_READ_ONLY) + INTERNAL_ERROR ("Failure to ensure database is writable."); + db = static_cast (notmuch->xapian_db); try { doc.add_term (term); @@ -706,7 +704,12 @@ _notmuch_message_remove_term (notmuch_message_t *message, notmuch_status_t notmuch_message_add_tag (notmuch_message_t *message, const char *tag) { - notmuch_private_status_t status; + notmuch_private_status_t private_status; + notmuch_status_t status; + + status = _notmuch_database_ensure_writable (message->notmuch); + if (status) + return status; if (tag == NULL) return NOTMUCH_STATUS_NULL_POINTER; @@ -714,10 +717,10 @@ notmuch_message_add_tag (notmuch_message_t *message, const char *tag) if (strlen (tag) > NOTMUCH_TAG_MAX) return NOTMUCH_STATUS_TAG_TOO_LONG; - status = _notmuch_message_add_term (message, "tag", tag); - if (status) { + private_status = _notmuch_message_add_term (message, "tag", tag); + if (private_status) { INTERNAL_ERROR ("_notmuch_message_add_term return unexpected value: %d\n", - status); + private_status); } if (! message->frozen) @@ -729,7 +732,12 @@ notmuch_message_add_tag (notmuch_message_t *message, const char *tag) notmuch_status_t notmuch_message_remove_tag (notmuch_message_t *message, const char *tag) { - notmuch_private_status_t status; + notmuch_private_status_t private_status; + notmuch_status_t status; + + status = _notmuch_database_ensure_writable (message->notmuch); + if (status) + return status; if (tag == NULL) return NOTMUCH_STATUS_NULL_POINTER; @@ -737,10 +745,10 @@ notmuch_message_remove_tag (notmuch_message_t *message, const char *tag) if (strlen (tag) > NOTMUCH_TAG_MAX) return NOTMUCH_STATUS_TAG_TOO_LONG; - status = _notmuch_message_remove_term (message, "tag", tag); - if (status) { + private_status = _notmuch_message_remove_term (message, "tag", tag); + if (private_status) { INTERNAL_ERROR ("_notmuch_message_remove_term return unexpected value: %d\n", - status); + private_status); } if (! message->frozen) @@ -749,39 +757,60 @@ notmuch_message_remove_tag (notmuch_message_t *message, const char *tag) return NOTMUCH_STATUS_SUCCESS; } -void +notmuch_status_t notmuch_message_remove_all_tags (notmuch_message_t *message) { - notmuch_private_status_t status; + notmuch_private_status_t private_status; + notmuch_status_t status; notmuch_tags_t *tags; const char *tag; + status = _notmuch_database_ensure_writable (message->notmuch); + if (status) + return status; + 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) { + private_status = _notmuch_message_remove_term (message, "tag", tag); + if (private_status) { INTERNAL_ERROR ("_notmuch_message_remove_term return unexpected value: %d\n", - status); + private_status); } } if (! message->frozen) _notmuch_message_sync (message); + + return NOTMUCH_STATUS_SUCCESS; } -void +notmuch_status_t notmuch_message_freeze (notmuch_message_t *message) { + notmuch_status_t status; + + status = _notmuch_database_ensure_writable (message->notmuch); + if (status) + return status; + message->frozen++; + + return NOTMUCH_STATUS_SUCCESS; } notmuch_status_t notmuch_message_thaw (notmuch_message_t *message) { + notmuch_status_t status; + + status = _notmuch_database_ensure_writable (message->notmuch); + if (status) + return status; + if (message->frozen > 0) { message->frozen--; if (message->frozen == 0) -- cgit v1.2.3