aboutsummaryrefslogtreecommitdiffstats
path: root/src/db/ProxyDatabasePlugin.cxx
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2014-06-23 09:12:51 +0200
committerMax Kellermann <max@duempel.org>2014-06-23 09:18:11 +0200
commit848ed1478866e4d99c10aa962a6d976a6b989536 (patch)
tree5da39e4368027e24d690bc5d004b9cf6d30bc396 /src/db/ProxyDatabasePlugin.cxx
parent4c8a5dfb0522b0ff7d6acb96fd2fbc33c22c14e6 (diff)
downloadmpd-848ed1478866e4d99c10aa962a6d976a6b989536.tar.gz
mpd-848ed1478866e4d99c10aa962a6d976a6b989536.tar.xz
mpd-848ed1478866e4d99c10aa962a6d976a6b989536.zip
db/proxy: fall back to recursive walk on old libmpdclient/MPD
Error message was 'too few arguments for "find"' because the "base" constraint was not supported, and no other constraints remained.
Diffstat (limited to 'src/db/ProxyDatabasePlugin.cxx')
-rw-r--r--src/db/ProxyDatabasePlugin.cxx22
1 files changed, 21 insertions, 1 deletions
diff --git a/src/db/ProxyDatabasePlugin.cxx b/src/db/ProxyDatabasePlugin.cxx
index e41ecdec0..cb1bcdc6b 100644
--- a/src/db/ProxyDatabasePlugin.cxx
+++ b/src/db/ProxyDatabasePlugin.cxx
@@ -566,6 +566,23 @@ SearchSongs(struct mpd_connection *connection,
return result && CheckError(connection, error);
}
+/**
+ * Check whether we can use the "base" constraint. Requires
+ * libmpdclient 2.9 and MPD 0.18.
+ */
+gcc_pure
+static bool
+ServerSupportsSearchBase(const struct mpd_connection *connection)
+{
+#if LIBMPDCLIENT_CHECK_VERSION(2,9,0)
+ return mpd_connection_cmp_server_version(connection, 0, 18, 0) >= 0;
+#else
+ (void)connection;
+
+ return false;
+#endif
+}
+
bool
ProxyDatabase::Visit(const DatabaseSelection &selection,
VisitDirectory visit_directory,
@@ -577,7 +594,10 @@ ProxyDatabase::Visit(const DatabaseSelection &selection,
if (!const_cast<ProxyDatabase *>(this)->EnsureConnected(error))
return nullptr;
- if (!visit_directory && !visit_playlist && selection.recursive)
+ if (!visit_directory && !visit_playlist && selection.recursive &&
+ (ServerSupportsSearchBase(connection)
+ ? !selection.IsEmpty()
+ : selection.HasOtherThanBase()))
/* this optimized code path can only be used under
certain conditions */
return ::SearchSongs(connection, selection, visit_song, error);