From eb8a23f2ff3dffbe04963e0d4a245e83d5c072c6 Mon Sep 17 00:00:00 2001 From: Anna Schumaker Date: Mon, 26 Sep 2016 15:40:54 -0400 Subject: [PATCH] core/tags/track: Add support for re-keying the track database This lets up update track keys to prevent duplicates showing up during a library path update. Fixes #93: Library sometimes has duplicated tracks Signed-off-by: Anna Schumaker --- CHANGELOG | 1 + core/tags/tags.c | 2 ++ core/tags/track.c | 19 +++++++++++++++++++ include/core/tags/track.h | 3 +++ tests/core/tags/track.c | 8 +++++++- 5 files changed, 32 insertions(+), 1 deletion(-) diff --git a/CHANGELOG b/CHANGELOG index 08c12a1e..df8cf9a2 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -2,6 +2,7 @@ - Add a switch to disable GUI tests - Don't save and restore the "Last Played" tracks column width - Save databases if they have been upgraded +- Don't duplicate tracks in the library after a defrag 6.5.0-rc: - Convert to CMake/CTest diff --git a/core/tags/tags.c b/core/tags/tags.c index 305d3b08..8e86d220 100644 --- a/core/tags/tags.c +++ b/core/tags/tags.c @@ -42,6 +42,8 @@ bool tags_defragment(void *data) bool library = library_db_defrag(); bool track = track_db_defrag(); + if (library) + track_db_rekey(); if (album || library || track) track_db_commit(); return track; diff --git a/core/tags/track.c b/core/tags/track.c index cba450dd..ec17d7c5 100644 --- a/core/tags/track.c +++ b/core/tags/track.c @@ -210,6 +210,25 @@ bool track_db_defrag() return db_defrag(&track_db); } +void track_db_rekey() +{ + struct db_entry *dbe, *next; + struct track *track; + unsigned int lib; + gchar *path; + + db_for_each(dbe, next, &track_db) { + track = TRACK(dbe); + + sscanf(track->tr_path, "%u/%m[^\n]", &lib, &path); + if (lib != library_index(track->tr_library)) { + track->tr_path = __track_key(track->tr_library, path); + db_rekey(&track_db, dbe); + } else + g_free(path); + } +} + const struct database *track_db_get() { return &track_db; diff --git a/include/core/tags/track.h b/include/core/tags/track.h index 2f5e2de1..8bdc3573 100644 --- a/include/core/tags/track.h +++ b/include/core/tags/track.h @@ -72,6 +72,9 @@ void track_db_commit(); /* Called to defragment the track database. */ bool track_db_defrag(); +/* Called to update track database keys. */ +void track_db_rekey(); + /* Called to access the track database. */ const struct database *track_db_get(); diff --git a/tests/core/tags/track.c b/tests/core/tags/track.c index 62bed624..256b2b37 100644 --- a/tests/core/tags/track.c +++ b/tests/core/tags/track.c @@ -275,7 +275,13 @@ static void __test_track_db_subprocess() g_assert_cmpuint(track_db_count_plays(), ==, 0); g_assert_cmpuint(track_db_average_plays(), ==, 0); - track_remove_all(library); + /* Rekey the database */ + track_get(1)->tr_library = library_find("tests/Music2"); + track_db_rekey(); + g_assert_cmpstr(track_get(1)->tr_path, ==, "1/Hyrule Symphony/01 - Title Theme.ogg"); + + track_remove_all(library_get(0)); + track_remove_all(library_get(1)); g_assert_cmpuint(track_db_get()->db_size, ==, 0); }