X-Git-Url: https://git.notmuchmail.org/git?p=notmuch;a=blobdiff_plain;f=bindings%2Fpython%2Fnotmuch%2Fdatabase.py;h=9fb30e6355d2ca9bca4d90311d2862e9455cb771;hp=dc124f5e91b97739ade5857320220781d8ad427f;hb=f88d985e507a96b5179c2de793b9b75da55457a3;hpb=8e7a108363574ad3a342ed33a7c61c7dea65dc8a diff --git a/bindings/python/notmuch/database.py b/bindings/python/notmuch/database.py index dc124f5e..9fb30e63 100644 --- a/bindings/python/notmuch/database.py +++ b/bindings/python/notmuch/database.py @@ -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)