From: Sebastian Spaeth <Sebastian@SSpaeth.de>
Date: Wed, 28 Sep 2011 15:50:57 +0000 (+0200)
Subject: python: add begin|end_atomic bindings
X-Git-Tag: 0.9~43
X-Git-Url: https://git.cworth.org/git?a=commitdiff_plain;h=0241a68e9eb67904ac1805ccc82910c555711ac6;p=notmuch

python: add begin|end_atomic bindings

* Add UNBALANCED_ATOMIC status code
  Catch up with the notmuch status codes, and add the UNBALANCED_ATOMIC
  one.
* Add the begin_atomic and end_atomic calls to libnotmuch

Signed-off-by: Sebastian Spaeth <Sebastian@SSpaeth.de>
---

diff --git a/bindings/python/notmuch/database.py b/bindings/python/notmuch/database.py
index da1ed047..bafe497e 100644
--- a/bindings/python/notmuch/database.py
+++ b/bindings/python/notmuch/database.py
@@ -221,6 +221,49 @@ class Database(object):
         #TODO: catch exceptions, document return values and etc
         return status
 
+    def begin_atomic(self):
+        """Begin an atomic database operation
+
+        Any modifications performed between a successful
+        :meth:`begin_atomic` and a :meth:`end_atomic` will be applied to
+        the database atomically.  Note that, unlike a typical database
+        transaction, this only ensures atomicity, not durability;
+        neither begin nor end necessarily flush modifications to disk.
+
+        :returns: STATUS.SUCCESS or raises
+
+        :exception: :exc:`NotmuchError` STATUS.XAPIAN_EXCEPTION::
+
+                        A Xapian exception occurred; atomic section not
+                        entered."""
+        # Raise a NotmuchError if not initialized
+        self._verify_initialized_db()
+        status = nmlib.notmuch_database_begin_atomic(self._db)
+        if status != STATUS.SUCCESS:
+            raise NotmuchError(status)
+        return status
+
+    def end_atomic(self):
+        """Indicate the end of an atomic database operation
+
+        See :meth:`begin_atomic` for details.
+
+        :returns: STATUS.SUCCESS or raises
+
+        :exception:
+            :exc:`NotmuchError`:
+                STATUS.XAPIAN_EXCEPTION
+                    A Xapian exception occurred; atomic section not
+                    ended.
+                STATUS.UNBALANCED_ATOMIC:
+                    end_atomic has been called more times than begin_atomic."""
+        # Raise a NotmuchError if not initialized
+        self._verify_initialized_db()
+        status = nmlib.notmuch_database_end_atomic(self._db)
+        if status != STATUS.SUCCESS:
+            raise NotmuchError(status)
+        return status
+
     def get_directory(self, path):
         """Returns a :class:`Directory` of path,
         (creating it if it does not exist(?))
diff --git a/bindings/python/notmuch/globals.py b/bindings/python/notmuch/globals.py
index 05b9962a..e5399bed 100644
--- a/bindings/python/notmuch/globals.py
+++ b/bindings/python/notmuch/globals.py
@@ -65,6 +65,7 @@ STATUS = Status(['SUCCESS',
   'NULL_POINTER',
   'TAG_TOO_LONG',
   'UNBALANCED_FREEZE_THAW',
+  'UNBALANCED_ATOMIC',
   'NOT_INITIALIZED'])
 """STATUS is a class, whose attributes provide constants that serve as return
 indicators for notmuch functions. Currently the following ones are defined. For
@@ -81,6 +82,7 @@ description.
   * NULL_POINTER
   * TAG_TOO_LONG
   * UNBALANCED_FREEZE_THAW
+  * UNBALANCED_ATOMIC
   * NOT_INITIALIZED
 
 Invoke the class method `notmuch.STATUS.status2str` with a status value as