Commit 6a147a17 authored by Max Kellermann's avatar Max Kellermann

db/proxy: pass search/find to remote MPD

parent 2b7529e9
...@@ -61,6 +61,10 @@ public: ...@@ -61,6 +61,10 @@ public:
return tag; return tag;
} }
bool GetFoldCase() const {
return fold_case;
}
const std::string &GetValue() const { const std::string &GetValue() const {
return value; return value;
} }
...@@ -106,6 +110,18 @@ public: ...@@ -106,6 +110,18 @@ public:
} }
/** /**
* Is there at least one item with "fold case" enabled?
*/
gcc_pure
bool HasFoldCase() const {
for (const auto &i : items)
if (i.GetFoldCase())
return true;
return false;
}
/**
* Returns the "base" specification (if there is one) or an * Returns the "base" specification (if there is one) or an
* empty string. * empty string.
*/ */
......
...@@ -472,6 +472,38 @@ Visit(struct mpd_connection *connection, const char *uri, ...@@ -472,6 +472,38 @@ Visit(struct mpd_connection *connection, const char *uri,
return CheckError(connection, error); return CheckError(connection, error);
} }
static bool
SearchSongs(struct mpd_connection *connection,
const DatabaseSelection &selection,
VisitSong visit_song,
Error &error)
{
assert(selection.recursive);
assert(visit_song);
const bool exact = selection.filter == nullptr ||
!selection.filter->HasFoldCase();
if (!mpd_search_db_songs(connection, exact) ||
!SendConstraints(connection, selection) ||
!mpd_search_commit(connection))
return CheckError(connection, error);
bool result = true;
struct mpd_song *song;
while (result && (song = mpd_recv_song(connection)) != nullptr) {
Song *song2 = Convert(song);
mpd_song_free(song);
result = !Match(selection.filter, *song2) ||
visit_song(*song2, error);
song2->Free();
}
mpd_response_finish(connection);
return result && CheckError(connection, error);
}
bool bool
ProxyDatabase::Visit(const DatabaseSelection &selection, ProxyDatabase::Visit(const DatabaseSelection &selection,
VisitDirectory visit_directory, VisitDirectory visit_directory,
...@@ -479,9 +511,14 @@ ProxyDatabase::Visit(const DatabaseSelection &selection, ...@@ -479,9 +511,14 @@ ProxyDatabase::Visit(const DatabaseSelection &selection,
VisitPlaylist visit_playlist, VisitPlaylist visit_playlist,
Error &error) const Error &error) const
{ {
// TODO: match
// TODO: auto-reconnect // TODO: auto-reconnect
if (!visit_directory && !visit_playlist && selection.recursive)
/* this optimized code path can only be used under
certain conditions */
return ::SearchSongs(connection, selection, visit_song, error);
/* fall back to recursive walk (slow!) */
return ::Visit(connection, selection.uri.c_str(), return ::Visit(connection, selection.uri.c_str(),
selection.recursive, selection.filter, selection.recursive, selection.filter,
visit_directory, visit_song, visit_playlist, visit_directory, visit_song, visit_playlist,
......
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