aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric Wollesen <ericw@xmtp.net>2009-03-11 17:03:01 -0600
committerEric Wollesen <ericw@xmtp.net>2009-03-11 17:03:01 -0600
commite2dc3c948ff43fbc7ed0dc5bedf207d139293a97 (patch)
tree328f6f4615be055cc9f709d2d4746d57041451ce
parentce6ef89f26d8243e863c9a5a419f91db27e3d6f4 (diff)
downloadmpd-e2dc3c948ff43fbc7ed0dc5bedf207d139293a97.tar.gz
mpd-e2dc3c948ff43fbc7ed0dc5bedf207d139293a97.tar.xz
mpd-e2dc3c948ff43fbc7ed0dc5bedf207d139293a97.zip
Move from the opaque GPtrArray to GHashTable for sticker lists.
-rw-r--r--src/command.c33
-rw-r--r--src/song_sticker.c8
-rw-r--r--src/song_sticker.h8
-rw-r--r--src/sticker.c21
-rw-r--r--src/sticker.h9
5 files changed, 34 insertions, 45 deletions
diff --git a/src/command.c b/src/command.c
index 5342662ca..14ac059d0 100644
--- a/src/command.c
+++ b/src/command.c
@@ -1448,6 +1448,13 @@ handle_idle(struct client *client,
}
#ifdef ENABLE_SQLITE
+static void print_sticker(GString *name, GString *value,
+ struct client *client)
+{
+ client_printf(client, "sticker: %s=%s\n",
+ (char *)name, (char *)value);
+}
+
static enum command_return
handle_sticker_song(struct client *client, int argc, char *argv[])
{
@@ -1474,31 +1481,17 @@ handle_sticker_song(struct client *client, int argc, char *argv[])
return COMMAND_RETURN_OK;
} else if (argc == 4 && strcmp(argv[1], "list") == 0) {
- GList *list;
- GPtrArray *values;
- unsigned int x;
+ GHashTable *hash;
- list = sticker_song_list_values(song);
- if (NULL == list) {
+ hash = sticker_song_list_values(song);
+ if (NULL == hash) {
command_error(client, ACK_ERROR_NO_EXIST,
"no stickers found");
return COMMAND_RETURN_ERROR;
}
-
- for (x = 0; x < g_list_length(list); x++) {
- values = g_list_nth_data(list, x);
- if (NULL == values) {
- g_warning("NULL sticker found");
- continue;
- }
- client_printf(client, "sticker: %s=%s\n",
- (char *)g_ptr_array_index(values, 0),
- (char *)g_ptr_array_index(values, 1));
- g_free(g_ptr_array_index(values, 0));
- g_free(g_ptr_array_index(values, 1));
- g_ptr_array_free(values, TRUE);
- }
- g_list_free(list);
+ g_hash_table_foreach(hash, (GHFunc)print_sticker,
+ client);
+ g_hash_table_destroy(hash);
return COMMAND_RETURN_OK;
} else if (argc == 6 && strcmp(argv[1], "set") == 0) {
diff --git a/src/song_sticker.c b/src/song_sticker.c
index bf400c15b..3c77c184b 100644
--- a/src/song_sticker.c
+++ b/src/song_sticker.c
@@ -39,20 +39,20 @@ sticker_song_get_value(const struct song *song, const char *name)
return value;
}
-GList *
+GHashTable *
sticker_song_list_values(const struct song *song)
{
char *uri;
- GList *list;
+ GHashTable *hash;
assert(song != NULL);
assert(song_in_database(song));
uri = song_get_uri(song);
- list = sticker_list_values("song", uri);
+ hash = sticker_list_values("song", uri);
g_free(uri);
- return list;
+ return hash;
}
bool
diff --git a/src/song_sticker.h b/src/song_sticker.h
index 68124580f..e2d68163f 100644
--- a/src/song_sticker.h
+++ b/src/song_sticker.h
@@ -40,12 +40,10 @@ sticker_song_set_value(const struct song *song,
const char *name, const char *value);
/**
- * Returns a list of key value pairs from a song's sticker record.
- * The caller must free each GPtrArray element of the returned list
- * with g_ptr_array_free(), as well as the returned GList with
- * g_list_free().
+ * Returns a hash table of key value pairs from a song's sticker record.
+ * The caller must free the GHashTable with g_hash_table_destroy().
*/
-GList *
+GHashTable *
sticker_song_list_values(const struct song *song);
/**
diff --git a/src/sticker.c b/src/sticker.c
index f27df7cf7..750f752af 100644
--- a/src/sticker.c
+++ b/src/sticker.c
@@ -189,15 +189,14 @@ sticker_load_value(const char *type, const char *uri, const char *name)
return value;
}
-GList *
+GHashTable *
sticker_list_values(const char *type, const char *uri)
{
int ret;
char *name, *value;
- GPtrArray *arr;
- GList *list;
+ GHashTable *hash;
- list = NULL;
+ hash = NULL;
assert(type != NULL);
assert(uri != NULL);
@@ -223,12 +222,14 @@ sticker_list_values(const char *type, const char *uri)
ret = sqlite3_step(sticker_stmt_list);
switch (ret) {
case SQLITE_ROW:
+ if (!hash)
+ hash = g_hash_table_new_full(g_str_hash,
+ g_str_equal,
+ (GDestroyNotify)g_free,
+ (GDestroyNotify)g_free);
name = g_strdup((const char*)sqlite3_column_text(sticker_stmt_list, 0));
value = g_strdup((const char*)sqlite3_column_text(sticker_stmt_list, 1));
- arr = g_ptr_array_new();
- g_ptr_array_add(arr, name);
- g_ptr_array_add(arr, value);
- list = g_list_prepend(list, arr);
+ g_hash_table_insert(hash, name, value);
break;
case SQLITE_DONE:
break;
@@ -242,12 +243,10 @@ sticker_list_values(const char *type, const char *uri)
}
} while (ret != SQLITE_DONE);
- list = g_list_reverse(list);
-
sqlite3_reset(sticker_stmt_list);
sqlite3_clear_bindings(sticker_stmt_list);
- return list;
+ return hash;
}
static bool
diff --git a/src/sticker.h b/src/sticker.h
index 689555fb0..2a76619cb 100644
--- a/src/sticker.h
+++ b/src/sticker.h
@@ -64,12 +64,11 @@ bool
sticker_enabled(void);
/**
- * Populates a GList with GPtrArrays of sticker names and values from
- * an object's sticker record. The caller must free each GPtrArray
- * element of the returned list with g_ptr_array_free(), as well as
- * the returned GList with g_list_free().
+ * Populates a GHashTable with GStrings of sticker keys and values
+ * from an object's sticker record. The caller must free the returned
+ * GHashTable with g_hash_list_destroy().
*/
-GList *
+GHashTable *
sticker_list_values(const char *type, const char *uri);
/**