lib/config: add notmuch_config_key_{get,set}

By using an enum we can have better error detection than copy pasting
key strings around.

The question of what layer this belongs in is a bit
tricky. Historically most of the keys are defined by the CLI. On the
other hand features like excludes are supported in the
library/bindings, and it makes sense to configure them from the
library as well.

The somewhat long prefix for notmuch_config_t is to avoid collisions
with the existing usage in notmuch-client.h.
This commit is contained in:
David Bremner 2020-08-25 22:36:43 -03:00
parent 867d7352a7
commit d6bd87a712
3 changed files with 128 additions and 0 deletions

View file

@ -279,3 +279,37 @@ _notmuch_config_load_from_file (notmuch_database_t *notmuch,
DONE: DONE:
return status; return status;
} }
const char *
_notmuch_config_key_to_string (notmuch_config_key_t key) {
switch (key) {
case NOTMUCH_CONFIG_DATABASE_PATH:
return "database.path";
case NOTMUCH_CONFIG_EXCLUDE_TAGS:
return "search.exclude_tags";
case NOTMUCH_CONFIG_NEW_TAGS:
return "new.tags";
case NOTMUCH_CONFIG_SYNC_MAILDIR_FLAGS:
return "maildir.synchronize_flags";
case NOTMUCH_CONFIG_PRIMARY_EMAIL:
return "user.primary_email";
case NOTMUCH_CONFIG_OTHER_EMAIL:
return "user.other_email";
case NOTMUCH_CONFIG_USER_NAME:
return "user.name";
default:
return NULL;
}
}
const char *
notmuch_config_get (notmuch_database_t *notmuch, notmuch_config_key_t key) {
return _notmuch_string_map_get (notmuch->config, _notmuch_config_key_to_string (key));
}
notmuch_status_t
notmuch_config_set (notmuch_database_t *notmuch, notmuch_config_key_t key, const char *val) {
return notmuch_database_set_config (notmuch, _notmuch_config_key_to_string (key), val);
}

View file

@ -2325,6 +2325,11 @@ notmuch_filenames_destroy (notmuch_filenames_t *filenames);
* set config 'key' to 'value' * set config 'key' to 'value'
* *
* @since libnotmuch 4.4 (notmuch 0.23) * @since libnotmuch 4.4 (notmuch 0.23)
* @retval #NOTMUCH_STATUS_READ_ONLY_DATABASE: Database was opened in
* read-only mode so message cannot be modified.
* @retval #NOTMUCH_STATUS_XAPIAN_EXCEPTION: an exception was thrown
* accessing the database.
* @retval #NOTMUCH_STATUS_SUCCESS
*/ */
notmuch_status_t notmuch_status_t
notmuch_database_set_config (notmuch_database_t *db, const char *key, const char *value); notmuch_database_set_config (notmuch_database_t *db, const char *key, const char *value);
@ -2339,6 +2344,7 @@ notmuch_database_set_config (notmuch_database_t *db, const char *key, const char
* caller. * caller.
* *
* @since libnotmuch 4.4 (notmuch 0.23) * @since libnotmuch 4.4 (notmuch 0.23)
*
*/ */
notmuch_status_t notmuch_status_t
notmuch_database_get_config (notmuch_database_t *db, const char *key, char **value); notmuch_database_get_config (notmuch_database_t *db, const char *key, char **value);
@ -2400,6 +2406,56 @@ void
notmuch_config_list_destroy (notmuch_config_list_t *config_list); notmuch_config_list_destroy (notmuch_config_list_t *config_list);
/**
* Configuration keys known to libnotmuch
*/
typedef enum _notmuch_config_key {
NOTMUCH_CONFIG_FIRST,
NOTMUCH_CONFIG_DATABASE_PATH = NOTMUCH_CONFIG_FIRST,
NOTMUCH_CONFIG_EXCLUDE_TAGS,
NOTMUCH_CONFIG_NEW_TAGS,
NOTMUCH_CONFIG_SYNC_MAILDIR_FLAGS,
NOTMUCH_CONFIG_PRIMARY_EMAIL,
NOTMUCH_CONFIG_OTHER_EMAIL,
NOTMUCH_CONFIG_USER_NAME,
NOTMUCH_CONFIG_LAST
} notmuch_config_key_t;
/**
* get a configuration value from an open database.
*
* This value reflects all configuration information given at the time
* the database was opened.
*
* @param[in] notmuch database
* @param[in] key configuration key
*
* @since libnotmuch 5.4 (notmuch 0.32)
*
* @retval NULL if 'key' unknown or if no value is known for
* 'key'. Otherwise returns a string owned by notmuch which should
* not be modified nor freed by the caller.
*/
const char *
notmuch_config_get (notmuch_database_t *notmuch, notmuch_config_key_t key);
/**
* set a configuration value from in an open database.
*
* This value reflects all configuration information given at the time
* the database was opened.
*
* @param[in,out] notmuch database open read/write
* @param[in] key configuration key
* @param[in] val configuration value
*
* @since libnotmuch 5.4 (notmuch 0.32)
*
* @retval returns any return value for notmuch_database_set_config.
*/
notmuch_status_t
notmuch_config_set (notmuch_database_t *notmuch, notmuch_config_key_t key, const char *val);
/** /**
* get the current default indexing options for a given database. * get the current default indexing options for a given database.
* *

View file

@ -201,6 +201,44 @@ EOF
test_expect_equal_file EXPECTED OUTPUT test_expect_equal_file EXPECTED OUTPUT
restore_database restore_database
backup_database
test_begin_subtest "get config by key"
notmuch config set test.key1 overridden
cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} ${NOTMUCH_CONFIG}
{
printf("before = %s\n", notmuch_config_get (db, NOTMUCH_CONFIG_SYNC_MAILDIR_FLAGS));
EXPECT0(notmuch_database_set_config (db, "maildir.synchronize_flags", "false"));
printf("after = %s\n", notmuch_config_get (db, NOTMUCH_CONFIG_SYNC_MAILDIR_FLAGS));
}
EOF
cat <<'EOF' >EXPECTED
== stdout ==
before = true
after = false
== stderr ==
EOF
test_expect_equal_file EXPECTED OUTPUT
restore_database
backup_database
test_begin_subtest "set config by key"
notmuch config set test.key1 overridden
cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} ${NOTMUCH_CONFIG}
{
printf("before = %s\n", notmuch_config_get (db, NOTMUCH_CONFIG_SYNC_MAILDIR_FLAGS));
EXPECT0(notmuch_config_set (db, NOTMUCH_CONFIG_SYNC_MAILDIR_FLAGS, "false"));
printf("after = %s\n", notmuch_config_get (db, NOTMUCH_CONFIG_SYNC_MAILDIR_FLAGS));
}
EOF
cat <<'EOF' >EXPECTED
== stdout ==
before = true
after = false
== stderr ==
EOF
test_expect_equal_file EXPECTED OUTPUT
restore_database
backup_database backup_database
test_begin_subtest "override config from \${NOTMUCH_CONFIG}" test_begin_subtest "override config from \${NOTMUCH_CONFIG}"
notmuch config set test.key1 overridden notmuch config set test.key1 overridden