Commit fa1fb47d authored by Max Kellermann's avatar Max Kellermann

Merge branch 'v0.18.x'

parents b9eeb6e6 848ed147
...@@ -43,6 +43,11 @@ ver 0.19 (not yet released) ...@@ -43,6 +43,11 @@ ver 0.19 (not yet released)
* install systemd unit for socket activation * install systemd unit for socket activation
* Android port * Android port
ver 0.18.12 (not yet released)
* database
- proxy: fix build failure with libmpdclient 2.2
- proxy: fix add/search and other commands with libmpdclient < 2.9
ver 0.18.11 (2014/05/12) ver 0.18.11 (2014/05/12)
* decoder * decoder
- opus: fix missing song length on high-latency files - opus: fix missing song length on high-latency files
......
...@@ -214,6 +214,16 @@ SongFilter::Match(const LightSong &song) const ...@@ -214,6 +214,16 @@ SongFilter::Match(const LightSong &song) const
return true; return true;
} }
bool
SongFilter::HasOtherThanBase() const
{
for (const auto &i : items)
if (i.GetTag() != LOCATE_TAG_BASE_TYPE)
return true;
return false;
}
std::string std::string
SongFilter::GetBase() const SongFilter::GetBase() const
{ {
......
...@@ -117,6 +117,11 @@ public: ...@@ -117,6 +117,11 @@ public:
return items; return items;
} }
gcc_pure
bool IsEmpty() const {
return items.empty();
}
/** /**
* Is there at least one item with "fold case" enabled? * Is there at least one item with "fold case" enabled?
*/ */
...@@ -130,6 +135,12 @@ public: ...@@ -130,6 +135,12 @@ public:
} }
/** /**
* Does this filter contain constraints other than "base"?
*/
gcc_pure
bool HasOtherThanBase() const;
/**
* Returns the "base" specification (if there is one) or an * Returns the "base" specification (if there is one) or an
* empty string. * empty string.
*/ */
......
...@@ -31,6 +31,18 @@ DatabaseSelection::DatabaseSelection(const char *_uri, bool _recursive, ...@@ -31,6 +31,18 @@ DatabaseSelection::DatabaseSelection(const char *_uri, bool _recursive,
} }
bool bool
DatabaseSelection::IsEmpty() const
{
return uri.empty() && (filter == nullptr || filter->IsEmpty());
}
bool
DatabaseSelection::HasOtherThanBase() const
{
return filter != nullptr && filter->HasOtherThanBase();
}
bool
DatabaseSelection::Match(const LightSong &song) const DatabaseSelection::Match(const LightSong &song) const
{ {
return filter == nullptr || filter->Match(song); return filter == nullptr || filter->Match(song);
......
...@@ -45,6 +45,15 @@ struct DatabaseSelection { ...@@ -45,6 +45,15 @@ struct DatabaseSelection {
const SongFilter *_filter=nullptr); const SongFilter *_filter=nullptr);
gcc_pure gcc_pure
bool IsEmpty() const;
/**
* Does this selection contain constraints other than "base"?
*/
gcc_pure
bool HasOtherThanBase() const;
gcc_pure
bool Match(const LightSong &song) const; bool Match(const LightSong &song) const;
}; };
......
...@@ -695,6 +695,23 @@ SearchSongs(struct mpd_connection *connection, ...@@ -695,6 +695,23 @@ SearchSongs(struct mpd_connection *connection,
return result && CheckError(connection, error); 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 bool
ProxyDatabase::Visit(const DatabaseSelection &selection, ProxyDatabase::Visit(const DatabaseSelection &selection,
VisitDirectory visit_directory, VisitDirectory visit_directory,
...@@ -706,7 +723,10 @@ ProxyDatabase::Visit(const DatabaseSelection &selection, ...@@ -706,7 +723,10 @@ ProxyDatabase::Visit(const DatabaseSelection &selection,
if (!const_cast<ProxyDatabase *>(this)->EnsureConnected(error)) if (!const_cast<ProxyDatabase *>(this)->EnsureConnected(error))
return nullptr; 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 /* this optimized code path can only be used under
certain conditions */ certain conditions */
return ::SearchSongs(connection, selection, visit_song, error); return ::SearchSongs(connection, selection, visit_song, error);
......
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