Commit 84cdf0ca authored by Max Kellermann's avatar Max Kellermann

StickerDatabase: use std::map instead of GHashTable

parent 9e99e5be
...@@ -24,6 +24,9 @@ extern "C" { ...@@ -24,6 +24,9 @@ extern "C" {
#include "idle.h" #include "idle.h"
} }
#include <string>
#include <map>
#include <glib.h> #include <glib.h>
#include <sqlite3.h> #include <sqlite3.h>
#include <assert.h> #include <assert.h>
...@@ -36,7 +39,7 @@ extern "C" { ...@@ -36,7 +39,7 @@ extern "C" {
#endif #endif
struct sticker { struct sticker {
GHashTable *table; std::map<std::string, std::string> table;
}; };
enum sticker_sql { enum sticker_sql {
...@@ -229,13 +232,12 @@ sticker_load_value(const char *type, const char *uri, const char *name) ...@@ -229,13 +232,12 @@ sticker_load_value(const char *type, const char *uri, const char *name)
} }
static bool static bool
sticker_list_values(GHashTable *hash, const char *type, const char *uri) sticker_list_values(std::map<std::string, std::string> &table,
const char *type, const char *uri)
{ {
sqlite3_stmt *const stmt = sticker_stmt[STICKER_SQL_LIST]; sqlite3_stmt *const stmt = sticker_stmt[STICKER_SQL_LIST];
int ret; int ret;
char *name, *value;
assert(hash != NULL);
assert(type != NULL); assert(type != NULL);
assert(uri != NULL); assert(uri != NULL);
assert(sticker_enabled()); assert(sticker_enabled());
...@@ -259,10 +261,13 @@ sticker_list_values(GHashTable *hash, const char *type, const char *uri) ...@@ -259,10 +261,13 @@ sticker_list_values(GHashTable *hash, const char *type, const char *uri)
do { do {
ret = sqlite3_step(stmt); ret = sqlite3_step(stmt);
switch (ret) { switch (ret) {
const char *name, *value;
case SQLITE_ROW: case SQLITE_ROW:
name = g_strdup((const char*)sqlite3_column_text(stmt, 0)); name = (const char*)sqlite3_column_text(stmt, 0);
value = g_strdup((const char*)sqlite3_column_text(stmt, 1)); value = (const char*)sqlite3_column_text(stmt, 1);
g_hash_table_insert(hash, name, value);
table.insert(std::make_pair(name, value));
break; break;
case SQLITE_DONE: case SQLITE_DONE:
break; break;
...@@ -521,45 +526,20 @@ sticker_delete_value(const char *type, const char *uri, const char *name) ...@@ -521,45 +526,20 @@ sticker_delete_value(const char *type, const char *uri, const char *name)
return ret > 0; return ret > 0;
} }
static struct sticker *
sticker_new(void)
{
struct sticker *sticker = g_new(struct sticker, 1);
sticker->table = g_hash_table_new_full(g_str_hash, g_str_equal,
g_free, g_free);
return sticker;
}
void void
sticker_free(struct sticker *sticker) sticker_free(struct sticker *sticker)
{ {
assert(sticker != NULL); delete sticker;
assert(sticker->table != NULL);
g_hash_table_destroy(sticker->table);
g_free(sticker);
} }
const char * const char *
sticker_get_value(const struct sticker *sticker, const char *name) sticker_get_value(const struct sticker *sticker, const char *name)
{ {
return (const char *)g_hash_table_lookup(sticker->table, name); auto i = sticker->table.find(name);
} if (i == sticker->table.end())
return nullptr;
struct sticker_foreach_data { return i->second.c_str();
void (*func)(const char *name, const char *value,
gpointer user_data);
gpointer user_data;
};
static void
sticker_foreach_func(gpointer key, gpointer value, gpointer user_data)
{
struct sticker_foreach_data *data =
(struct sticker_foreach_data *)user_data;
data->func((const char *)key, (const char *)value, data->user_data);
} }
void void
...@@ -568,32 +548,23 @@ sticker_foreach(const struct sticker *sticker, ...@@ -568,32 +548,23 @@ sticker_foreach(const struct sticker *sticker,
gpointer user_data), gpointer user_data),
gpointer user_data) gpointer user_data)
{ {
struct sticker_foreach_data data; for (const auto &i : sticker->table)
data.func = func; func(i.first.c_str(), i.second.c_str(), user_data);
data.user_data = user_data;
g_hash_table_foreach(sticker->table, sticker_foreach_func, &data);
} }
struct sticker * struct sticker *
sticker_load(const char *type, const char *uri) sticker_load(const char *type, const char *uri)
{ {
struct sticker *sticker = sticker_new(); sticker s;
bool success;
success = sticker_list_values(sticker->table, type, uri); if (!sticker_list_values(s.table, type, uri))
if (!success) {
sticker_free(sticker);
return NULL; return NULL;
}
if (g_hash_table_size(sticker->table) == 0) { if (s.table.empty())
/* don't return empty sticker objects */ /* don't return empty sticker objects */
sticker_free(sticker);
return NULL; return NULL;
}
return sticker; return new sticker(std::move(s));
} }
bool bool
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment