/* * Copyright 2014 (c) Anna Schumaker. */ #include #include static struct database artist_db; static struct artist *__artist_alloc(gchar *name) { struct artist *artist = g_malloc(sizeof(struct artist)); dbe_init(&artist->ar_dbe, artist); artist->ar_name = name; artist->ar_tokens = g_str_tokenize_and_fold(name, NULL, &artist->ar_alts); artist->ar_playlist = NULL; return artist; } static struct db_entry *artist_alloc(const gchar *name, unsigned int index) { return &__artist_alloc(g_strdup(name))->ar_dbe; } static void artist_free(struct db_entry *dbe) { g_strfreev(ARTIST(dbe)->ar_tokens); g_strfreev(ARTIST(dbe)->ar_alts); g_free(ARTIST(dbe)); } static gchar *artist_key(struct db_entry *dbe) { return ARTIST(dbe)->ar_name; } struct db_entry *artist_read(struct file *file, unsigned int index) { return &__artist_alloc(file_readl(file))->ar_dbe; } static void artist_write(struct file *file, struct db_entry *dbe) { file_writef(file, "%s", ARTIST(dbe)->ar_name); } static const struct db_ops artist_ops = { .dbe_alloc = artist_alloc, .dbe_free = artist_free, .dbe_key = artist_key, .dbe_read = artist_read, .dbe_write = artist_write, }; void artist_db_init() { db_init(&artist_db, "artist.db", true, &artist_ops, 0); db_load(&artist_db); } void artist_db_deinit() { db_deinit(&artist_db); } const struct database *artist_db_get() { return &artist_db; } struct artist *artist_find(const gchar *name) { return ARTIST(db_find(&artist_db, name)); } struct artist *artist_lookup(const gchar *name) { return ARTIST(db_get(&artist_db, name)); } struct artist *artist_get(const unsigned int index) { return ARTIST(db_at(&artist_db, index)); } int artist_compare(struct artist *lhs, struct artist *rhs) { return string_compare_tokens(lhs->ar_tokens, rhs->ar_tokens); } bool artist_match_token(struct artist *artist, const gchar *string) { return string_match_token(string, artist->ar_tokens) || string_match_token(string, artist->ar_alts); } #ifdef CONFIG_TESTING const struct db_ops *test_artist_ops() { return &artist_ops; } #endif /* CONFIG_TESTING */