diff options
author | Max Kellermann <max@duempel.org> | 2012-08-15 21:32:34 +0200 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2012-08-15 23:02:27 +0200 |
commit | a6ac0f89656b9ef374703d24bbb27316a705eadc (patch) | |
tree | 3706b1b8474ae06890595a8e20c8be011f6a162b /src/DatabasePrint.cxx | |
parent | 4e1eb03287c1af889372ed4c63220a88d2032f78 (diff) | |
download | mpd-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.cxx | 72 |
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); + } } |