From 6c6b0f13ffc3988b0f31774b33b8215be02abaa9 Mon Sep 17 00:00:00 2001 From: "l-m-h@web.de" Date: Thu, 7 Dec 2017 12:40:46 +0100 Subject: [PATCH] python: add bindings to access config The C functions notmuch_database_get_config, notmuch_database_get_config_list and notmuch_database_set_config are part of the official C bindings. So there should also be some python bindings for them. Also they are the only way to access the named queries introduced in b9bf3f44. The interface of the python functions is designed to be close to the C functions. --- bindings/python/docs/source/database.rst | 6 ++ bindings/python/notmuch/database.py | 106 +++++++++++++++++++++++ bindings/python/notmuch/globals.py | 5 ++ 3 files changed, 117 insertions(+) diff --git a/bindings/python/docs/source/database.rst b/bindings/python/docs/source/database.rst index 079dc754..f9567949 100644 --- a/bindings/python/docs/source/database.rst +++ b/bindings/python/docs/source/database.rst @@ -37,6 +37,12 @@ .. automethod:: create_query + .. automethod:: get_config + + .. automethod:: get_config_list + + .. automethod:: set_config + .. attribute:: Database.MODE Defines constants that are used as the mode in which to open a database. diff --git a/bindings/python/notmuch/database.py b/bindings/python/notmuch/database.py index 1279804a..2866b860 100644 --- a/bindings/python/notmuch/database.py +++ b/bindings/python/notmuch/database.py @@ -26,6 +26,7 @@ from .globals import ( nmlib, Enum, _str, + NotmuchConfigListP, NotmuchDatabaseP, NotmuchDirectoryP, NotmuchMessageP, @@ -634,3 +635,108 @@ class Database(object): raise NotmuchError(message="No DB path specified" " and no user default found") return config.get('database', 'path') + + """notmuch_database_get_config""" + _get_config = nmlib.notmuch_database_get_config + _get_config.argtypes = [NotmuchDatabaseP, c_char_p, POINTER(c_char_p)] + _get_config.restype = c_uint + + def get_config(self, key): + """Return the value of the given config key. + + Note that only config values that are stored in the database are + searched and returned. The config file is not read. + + :param key: the config key under which a value should be looked up, it + should probably be in the form "section.key" + :type key: str + :returns: the config value or the empty string if no value is present + for that key + :rtype: str + :raises: :exc:`NotmuchError` in case of failure. + + """ + self._assert_db_is_initialized() + return_string = c_char_p() + status = self._get_config(self._db, _str(key), byref(return_string)) + if status != STATUS.SUCCESS: + raise NotmuchError(status) + return return_string.value.decode('utf-8') + + """notmuch_database_get_config_list""" + _get_config_list = nmlib.notmuch_database_get_config_list + _get_config_list.argtypes = [NotmuchDatabaseP, c_char_p, + POINTER(NotmuchConfigListP)] + _get_config_list.restype = c_uint + + _config_list_valid = nmlib.notmuch_config_list_valid + _config_list_valid.argtypes = [NotmuchConfigListP] + _config_list_valid.restype = bool + + _config_list_key = nmlib.notmuch_config_list_key + _config_list_key.argtypes = [NotmuchConfigListP] + _config_list_key.restype = c_char_p + + _config_list_value = nmlib.notmuch_config_list_value + _config_list_value.argtypes = [NotmuchConfigListP] + _config_list_value.restype = c_char_p + + _config_list_move_to_next = nmlib.notmuch_config_list_move_to_next + _config_list_move_to_next.argtypes = [NotmuchConfigListP] + _config_list_move_to_next.restype = None + + _config_list_destroy = nmlib.notmuch_config_list_destroy + _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 + + Note that only config values that are stored in the database are + searched and returned. The config file is not read. + + :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 list of pairs of str + :raises: :exc:`NotmuchError` in case of failure. + + """ + self._assert_db_is_initialized() + config_list_p = NotmuchConfigListP() + status = self._get_config_list(self._db, _str(prefix), + 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)) + self._config_list_move_to_next(config_list_p) + return config_list + + """notmuch_database_set_config""" + _set_config = nmlib.notmuch_database_set_config + _set_config.argtypes = [NotmuchDatabaseP, c_char_p, c_char_p] + _set_config.restype = c_uint + + def set_config(self, key, value): + """Set a config value in the notmuch database. + + If an empty string is provided as `value` the `key` is unset! + + :param key: the key to set + :type key: str + :param value: the value to store under `key` + :type value: str + :returns: None + :raises: :exc:`NotmuchError` in case of failure. + + """ + self._assert_db_is_initialized() + status = self._set_config(self._db, _str(key), _str(value)) + if status != STATUS.SUCCESS: + raise NotmuchError(status) diff --git a/bindings/python/notmuch/globals.py b/bindings/python/notmuch/globals.py index b1eec2cf..b33e10d3 100644 --- a/bindings/python/notmuch/globals.py +++ b/bindings/python/notmuch/globals.py @@ -88,3 +88,8 @@ NotmuchDirectoryP = POINTER(NotmuchDirectoryS) class NotmuchFilenamesS(Structure): pass NotmuchFilenamesP = POINTER(NotmuchFilenamesS) + + +class NotmuchConfigListS(Structure): + pass +NotmuchConfigListP = POINTER(NotmuchConfigListS)