From: Austin Clements Date: Sat, 11 Jun 2011 04:42:58 +0000 (-0400) Subject: lib: Wrap notmuch_database_add_message in an atomic section. X-Git-Tag: 0.9_rc1~15 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=51c3c0b2d27c8d0ba8e1ae242fd907c59f82d992;p=notmuch.git 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. --- 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; }