X-Git-Url: https://git.notmuchmail.org/git?a=blobdiff_plain;f=lib%2Fconfig.cc;h=0b760dbcc2063deeefde553fa66b5421fcf23d02;hb=763445beaec906440fbdd497755718ef860b88e4;hp=e05e50fe209e7f974fc7b23b80c4cf7d833398f9;hpb=92e59568fa4eec466db78af6c21c39ca5826b0d7;p=notmuch diff --git a/lib/config.cc b/lib/config.cc index e05e50fe..0b760dbc 100644 --- a/lib/config.cc +++ b/lib/config.cc @@ -13,7 +13,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see http://www.gnu.org/licenses/ . + * along with this program. If not, see https://www.gnu.org/licenses/ . * * Author: David Bremner */ @@ -45,22 +45,20 @@ notmuch_database_set_config (notmuch_database_t *notmuch, const char *value) { notmuch_status_t status; - Xapian::WritableDatabase *db; status = _notmuch_database_ensure_writable (notmuch); if (status) return status; try { - db = static_cast (notmuch->xapian_db); - db->set_metadata (CONFIG_PREFIX + key, value); + notmuch->writable_xapian_db->set_metadata (CONFIG_PREFIX + key, value); } catch (const Xapian::Error &error) { status = NOTMUCH_STATUS_XAPIAN_EXCEPTION; - notmuch->exception_reported = TRUE; + notmuch->exception_reported = true; _notmuch_database_log (notmuch, "Error: A Xapian exception occurred setting metadata: %s\n", - error.get_msg().c_str()); + error.get_msg ().c_str ()); } - return NOTMUCH_STATUS_SUCCESS; + return status; } static notmuch_status_t @@ -74,9 +72,9 @@ _metadata_value (notmuch_database_t *notmuch, value = notmuch->xapian_db->get_metadata (CONFIG_PREFIX + key); } catch (const Xapian::Error &error) { status = NOTMUCH_STATUS_XAPIAN_EXCEPTION; - notmuch->exception_reported = TRUE; + notmuch->exception_reported = true; _notmuch_database_log (notmuch, "Error: A Xapian exception occurred getting metadata: %s\n", - error.get_msg().c_str()); + error.get_msg ().c_str ()); } return status; } @@ -115,7 +113,6 @@ notmuch_database_get_config_list (notmuch_database_t *notmuch, goto DONE; } - talloc_set_destructor (list, _notmuch_config_list_destroy); list->notmuch = notmuch; list->current_key = NULL; list->current_val = NULL; @@ -123,20 +120,28 @@ notmuch_database_get_config_list (notmuch_database_t *notmuch, try { new(&(list->iterator)) Xapian::TermIterator (notmuch->xapian_db->metadata_keys_begin - (CONFIG_PREFIX + (prefix ? prefix : ""))); + (CONFIG_PREFIX + (prefix ? prefix : ""))); + talloc_set_destructor (list, _notmuch_config_list_destroy); } catch (const Xapian::Error &error) { _notmuch_database_log (notmuch, "A Xapian exception occurred getting metadata iterator: %s.\n", - error.get_msg().c_str()); - notmuch->exception_reported = TRUE; + error.get_msg ().c_str ()); + notmuch->exception_reported = true; status = NOTMUCH_STATUS_XAPIAN_EXCEPTION; } *out = list; DONE: - if (status && list) - talloc_free (list); + if (status) { + if (list) { + talloc_free (list); + if (status != NOTMUCH_STATUS_XAPIAN_EXCEPTION) + _notmuch_config_list_destroy (list); + } + } else { + talloc_set_destructor (list, _notmuch_config_list_destroy); + } return status; } @@ -145,9 +150,13 @@ notmuch_bool_t notmuch_config_list_valid (notmuch_config_list_t *metadata) { if (metadata->iterator == metadata->notmuch->xapian_db->metadata_keys_end ()) - return FALSE; + return false; + + return true; +} - return TRUE; +static inline char * _key_from_iterator (notmuch_config_list_t *list) { + return talloc_strdup (list, (*list->iterator).c_str () + CONFIG_PREFIX.length ()); } const char * @@ -156,7 +165,7 @@ notmuch_config_list_key (notmuch_config_list_t *list) if (list->current_key) talloc_free (list->current_key); - list->current_key = talloc_strdup (list, (*list->iterator).c_str () + CONFIG_PREFIX.length ()); + list->current_key = _key_from_iterator (list); return list->current_key; } @@ -166,7 +175,7 @@ notmuch_config_list_value (notmuch_config_list_t *list) { std::string strval; notmuch_status_t status; - const char *key = notmuch_config_list_key (list); + char *key = _key_from_iterator (list); /* TODO: better error reporting?? */ status = _metadata_value (list->notmuch, key, strval); @@ -177,6 +186,7 @@ notmuch_config_list_value (notmuch_config_list_t *list) talloc_free (list->current_val); list->current_val = talloc_strdup (list, strval.c_str ()); + talloc_free (key); return list->current_val; }