/* * Copyright 2014 (c) Anna Schumaker. */ #include #include 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_tokens = g_str_tokenize_and_fold(name, NULL, &genre->ge_alts); return genre; } static struct db_entry *genre_alloc(const gchar *name, unsigned int index) { return &__genre_alloc(g_strdup(name))->ge_dbe; } static void genre_free(struct db_entry *dbe) { g_strfreev(GENRE(dbe)->ge_tokens); g_strfreev(GENRE(dbe)->ge_alts); 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, unsigned int index) { 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 = { .dbe_alloc = genre_alloc, .dbe_free = genre_free, .dbe_key = genre_key, .dbe_read = genre_read, .dbe_write = genre_write, }; void genre_db_init() { db_init(&genre_db, "genre.db", true, &genre_ops, 0); db_load(&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_tokens(lhs->ge_tokens, rhs->ge_tokens); } 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); } #ifdef CONFIG_TESTING const struct db_ops *test_genre_ops() { return &genre_ops; } #endif /* CONFIG_TESTING */