aboutsummaryrefslogtreecommitdiffhomepage
path: root/lib
diff options
context:
space:
mode:
authorGravatar Austin Clements <amdragon@mit.edu>2011-06-11 00:42:58 -0400
committerGravatar David Bremner <bremner@debian.org>2011-09-24 20:00:28 -0300
commit51c3c0b2d27c8d0ba8e1ae242fd907c59f82d992 (patch)
tree57b117ffe9c30fdb9fa958d619825590963867fd /lib
parent7a8046ced8c0e61ddd0ff463cfc17ed63e6edad3 (diff)
lib: Wrap notmuch_database_add_message in an atomic section.
Adding a message may involve changes to multiple database documents, and thus needs to be done in a transaction. This makes add_message (and, I think, the whole library) atomicity-safe: library callers only needs to use atomic sections if they needs atomicity across multiple library calls.
Diffstat (limited to 'lib')
-rw-r--r--lib/database.cc14
1 files changed, 13 insertions, 1 deletions
diff --git a/lib/database.cc b/lib/database.cc
index f8b95bc4..9299c8d5 100644
--- a/lib/database.cc
+++ b/lib/database.cc
@@ -1601,7 +1601,7 @@ notmuch_database_add_message (notmuch_database_t *notmuch,
{
notmuch_message_file_t *message_file;
notmuch_message_t *message = NULL;
- notmuch_status_t ret = NOTMUCH_STATUS_SUCCESS;
+ notmuch_status_t ret = NOTMUCH_STATUS_SUCCESS, ret2;
notmuch_private_status_t private_status;
const char *date, *header;
@@ -1619,6 +1619,12 @@ notmuch_database_add_message (notmuch_database_t *notmuch,
if (message_file == NULL)
return NOTMUCH_STATUS_FILE_ERROR;
+ /* Adding a message may change many documents. Do this all
+ * atomically. */
+ ret = notmuch_database_begin_atomic (notmuch);
+ if (ret)
+ goto DONE;
+
notmuch_message_file_restrict_headers (message_file,
"date",
"from",
@@ -1740,6 +1746,12 @@ notmuch_database_add_message (notmuch_database_t *notmuch,
if (message_file)
notmuch_message_file_close (message_file);
+ ret2 = notmuch_database_end_atomic (notmuch);
+ if ((ret == NOTMUCH_STATUS_SUCCESS ||
+ ret == NOTMUCH_STATUS_DUPLICATE_MESSAGE_ID) &&
+ ret2 != NOTMUCH_STATUS_SUCCESS)
+ ret = ret2;
+
return ret;
}