Move from the opaque GPtrArray to GHashTable for sticker lists.

This commit is contained in:
Eric Wollesen 2009-03-11 17:03:01 -06:00
parent ce6ef89f26
commit e2dc3c948f
5 changed files with 34 additions and 45 deletions

View File

@ -1448,6 +1448,13 @@ handle_idle(struct client *client,
} }
#ifdef ENABLE_SQLITE #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 static enum command_return
handle_sticker_song(struct client *client, int argc, char *argv[]) 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; return COMMAND_RETURN_OK;
} else if (argc == 4 && strcmp(argv[1], "list") == 0) { } else if (argc == 4 && strcmp(argv[1], "list") == 0) {
GList *list; GHashTable *hash;
GPtrArray *values;
unsigned int x;
list = sticker_song_list_values(song); hash = sticker_song_list_values(song);
if (NULL == list) { if (NULL == hash) {
command_error(client, ACK_ERROR_NO_EXIST, command_error(client, ACK_ERROR_NO_EXIST,
"no stickers found"); "no stickers found");
return COMMAND_RETURN_ERROR; return COMMAND_RETURN_ERROR;
} }
g_hash_table_foreach(hash, (GHFunc)print_sticker,
for (x = 0; x < g_list_length(list); x++) { client);
values = g_list_nth_data(list, x); g_hash_table_destroy(hash);
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);
return COMMAND_RETURN_OK; return COMMAND_RETURN_OK;
} else if (argc == 6 && strcmp(argv[1], "set") == 0) { } else if (argc == 6 && strcmp(argv[1], "set") == 0) {

View File

@ -39,20 +39,20 @@ sticker_song_get_value(const struct song *song, const char *name)
return value; return value;
} }
GList * GHashTable *
sticker_song_list_values(const struct song *song) sticker_song_list_values(const struct song *song)
{ {
char *uri; char *uri;
GList *list; GHashTable *hash;
assert(song != NULL); assert(song != NULL);
assert(song_in_database(song)); assert(song_in_database(song));
uri = song_get_uri(song); uri = song_get_uri(song);
list = sticker_list_values("song", uri); hash = sticker_list_values("song", uri);
g_free(uri); g_free(uri);
return list; return hash;
} }
bool bool

View File

@ -40,12 +40,10 @@ sticker_song_set_value(const struct song *song,
const char *name, const char *value); const char *name, const char *value);
/** /**
* Returns a list of key value pairs from a song's sticker record. * Returns a hash table of key value pairs from a song's sticker record.
* The caller must free each GPtrArray element of the returned list * The caller must free the GHashTable with g_hash_table_destroy().
* with g_ptr_array_free(), as well as the returned GList with
* g_list_free().
*/ */
GList * GHashTable *
sticker_song_list_values(const struct song *song); sticker_song_list_values(const struct song *song);
/** /**

View File

@ -189,15 +189,14 @@ sticker_load_value(const char *type, const char *uri, const char *name)
return value; return value;
} }
GList * GHashTable *
sticker_list_values(const char *type, const char *uri) sticker_list_values(const char *type, const char *uri)
{ {
int ret; int ret;
char *name, *value; char *name, *value;
GPtrArray *arr; GHashTable *hash;
GList *list;
list = NULL; hash = NULL;
assert(type != NULL); assert(type != NULL);
assert(uri != NULL); assert(uri != NULL);
@ -223,12 +222,14 @@ sticker_list_values(const char *type, const char *uri)
ret = sqlite3_step(sticker_stmt_list); ret = sqlite3_step(sticker_stmt_list);
switch (ret) { switch (ret) {
case SQLITE_ROW: 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)); name = g_strdup((const char*)sqlite3_column_text(sticker_stmt_list, 0));
value = g_strdup((const char*)sqlite3_column_text(sticker_stmt_list, 1)); value = g_strdup((const char*)sqlite3_column_text(sticker_stmt_list, 1));
arr = g_ptr_array_new(); g_hash_table_insert(hash, name, value);
g_ptr_array_add(arr, name);
g_ptr_array_add(arr, value);
list = g_list_prepend(list, arr);
break; break;
case SQLITE_DONE: case SQLITE_DONE:
break; break;
@ -242,12 +243,10 @@ sticker_list_values(const char *type, const char *uri)
} }
} while (ret != SQLITE_DONE); } while (ret != SQLITE_DONE);
list = g_list_reverse(list);
sqlite3_reset(sticker_stmt_list); sqlite3_reset(sticker_stmt_list);
sqlite3_clear_bindings(sticker_stmt_list); sqlite3_clear_bindings(sticker_stmt_list);
return list; return hash;
} }
static bool static bool

View File

@ -64,12 +64,11 @@ bool
sticker_enabled(void); sticker_enabled(void);
/** /**
* Populates a GList with GPtrArrays of sticker names and values from * Populates a GHashTable with GStrings of sticker keys and values
* an object's sticker record. The caller must free each GPtrArray * from an object's sticker record. The caller must free the returned
* element of the returned list with g_ptr_array_free(), as well as * GHashTable with g_hash_list_destroy().
* the returned GList with g_list_free().
*/ */
GList * GHashTable *
sticker_list_values(const char *type, const char *uri); sticker_list_values(const char *type, const char *uri);
/** /**