if (status)
return status;
+ if (! notmuch->config) {
+ if ((status = _notmuch_config_load_from_database (notmuch)))
+ return status;
+ }
+
try {
notmuch->writable_xapian_db->set_metadata (CONFIG_PREFIX + key, value);
} catch (const Xapian::Error &error) {
_notmuch_database_log (notmuch, "Error: A Xapian exception occurred setting metadata: %s\n",
error.get_msg ().c_str ());
}
- return status;
+
+ if (status)
+ return status;
+
+ _notmuch_string_map_set (notmuch->config, key, value);
+
+ return NOTMUCH_STATUS_SUCCESS;
}
static notmuch_status_t
const char *key,
char **value)
{
- std::string strval;
+ const char* stored_val;
notmuch_status_t status;
+ if (! notmuch->config) {
+ if ((status = _notmuch_config_load_from_database (notmuch)))
+ return status;
+ }
+
if (! value)
return NOTMUCH_STATUS_NULL_POINTER;
- status = _metadata_value (notmuch, key, strval);
- if (status)
- return status;
-
- *value = strdup (strval.c_str ());
+ stored_val = _notmuch_string_map_get (notmuch->config, key);
+ if (! stored_val) {
+ /* XXX in principle this API should be fixed so empty string
+ * is distinguished from not found */
+ *value = strdup("");
+ } else {
+ *value = strdup (stored_val);
+ }
return NOTMUCH_STATUS_SUCCESS;
}
{
talloc_free (list);
}
+
+notmuch_status_t
+_notmuch_config_load_from_database (notmuch_database_t *notmuch)
+{
+ notmuch_status_t status = NOTMUCH_STATUS_SUCCESS;
+ notmuch_config_list_t *list;
+
+ if (notmuch->config == NULL)
+ notmuch->config = _notmuch_string_map_create (notmuch);
+
+ if (unlikely(notmuch->config == NULL))
+ return NOTMUCH_STATUS_OUT_OF_MEMORY;
+
+ status = notmuch_database_get_config_list (notmuch, "", &list);
+ if (status)
+ return status;
+
+ for (; notmuch_config_list_valid (list); notmuch_config_list_move_to_next (list)) {
+ _notmuch_string_map_append (notmuch->config,
+ notmuch_config_list_key (list),
+ notmuch_config_list_value (list));
+ }
+
+ return status;
+}
* here, but at least they are small */
notmuch_string_map_t *user_prefix;
notmuch_string_map_t *user_header;
+
+ /* Cached and possibly overridden configuration */
+ notmuch_string_map_t *config;
};
/* Prior to database version 3, features were implied by the database
#define EMPTY_STRING(s) ((s)[0] == '\0')
+/* config.cc */
+notmuch_status_t
+_notmuch_config_load_from_database (notmuch_database_t * db);
NOTMUCH_END_DECLS
#ifdef __cplusplus
notmuch->exception_reported = false;
notmuch->status_string = NULL;
notmuch->path = talloc_strdup (notmuch, path);
-
+ notmuch->config = NULL;
strip_trailing (notmuch->path, '/');
notmuch->writable_xapian_db = NULL;
notmuch->query_parser->add_rangeprocessor (notmuch->date_range_processor);
notmuch->query_parser->add_rangeprocessor (notmuch->last_mod_range_processor);
+ /* Configuration information is needed to set up query parser */
+ status = _notmuch_config_load_from_database (notmuch);
+ if (status)
+ goto DONE;
+
status = _notmuch_database_setup_standard_query_fields (notmuch);
if (status)
goto DONE;
notmuch_status_t
_notmuch_database_setup_user_query_fields (notmuch_database_t *notmuch)
{
- notmuch_config_list_t *list;
- notmuch_status_t status;
+ notmuch_string_map_iterator_t *list;
notmuch->user_prefix = _notmuch_string_map_create (notmuch);
if (notmuch->user_prefix == NULL)
if (notmuch->user_header == NULL)
return NOTMUCH_STATUS_OUT_OF_MEMORY;
- status = notmuch_database_get_config_list (notmuch, CONFIG_HEADER_PREFIX, &list);
- if (status)
- return status;
+ list = _notmuch_string_map_iterator_create (notmuch->config, CONFIG_HEADER_PREFIX, FALSE);
+ if (! list)
+ INTERNAL_ERROR ("unable to read headers from configuration");
- for (; notmuch_config_list_valid (list); notmuch_config_list_move_to_next (list)) {
+ for (; _notmuch_string_map_iterator_valid (list);
+ _notmuch_string_map_iterator_move_to_next (list)) {
prefix_t query_field;
- const char *key = notmuch_config_list_key (list)
+ const char *key = _notmuch_string_map_iterator_key (list)
+ sizeof (CONFIG_HEADER_PREFIX) - 1;
_notmuch_string_map_append (notmuch->user_prefix,
_notmuch_string_map_append (notmuch->user_header,
key,
- notmuch_config_list_value (list));
+ _notmuch_string_map_iterator_value (list));
query_field.name = talloc_strdup (notmuch, key);
query_field.prefix = _user_prefix (notmuch, key);
_setup_query_field_default (&query_field, notmuch);
}
- notmuch_config_list_destroy (list);
+ _notmuch_string_map_iterator_destroy (list);
return NOTMUCH_STATUS_SUCCESS;
}
test_begin_subtest "get config from closed database"
cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR}
{
- const char *result;
+ char *result;
EXPECT0(notmuch_database_close (db));
stat = notmuch_database_get_config (db, "foo", &result);
printf("%d\n", stat == NOTMUCH_STATUS_XAPIAN_EXCEPTION);
EOF
cat <<EOF > EXPECTED
== stdout ==
-1
+0
== stderr ==
-Error: A Xapian exception occurred getting metadata: Database has been closed
EOF
test_expect_equal_file EXPECTED OUTPUT
notmuch_indexopts_t *result;
EXPECT0(notmuch_database_close (db));
result = notmuch_database_get_default_indexopts (db);
- printf("%d\n", result == NULL);
+ printf("%d\n", result != NULL);
}
EOF
cat <<EOF > EXPECTED