StickerDatabase: use std::map instead of GHashTable
This commit is contained in:
@@ -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" {
|
|||||||
#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)
|
|||||||
}
|
}
|
||||||
|
|
||||||
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)
|
|||||||
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)
|
|||||||
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,
|
|||||||
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
|
||||||
|
Reference in New Issue
Block a user