core/database: Change db_insert() to insert-by-key
This means that databases completely manage when memory is allocated. Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
This commit is contained in:
parent
bd1de2262d
commit
746c55ac56
|
@ -128,8 +128,13 @@ void db_load(struct database *db)
|
||||||
file_close(&db->db_file);
|
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) {
|
if (item) {
|
||||||
g_ptr_array_add(db->db_entries, item);
|
g_ptr_array_add(db->db_entries, item);
|
||||||
__dbe_setup(db, db_actual_size(db) - 1);
|
__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);
|
struct db_entry *dbe = db_get(db, key);
|
||||||
if (dbe)
|
if (dbe)
|
||||||
return dbe;
|
return dbe;
|
||||||
dbe = db->db_ops->dbe_alloc(key);
|
return db_insert(db, key);
|
||||||
return db_insert(db, dbe);
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -179,7 +179,7 @@ struct track *track_add(struct library *library, const std::string &filepath)
|
||||||
struct track *track = NULL;
|
struct track *track = NULL;
|
||||||
|
|
||||||
if (!db_get(&track_db, key))
|
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);
|
g_free(key);
|
||||||
return track;
|
return track;
|
||||||
|
|
|
@ -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
|
* 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.
|
* 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. */
|
/* Called to remove an item from the database. */
|
||||||
void db_remove(struct database *, struct db_entry *);
|
void db_remove(struct database *, struct db_entry *);
|
||||||
|
|
|
@ -29,7 +29,7 @@ static struct int_entry *__int_alloc(unsigned int val)
|
||||||
static struct db_entry *int_alloc(const gchar *key)
|
static struct db_entry *int_alloc(const gchar *key)
|
||||||
{
|
{
|
||||||
unsigned int val;
|
unsigned int val;
|
||||||
sscanf(key, "%u",&val);
|
sscanf(key, "%u", &val);
|
||||||
return &__int_alloc(val)->ie_dbe;
|
return &__int_alloc(val)->ie_dbe;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -140,7 +140,7 @@ static void test_stress(unsigned int N)
|
||||||
/* db_insert() */
|
/* db_insert() */
|
||||||
for (i = 0; i < N; i++) {
|
for (i = 0; i < N; i++) {
|
||||||
key = g_strdup_printf("%u", 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_not_equal((void *)dbe, NULL, i);
|
||||||
test_loop_equal(dbe->dbe_index, i, i);
|
test_loop_equal(dbe->dbe_index, i, i);
|
||||||
test_loop_equal(dbe->dbe_key, key, i);
|
test_loop_equal(dbe->dbe_key, key, i);
|
||||||
|
@ -242,10 +242,14 @@ static void test_save_load()
|
||||||
struct db_entry *dbe, *next;
|
struct db_entry *dbe, *next;
|
||||||
const unsigned int N = 10;
|
const unsigned int N = 10;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
gchar *key;
|
||||||
|
|
||||||
/* 10 items should "autosave" when inserted */
|
/* 10 items should "autosave" when inserted */
|
||||||
for (i = 0; i < N; i++)
|
for (i = 0; i < N; i++) {
|
||||||
db_insert(&db1, &__int_alloc(i)->ie_dbe);
|
key = g_strdup_printf("%u", i);
|
||||||
|
db_insert(&db1, key);
|
||||||
|
g_free(key);
|
||||||
|
}
|
||||||
|
|
||||||
i = 0;
|
i = 0;
|
||||||
db_load(&db2);
|
db_load(&db2);
|
||||||
|
@ -276,8 +280,11 @@ static void test_save_load()
|
||||||
|
|
||||||
/* Manually turn autosave off. */
|
/* Manually turn autosave off. */
|
||||||
db1.db_autosave = false;
|
db1.db_autosave = false;
|
||||||
for (i = N; i < (2 * N); i++)
|
for (i = N; i < (2 * N); i++) {
|
||||||
db_insert(&db1, &__int_alloc(i)->ie_dbe);
|
key = g_strdup_printf("%u", i);
|
||||||
|
db_insert(&db1, key);
|
||||||
|
g_free(key);
|
||||||
|
}
|
||||||
for (i = N; i < (2 * N); i += 2)
|
for (i = N; i < (2 * N); i += 2)
|
||||||
db_remove(&db1, db_at(&db1, i));
|
db_remove(&db1, db_at(&db1, i));
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue