aboutsummaryrefslogtreecommitdiffstats
path: root/src/DatabasePrint.cxx
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2012-08-15 21:32:34 +0200
committerMax Kellermann <max@duempel.org>2012-08-15 23:02:27 +0200
commita6ac0f89656b9ef374703d24bbb27316a705eadc (patch)
tree3706b1b8474ae06890595a8e20c8be011f6a162b /src/DatabasePrint.cxx
parent4e1eb03287c1af889372ed4c63220a88d2032f78 (diff)
downloadmpd-a6ac0f89656b9ef374703d24bbb27316a705eadc.tar.gz
mpd-a6ac0f89656b9ef374703d24bbb27316a705eadc.tar.xz
mpd-a6ac0f89656b9ef374703d24bbb27316a705eadc.zip
DatabasePlugin: add method VisitUniqueTags()
Optimize the ProxyDatabase by invoking "list" on the peer, instead of visiting all songs.
Diffstat (limited to '')
-rw-r--r--src/DatabasePrint.cxx72
1 files changed, 19 insertions, 53 deletions
diff --git a/src/DatabasePrint.cxx b/src/DatabasePrint.cxx
index d22d4db8a..b58619a95 100644
--- a/src/DatabasePrint.cxx
+++ b/src/DatabasePrint.cxx
@@ -38,7 +38,6 @@ extern "C" {
#include "DatabasePlugin.hxx"
#include <functional>
-#include <set>
static bool
PrintDirectory(struct client *client, const directory &directory)
@@ -186,48 +185,19 @@ printInfoForAllIn(struct client *client, const char *uri_utf8,
return db_selection_print(client, selection, true, error_r);
}
-struct StringLess {
- gcc_pure
- bool operator()(const char *a, const char *b) const {
- return strcmp(a, b) < 0;
- }
-};
-
-typedef std::set<const char *, StringLess> StringSet;
-
-static void
-visitTag(struct client *client, StringSet &set,
- song &song, enum tag_type tagType)
+static bool
+PrintSongURIVisitor(struct client *client, song &song)
{
- struct tag *tag = song.tag;
- bool found = false;
-
- if (tagType == LOCATE_TAG_FILE_TYPE) {
- song_print_uri(client, &song);
- return;
- }
-
- if (!tag)
- return;
-
- for (unsigned i = 0; i < tag->num_items; i++) {
- if (tag->items[i]->type == tagType) {
- set.insert(tag->items[i]->value);
- found = true;
- }
- }
+ song_print_uri(client, &song);
- if (!found)
- set.insert("");
+ return true;
}
static bool
-unique_tags_visitor_song(struct client *client,
- enum tag_type tag_type,
- StringSet &set, song &song)
+PrintUniqueTag(struct client *client, enum tag_type tag_type,
+ const char *value)
{
- visitTag(client, set, song, tag_type);
-
+ client_printf(client, "%s: %s\n", tag_item_names[tag_type], value);
return true;
}
@@ -238,20 +208,16 @@ listAllUniqueTags(struct client *client, int type,
{
const DatabaseSelection selection("", true, criteria);
- StringSet set;
-
- using namespace std::placeholders;
- const auto f = std::bind(unique_tags_visitor_song, client,
- (enum tag_type)type, std::ref(set),
- _1);
- if (!GetDatabase()->Visit(selection, f, error_r))
- return false;
-
- if (type >= 0 && type <= TAG_NUM_OF_ITEM_TYPES)
- for (auto value : set)
- client_printf(client, "%s: %s\n",
- tag_item_names[type],
- value);
-
- return true;
+ if (type == LOCATE_TAG_FILE_TYPE) {
+ using namespace std::placeholders;
+ const auto f = std::bind(PrintSongURIVisitor, client, _1);
+ return GetDatabase()->Visit(selection, f, error_r);
+ } else {
+ using namespace std::placeholders;
+ const auto f = std::bind(PrintUniqueTag, client,
+ (enum tag_type)type, _1);
+ return GetDatabase()->VisitUniqueTags(selection,
+ (enum tag_type)type,
+ f, error_r);
+ }
}