From 746c55ac56c8e78da6b00fdc3d2d04cdafbcddcd Mon Sep 17 00:00:00 2001 From: Anna Schumaker Date: Sun, 8 Nov 2015 13:09:10 -0500 Subject: [PATCH] core/database: Change db_insert() to insert-by-key This means that databases completely manage when memory is allocated. Signed-off-by: Anna Schumaker --- core/database.c | 10 +++++++--- core/tags/track.cpp | 2 +- include/core/database.h | 2 +- tests/core/database.c | 19 +++++++++++++------ 4 files changed, 22 insertions(+), 11 deletions(-) diff --git a/core/database.c b/core/database.c index 5e331b2b..904b087f 100644 --- a/core/database.c +++ b/core/database.c @@ -128,8 +128,13 @@ void db_load(struct database *db) file_close(&db->db_file); } -struct db_entry *db_insert(struct database *db, struct db_entry *item) +struct db_entry *db_insert(struct database *db, const gchar *key) { + struct db_entry *item = NULL; + + if (key) + item = db->db_ops->dbe_alloc(key); + if (item) { g_ptr_array_add(db->db_entries, item); __dbe_setup(db, db_actual_size(db) - 1); @@ -184,6 +189,5 @@ struct db_entry *db_find(struct database *db, const gchar *key) struct db_entry *dbe = db_get(db, key); if (dbe) return dbe; - dbe = db->db_ops->dbe_alloc(key); - return db_insert(db, dbe); + return db_insert(db, key); } diff --git a/core/tags/track.cpp b/core/tags/track.cpp index 4c6e919a..39762bbc 100644 --- a/core/tags/track.cpp +++ b/core/tags/track.cpp @@ -179,7 +179,7 @@ struct track *track_add(struct library *library, const std::string &filepath) struct track *track = NULL; if (!db_get(&track_db, key)) - track = TRACK(db_insert(&track_db, track_alloc(key))); + track = TRACK(db_insert(&track_db, key)); g_free(key); return track; diff --git a/include/core/database.h b/include/core/database.h index 0510e8d5..f72fefda 100644 --- a/include/core/database.h +++ b/include/core/database.h @@ -114,7 +114,7 @@ unsigned int db_actual_size(const struct database *); * Called to add a new item to the database. The caller MUST check if the * database already contains a similar item before calling this function. */ -struct db_entry *db_insert(struct database *, struct db_entry *); +struct db_entry *db_insert(struct database *, const gchar *); /* Called to remove an item from the database. */ void db_remove(struct database *, struct db_entry *); diff --git a/tests/core/database.c b/tests/core/database.c index cfec0b30..8c748fdd 100644 --- a/tests/core/database.c +++ b/tests/core/database.c @@ -29,7 +29,7 @@ static struct int_entry *__int_alloc(unsigned int val) static struct db_entry *int_alloc(const gchar *key) { unsigned int val; - sscanf(key, "%u",&val); + sscanf(key, "%u", &val); return &__int_alloc(val)->ie_dbe; } @@ -140,7 +140,7 @@ static void test_stress(unsigned int N) /* db_insert() */ for (i = 0; i < N; i++) { key = g_strdup_printf("%u", i); - dbe = db_insert(&db, &__int_alloc(i)->ie_dbe); + dbe = db_insert(&db, key); test_loop_not_equal((void *)dbe, NULL, i); test_loop_equal(dbe->dbe_index, i, i); test_loop_equal(dbe->dbe_key, key, i); @@ -242,10 +242,14 @@ static void test_save_load() struct db_entry *dbe, *next; const unsigned int N = 10; unsigned int i; + gchar *key; /* 10 items should "autosave" when inserted */ - for (i = 0; i < N; i++) - db_insert(&db1, &__int_alloc(i)->ie_dbe); + for (i = 0; i < N; i++) { + key = g_strdup_printf("%u", i); + db_insert(&db1, key); + g_free(key); + } i = 0; db_load(&db2); @@ -276,8 +280,11 @@ static void test_save_load() /* Manually turn autosave off. */ db1.db_autosave = false; - for (i = N; i < (2 * N); i++) - db_insert(&db1, &__int_alloc(i)->ie_dbe); + for (i = N; i < (2 * N); i++) { + key = g_strdup_printf("%u", i); + db_insert(&db1, key); + g_free(key); + } for (i = N; i < (2 * N); i += 2) db_remove(&db1, db_at(&db1, i));