From b67b28e6bf116d7dcaa42513d9af929ff506fe17 Mon Sep 17 00:00:00 2001 From: Richard Fuchs Date: Tue, 30 Jan 2024 12:23:44 -0500 Subject: [PATCH] MT#59069 support non-unique metadata keys Change-Id: I2deeea77d29d22dfd2ae3104439d790f96b32e18 --- recording-daemon/db.c | 15 +++++++++------ recording-daemon/metafile.c | 8 +++++++- recording-daemon/output.c | 10 +++++++--- recording-daemon/types.h | 6 +++++- 4 files changed, 28 insertions(+), 11 deletions(-) diff --git a/recording-daemon/db.c b/recording-daemon/db.c index a75467bca..fcfce500e 100644 --- a/recording-daemon/db.c +++ b/recording-daemon/db.c @@ -277,12 +277,15 @@ static void db_do_call_metadata(metafile_t *mf) { metadata_ht_iter iter; t_hash_table_iter_init(&iter, mf->metadata_parsed); - str *key, *token; - while (t_hash_table_iter_next(&iter, &key, &token)) { - my_str(&b[1], key); - my_str(&b[2], token); - - execute_wrap(&stm_insert_metadata, b, NULL); + str *key; + str_q *vals; + while (t_hash_table_iter_next(&iter, &key, &vals)) { + for (__auto_type l = vals->head; l; l = l->next) { + my_str(&b[1], key); + my_str(&b[2], l->data); + + execute_wrap(&stm_insert_metadata, b, NULL); + } } mf->db_metadata_done = 1; diff --git a/recording-daemon/metafile.c b/recording-daemon/metafile.c index 8c4161c58..c09170ea1 100644 --- a/recording-daemon/metafile.c +++ b/recording-daemon/metafile.c @@ -170,6 +170,7 @@ static void meta_ptime(metafile_t *mf, unsigned long mnum, int ptime) // updates the contents, does not remove previously set entries static void meta_metadata_parse(metafile_t *mf) { // XXX offload this parsing to proxy module -> bencode list/dictionary + t_hash_table_remove_all(mf->metadata_parsed); str all_meta = STR_INIT(mf->metadata); while (all_meta.len > 1) { str token; @@ -182,7 +183,12 @@ static void meta_metadata_parse(metafile_t *mf) { continue; } - t_hash_table_replace(mf->metadata_parsed, str_dup(&key), str_dup(&token)); + str_q *q = t_hash_table_lookup(mf->metadata_parsed, &key); + if (!q) { + q = str_q_new(); + t_hash_table_replace(mf->metadata_parsed, str_dup(&key), q); + } + t_queue_push_tail(q, str_dup(&token)); } } diff --git a/recording-daemon/output.c b/recording-daemon/output.c index c1f4d2f45..d0e10eab7 100644 --- a/recording-daemon/output.c +++ b/recording-daemon/output.c @@ -101,13 +101,17 @@ static output_t *output_alloc(const char *path, const char *name) { } static void output_append_str_from_ht(GString *f, metadata_ht ht, const str *s) { - str *val = t_hash_table_lookup(ht, s); - if (!val) { + str_q *q = t_hash_table_lookup(ht, s); + if (!q || q->length == 0) { ilog(LOG_WARN, "Key '{" STR_FORMAT "}' used in file name pattern not present in metadata", STR_FMT(s)); return; } - g_autoptr(char) esc = g_uri_escape_string(val->s, NULL, false); + if (q->length > 1) + ilog(LOG_WARN, "Key '{" STR_FORMAT "}' used in file name pattern present in metadata %u times, " + "only using first occurrence", + STR_FMT(s), q->length); + g_autoptr(char) esc = g_uri_escape_string(q->head->data->s, NULL, false); g_string_append(f, esc); } diff --git a/recording-daemon/types.h b/recording-daemon/types.h index 2dfd04d3c..99bb85e1a 100644 --- a/recording-daemon/types.h +++ b/recording-daemon/types.h @@ -109,7 +109,11 @@ struct tag_s { typedef struct tag_s tag_t; -TYPED_GHASHTABLE(metadata_ht, str, str, str_hash, str_equal, str_free, str_free) +INLINE void str_q_free(str_q *q) { + t_queue_clear_full(q, str_free); + t_queue_free(q); +} +TYPED_GHASHTABLE(metadata_ht, str, str_q, str_hash, str_equal, str_free, str_q_free) struct metafile_s {