diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/command.c | 33 | ||||
-rw-r--r-- | src/song_sticker.c | 8 | ||||
-rw-r--r-- | src/song_sticker.h | 8 | ||||
-rw-r--r-- | src/sticker.c | 21 | ||||
-rw-r--r-- | src/sticker.h | 9 |
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); /** |