db/Interface: migrate visitor methods from class Error to C++ exceptions
This commit is contained in:
@@ -33,8 +33,6 @@
|
||||
#include "config/Block.hxx"
|
||||
#include "tag/TagBuilder.hxx"
|
||||
#include "tag/Tag.hxx"
|
||||
#include "util/Error.hxx"
|
||||
#include "util/Domain.hxx"
|
||||
#include "util/ScopeExit.hxx"
|
||||
#include "protocol/Ack.hxx"
|
||||
#include "event/SocketMonitor.hxx"
|
||||
@@ -115,20 +113,16 @@ public:
|
||||
const LightSong *GetSong(const char *uri_utf8) const override;
|
||||
void ReturnSong(const LightSong *song) const override;
|
||||
|
||||
virtual bool Visit(const DatabaseSelection &selection,
|
||||
VisitDirectory visit_directory,
|
||||
VisitSong visit_song,
|
||||
VisitPlaylist visit_playlist,
|
||||
Error &error) const override;
|
||||
void Visit(const DatabaseSelection &selection,
|
||||
VisitDirectory visit_directory,
|
||||
VisitSong visit_song,
|
||||
VisitPlaylist visit_playlist) const override;
|
||||
|
||||
virtual bool VisitUniqueTags(const DatabaseSelection &selection,
|
||||
TagType tag_type, tag_mask_t group_mask,
|
||||
VisitTag visit_tag,
|
||||
Error &error) const override;
|
||||
void VisitUniqueTags(const DatabaseSelection &selection,
|
||||
TagType tag_type, tag_mask_t group_mask,
|
||||
VisitTag visit_tag) const override;
|
||||
|
||||
virtual bool GetStats(const DatabaseSelection &selection,
|
||||
DatabaseStats &stats,
|
||||
Error &error) const override;
|
||||
DatabaseStats GetStats(const DatabaseSelection &selection) const override;
|
||||
|
||||
virtual unsigned Update(const char *uri_utf8, bool discard,
|
||||
Error &error) override;
|
||||
@@ -151,8 +145,6 @@ private:
|
||||
virtual void OnIdle() override;
|
||||
};
|
||||
|
||||
static constexpr Domain libmpdclient_domain("libmpdclient");
|
||||
|
||||
static constexpr struct {
|
||||
TagType d;
|
||||
enum mpd_tag_type s;
|
||||
@@ -543,18 +535,18 @@ ProxyDatabase::ReturnSong(const LightSong *_song) const
|
||||
delete song;
|
||||
}
|
||||
|
||||
static bool
|
||||
static void
|
||||
Visit(struct mpd_connection *connection, const char *uri,
|
||||
bool recursive, const SongFilter *filter,
|
||||
VisitDirectory visit_directory, VisitSong visit_song,
|
||||
VisitPlaylist visit_playlist, Error &error);
|
||||
VisitPlaylist visit_playlist);
|
||||
|
||||
static bool
|
||||
static void
|
||||
Visit(struct mpd_connection *connection,
|
||||
bool recursive, const SongFilter *filter,
|
||||
const struct mpd_directory *directory,
|
||||
VisitDirectory visit_directory, VisitSong visit_song,
|
||||
VisitPlaylist visit_playlist, Error &error)
|
||||
VisitPlaylist visit_playlist)
|
||||
{
|
||||
const char *path = mpd_directory_get_path(directory);
|
||||
#if LIBMPDCLIENT_CHECK_VERSION(2,9,0)
|
||||
@@ -566,12 +558,9 @@ Visit(struct mpd_connection *connection,
|
||||
if (visit_directory)
|
||||
visit_directory(LightDirectory(path, mtime));
|
||||
|
||||
if (recursive &&
|
||||
!Visit(connection, path, recursive, filter,
|
||||
visit_directory, visit_song, visit_playlist, error))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
if (recursive)
|
||||
Visit(connection, path, recursive, filter,
|
||||
visit_directory, visit_song, visit_playlist);
|
||||
}
|
||||
|
||||
gcc_pure
|
||||
@@ -645,11 +634,11 @@ ReceiveEntities(struct mpd_connection *connection)
|
||||
return entities;
|
||||
}
|
||||
|
||||
static bool
|
||||
static void
|
||||
Visit(struct mpd_connection *connection, const char *uri,
|
||||
bool recursive, const SongFilter *filter,
|
||||
VisitDirectory visit_directory, VisitSong visit_song,
|
||||
VisitPlaylist visit_playlist, Error &error)
|
||||
VisitPlaylist visit_playlist)
|
||||
{
|
||||
if (!mpd_send_list_meta(connection, uri))
|
||||
ThrowError(connection);
|
||||
@@ -663,11 +652,9 @@ Visit(struct mpd_connection *connection, const char *uri,
|
||||
break;
|
||||
|
||||
case MPD_ENTITY_TYPE_DIRECTORY:
|
||||
if (!Visit(connection, recursive, filter,
|
||||
mpd_entity_get_directory(entity),
|
||||
visit_directory, visit_song, visit_playlist,
|
||||
error))
|
||||
return false;
|
||||
Visit(connection, recursive, filter,
|
||||
mpd_entity_get_directory(entity),
|
||||
visit_directory, visit_song, visit_playlist);
|
||||
break;
|
||||
|
||||
case MPD_ENTITY_TYPE_SONG:
|
||||
@@ -680,8 +667,6 @@ Visit(struct mpd_connection *connection, const char *uri,
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -734,12 +719,11 @@ ServerSupportsSearchBase(const struct mpd_connection *connection)
|
||||
#endif
|
||||
}
|
||||
|
||||
bool
|
||||
void
|
||||
ProxyDatabase::Visit(const DatabaseSelection &selection,
|
||||
VisitDirectory visit_directory,
|
||||
VisitSong visit_song,
|
||||
VisitPlaylist visit_playlist,
|
||||
Error &error) const
|
||||
VisitPlaylist visit_playlist) const
|
||||
{
|
||||
// TODO: eliminate the const_cast
|
||||
const_cast<ProxyDatabase *>(this)->EnsureConnected();
|
||||
@@ -751,31 +735,27 @@ ProxyDatabase::Visit(const DatabaseSelection &selection,
|
||||
/* this optimized code path can only be used under
|
||||
certain conditions */
|
||||
::SearchSongs(connection, selection, visit_song);
|
||||
return true;
|
||||
return;
|
||||
}
|
||||
|
||||
/* fall back to recursive walk (slow!) */
|
||||
return ::Visit(connection, selection.uri.c_str(),
|
||||
selection.recursive, selection.filter,
|
||||
visit_directory, visit_song, visit_playlist,
|
||||
error);
|
||||
::Visit(connection, selection.uri.c_str(),
|
||||
selection.recursive, selection.filter,
|
||||
visit_directory, visit_song, visit_playlist);
|
||||
}
|
||||
|
||||
bool
|
||||
void
|
||||
ProxyDatabase::VisitUniqueTags(const DatabaseSelection &selection,
|
||||
TagType tag_type,
|
||||
gcc_unused tag_mask_t group_mask,
|
||||
VisitTag visit_tag,
|
||||
Error &error) const
|
||||
VisitTag visit_tag) const
|
||||
{
|
||||
// TODO: eliminate the const_cast
|
||||
const_cast<ProxyDatabase *>(this)->EnsureConnected();
|
||||
|
||||
enum mpd_tag_type tag_type2 = Convert(tag_type);
|
||||
if (tag_type2 == MPD_TAG_COUNT) {
|
||||
error.Set(libmpdclient_domain, "Unsupported tag");
|
||||
return false;
|
||||
}
|
||||
if (tag_type2 == MPD_TAG_COUNT)
|
||||
throw std::runtime_error("Unsupported tag");
|
||||
|
||||
if (!mpd_search_db_tags(connection, tag_type2) ||
|
||||
!SendConstraints(connection, selection))
|
||||
@@ -812,13 +792,10 @@ ProxyDatabase::VisitUniqueTags(const DatabaseSelection &selection,
|
||||
|
||||
if (!mpd_response_finish(connection))
|
||||
ThrowError(connection);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
ProxyDatabase::GetStats(const DatabaseSelection &selection,
|
||||
DatabaseStats &stats, gcc_unused Error &error) const
|
||||
DatabaseStats
|
||||
ProxyDatabase::GetStats(const DatabaseSelection &selection) const
|
||||
{
|
||||
// TODO: match
|
||||
(void)selection;
|
||||
@@ -833,13 +810,13 @@ ProxyDatabase::GetStats(const DatabaseSelection &selection,
|
||||
|
||||
update_stamp = (time_t)mpd_stats_get_db_update_time(stats2);
|
||||
|
||||
DatabaseStats stats;
|
||||
stats.song_count = mpd_stats_get_number_of_songs(stats2);
|
||||
stats.total_duration = std::chrono::seconds(mpd_stats_get_db_play_time(stats2));
|
||||
stats.artist_count = mpd_stats_get_number_of_artists(stats2);
|
||||
stats.album_count = mpd_stats_get_number_of_albums(stats2);
|
||||
mpd_stats_free(stats2);
|
||||
|
||||
return true;
|
||||
return stats;
|
||||
}
|
||||
|
||||
unsigned
|
||||
|
||||
@@ -32,7 +32,6 @@
|
||||
#include "fs/Traits.hxx"
|
||||
#include "util/Alloc.hxx"
|
||||
#include "util/DeleteDisposer.hxx"
|
||||
#include "util/Error.hxx"
|
||||
|
||||
#include <assert.h>
|
||||
#include <string.h>
|
||||
@@ -218,14 +217,11 @@ Directory::Sort()
|
||||
child.Sort();
|
||||
}
|
||||
|
||||
bool
|
||||
void
|
||||
Directory::Walk(bool recursive, const SongFilter *filter,
|
||||
VisitDirectory visit_directory, VisitSong visit_song,
|
||||
VisitPlaylist visit_playlist,
|
||||
Error &error) const
|
||||
VisitPlaylist visit_playlist) const
|
||||
{
|
||||
assert(!error.IsDefined());
|
||||
|
||||
if (IsMount()) {
|
||||
assert(IsEmpty());
|
||||
|
||||
@@ -233,11 +229,11 @@ Directory::Walk(bool recursive, const SongFilter *filter,
|
||||
because the child's SimpleDatabasePlugin::Visit()
|
||||
call will lock it again */
|
||||
const ScopeDatabaseUnlock unlock;
|
||||
return WalkMount(GetPath(), *mounted_database,
|
||||
recursive, filter,
|
||||
visit_directory, visit_song,
|
||||
visit_playlist,
|
||||
error);
|
||||
WalkMount(GetPath(), *mounted_database,
|
||||
recursive, filter,
|
||||
visit_directory, visit_song,
|
||||
visit_playlist);
|
||||
return;
|
||||
}
|
||||
|
||||
if (visit_song) {
|
||||
@@ -257,14 +253,11 @@ Directory::Walk(bool recursive, const SongFilter *filter,
|
||||
if (visit_directory)
|
||||
visit_directory(child.Export());
|
||||
|
||||
if (recursive &&
|
||||
!child.Walk(recursive, filter,
|
||||
visit_directory, visit_song, visit_playlist,
|
||||
error))
|
||||
return false;
|
||||
if (recursive)
|
||||
child.Walk(recursive, filter,
|
||||
visit_directory, visit_song,
|
||||
visit_playlist);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
LightDirectory
|
||||
|
||||
@@ -44,7 +44,6 @@ static constexpr unsigned DEVICE_INARCHIVE = -1;
|
||||
static constexpr unsigned DEVICE_CONTAINER = -2;
|
||||
|
||||
class SongFilter;
|
||||
class Error;
|
||||
class Database;
|
||||
|
||||
struct Directory {
|
||||
@@ -266,10 +265,9 @@ public:
|
||||
/**
|
||||
* Caller must lock #db_mutex.
|
||||
*/
|
||||
bool Walk(bool recursive, const SongFilter *match,
|
||||
void Walk(bool recursive, const SongFilter *match,
|
||||
VisitDirectory visit_directory, VisitSong visit_song,
|
||||
VisitPlaylist visit_playlist,
|
||||
Error &error) const;
|
||||
VisitPlaylist visit_playlist) const;
|
||||
|
||||
gcc_pure
|
||||
LightDirectory Export() const;
|
||||
|
||||
@@ -63,12 +63,11 @@ PrefixVisitPlaylist(const char *base, const VisitPlaylist &visit_playlist,
|
||||
PrefixedLightDirectory(directory, base));
|
||||
}
|
||||
|
||||
bool
|
||||
void
|
||||
WalkMount(const char *base, const Database &db,
|
||||
bool recursive, const SongFilter *filter,
|
||||
const VisitDirectory &visit_directory, const VisitSong &visit_song,
|
||||
const VisitPlaylist &visit_playlist,
|
||||
Error &error)
|
||||
const VisitPlaylist &visit_playlist)
|
||||
{
|
||||
using namespace std::placeholders;
|
||||
|
||||
@@ -87,6 +86,5 @@ WalkMount(const char *base, const Database &db,
|
||||
vp = std::bind(PrefixVisitPlaylist,
|
||||
base, std::ref(visit_playlist), _1, _2);
|
||||
|
||||
return db.Visit(DatabaseSelection("", recursive, filter),
|
||||
vd, vs, vp, error);
|
||||
db.Visit(DatabaseSelection("", recursive, filter), vd, vs, vp);
|
||||
}
|
||||
|
||||
@@ -24,13 +24,11 @@
|
||||
|
||||
class Database;
|
||||
class SongFilter;
|
||||
class Error;
|
||||
|
||||
bool
|
||||
void
|
||||
WalkMount(const char *base, const Database &db,
|
||||
bool recursive, const SongFilter *filter,
|
||||
const VisitDirectory &visit_directory, const VisitSong &visit_song,
|
||||
const VisitPlaylist &visit_playlist,
|
||||
Error &error);
|
||||
const VisitPlaylist &visit_playlist);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
#include "db/DatabasePlugin.hxx"
|
||||
#include "db/Selection.hxx"
|
||||
#include "db/Helpers.hxx"
|
||||
#include "db/Stats.hxx"
|
||||
#include "db/UniqueTags.hxx"
|
||||
#include "db/LightDirectory.hxx"
|
||||
#include "Directory.hxx"
|
||||
@@ -37,7 +38,6 @@
|
||||
#include "config/Block.hxx"
|
||||
#include "fs/FileSystem.hxx"
|
||||
#include "util/CharUtil.hxx"
|
||||
#include "util/Error.hxx"
|
||||
#include "util/Domain.hxx"
|
||||
#include "Log.hxx"
|
||||
|
||||
@@ -261,12 +261,11 @@ SimpleDatabase::ReturnSong(gcc_unused const LightSong *song) const
|
||||
#endif
|
||||
}
|
||||
|
||||
bool
|
||||
void
|
||||
SimpleDatabase::Visit(const DatabaseSelection &selection,
|
||||
VisitDirectory visit_directory,
|
||||
VisitSong visit_song,
|
||||
VisitPlaylist visit_playlist,
|
||||
Error &error) const
|
||||
VisitPlaylist visit_playlist) const
|
||||
{
|
||||
ScopeDatabaseLock protect;
|
||||
|
||||
@@ -277,10 +276,10 @@ SimpleDatabase::Visit(const DatabaseSelection &selection,
|
||||
if (selection.recursive && visit_directory)
|
||||
visit_directory(r.directory->Export());
|
||||
|
||||
return r.directory->Walk(selection.recursive, selection.filter,
|
||||
visit_directory, visit_song,
|
||||
visit_playlist,
|
||||
error);
|
||||
r.directory->Walk(selection.recursive, selection.filter,
|
||||
visit_directory, visit_song,
|
||||
visit_playlist);
|
||||
return;
|
||||
}
|
||||
|
||||
if (strchr(r.uri, '/') == nullptr) {
|
||||
@@ -298,22 +297,18 @@ SimpleDatabase::Visit(const DatabaseSelection &selection,
|
||||
"No such directory");
|
||||
}
|
||||
|
||||
bool
|
||||
void
|
||||
SimpleDatabase::VisitUniqueTags(const DatabaseSelection &selection,
|
||||
TagType tag_type, tag_mask_t group_mask,
|
||||
VisitTag visit_tag,
|
||||
Error &error) const
|
||||
VisitTag visit_tag) const
|
||||
{
|
||||
return ::VisitUniqueTags(*this, selection, tag_type, group_mask,
|
||||
visit_tag,
|
||||
error);
|
||||
::VisitUniqueTags(*this, selection, tag_type, group_mask, visit_tag);
|
||||
}
|
||||
|
||||
bool
|
||||
SimpleDatabase::GetStats(const DatabaseSelection &selection,
|
||||
DatabaseStats &stats, Error &error) const
|
||||
DatabaseStats
|
||||
SimpleDatabase::GetStats(const DatabaseSelection &selection) const
|
||||
{
|
||||
return ::GetStats(*this, selection, stats, error);
|
||||
return ::GetStats(*this, selection);
|
||||
}
|
||||
|
||||
void
|
||||
|
||||
@@ -112,20 +112,16 @@ public:
|
||||
const LightSong *GetSong(const char *uri_utf8) const override;
|
||||
void ReturnSong(const LightSong *song) const override;
|
||||
|
||||
virtual bool Visit(const DatabaseSelection &selection,
|
||||
VisitDirectory visit_directory,
|
||||
VisitSong visit_song,
|
||||
VisitPlaylist visit_playlist,
|
||||
Error &error) const override;
|
||||
void Visit(const DatabaseSelection &selection,
|
||||
VisitDirectory visit_directory,
|
||||
VisitSong visit_song,
|
||||
VisitPlaylist visit_playlist) const override;
|
||||
|
||||
virtual bool VisitUniqueTags(const DatabaseSelection &selection,
|
||||
TagType tag_type, tag_mask_t group_mask,
|
||||
VisitTag visit_tag,
|
||||
Error &error) const override;
|
||||
void VisitUniqueTags(const DatabaseSelection &selection,
|
||||
TagType tag_type, tag_mask_t group_mask,
|
||||
VisitTag visit_tag) const override;
|
||||
|
||||
virtual bool GetStats(const DatabaseSelection &selection,
|
||||
DatabaseStats &stats,
|
||||
Error &error) const override;
|
||||
DatabaseStats GetStats(const DatabaseSelection &selection) const override;
|
||||
|
||||
virtual time_t GetUpdateStamp() const override {
|
||||
return mtime;
|
||||
|
||||
@@ -26,7 +26,6 @@
|
||||
#include "util/NumberParser.hxx"
|
||||
#include "util/UriUtil.hxx"
|
||||
#include "util/RuntimeError.hxx"
|
||||
#include "util/Error.hxx"
|
||||
#include "util/ScopeExit.hxx"
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
@@ -35,8 +35,6 @@
|
||||
#include "config/Block.hxx"
|
||||
#include "tag/TagBuilder.hxx"
|
||||
#include "tag/TagTable.hxx"
|
||||
#include "util/Error.hxx"
|
||||
#include "util/Domain.hxx"
|
||||
#include "fs/Traits.hxx"
|
||||
#include "Log.hxx"
|
||||
#include "SongFilter.hxx"
|
||||
@@ -84,20 +82,17 @@ public:
|
||||
virtual const LightSong *GetSong(const char *uri_utf8) const override;
|
||||
void ReturnSong(const LightSong *song) const override;
|
||||
|
||||
virtual bool Visit(const DatabaseSelection &selection,
|
||||
VisitDirectory visit_directory,
|
||||
VisitSong visit_song,
|
||||
VisitPlaylist visit_playlist,
|
||||
Error &error) const override;
|
||||
void Visit(const DatabaseSelection &selection,
|
||||
VisitDirectory visit_directory,
|
||||
VisitSong visit_song,
|
||||
VisitPlaylist visit_playlist) const override;
|
||||
|
||||
virtual bool VisitUniqueTags(const DatabaseSelection &selection,
|
||||
TagType tag_type, tag_mask_t group_mask,
|
||||
VisitTag visit_tag,
|
||||
Error &error) const override;
|
||||
void VisitUniqueTags(const DatabaseSelection &selection,
|
||||
TagType tag_type, tag_mask_t group_mask,
|
||||
VisitTag visit_tag) const override;
|
||||
|
||||
DatabaseStats GetStats(const DatabaseSelection &selection) const override;
|
||||
|
||||
virtual bool GetStats(const DatabaseSelection &selection,
|
||||
DatabaseStats &stats,
|
||||
Error &error) const override;
|
||||
time_t GetUpdateStamp() const override {
|
||||
return 0;
|
||||
}
|
||||
@@ -576,12 +571,11 @@ UpnpDatabase::VisitServer(const ContentDirectoryService &server,
|
||||
}
|
||||
|
||||
// Deal with the possibly multiple servers, call VisitServer if needed.
|
||||
bool
|
||||
void
|
||||
UpnpDatabase::Visit(const DatabaseSelection &selection,
|
||||
VisitDirectory visit_directory,
|
||||
VisitSong visit_song,
|
||||
VisitPlaylist visit_playlist,
|
||||
Error &) const
|
||||
VisitPlaylist visit_playlist) const
|
||||
{
|
||||
auto vpath = stringToTokens(selection.uri, "/", true);
|
||||
if (vpath.empty()) {
|
||||
@@ -597,7 +591,7 @@ UpnpDatabase::Visit(const DatabaseSelection &selection,
|
||||
visit_playlist);
|
||||
}
|
||||
|
||||
return true;
|
||||
return;
|
||||
}
|
||||
|
||||
// We do have a path: the first element selects the server
|
||||
@@ -607,19 +601,17 @@ UpnpDatabase::Visit(const DatabaseSelection &selection,
|
||||
auto server = discovery->GetServer(servername.c_str());
|
||||
VisitServer(server, vpath, selection,
|
||||
visit_directory, visit_song, visit_playlist);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
void
|
||||
UpnpDatabase::VisitUniqueTags(const DatabaseSelection &selection,
|
||||
TagType tag, gcc_unused tag_mask_t group_mask,
|
||||
VisitTag visit_tag,
|
||||
Error &) const
|
||||
VisitTag visit_tag) const
|
||||
{
|
||||
// TODO: use group_mask
|
||||
|
||||
if (!visit_tag)
|
||||
return true;
|
||||
return;
|
||||
|
||||
std::set<std::string> values;
|
||||
for (auto& server : discovery->GetDirectories()) {
|
||||
@@ -646,18 +638,16 @@ UpnpDatabase::VisitUniqueTags(const DatabaseSelection &selection,
|
||||
builder.AddItem(tag, value.c_str());
|
||||
visit_tag(builder.Commit());
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
UpnpDatabase::GetStats(const DatabaseSelection &,
|
||||
DatabaseStats &stats, Error &) const
|
||||
DatabaseStats
|
||||
UpnpDatabase::GetStats(const DatabaseSelection &) const
|
||||
{
|
||||
/* Note: this gets called before the daemonizing so we can't
|
||||
reallyopen this would be a problem if we had real stats */
|
||||
DatabaseStats stats;
|
||||
stats.Clear();
|
||||
return true;
|
||||
return stats;
|
||||
}
|
||||
|
||||
const DatabasePlugin upnp_db_plugin = {
|
||||
|
||||
Reference in New Issue
Block a user