mirror of
https://git.notmuchmail.org/git/notmuch
synced 2024-11-24 11:58:10 +01:00
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.
This commit is contained in:
parent
572259885a
commit
6c6b0f13ff
3 changed files with 117 additions and 0 deletions
|
@ -37,6 +37,12 @@
|
||||||
|
|
||||||
.. automethod:: create_query
|
.. automethod:: create_query
|
||||||
|
|
||||||
|
.. automethod:: get_config
|
||||||
|
|
||||||
|
.. automethod:: get_config_list
|
||||||
|
|
||||||
|
.. automethod:: set_config
|
||||||
|
|
||||||
.. attribute:: Database.MODE
|
.. attribute:: Database.MODE
|
||||||
|
|
||||||
Defines constants that are used as the mode in which to open a database.
|
Defines constants that are used as the mode in which to open a database.
|
||||||
|
|
|
@ -26,6 +26,7 @@ from .globals import (
|
||||||
nmlib,
|
nmlib,
|
||||||
Enum,
|
Enum,
|
||||||
_str,
|
_str,
|
||||||
|
NotmuchConfigListP,
|
||||||
NotmuchDatabaseP,
|
NotmuchDatabaseP,
|
||||||
NotmuchDirectoryP,
|
NotmuchDirectoryP,
|
||||||
NotmuchMessageP,
|
NotmuchMessageP,
|
||||||
|
@ -634,3 +635,108 @@ class Database(object):
|
||||||
raise NotmuchError(message="No DB path specified"
|
raise NotmuchError(message="No DB path specified"
|
||||||
" and no user default found")
|
" and no user default found")
|
||||||
return config.get('database', 'path')
|
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)
|
||||||
|
|
|
@ -88,3 +88,8 @@ NotmuchDirectoryP = POINTER(NotmuchDirectoryS)
|
||||||
class NotmuchFilenamesS(Structure):
|
class NotmuchFilenamesS(Structure):
|
||||||
pass
|
pass
|
||||||
NotmuchFilenamesP = POINTER(NotmuchFilenamesS)
|
NotmuchFilenamesP = POINTER(NotmuchFilenamesS)
|
||||||
|
|
||||||
|
|
||||||
|
class NotmuchConfigListS(Structure):
|
||||||
|
pass
|
||||||
|
NotmuchConfigListP = POINTER(NotmuchConfigListS)
|
||||||
|
|
Loading…
Reference in a new issue