X-Git-Url: https://git.notmuchmail.org/git?p=notmuch;a=blobdiff_plain;f=lib%2Fmessage-property.cc;h=ecf7e140108d08b07e43afeb78c636d6085de46f;hp=0b13cac314f9aad61067986257273af3a7921b3b;hb=b90d852a2fb377d5b7db4ab2ac389964f8c0c3b3;hpb=58fe8fce1d1b7b86b4914a5a476ff21411c84082 diff --git a/lib/message-property.cc b/lib/message-property.cc index 0b13cac3..ecf7e140 100644 --- a/lib/message-property.cc +++ b/lib/message-property.cc @@ -16,7 +16,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 */ @@ -36,22 +36,47 @@ notmuch_message_get_property (notmuch_message_t *message, const char *key, const return NOTMUCH_STATUS_SUCCESS; } +notmuch_status_t +notmuch_message_count_properties (notmuch_message_t *message, const char *key, unsigned int *count) +{ + if (! count || ! key || ! message) + return NOTMUCH_STATUS_NULL_POINTER; + + notmuch_string_map_t *map; + map = _notmuch_message_property_map (message); + if (! map) + return NOTMUCH_STATUS_NULL_POINTER; + + notmuch_string_map_iterator_t *matcher = _notmuch_string_map_iterator_create (map, key, true); + if (! matcher) + return NOTMUCH_STATUS_OUT_OF_MEMORY; + + *count = 0; + while (_notmuch_string_map_iterator_valid (matcher)) { + (*count)++; + _notmuch_string_map_iterator_move_to_next (matcher); + } + + _notmuch_string_map_iterator_destroy (matcher); + return NOTMUCH_STATUS_SUCCESS; +} + static notmuch_status_t _notmuch_message_modify_property (notmuch_message_t *message, const char *key, const char *value, - notmuch_bool_t delete_it) + bool delete_it) { notmuch_private_status_t private_status; notmuch_status_t status; char *term = NULL; - status = _notmuch_database_ensure_writable (_notmuch_message_database (message)); + status = _notmuch_database_ensure_writable (notmuch_message_get_database (message)); if (status) return status; if (key == NULL || value == NULL) return NOTMUCH_STATUS_NULL_POINTER; - if (index (key, '=')) + if (strchr (key, '=')) return NOTMUCH_STATUS_ILLEGAL_ARGUMENT; term = talloc_asprintf (message, "%s=%s", key, value); @@ -76,28 +101,30 @@ _notmuch_message_modify_property (notmuch_message_t *message, const char *key, c notmuch_status_t notmuch_message_add_property (notmuch_message_t *message, const char *key, const char *value) { - return _notmuch_message_modify_property (message, key, value, FALSE); + return _notmuch_message_modify_property (message, key, value, false); } notmuch_status_t notmuch_message_remove_property (notmuch_message_t *message, const char *key, const char *value) { - return _notmuch_message_modify_property (message, key, value, TRUE); + return _notmuch_message_modify_property (message, key, value, true); } +static notmuch_status_t -notmuch_message_remove_all_properties (notmuch_message_t *message, const char *key) +_notmuch_message_remove_all_properties (notmuch_message_t *message, const char *key, bool prefix) { notmuch_status_t status; - const char * term_prefix; + const char *term_prefix; - status = _notmuch_database_ensure_writable (_notmuch_message_database (message)); + status = _notmuch_database_ensure_writable (notmuch_message_get_database (message)); if (status) return status; _notmuch_message_invalidate_metadata (message, "property"); if (key) - term_prefix = talloc_asprintf (message, "%s%s=", _find_prefix ("property"), key); + term_prefix = talloc_asprintf (message, "%s%s%s", _find_prefix ("property"), key, + prefix ? "" : "="); else term_prefix = _find_prefix ("property"); @@ -107,10 +134,23 @@ notmuch_message_remove_all_properties (notmuch_message_t *message, const char *k return NOTMUCH_STATUS_SUCCESS; } +notmuch_status_t +notmuch_message_remove_all_properties (notmuch_message_t *message, const char *key) +{ + return _notmuch_message_remove_all_properties (message, key, false); +} + +notmuch_status_t +notmuch_message_remove_all_properties_with_prefix (notmuch_message_t *message, const char *prefix) +{ + return _notmuch_message_remove_all_properties (message, prefix, true); +} + notmuch_message_properties_t * notmuch_message_get_properties (notmuch_message_t *message, const char *key, notmuch_bool_t exact) { notmuch_string_map_t *map; + map = _notmuch_message_property_map (message); return _notmuch_string_map_iterator_create (map, key, exact); }