diff options
author | Max Kellermann <max@duempel.org> | 2014-01-19 10:51:34 +0100 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2014-01-19 17:04:51 +0100 |
commit | f5ae1ce00b85699291a7cdf9782574e70a8c28f5 (patch) | |
tree | 9cb95dd1d98b1b0cd522ee27d7e8a374a3c8eb4a /src/db/SimpleDatabasePlugin.cxx | |
parent | 738d6f10409037fbf8aa30cec5aceb121e21e230 (diff) | |
download | mpd-f5ae1ce00b85699291a7cdf9782574e70a8c28f5.tar.gz mpd-f5ae1ce00b85699291a7cdf9782574e70a8c28f5.tar.xz mpd-f5ae1ce00b85699291a7cdf9782574e70a8c28f5.zip |
LightSong: new class to be used by DatabasePlugin callbacks
Detach the Song class completely from the public API, only to be used
by SimpleDatabase and the update thread.
Diffstat (limited to 'src/db/SimpleDatabasePlugin.cxx')
-rw-r--r-- | src/db/SimpleDatabasePlugin.cxx | 30 |
1 files changed, 19 insertions, 11 deletions
diff --git a/src/db/SimpleDatabasePlugin.cxx b/src/db/SimpleDatabasePlugin.cxx index c33db3831..3d947c042 100644 --- a/src/db/SimpleDatabasePlugin.cxx +++ b/src/db/SimpleDatabasePlugin.cxx @@ -22,6 +22,7 @@ #include "DatabaseSelection.hxx" #include "DatabaseHelpers.hxx" #include "Directory.hxx" +#include "Song.hxx" #include "SongFilter.hxx" #include "DatabaseSave.hxx" #include "DatabaseLock.hxx" @@ -193,29 +194,34 @@ SimpleDatabase::Close() delete root; } -Song * +const LightSong * SimpleDatabase::GetSong(const char *uri, Error &error) const { assert(root != nullptr); + assert(borrowed_song_count == 0); db_lock(); - Song *song = root->LookupSong(uri); + const Song *song = root->LookupSong(uri); db_unlock(); - if (song == nullptr) + if (song == nullptr) { error.Format(db_domain, DB_NOT_FOUND, "No such song: %s", uri); + return nullptr; + } + + light_song = song->Export(); + #ifndef NDEBUG - else - ++borrowed_song_count; + ++borrowed_song_count; #endif - return song; + return &light_song; } void -SimpleDatabase::ReturnSong(gcc_unused Song *song) const +SimpleDatabase::ReturnSong(gcc_unused const LightSong *song) const { - assert(song != nullptr); + assert(song == &light_song); #ifndef NDEBUG assert(borrowed_song_count > 0); @@ -247,9 +253,11 @@ SimpleDatabase::Visit(const DatabaseSelection &selection, if (directory == nullptr) { if (visit_song) { Song *song = root->LookupSong(selection.uri.c_str()); - if (song != nullptr) - return !selection.Match(*song) || - visit_song(*song, error); + if (song != nullptr) { + const LightSong song2 = song->Export(); + return !selection.Match(song2) || + visit_song(song2, error); + } } error.Set(db_domain, DB_NOT_FOUND, "No such directory"); |