aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteven Allen <steven@stebalien.com>2015-10-25 17:30:39 -0400
committerDavid Bremner <david@tethera.net>2015-11-23 08:15:37 -0400
commitc946356cdc026b6d65662075487eb058f5c96c2b (patch)
treeb21c7606c28985d07a8932ba7aafea8b8b8a84c0
parenta79936cd6fe0b25da87ef28355b58b774bbd6369 (diff)
forbid atomic transactions on writable, upgradable databases
We can't (but currently do) allow upgrades within transactions because upgrades need their own transactions. We don't want to re-use the current transaction because bailing out of an upgrade would mean loosing all previous changes (because our "atomic" transactions don't commit before hand). This gives us two options: 1. Fail at the beginning of upgrade (tell the user to end the transaction, upgrade, and start over). 2. Don't allow the user to start the transaction. I went with the latter because: 1. There is no reason to call `begin_atomic` unless you intend to to write to the database and anyone intending to write to the database should upgrade it first. 2. This means that nothing inside an atomic transaction can ever fail with NOTMUCH_STATUS_UPGRADE_REQUIRED.
-rw-r--r--lib/database.cc3
1 files changed, 3 insertions, 0 deletions
diff --git a/lib/database.cc b/lib/database.cc
index 5e86955d..3b342f13 100644
--- a/lib/database.cc
+++ b/lib/database.cc
@@ -1635,6 +1635,9 @@ notmuch_database_begin_atomic (notmuch_database_t *notmuch)
notmuch->atomic_nesting > 0)
goto DONE;
+ if (notmuch_database_needs_upgrade(notmuch))
+ return NOTMUCH_STATUS_UPGRADE_REQUIRED;
+
try {
(static_cast <Xapian::WritableDatabase *> (notmuch->xapian_db))->begin_transaction (false);
} catch (const Xapian::Error &error) {