]> git.notmuchmail.org Git - notmuch/blobdiff - bindings/python/notmuch/database.py
python: rename _verify_dir_initialized to _assert_dir_is_initialized
[notmuch] / bindings / python / notmuch / database.py
index dc124f5e91b97739ade5857320220781d8ad427f..9fb30e6355d2ca9bca4d90311d2862e9455cb771 100644 (file)
@@ -63,6 +63,10 @@ class Database(object):
     _find_message = nmlib.notmuch_database_find_message
     _find_message.restype = c_void_p
 
+    """notmuch_database_find_message_by_filename"""
+    _find_message_by_filename = nmlib.notmuch_database_find_message_by_filename
+    _find_message_by_filename.restype = c_void_p
+
     """notmuch_database_get_all_tags"""
     _get_all_tags = nmlib.notmuch_database_get_all_tags
     _get_all_tags.restype = c_void_p
@@ -105,7 +109,7 @@ class Database(object):
         else:
             self.create(path)
 
-    def _verify_initialized_db(self):
+    def _assert_db_is_initialized(self):
         """Raises a NotmuchError in case self._db is still None"""
         if self._db is None:
             raise NotmuchError(STATUS.NOT_INITIALIZED)
@@ -161,9 +165,7 @@ class Database(object):
         """Returns the file path of an open database
 
         Wraps *notmuch_database_get_path*."""
-        # Raise a NotmuchError if not initialized
-        self._verify_initialized_db()
-
+        self._assert_db_is_initialized()
         return Database._get_path(self._db).decode('utf-8')
 
     def get_version(self):
@@ -173,9 +175,7 @@ class Database(object):
         :exception: :exc:`NotmuchError` with STATUS.NOT_INITIALIZED if
                     the database was not intitialized.
         """
-        # Raise a NotmuchError if not initialized
-        self._verify_initialized_db()
-
+        self._assert_db_is_initialized()
         return Database._get_version(self._db)
 
     def needs_upgrade(self):
@@ -190,9 +190,7 @@ class Database(object):
         :exception: :exc:`NotmuchError` with STATUS.NOT_INITIALIZED if
                     the database was not intitialized.
         """
-        # Raise a NotmuchError if not initialized
-        self._verify_initialized_db()
-
+        self._assert_db_is_initialized()
         return nmlib.notmuch_database_needs_upgrade(self._db)
 
     def upgrade(self):
@@ -210,13 +208,52 @@ class Database(object):
 
         :TODO: catch exceptions, document return values and etc...
         """
-        # Raise a NotmuchError if not initialized
-        self._verify_initialized_db()
-
+        self._assert_db_is_initialized()
         status = Database._upgrade(self._db, None, None)
         #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."""
+        self._assert_db_is_initialized()
+        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."""
+        self._assert_db_is_initialized()
+        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(?))
@@ -239,9 +276,7 @@ class Database(object):
                     components same as database.
 
         """
-        # Raise a NotmuchError if not initialized
-        self._verify_initialized_db()
-
+        self._assert_db_is_initialized()
         # sanity checking if path is valid, and make path absolute
         if path[0] == os.sep:
             # we got an absolute path
@@ -291,7 +326,7 @@ class Database(object):
               STATUS.DUPLICATE_MESSAGE_ID
                   Message has the same message ID as another message already
                   in the database. The new filename was successfully added
-                  to the message in the database.
+                  to the list of the filenames for the existing message.
 
         :rtype:   2-tuple(:class:`Message`, STATUS)
 
@@ -310,9 +345,7 @@ class Database(object):
               STATUS.NOT_INITIALIZED
                       The database has not been initialized.
         """
-        # Raise a NotmuchError if not initialized
-        self._verify_initialized_db()
-
+        self._assert_db_is_initialized()
         msg_p = c_void_p()
         status = nmlib.notmuch_database_add_message(self._db,
                                                   _str(filename),
@@ -329,7 +362,7 @@ class Database(object):
         return (msg, status)
 
     def remove_message(self, filename):
-        """Removes a message from the given notmuch database
+        """Removes a message (filename) from the given notmuch database
 
         Note that only this particular filename association is removed from
         the database. If the same message (as determined by the message ID)
@@ -357,9 +390,7 @@ class Database(object):
              STATUS.NOT_INITIALIZED
                The database has not been initialized.
         """
