ocarina/core/tags/genre.cpp

90 lines
1.4 KiB
C++
Raw Normal View History

/**
* Copyright 2014 (c) Anna Schumaker.
*/
extern "C" {
#include <core/string.h>
}
#include <core/tags/genre.h>
static database<struct genre> genre_db;
genre :: genre() {}
static struct db_entry *genre_alloc(const gchar *name)
{
struct genre *genre = new struct genre;
gchar *lower = string_lowercase(name);
genre->ge_name = name;
genre->ge_lower = lower;
g_free(lower);
return genre;
}
static void genre_free(struct db_entry *dbe)
{
delete (struct genre *)dbe;
}
const std::string genre :: primary_key() const
{
return ge_name;
}
void genre :: read(file &file)
{
gchar *name = file_readl(&file);
gchar *g_lc = string_lowercase(name);
ge_name = name;
ge_lower = g_lc;
g_free(name);
g_free(g_lc);
}
void genre :: write(file &file)
{
file_writef(&file, "%s", ge_name.c_str());
}
static const struct db_ops genre_ops = {
genre_alloc,
genre_free,
NULL,
};
void genre_db_init()
{
db_init(&genre_db, "genre.db", true, &genre_ops);
db_load(&genre_db);
}
void genre_db_deinit()
{
db_deinit(&genre_db);
}
struct genre *genre_find(const std::string &name)
{
return db_find(&genre_db, name.c_str());
}
struct genre *genre_get(const unsigned int index)
{
return db_at(&genre_db, index);
}
int genre_compare(struct genre *lhs, struct genre *rhs)
{
return string_compare(lhs->ge_lower.c_str(), rhs->ge_lower.c_str());
}
#ifdef CONFIG_TESTING
const struct db_ops *test_genre_ops() { return &genre_ops; }
#endif /* CONFIG_TESTING */