db/proxy: pass SongFilter to the remote MPD in VisitUniqueTags()
This commit is contained in:
parent
1ed321f964
commit
2b7529e905
@ -126,6 +126,76 @@ CheckError(struct mpd_connection *connection, Error &error)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
SendConstraints(mpd_connection *connection, const SongFilter::Item &item)
|
||||||
|
{
|
||||||
|
switch (item.GetTag()) {
|
||||||
|
mpd_tag_type tag;
|
||||||
|
|
||||||
|
#if LIBMPDCLIENT_CHECK_VERSION(2,9,0)
|
||||||
|
case LOCATE_TAG_BASE_TYPE:
|
||||||
|
if (mpd_connection_cmp_server_version(connection, 0, 18, 0) < 0)
|
||||||
|
/* requires MPD 0.18 */
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return mpd_search_add_base_constraint(connection,
|
||||||
|
MPD_OPERATOR_DEFAULT,
|
||||||
|
item.GetValue().c_str());
|
||||||
|
#endif
|
||||||
|
|
||||||
|
case LOCATE_TAG_FILE_TYPE:
|
||||||
|
return mpd_search_add_uri_constraint(connection,
|
||||||
|
MPD_OPERATOR_DEFAULT,
|
||||||
|
item.GetValue().c_str());
|
||||||
|
|
||||||
|
case LOCATE_TAG_ANY_TYPE:
|
||||||
|
return mpd_search_add_any_tag_constraint(connection,
|
||||||
|
MPD_OPERATOR_DEFAULT,
|
||||||
|
item.GetValue().c_str());
|
||||||
|
|
||||||
|
default:
|
||||||
|
tag = Convert(TagType(item.GetTag()));
|
||||||
|
if (tag == MPD_TAG_COUNT)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return mpd_search_add_tag_constraint(connection,
|
||||||
|
MPD_OPERATOR_DEFAULT,
|
||||||
|
tag,
|
||||||
|
item.GetValue().c_str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
SendConstraints(mpd_connection *connection, const SongFilter &filter)
|
||||||
|
{
|
||||||
|
for (const auto &i : filter.GetItems())
|
||||||
|
if (!SendConstraints(connection, i))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
SendConstraints(mpd_connection *connection, const DatabaseSelection &selection)
|
||||||
|
{
|
||||||
|
#if LIBMPDCLIENT_CHECK_VERSION(2,9,0)
|
||||||
|
if (!selection.uri.empty() &&
|
||||||
|
mpd_connection_cmp_server_version(connection, 0, 18, 0) >= 0) {
|
||||||
|
/* requires MPD 0.18 */
|
||||||
|
if (!mpd_search_add_base_constraint(connection,
|
||||||
|
MPD_OPERATOR_DEFAULT,
|
||||||
|
selection.uri.c_str()))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (selection.filter != nullptr &&
|
||||||
|
!SendConstraints(connection, *selection.filter))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
Database *
|
Database *
|
||||||
ProxyDatabase::Create(const config_param ¶m, Error &error)
|
ProxyDatabase::Create(const config_param ¶m, Error &error)
|
||||||
{
|
{
|
||||||
@ -433,8 +503,8 @@ ProxyDatabase::VisitUniqueTags(const DatabaseSelection &selection,
|
|||||||
if (!mpd_search_db_tags(connection, tag_type2))
|
if (!mpd_search_db_tags(connection, tag_type2))
|
||||||
return CheckError(connection, error);
|
return CheckError(connection, error);
|
||||||
|
|
||||||
// TODO: match
|
if (!SendConstraints(connection, selection))
|
||||||
(void)selection;
|
return CheckError(connection, error);
|
||||||
|
|
||||||
if (!mpd_search_commit(connection))
|
if (!mpd_search_commit(connection))
|
||||||
return CheckError(connection, error);
|
return CheckError(connection, error);
|
||||||
|
Loading…
Reference in New Issue
Block a user