ocarina/core/tags/genre.c
Anna Schumaker 9a209d098b core/tags: Switch over to db_load_idle()
Load all tag databases with the new load function.

Implements #15: Load track database through an idle task
Implements #16: Load library database through an idle task
Implements #17: Load genre database through an idle task
Implements #18: Load artist database through an idle task
Implements #19: Load album database through an idle task
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
2016-06-14 17:07:55 -04:00

87 lines
1.5 KiB
C

/*
* Copyright 2014 (c) Anna Schumaker.
*/
#include <core/string.h>
#include <core/tags/genre.h>
static struct database genre_db;
static struct genre *__genre_alloc(gchar *name)
{
struct genre *genre = g_malloc(sizeof(struct genre));
dbe_init(&genre->ge_dbe, genre);
genre->ge_name = name;
genre->ge_lower = string_lowercase(name);
return genre;
}
static struct db_entry *genre_alloc(const gchar *name)
{
return &__genre_alloc(g_strdup(name))->ge_dbe;
}
static void genre_free(struct db_entry *dbe)
{
g_free(GENRE(dbe)->ge_lower);
g_free(GENRE(dbe));
}
static gchar *genre_key(struct db_entry *dbe)
{
return GENRE(dbe)->ge_name;
}
static struct db_entry *genre_read(struct file *file)
{
return &__genre_alloc(file_readl(file))->ge_dbe;
}
static void genre_write(struct file *file, struct db_entry *dbe)
{
file_writef(file, "%s", GENRE(dbe)->ge_name);
}
static const struct db_ops genre_ops = {
genre_alloc,
genre_free,
genre_key,
genre_read,
NULL,
genre_write,
};
void genre_db_init()
{
db_init(&genre_db, "genre.db", true, &genre_ops);
db_load_idle(&genre_db);
}
void genre_db_deinit()
{
db_deinit(&genre_db);
}
struct genre *genre_find(const gchar *name)
{
return GENRE(db_find(&genre_db, name));
}
struct genre *genre_get(const unsigned int index)
{
return GENRE(db_at(&genre_db, index));
}
int genre_compare(struct genre *lhs, struct genre *rhs)
{
return string_compare(lhs->ge_lower, rhs->ge_lower);
}
#ifdef CONFIG_TESTING
const struct db_ops *test_genre_ops() { return &genre_ops; }
#endif /* CONFIG_TESTING */