Browse Source

MT#59069 support non-unique metadata keys

Change-Id: I2deeea77d29d22dfd2ae3104439d790f96b32e18
pull/1802/head
Richard Fuchs 2 years ago
parent
commit
b67b28e6bf
4 changed files with 28 additions and 11 deletions
  1. +9
    -6
      recording-daemon/db.c
  2. +7
    -1
      recording-daemon/metafile.c
  3. +7
    -3
      recording-daemon/output.c
  4. +5
    -1
      recording-daemon/types.h

+ 9
- 6
recording-daemon/db.c View File

@ -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;


+ 7
- 1
recording-daemon/metafile.c View File

@ -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));
}
}


+ 7
- 3
recording-daemon/output.c View File

@ -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);
}


+ 5
- 1
recording-daemon/types.h View File

@ -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 {


Loading…
Cancel
Save