NotmuchConfigListP,
NotmuchDatabaseP,
NotmuchDirectoryP,
+ NotmuchIndexoptsP,
NotmuchMessageP,
NotmuchTagsP,
)
.. note::
Any function in this class can and will throw an
- :exc:`NotInitializedError` if the database was not intitialized
+ :exc:`NotInitializedError` if the database was not initialized
properly.
"""
_std_db_path = None
MODE = Enum(['READ_ONLY', 'READ_WRITE'])
"""Constants: Mode in which to open the database"""
+ DECRYPTION_POLICY = Enum(['FALSE', 'TRUE', 'AUTO', 'NOSTASH'])
+ """Constants: policies for decrypting messages during indexing"""
+
"""notmuch_database_get_directory"""
_get_directory = nmlib.notmuch_database_get_directory
_get_directory.argtypes = [NotmuchDatabaseP, c_char_p, POINTER(NotmuchDirectoryP)]
return Database._get_version(self._db)
def get_revision (self):
- """Returns the committed database revison and UUID
+ """Returns the committed database revision and UUID
- :returns: (revison, uuid) The database revision as a positive integer
+ :returns: (revision, uuid) The database revision as a positive integer
and the UUID of the database.
"""
self._assert_db_is_initialized()
# return the Directory, init it with the absolute path
return Directory(abs_dirpath, dir_p, self)
+ _get_default_indexopts = nmlib.notmuch_database_get_default_indexopts
+ _get_default_indexopts.argtypes = [NotmuchDatabaseP]
+ _get_default_indexopts.restype = NotmuchIndexoptsP
+
+ _indexopts_set_decrypt_policy = nmlib.notmuch_indexopts_set_decrypt_policy
+ _indexopts_set_decrypt_policy.argtypes = [NotmuchIndexoptsP, c_uint]
+ _indexopts_set_decrypt_policy.restype = None
+
+ _indexopts_destroy = nmlib.notmuch_indexopts_destroy
+ _indexopts_destroy.argtypes = [NotmuchIndexoptsP]
+ _indexopts_destroy.restype = None
+
_index_file = nmlib.notmuch_database_index_file
_index_file.argtypes = [NotmuchDatabaseP, c_char_p,
c_void_p,
POINTER(NotmuchMessageP)]
_index_file.restype = c_uint
- def index_file(self, filename, sync_maildir_flags=False):
+ def index_file(self, filename, sync_maildir_flags=False, decrypt_policy=None):
"""Adds a new message to the database
:param filename: should be a path relative to the path of the
API. You might want to look into the underlying method
:meth:`Message.maildir_flags_to_tags`.
+ :param decrypt_policy: If the message contains any encrypted
+ parts, and decrypt_policy is set to
+ :attr:`DECRYPTION_POLICY`.TRUE, notmuch will try to
+ decrypt the message and index the cleartext, stashing any
+ discovered session keys. If it is set to
+ :attr:`DECRYPTION_POLICY`.FALSE, it will never try to
+ decrypt during indexing. If it is set to
+ :attr:`DECRYPTION_POLICY`.AUTO, then it will try to use
+ any stashed session keys it knows about, but will not try
+ to access the user's secret keys.
+ :attr:`DECRYPTION_POLICY`.NOSTASH behaves the same as
+ :attr:`DECRYPTION_POLICY`.TRUE except that no session keys
+ are stashed in the database. If decrypt_policy is set to
+ None (the default), then the database itself will decide
+ whether to decrypt, based on the `index.decrypt`
+ configuration setting (see notmuch-config(1)).
+
:returns: On success, we return
1) a :class:`Message` object that can be used for things
"""
self._assert_db_is_initialized()
msg_p = NotmuchMessageP()
- status = self._index_file(self._db, _str(filename), c_void_p(None), byref(msg_p))
+ indexopts = c_void_p(None)
+ if decrypt_policy is not None:
+ indexopts = self._get_default_indexopts(self._db)
+ self._indexopts_set_decrypt_policy(indexopts, decrypt_policy)
+
+ status = self._index_file(self._db, _str(filename), indexopts, byref(msg_p))
+
+ if indexopts:
+ self._indexopts_destroy(indexopts)
if not status in [STATUS.SUCCESS, STATUS.DUPLICATE_MESSAGE_ID]:
raise NotmuchError(status)
:returns: :class:`Message` or `None` if no message is found.
:raises:
:exc:`OutOfMemoryError`
- If an Out-of-memory occured while constructing the message.
+ If an Out-of-memory occurred while constructing the message.
:exc:`XapianError`
In case of a Xapian Exception. These exceptions
include "Database modified" situations, e.g. when the
in the meantime. In this case, you should close and
reopen the database and retry.
:exc:`NotInitializedError` if
- the database was not intitialized.
+ the database was not initialized.
"""
self._assert_db_is_initialized()
msg_p = NotmuchMessageP()
function returns None if no message is found with the given
filename.
- :raises: :exc:`OutOfMemoryError` if an Out-of-memory occured while
+ :raises: :exc:`OutOfMemoryError` if an Out-of-memory occurred while
constructing the message.
:raises: :exc:`XapianError` in case of a Xapian Exception.
These exceptions include "Database modified"
case, you should close and reopen the database and
retry.
:raises: :exc:`NotInitializedError` if the database was not
- intitialized.
+ initialized.
*Added in notmuch 0.9*"""
self._assert_db_is_initialized()
"""Returns :class:`Tags` with a list of all tags found in the database
:returns: :class:`Tags`
- :execption: :exc:`NotmuchError` with :attr:`STATUS`.NULL_POINTER
+ :exception: :exc:`NotmuchError` with :attr:`STATUS`.NULL_POINTER
on error
"""
self._assert_db_is_initialized()
if not config.has_option('database', 'path'):
raise NotmuchError(message="No DB path specified"
" and no user default found")
- return config.get('database', 'path')
+ db_path = config.get('database', 'path')
+ if not os.path.isabs(db_path):
+ db_path = os.path.expanduser(os.path.join("~", db_path))
+ return db_path
"""notmuch_database_get_config"""
_get_config = nmlib.notmuch_database_get_config
_config_list_destroy.argtypes = [NotmuchConfigListP]
_config_list_destroy.restype = None
- def get_config_list(self, prefix=''):
+ def get_configs(self, prefix=''):
"""Return a generator of key, value pairs where the start of key
matches the given prefix
This could be used to get all named queries into a dict for example::
- queries = {k[6:]: v for k, v in db.get_config_list('query.')}
+ queries = {k[6:]: v for k, v in db.get_configs('query.')}
:param prefix: a string by which the keys should be selected
:type prefix: str
yield key, value
self._config_list_move_to_next(config_list_p)
- def get_configs(self, prefix=''):
- """Return a dict of key, value pairs where the start of key matches the
- given prefix
-
- :param prefix: a string by which the keys should be selected
- :type prefix: str
- :returns: all key-value pairs where `prefix` matches the beginning
- of the key
- :rtype: a dict of str: str
- :raises: :exc:`NotmuchError` in case of failure.
-
- """
- return dict(self.get_config_list(prefix))
-
"""notmuch_database_set_config"""
_set_config = nmlib.notmuch_database_set_config
_set_config.argtypes = [NotmuchDatabaseP, c_char_p, c_char_p]