-        # Raise a NotmuchError if not initialized
-        self._verify_initialized_db()
-
+        self._assert_db_is_initialized()
         return nmlib.notmuch_database_remove_message(self._db,
                                                        filename)
 
@@ -381,21 +412,31 @@ class Database(object):
         :exception: :exc:`NotmuchError` with STATUS.NOT_INITIALIZED if
                   the database was not intitialized.
         """
-        # Raise a NotmuchError if not initialized
-        self._verify_initialized_db()
-
+        self._assert_db_is_initialized()
         msg_p = Database._find_message(self._db, _str(msgid))
         return msg_p and Message(msg_p, self) or None
 
+    def find_message_by_filename(self, filename):
+        """Find a message with the given filename
+
+        :returns: If the database contains a message with the given
+            filename, then a class:`Message:` is returned.  This
+            function returns None in the following situations:
+
+                * No message is found with the given filename
+                * An out-of-memory situation occurs
+                * A Xapian exception occurs"""
+        self._assert_db_is_initialized()
+        msg_p = Database._find_message_by_filename(self._db, _str(filename))
+        return msg_p and Message(msg_p, self) or None
+
     def get_all_tags(self):
         """Returns :class:`Tags` with a list of all tags found in the database
 
         :returns: :class:`Tags`
         :execption: :exc:`NotmuchError` with STATUS.NULL_POINTER on error
         """
-        # Raise a NotmuchError if not initialized
-        self._verify_initialized_db()
-
+        self._assert_db_is_initialized()
         tags_p = Database._get_all_tags(self._db)
         if tags_p == None:
             raise NotmuchError(STATUS.NULL_POINTER)
@@ -419,9 +460,7 @@ class Database(object):
 
         This function is a python extension and not in the underlying C API.
         """
-        # Raise a NotmuchError if not initialized
-        self._verify_initialized_db()
-
+        self._assert_db_is_initialized()
         return Query(self, querystring)
 
     def __repr__(self):
@@ -658,7 +697,7 @@ class Directory(object):
     _get_child_directories = nmlib.notmuch_directory_get_child_directories
     _get_child_directories.restype = c_void_p
 
-    def _verify_dir_initialized(self):
+    def _assert_dir_is_initialized(self):
         """Raises a NotmuchError(STATUS.NOT_INITIALIZED) if dir_p is None"""
         if self._dir_p is None:
             raise NotmuchError(STATUS.NOT_INITIALIZED)
@@ -713,9 +752,7 @@ class Directory(object):
                         STATUS.NOT_INITIALIZED
                           The directory has not been initialized
         """
-        #Raise a NotmuchError(STATUS.NOT_INITIALIZED) if the dir_p is None
-        self._verify_dir_initialized()
-
+        self._assert_dir_is_initialized()
         #TODO: make sure, we convert the mtime parameter to a 'c_long'
         status = Directory._set_mtime(self._dir_p, mtime)
 
@@ -737,9 +774,7 @@ class Directory(object):
                         STATUS.NOT_INITIALIZED
                           The directory has not been initialized
         """
-        #Raise a NotmuchError(STATUS.NOT_INITIALIZED) if self.dir_p is None
-        self._verify_dir_initialized()
-
+        self._assert_dir_is_initialized()
         return Directory._get_mtime(self._dir_p)
 
     # Make mtime attribute a property of Directory()
@@ -756,9 +791,7 @@ class Directory(object):
         The returned filenames will be the basename-entries only (not
         complete paths.
         """
-        #Raise a NotmuchError(STATUS.NOT_INITIALIZED) if self._dir_p is None
-        self._verify_dir_initialized()
-
+        self._assert_dir_is_initialized()
         files_p = Directory._get_child_files(self._dir_p)
         return Filenames(files_p, self)
 
@@ -769,9 +802,7 @@ class Directory(object):
         The returned filenames will be the basename-entries only (not
         complete paths.
         """
-        #Raise a NotmuchError(STATUS.NOT_INITIALIZED) if self._dir_p is None
-        self._verify_dir_initialized()
-
+        self._assert_dir_is_initialized()
         files_p = Directory._get_child_directories(self._dir_p)
         return Filenames(files_p, self)