diff options
author | Max Kellermann <max@duempel.org> | 2012-08-15 22:20:28 +0200 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2012-08-15 23:05:08 +0200 |
commit | 3c0dea811d498db3091dad868740c4653c22717e (patch) | |
tree | 698de51e854a052d43cb3f872a5aee5b608fb71f /src/Stats.cxx | |
parent | a6ac0f89656b9ef374703d24bbb27316a705eadc (diff) | |
download | mpd-3c0dea811d498db3091dad868740c4653c22717e.tar.gz mpd-3c0dea811d498db3091dad868740c4653c22717e.tar.xz mpd-3c0dea811d498db3091dad868740c4653c22717e.zip |
DatabasePlugin: add method GetStats()
Optimize the ProxyDatabase by invoking "stats" on the peer, instead of
visiting all songs.
Diffstat (limited to '')
-rw-r--r-- | src/Stats.cxx | 81 |
1 files changed, 18 insertions, 63 deletions
diff --git a/src/Stats.cxx b/src/Stats.cxx index 07273bfdb..35c162ef2 100644 --- a/src/Stats.cxx +++ b/src/Stats.cxx @@ -1,5 +1,5 @@ /* - * Copyright (C) 2003-2011 The Music Player Daemon Project + * Copyright (C) 2003-2012 The Music Player Daemon Project * http://www.musicpd.org * * This program is free software; you can redistribute it and/or modify @@ -22,11 +22,8 @@ extern "C" { #include "stats.h" #include "database.h" -#include "tag.h" -#include "song.h" #include "client.h" #include "player_control.h" -#include "strset.h" #include "client_internal.h" } @@ -34,9 +31,6 @@ extern "C" { #include "DatabaseGlue.hxx" #include "DatabasePlugin.hxx" -#include <functional> -#include <set> - struct stats stats; void stats_global_init(void) @@ -49,66 +43,27 @@ void stats_global_finish(void) g_timer_destroy(stats.timer); } -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 -visit_tag(StringSet &artists, StringSet &albums, const struct tag *tag) -{ - if (tag->time > 0) - stats.song_duration += tag->time; - - for (unsigned i = 0; i < tag->num_items; ++i) { - const struct tag_item *item = tag->items[i]; - - switch (item->type) { - case TAG_ARTIST: - artists.insert(item->value); - break; - - case TAG_ALBUM: - albums.insert(item->value); - break; - - default: - break; - } - } -} - -static bool -collect_stats_song(StringSet &artists, StringSet &albums, song &song) -{ - ++stats.song_count; - - if (song.tag != NULL) - visit_tag(artists, albums, song.tag); - - return true; -} - void stats_update(void) { - stats.song_count = 0; - stats.song_duration = 0; - stats.artist_count = 0; - - const DatabaseSelection selection("", true); + GError *error = nullptr; - StringSet artists, albums; - using namespace std::placeholders; - const auto f = std::bind(collect_stats_song, - std::ref(artists), std::ref(albums), _1); - GetDatabase()->Visit(selection, f, NULL); + DatabaseStats stats2; - stats.artist_count = artists.size(); - stats.album_count = albums.size(); + const DatabaseSelection selection("", true); + if (GetDatabase()->GetStats(selection, stats2, &error)) { + stats.song_count = stats2.song_count; + stats.song_duration = stats2.total_duration; + stats.artist_count = stats2.artist_count; + stats.album_count = stats2.album_count; + } else { + g_warning("%s", error->message); + g_error_free(error); + + stats.song_count = 0; + stats.song_duration = 0; + stats.artist_count = 0; + stats.album_count = 0; + } } int stats_print(struct client *client) |