aboutsummaryrefslogtreecommitdiffstats
path: root/src/stats.c
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2008-09-08 11:47:57 +0200
committerEric Wong <normalperson@yhbt.net>2008-09-09 00:40:26 -0700
commit09dccb79f611110a5a653030c7c21958eda95a03 (patch)
treec1132f3228146c9543806c36451056a61a1f7f8e /src/stats.c
parent65c88720fbc08bb9ca2cb37ffa75fd842ff3f1d1 (diff)
downloadmpd-09dccb79f611110a5a653030c7c21958eda95a03.tar.gz
mpd-09dccb79f611110a5a653030c7c21958eda95a03.tar.xz
mpd-09dccb79f611110a5a653030c7c21958eda95a03.zip
use strset.h instead of tagTracker.h
With a large music database, the linear string collection in tagTracker.c becomes very slow. We implemented that in a quick'n'dirty fashion when we removed tree.c, and now we rewrite it using the fast hashed string set.
Diffstat (limited to 'src/stats.c')
-rw-r--r--src/stats.c65
1 files changed, 56 insertions, 9 deletions
diff --git a/src/stats.c b/src/stats.c
index 39ba39e9a..c576d2870 100644
--- a/src/stats.c
+++ b/src/stats.c
@@ -1,5 +1,6 @@
/* the Music Player Daemon (MPD)
* Copyright (C) 2003-2007 by Warren Dukes (warren.dukes@gmail.com)
+ * Copyright (C) 2008 Max Kellermann <max@duempel.org>
* This project's homepage is: http://www.musicpd.org
*
* This program is free software; you can redistribute it and/or modify
@@ -21,8 +22,10 @@
#include "directory.h"
#include "myfprintf.h"
#include "outputBuffer.h"
-#include "tagTracker.h"
+#include "tag.h"
+#include "strset.h"
#include "os_compat.h"
+#include "gcc.h"
Stats stats;
@@ -32,15 +35,59 @@ void initStats(void)
stats.numberOfSongs = 0;
}
+struct visit_data {
+ enum tag_type type;
+ struct strset *set;
+};
+
+static int visit_tag_items(mpd_unused int fd, Song *song, void *_data)
+{
+ const struct visit_data *data = _data;
+ unsigned i;
+
+ if (song->tag == NULL)
+ return 0;
+
+ for (i = 0; i < (unsigned)song->tag->numOfItems; ++i) {
+ const struct tag_item *item = song->tag->items[i];
+ if (item->type == data->type)
+ strset_add(data->set, item->value);
+ }
+
+ return 0;
+}
+
+static unsigned int getNumberOfTagItems(int type)
+{
+ struct visit_data data;
+ unsigned int ret;
+
+ data.type = type;
+ data.set = strset_new();
+
+ traverseAllIn(STDERR_FILENO, NULL, visit_tag_items, NULL, &data);
+
+ ret = strset_size(data.set);
+ strset_free(data.set);
+ return ret;
+}
+
int printStats(int fd)
{
- fdprintf(fd, "artists: %i\n", getNumberOfTagItems(TAG_ITEM_ARTIST));
- fdprintf(fd, "albums: %i\n", getNumberOfTagItems(TAG_ITEM_ALBUM));
- fdprintf(fd, "songs: %i\n", stats.numberOfSongs);
- fdprintf(fd, "uptime: %li\n", time(NULL) - stats.daemonStart);
- fdprintf(fd, "playtime: %li\n",
- (long)(ob_get_total_time() + 0.5));
- fdprintf(fd, "db_playtime: %li\n", stats.dbPlayTime);
- fdprintf(fd, "db_update: %li\n", getDbModTime());
+ fdprintf(fd,
+ "artists: %u\n"
+ "albums: %u\n"
+ "songs: %i\n"
+ "uptime: %li\n"
+ "playtime: %li\n"
+ "db_playtime: %li\n"
+ "db_update: %li\n",
+ getNumberOfTagItems(TAG_ITEM_ARTIST),
+ getNumberOfTagItems(TAG_ITEM_ALBUM),
+ stats.numberOfSongs,
+ time(NULL) - stats.daemonStart,
+ (long)(ob_get_total_time() + 0.5),
+ stats.dbPlayTime,
+ getDbModTime());
return 0;
}