db/Interface: migrate visitor methods from class Error to C++ exceptions

This commit is contained in:
Max Kellermann
2016-10-29 10:21:57 +02:00
parent 9a9da7b077
commit fac8edd47a
27 changed files with 190 additions and 331 deletions

View File

@@ -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

View File

@@ -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;

View File

@@ -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);
}

View File

@@ -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

View File

@@ -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

View File

@@ -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;