[PATCH] Support aborting the atomic context
Floris Bruynooghe
flub at devork.be
Sun Jun 14 08:23:19 PDT 2020
Since it is possible to use an atomic context to abort a number of
changes support this usage. Because the only way to actually abort
the transaction is to close the database this must also do so.
---
bindings/python-cffi/notmuch2/_database.py | 16 +++++++++++++++-
bindings/python-cffi/tests/test_database.py | 5 +++++
2 files changed, 20 insertions(+), 1 deletion(-)
diff --git a/bindings/python-cffi/notmuch2/_database.py b/bindings/python-cffi/notmuch2/_database.py
index 95f59ca0..c851f0a5 100644
--- a/bindings/python-cffi/notmuch2/_database.py
+++ b/bindings/python-cffi/notmuch2/_database.py
@@ -641,6 +641,7 @@ class AtomicContext:
def __init__(self, db, ptr_name):
self._db = db
self._ptr = lambda: getattr(db, ptr_name)
+ self._exit_fn = lambda: None
def __del__(self):
self._destroy()
@@ -656,13 +657,17 @@ class AtomicContext:
ret = capi.lib.notmuch_database_begin_atomic(self._ptr())
if ret != capi.lib.NOTMUCH_STATUS_SUCCESS:
raise errors.NotmuchError(ret)
+ self._exit_fn = self._end_atomic
return self
- def __exit__(self, exc_type, exc_value, traceback):
+ def _end_atomic(self):
ret = capi.lib.notmuch_database_end_atomic(self._ptr())
if ret != capi.lib.NOTMUCH_STATUS_SUCCESS:
raise errors.NotmuchError(ret)
+ def __exit__(self, exc_type, exc_value, traceback):
+ self._exit_fn()
+
def force_end(self):
"""Force ending the atomic section.
@@ -681,6 +686,15 @@ class AtomicContext:
if ret != capi.lib.NOTMUCH_STATUS_SUCCESS:
raise errors.NotmuchError(ret)
+ def abort(self):
+ """Abort the transaction.
+
+ Aborting a transaction will not commit any of the changes, but
+ will also implicitly close the database.
+ """
+ self._exit_fn = lambda: None
+ self._db.close()
+
@functools.total_ordering
class DbRevision:
diff --git a/bindings/python-cffi/tests/test_database.py b/bindings/python-cffi/tests/test_database.py
index e3a8344d..aa2cbdc7 100644
--- a/bindings/python-cffi/tests/test_database.py
+++ b/bindings/python-cffi/tests/test_database.py
@@ -127,6 +127,11 @@ class TestAtomic:
with pytest.raises(errors.UnbalancedAtomicError):
ctx.force_end()
+ def test_abort(self, db):
+ with db.atomic() as txn:
+ txn.abort()
+ assert db.closed
+
class TestRevision:
--
2.27.0
More information about the notmuch
mailing list