Commit ff871455 authored by Max Kellermann's avatar Max Kellermann

sticker: don't use classes Directory and Song

Don't depend on the "simple" database plugin. This fixes an assertion failure / crash and allows using stickers with other plugins.
parent 667481c3
...@@ -124,24 +124,17 @@ handle_sticker_song(Client &client, int argc, char *argv[]) ...@@ -124,24 +124,17 @@ handle_sticker_song(Client &client, int argc, char *argv[])
/* find song dir key */ /* find song dir key */
} else if (argc == 5 && strcmp(argv[1], "find") == 0) { } else if (argc == 5 && strcmp(argv[1], "find") == 0) {
/* "sticker find song a/directory name" */ /* "sticker find song a/directory name" */
const char *const base_uri = argv[3];
bool success; bool success;
struct sticker_song_find_data data = { struct sticker_song_find_data data = {
client, client,
argv[4], argv[4],
}; };
db_lock(); success = sticker_song_find(base_uri, data.name,
Directory *directory = db_get_directory(argv[3]);
if (directory == nullptr) {
db_unlock();
command_error(client, ACK_ERROR_NO_EXIST,
"no such directory");
return CommandResult::ERROR;
}
success = sticker_song_find(*directory, data.name,
sticker_song_find_print_cb, &data); sticker_song_find_print_cb, &data);
db_unlock();
if (!success) { if (!success) {
command_error(client, ACK_ERROR_SYSTEM, command_error(client, ACK_ERROR_SYSTEM,
"failed to set search sticker database"); "failed to set search sticker database");
......
...@@ -21,8 +21,9 @@ ...@@ -21,8 +21,9 @@
#include "SongSticker.hxx" #include "SongSticker.hxx"
#include "StickerDatabase.hxx" #include "StickerDatabase.hxx"
#include "db/LightSong.hxx" #include "db/LightSong.hxx"
#include "db/Song.hxx" #include "db/DatabaseGlue.hxx"
#include "db/Directory.hxx" #include "db/DatabasePlugin.hxx"
#include "util/Error.hxx"
#include <glib.h> #include <glib.h>
...@@ -66,7 +67,7 @@ sticker_song_get(const LightSong &song) ...@@ -66,7 +67,7 @@ sticker_song_get(const LightSong &song)
} }
struct sticker_song_find_data { struct sticker_song_find_data {
Directory *directory; const Database *db;
const char *base_uri; const char *base_uri;
size_t base_uri_length; size_t base_uri_length;
...@@ -85,24 +86,29 @@ sticker_song_find_cb(const char *uri, const char *value, void *user_data) ...@@ -85,24 +86,29 @@ sticker_song_find_cb(const char *uri, const char *value, void *user_data)
/* should not happen, ignore silently */ /* should not happen, ignore silently */
return; return;
Song *song = data->directory->LookupSong(uri + data->base_uri_length); const Database *db = data->db;
if (song != nullptr) const LightSong *song = db->GetSong(uri, IgnoreError());
data->func(song->Export(), value, data->user_data); if (song != nullptr) {
data->func(*song, value, data->user_data);
db->ReturnSong(song);
}
} }
bool bool
sticker_song_find(Directory &directory, const char *name, sticker_song_find(const char *base_uri, const char *name,
void (*func)(const LightSong &song, const char *value, void (*func)(const LightSong &song, const char *value,
void *user_data), void *user_data),
void *user_data) void *user_data)
{ {
struct sticker_song_find_data data; struct sticker_song_find_data data;
data.directory = &directory; data.db = GetDatabase();
assert(data.db != nullptr);
data.func = func; data.func = func;
data.user_data = user_data; data.user_data = user_data;
char *allocated; char *allocated;
data.base_uri = directory.GetPath(); data.base_uri = base_uri;
if (*data.base_uri != 0) if (*data.base_uri != 0)
/* append slash to base_uri */ /* append slash to base_uri */
data.base_uri = allocated = data.base_uri = allocated =
......
...@@ -72,13 +72,13 @@ sticker_song_get(const LightSong &song); ...@@ -72,13 +72,13 @@ sticker_song_get(const LightSong &song);
* *
* Caller must lock the #db_mutex. * Caller must lock the #db_mutex.
* *
* @param directory the base directory to search in * @param base_uri the base directory to search in
* @param name the name of the sticker * @param name the name of the sticker
* @return true on success (even if no sticker was found), false on * @return true on success (even if no sticker was found), false on
* failure * failure
*/ */
bool bool
sticker_song_find(Directory &directory, const char *name, sticker_song_find(const char *base_uri, const char *name,
void (*func)(const LightSong &song, const char *value, void (*func)(const LightSong &song, const char *value,
void *user_data), void *user_data),
void *user_data); void *user_data);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment