]> git.notmuchmail.org Git - notmuch/blobdiff - bindings/python/notmuch/database.py
Drop devel/printmimestructure (it is in mailscripts 0.11)
[notmuch] / bindings / python / notmuch / database.py
index 549663078ac5813c27aeb5c5b2b780313e6e6eed..88ca836e2d1aa4c78471ede28f7541fac630aafa 100644 (file)
@@ -29,6 +29,7 @@ from .globals import (
     NotmuchConfigListP,
     NotmuchDatabaseP,
     NotmuchDirectoryP,
+    NotmuchIndexoptsP,
     NotmuchMessageP,
     NotmuchTagsP,
 )
@@ -73,6 +74,9 @@ class Database(object):
     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)]
@@ -401,13 +405,25 @@ class Database(object):
         # 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
@@ -428,6 +444,23 @@ class Database(object):
             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
@@ -458,7 +491,15 @@ class Database(object):
         """
         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)
@@ -525,7 +566,7 @@ class Database(object):
         :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
@@ -550,7 +591,7 @@ class Database(object):
             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"
@@ -634,7 +675,10 @@ class Database(object):
         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
@@ -689,25 +733,23 @@ class Database(object):
     _config_list_destroy.argtypes = [NotmuchConfigListP]
     _config_list_destroy.restype = None
 
-    def get_config_list(self, prefix=''):
-        """Return a list of key, value pairs where the start of key matches the
-        given prefix
+    def get_configs(self, prefix=''):
+        """Return a generator of key, value pairs where the start of key
+        matches the given prefix
 
         Note that only config values that are stored in the database are
         searched and returned.  The config file is not read.  If no `prefix` is
         given all config values are returned.
 
-        This could be used to get all config values or all named queries into a
-        dict for example::
+        This could be used to get all named queries into a dict for example::
 
-            config = {k: v for k, v in db.get_config_list()}
-            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
-        :returns:      all key-value pairs where `prefix` matches the beginning
+        :yields:       all key-value pairs where `prefix` matches the beginning
                        of the key
-        :rtype:        a list of pairs of str
+        :ytype:        pairs of str
         :raises:      :exc:`NotmuchError` in case of failure.
 
         """
@@ -717,13 +759,11 @@ class Database(object):
                                        byref(config_list_p))
         if status != STATUS.SUCCESS:
             raise NotmuchError(status)
-        config_list = []
         while self._config_list_valid(config_list_p):
             key = self._config_list_key(config_list_p).decode('utf-8')
             value = self._config_list_value(config_list_p).decode('utf-8')
-            config_list.append((key, value))
+            yield key, value
             self._config_list_move_to_next(config_list_p)
-        return config_list
 
     """notmuch_database_set_config"""
     _set_config = nmlib.notmuch_database_set_config