]> git.notmuchmail.org Git - notmuch/blobdiff - bindings/python/notmuch/database.py
python: work around libnotmuch calling exit(3) in Database.get_directory
[notmuch] / bindings / python / notmuch / database.py
index d8413671ad5610938909540076042e602d8eac6e..82cb803a0f2fd6687bc274f55570512731f2b147 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,24 +337,26 @@ 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[0] == os.sep:
+        if path and path[0] == os.sep:
             # we got an absolute path
             if not path.startswith(self.get_path()):
                 # but its initial components are not equal to the db path
@@ -365,7 +370,7 @@ class Database(object):
         dir_p = Database._get_directory(self._db, _str(path))
 
         # return the Directory, init it with the absolute path
-        return Directory(_str(abs_dirpath), dir_p, self)
+        return Directory(abs_dirpath, dir_p, self)
 
     _add_message = nmlib.notmuch_database_add_message
     _add_message.argtypes = [NotmuchDatabaseP, c_char_p,
@@ -639,7 +644,7 @@ class Directory(object):
 
     def __init__(self, path, dir_p, parent):
         """
-        :param path:   The absolute path of the directory object as unicode.
+        :param path:   The absolute path of the directory object.
         :param dir_p:  The pointer to an internal notmuch_directory_t object.
         :param parent: The object this Directory is derived from
                        (usually a :class:`Database`). We do not directly use
@@ -647,7 +652,6 @@ class Directory(object):
                        this Directory object lives. This keeps the
                        parent object alive.
         """
-        assert isinstance(path, unicode), "Path needs to be an UNICODE object"
         self._path = path
         self._dir_p = dir_p
         self._parent = parent