struct _notmuch_config_values {
const char *iterator;
size_t tok_len;
+ const char *string;
+ void *children; /* talloc_context */
};
static const char * _notmuch_config_key_to_string (notmuch_config_key_t key);
notmuch_config_values_t *
notmuch_config_get_values (notmuch_database_t *notmuch, notmuch_config_key_t key)
{
- notmuch_config_values_t *values;
+ notmuch_config_values_t *values = NULL;
+ bool ok = false;
- const char *str;
const char *key_str = _notmuch_config_key_to_string (key);
if (! key_str)
- return NULL;
-
- str = _notmuch_string_map_get (notmuch->config, key_str);
- if (! str)
- return NULL;
+ goto DONE;
values = talloc (notmuch, notmuch_config_values_t);
if (unlikely(! values))
- return NULL;
+ goto DONE;
+
+ values->children = talloc_new (values);
+
+ values->string = _notmuch_string_map_get (notmuch->config, key_str);
+ if (! values->string)
+ goto DONE;
- values->iterator = strsplit_len (str, ';', &(values->tok_len));
+ values->iterator = strsplit_len (values->string, ';', &(values->tok_len));
+ ok = true;
+
+ DONE:
+ if (!ok) {
+ if (values)
+ talloc_free(values);
+ return NULL;
+ }
return values;
}
return talloc_strndup (values, values->iterator, values->tok_len);
}
+void
+notmuch_config_values_start (notmuch_config_values_t *values) {
+ if (values == NULL)
+ return;
+ if (values->children) {
+ talloc_free (values->children);
+ }
+
+ values->children = talloc_new (values);
+
+ values->iterator = strsplit_len (values->string, ';', &(values->tok_len));
+}
+
void
notmuch_config_values_move_to_next (notmuch_config_values_t *values) {
values->iterator += values->tok_len;
return status;
}
+notmuch_status_t
+notmuch_config_get_bool (notmuch_database_t *notmuch, notmuch_config_key_t key, notmuch_bool_t *val)
+{
+ const char *key_string, *val_string;
+
+ key_string = _notmuch_config_key_to_string (key);
+ if (! key_string) {
+ return NOTMUCH_STATUS_ILLEGAL_ARGUMENT;
+ }
+
+ val_string = _notmuch_string_map_get (notmuch->config, key_string);
+ if (! val_string) {
+ *val = FALSE;
+ return NOTMUCH_STATUS_SUCCESS;
+ }
+
+ if (strcase_equal (val_string, "false") || strcase_equal (val_string, "no"))
+ *val = FALSE;
+ else if (strcase_equal (val_string, "true") || strcase_equal (val_string, "yes"))
+ *val = TRUE;
+ else
+ return NOTMUCH_STATUS_ILLEGAL_ARGUMENT;
+
+ return NOTMUCH_STATUS_SUCCESS;
+}
+
static 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_HOOK_DIR:
+ return "database.hook_dir";
case NOTMUCH_CONFIG_EXCLUDE_TAGS:
return "search.exclude_tags";
case NOTMUCH_CONFIG_NEW_TAGS:
return "new.tags";
+ case NOTMUCH_CONFIG_NEW_IGNORE:
+ return "new.ignore";
case NOTMUCH_CONFIG_SYNC_MAILDIR_FLAGS:
return "maildir.synchronize_flags";
case NOTMUCH_CONFIG_PRIMARY_EMAIL:
return "inbox;unread";
case NOTMUCH_CONFIG_SYNC_MAILDIR_FLAGS:
return "true";
+ case NOTMUCH_CONFIG_HOOK_DIR:
+ case NOTMUCH_CONFIG_NEW_IGNORE:
case NOTMUCH_CONFIG_USER_NAME:
case NOTMUCH_CONFIG_PRIMARY_EMAIL:
case NOTMUCH_CONFIG_OTHER_EMAIL:
return notmuch_database_set_config (notmuch, _notmuch_config_key_to_string (key), val);
}
+
+void
+_notmuch_config_cache (notmuch_database_t *notmuch, notmuch_config_key_t key, const char *val) {
+ _notmuch_string_map_set (notmuch->config, _notmuch_config_key_to_string (key), val);
+}