core/database: Add a db_rekey() function
Sometimes database entry keys change, so this gives us a way to update them in the database keys hash table. Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
This commit is contained in:
parent
cf4eedb592
commit
811509ff80
|
@ -182,6 +182,18 @@ bool db_defrag(struct database *db)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void db_rekey(struct database *db, struct db_entry *dbe)
|
||||||
|
{
|
||||||
|
if (dbe == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
g_hash_table_remove(db->db_keys, dbe->dbe_key);
|
||||||
|
g_free(dbe->dbe_key);
|
||||||
|
|
||||||
|
dbe->dbe_key = db->db_ops->dbe_key(dbe);
|
||||||
|
g_hash_table_insert(db->db_keys, dbe->dbe_key, dbe);
|
||||||
|
}
|
||||||
|
|
||||||
unsigned int db_actual_size(const struct database *db)
|
unsigned int db_actual_size(const struct database *db)
|
||||||
{
|
{
|
||||||
if (db->db_entries)
|
if (db->db_entries)
|
||||||
|
|
|
@ -124,6 +124,9 @@ void db_remove(struct database *, struct db_entry *);
|
||||||
*/
|
*/
|
||||||
bool db_defrag(struct database *);
|
bool db_defrag(struct database *);
|
||||||
|
|
||||||
|
/* Called to change the key of a database entry. */
|
||||||
|
void db_rekey(struct database *, struct db_entry *);
|
||||||
|
|
||||||
/* Returns the database item at the requested index. */
|
/* Returns the database item at the requested index. */
|
||||||
struct db_entry *db_at(const struct database *, unsigned int);
|
struct db_entry *db_at(const struct database *, unsigned int);
|
||||||
|
|
||||||
|
|
|
@ -221,6 +221,19 @@ static void test_database(gconstpointer arg)
|
||||||
}
|
}
|
||||||
g_assert_false(db_defrag(&db));
|
g_assert_false(db_defrag(&db));
|
||||||
|
|
||||||
|
/* db_rekey() */
|
||||||
|
i = 0;
|
||||||
|
db_for_each(dbe, next, &db) {
|
||||||
|
INT_ENTRY(dbe)->ie_val = i;
|
||||||
|
db_rekey(&db, dbe);
|
||||||
|
|
||||||
|
key = g_strdup_printf("%u", i);
|
||||||
|
g_assert_cmpstr(dbe->dbe_key, ==, key);
|
||||||
|
g_assert_true(db_get(&db, key) == dbe);
|
||||||
|
g_free(key);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
db_deinit(&db);
|
db_deinit(&db);
|
||||||
g_assert_cmpuint(db.db_size, ==, 0);
|
g_assert_cmpuint(db.db_size, ==, 0);
|
||||||
g_assert_cmpuint(db_actual_size(&db), ==, 0);
|
g_assert_cmpuint(db_actual_size(&db), ==, 0);
|
||||||
|
|
Loading…
Reference in New Issue