]> git.notmuchmail.org Git - notmuch/blobdiff - bindings/python/notmuch/database.py
python: work around libnotmuch calling exit(3) in Database.find_message_by_filename
[notmuch] / bindings / python / notmuch / database.py
index 504bb8804223fe94a502f9078eeee5dcaff01dae..a054be76e1ba4a72ee8d678b3950fa659508cb01 100644 (file)
@@ -27,6 +27,7 @@ from notmuch.globals import (
     NotmuchError,
     NullPointerError,
     NotInitializedError,
+    ReadOnlyDatabaseError,
     Enum,
     _str,
     NotmuchDatabaseP,
@@ -122,7 +123,8 @@ class Database(object):
     _create.argtypes = [c_char_p]
     _create.restype = NotmuchDatabaseP
 
-    def __init__(self, path=None, create=False, mode=0):
+    def __init__(self, path = None, create = False,
+                 mode = MODE.READ_ONLY):
         """If *path* is `None`, we will try to read a users notmuch
         configuration and use his configured database. The location of the
         configuration file can be specified through the environment variable
@@ -144,6 +146,7 @@ class Database(object):
             failure.
         """
         self._db = None
+        self.mode = mode
         if path is None:
             # no path specified. use a user's default database
             if Database._std_db_path is None:
@@ -334,22 +337,24 @@ class Database(object):
         """Returns a :class:`Directory` of path,
         (creating it if it does not exist(?))
 
-        .. warning::
-
-            This call needs a writeable database in
-            :attr:`Database.MODE`.READ_WRITE mode. The underlying library will
-            exit the program if this method is used on a read-only database!
-
         :param path: An unicode string containing the path relative to the path
               of database (see :meth:`get_path`), or else should be an absolute
               path with initial components that match the path of 'database'.
         :returns: :class:`Directory` or raises an exception.
-        :raises:
-            :exc:`NotmuchError` with :attr:`STATUS`.FILE_ERROR
-                    If path is not relative database or absolute with initial
-                    components same as database.
+        :raises: :exc:`FileError` if path is not relative database or absolute
+                 with initial components same as database.
+        :raises: :exc:`ReadOnlyDatabaseError` if the database has not been
+                 opened in read-write mode
         """
         self._assert_db_is_initialized()
+
+        # work around libnotmuch calling exit(3), see
+        # id:20120221002921.8534.57091@thinkbox.jade-hamburg.de
+        # TODO: remove once this issue is resolved
+        if self.mode != Database.MODE.READ_WRITE:
+            raise ReadOnlyDatabaseError('The database has to be opened in '
+                                        'read-write mode for get_directory')
+
         # sanity checking if path is valid, and make path absolute
         if path and path[0] == os.sep:
             # we got an absolute path
@@ -499,31 +504,34 @@ class Database(object):
     def find_message_by_filename(self, filename):
         """Find a message with the given filename
 
-        .. warning::
-
-            This call needs a writeable database in
-            :attr:`Database.MODE`.READ_WRITE mode. The underlying library will
-            exit the program if this method is used on a read-only database!
-
         :returns: If the database contains a message with the given
             filename, then a class:`Message:` is returned.  This
             function returns None if no message is found with the given
             filename.
 
-        :raises:
-            :exc:`OutOfMemoryError`
-                  If an Out-of-memory occured while constructing the message.
-            :exc:`XapianError`
-                  In case of a Xapian Exception. These exceptions
-                  include "Database modified" situations, e.g. when the
-                  notmuch database has been modified by another program
-                  in the meantime. In this case, you should close and
-                  reopen the database and retry.
-            :exc:`NotInitializedError` if
-                    the database was not intitialized.
+        :raises: :exc:`OutOfMemoryError` if an Out-of-memory occured while
+                 constructing the message.
+        :raises: :exc:`XapianError` in case of a Xapian Exception.
+                 These exceptions include "Database modified"
+                 situations, e.g. when the notmuch database has been
+                 modified by another program in the meantime. In this
+                 case, you should close and reopen the database and
+                 retry.
+        :raises: :exc:`NotInitializedError` if the database was not
+                 intitialized.
+        :raises: :exc:`ReadOnlyDatabaseError` if the database has not been
+                 opened in read-write mode
 
         *Added in notmuch 0.9*"""
         self._assert_db_is_initialized()
+
+        # work around libnotmuch calling exit(3), see
+        # id:20120221002921.8534.57091@thinkbox.jade-hamburg.de
+        # TODO: remove once this issue is resolved
+        if self.mode != Database.MODE.READ_WRITE:
+            raise ReadOnlyDatabaseError('The database has to be opened in '
+                                        'read-write mode for get_directory')
+
         msg_p = NotmuchMessageP()
         status = Database._find_message_by_filename(self._db, _str(filename),
                                                     byref(msg_p))