2015-11-11 12:09:02 -05:00
|
|
|
/*
|
2014-11-09 10:18:09 -05:00
|
|
|
* Copyright 2014 (c) Anna Schumaker.
|
|
|
|
*/
|
2015-10-23 09:04:23 -04:00
|
|
|
#include <core/string.h>
|
2014-11-09 10:18:09 -05:00
|
|
|
#include <core/tags/genre.h>
|
|
|
|
|
2014-11-16 15:15:32 -05:00
|
|
|
|
2015-11-04 12:23:00 -05:00
|
|
|
static struct database genre_db;
|
2014-11-16 15:15:32 -05:00
|
|
|
|
2015-11-11 12:05:02 -05:00
|
|
|
static struct genre *__genre_alloc(gchar *name)
|
2014-11-09 10:18:09 -05:00
|
|
|
{
|
2015-11-11 12:09:02 -05:00
|
|
|
struct genre *genre = g_malloc(sizeof(struct genre));
|
2015-10-23 09:04:23 -04:00
|
|
|
|
2015-11-11 11:57:54 -05:00
|
|
|
dbe_init(&genre->ge_dbe, genre);
|
2016-05-19 11:20:35 -04:00
|
|
|
genre->ge_name = name;
|
|
|
|
genre->ge_tokens = g_str_tokenize_and_fold(name, NULL, &genre->ge_alts);
|
2015-11-11 12:05:02 -05:00
|
|
|
|
|
|
|
return genre;
|
|
|
|
}
|
2015-10-23 09:04:23 -04:00
|
|
|
|
2016-09-12 15:27:02 -04:00
|
|
|
static struct db_entry *genre_alloc(const gchar *name, unsigned int index)
|
2015-11-11 12:05:02 -05:00
|
|
|
{
|
|
|
|
return &__genre_alloc(g_strdup(name))->ge_dbe;
|
2015-10-23 09:04:23 -04:00
|
|
|
}
|
|
|
|
|
2015-09-30 09:15:15 -04:00
|
|
|
static void genre_free(struct db_entry *dbe)
|
|
|
|
{
|
2016-05-19 11:20:35 -04:00
|
|
|
g_strfreev(GENRE(dbe)->ge_tokens);
|
|
|
|
g_strfreev(GENRE(dbe)->ge_alts);
|
2015-11-11 12:09:02 -05:00
|
|
|
g_free(GENRE(dbe));
|
2015-09-30 09:15:15 -04:00
|
|
|
}
|
|
|
|
|
2015-09-23 09:33:55 -04:00
|
|
|
static gchar *genre_key(struct db_entry *dbe)
|
2015-10-23 09:04:23 -04:00
|
|
|
{
|
2015-11-11 12:05:02 -05:00
|
|
|
return GENRE(dbe)->ge_name;
|
2014-11-09 10:18:09 -05:00
|
|
|
}
|
2014-11-16 15:15:32 -05:00
|
|
|
|
2018-02-16 13:30:23 -05:00
|
|
|
static struct db_entry *genre_read(struct file *file, unsigned int index)
|
2015-10-23 09:04:23 -04:00
|
|
|
{
|
2018-02-21 16:01:15 -05:00
|
|
|
return &__genre_alloc(file_readl(file))->ge_dbe;
|
2015-10-23 09:04:23 -04:00
|
|
|
}
|
|
|
|
|
2018-02-16 13:30:23 -05:00
|
|
|
static void genre_write(struct file *file, struct db_entry *dbe)
|
2015-10-23 09:04:23 -04:00
|
|
|
{
|
2018-02-21 08:19:19 -05:00
|
|
|
file_writef(file, "%s", GENRE(dbe)->ge_name);
|
2015-10-23 09:04:23 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2015-11-03 10:39:06 -05:00
|
|
|
static const struct db_ops genre_ops = {
|
2016-09-11 10:07:57 -04:00
|
|
|
.dbe_alloc = genre_alloc,
|
|
|
|
.dbe_free = genre_free,
|
|
|
|
.dbe_key = genre_key,
|
|
|
|
.dbe_read = genre_read,
|
|
|
|
.dbe_write = genre_write,
|
2015-11-03 10:39:06 -05:00
|
|
|
};
|
|
|
|
|
|
|
|
|
2015-09-28 08:18:39 -04:00
|
|
|
void genre_db_init()
|
2014-11-16 15:15:32 -05:00
|
|
|
{
|
2016-08-17 14:17:52 -04:00
|
|
|
db_init(&genre_db, "genre.db", true, &genre_ops, 0);
|
2016-08-22 11:17:28 -04:00
|
|
|
db_load(&genre_db);
|
2014-11-16 15:15:32 -05:00
|
|
|
}
|
|
|
|
|
2015-09-28 08:18:39 -04:00
|
|
|
void genre_db_deinit()
|
|
|
|
{
|
|
|
|
db_deinit(&genre_db);
|
|
|
|
}
|
|
|
|
|
2015-11-11 12:05:02 -05:00
|
|
|
struct genre *genre_find(const gchar *name)
|
2014-11-16 15:15:32 -05:00
|
|
|
{
|
2015-11-11 12:05:02 -05:00
|
|
|
return GENRE(db_find(&genre_db, name));
|
2014-11-16 15:15:32 -05:00
|
|
|
}
|
|
|
|
|
2015-09-28 08:25:15 -04:00
|
|
|
struct genre *genre_get(const unsigned int index)
|
2014-11-16 15:15:32 -05:00
|
|
|
{
|
2015-11-04 12:23:00 -05:00
|
|
|
return GENRE(db_at(&genre_db, index));
|
2014-11-16 15:15:32 -05:00
|
|
|
}
|
2015-10-23 09:04:23 -04:00
|
|
|
|
|
|
|
int genre_compare(struct genre *lhs, struct genre *rhs)
|
|
|
|
{
|
2016-05-19 11:20:35 -04:00
|
|
|
return string_compare_tokens(lhs->ge_tokens, rhs->ge_tokens);
|
2015-10-23 09:04:23 -04:00
|
|
|
}
|
2015-11-03 10:39:06 -05:00
|
|
|
|
2016-05-19 15:05:38 -04:00
|
|
|
bool genre_match_token(struct genre *genre, const gchar *string)
|
|
|
|
{
|
|
|
|
return string_match_token(string, genre->ge_tokens) ||
|
|
|
|
string_match_token(string, genre->ge_alts);
|
|
|
|
}
|
|
|
|
|
2015-11-03 10:39:06 -05:00
|
|
|
#ifdef CONFIG_TESTING
|
|
|
|
const struct db_ops *test_genre_ops() { return &genre_ops; }
|
|
|
|
#endif /* CONFIG_TESTING */
|