#include <db-util.h>
#include <tcore.h>
+#include <server.h>
#include <plugin.h>
#include <storage.h>
#define PLUGIN_VERSION 1
#endif
-static void* create_handle(Storage *strg, const char *path)
+static gboolean __update_query_database(Storage *strg, void *handle, const char *query, GHashTable *in_param)
{
int rv = 0;
- sqlite3 *handle = NULL;
-
- rv = db_util_open(path, &handle, 0);
- if (rv != SQLITE_OK) {
- err("fail to connect database err(%d)", rv);
- return NULL;
- }
-
- dbg("connected to %s", path);
- return handle;
-}
-
-static gboolean remove_handle(Storage *strg, void *handle)
-{
- if (!handle)
- return FALSE;
-
- db_util_close(handle);
- //free(handle);
-
- dbg("disconnected from database");
- return TRUE;
-}
-
-static gboolean update_query_database(Storage *strg, void *handle, const char *query, GHashTable *in_param)
-{
- int rv = 0;
- sqlite3_stmt* stmt = NULL;
- char szQuery[1000+1]; // +1 is for NULL Termination Character '\0'
+ sqlite3_stmt *stmt = NULL;
+ char szQuery[1000+1]; /* +1 is for NULL Termination Character '\0' */
GHashTableIter iter;
gpointer key, value;
return FALSE;
}
- if(in_param){
+ if (in_param) {
g_hash_table_iter_init(&iter, in_param);
while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) {
- dbg("key(%s), value(%s)", (const char*)key, (const char*)value);
+ dbg("key(%s), value(%s)", (const char *)key, (const char *)value);
- if (!value || g_strcmp0((const char*) value, "") == 0) {
+ if (!value || g_strcmp0((const char *)value, "") == 0) {
dbg("bind null");
- rv = sqlite3_bind_null(stmt, atoi((const char*) key));
- }
- else {
+ rv = sqlite3_bind_null(stmt, atoi((const char *)key));
+ } else {
dbg("bind value");
- rv = sqlite3_bind_text(stmt, atoi((const char*) key), (const char*) value, strlen((const char*) value),
+ rv = sqlite3_bind_text(stmt, atoi((const char *)key), (const char *)value, strlen((const char *)value),
SQLITE_STATIC);
}
if (rv != SQLITE_OK) {
dbg("fail to bind data (%d)", rv);
- return FALSE;
+ break;
}
}
}
+ if (rv != SQLITE_OK) {
+ sqlite3_finalize(stmt);
+ return FALSE;
+ }
+
rv = sqlite3_step(stmt);
- dbg("update query executed (%d)", rv);
+ dbg("query executed (%d)", rv);
sqlite3_finalize(stmt);
- if (rv != SQLITE_DONE) {
+ if (rv != SQLITE_DONE)
+ return FALSE;
+
+ return TRUE;
+}
+
+static void *create_handle(Storage *strg, const char *path)
+{
+ int rv = 0;
+ sqlite3 *handle = NULL;
+
+ rv = db_util_open(path, &handle, 0);
+ if (rv != SQLITE_OK) {
+ err("fail to connect database err(%d)", rv);
+ return NULL;
+ }
+
+ dbg("connected to %s", path);
+ return handle;
+}
+
+static gboolean remove_handle(Storage *strg, void *handle)
+{
+ int rv = 0;
+
+ if (!handle)
+ return FALSE;
+
+ rv = db_util_close(handle);
+ if (rv != SQLITE_OK) {
+ err("fail to close database err(%d)", rv);
+ handle = NULL;
return FALSE;
}
+ dbg("disconnected from database");
return TRUE;
}
-static gboolean read_query_database(Storage *strg, void *handle, const char *query, GHashTable *in_param,
- GHashTable *out_param, int out_param_cnt)
+static gboolean update_query_database(Storage *strg, void *handle, const char *query, GHashTable *in_param)
+{
+ gboolean ret = TRUE;
+
+ dbg("update query");
+
+ ret = __update_query_database(strg, handle, query, in_param);
+
+ return ret;
+}
+
+static gboolean _read_query_database_internal(Storage *strg, void *handle, const char *query, GHashTable *in_param,
+ gpointer out_param, int out_param_cnt, gboolean in_order)
{
int rv = 0, local_index = 0, outter_index = 0;
- sqlite3_stmt* stmt = NULL;
- char szQuery[5000+1]; // +1 is for NULL Termination Character '\0'
+ sqlite3_stmt *stmt = NULL;
+ char szQuery[5000+1]; /* +1 is for NULL Termination Character '\0' */
GHashTableIter iter;
gpointer key, value;
if (in_param) {
g_hash_table_iter_init(&iter, in_param);
while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) {
- dbg("key(%s), value(%s)", (const char*)key, (const char*)value);
+ dbg("key(%s), value(%s)", (const char *)key, (const char *)value);
- if (!value || g_strcmp0((const char*) value, "") == 0) {
+ if (!value || g_strcmp0((const char *)value, "") == 0) {
dbg("bind null");
- rv = sqlite3_bind_null(stmt, atoi((const char*) key));
- }
- else {
+ rv = sqlite3_bind_null(stmt, atoi((const char *)key));
+ } else {
dbg("bind value");
- rv = sqlite3_bind_text(stmt, atoi((const char*) key), (const char*) value, strlen((const char*) value),
+ rv = sqlite3_bind_text(stmt, atoi((const char *)key), (const char *)value, strlen((const char *)value),
SQLITE_STATIC);
}
if (rv != SQLITE_OK) {
dbg("fail to bind data (%d)", rv);
- return FALSE;
+ break;
}
}
}
+ if (rv != SQLITE_OK) {
+ sqlite3_finalize(stmt);
+ return FALSE;
+ }
+
rv = sqlite3_step(stmt);
- dbg("read query executed (%d)", rv);
+ dbg("read query executed (%d), in_order (%d)", rv, in_order);
while (rv == SQLITE_ROW) {
-
- char tmp_key_outter[10];
GHashTable *out_param_data;
- out_param_data = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, g_free);
+ out_param_data = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
for (local_index = 0; local_index < out_param_cnt; local_index++) {
char tmp_key[10];
const unsigned char *tmp;
tmp = sqlite3_column_text(stmt, local_index);
snprintf(tmp_key, sizeof(tmp_key), "%d", local_index);
- g_hash_table_insert(out_param_data, g_strdup(tmp_key), g_strdup((const gchar *) tmp));
+ g_hash_table_insert(out_param_data, g_strdup(tmp_key), g_strdup((const char *)tmp));
}
- snprintf(tmp_key_outter, sizeof(tmp_key_outter), "%d", outter_index);
- g_hash_table_insert(out_param, g_strdup(tmp_key_outter), out_param_data);
+ if (in_order) {
+ GSList **temp = out_param;
+ *temp = g_slist_append(*temp, out_param_data);
+ } else {
+ char tmp_key_outter[10];
+ snprintf(tmp_key_outter, sizeof(tmp_key_outter), "%d", outter_index);
+ g_hash_table_insert((GHashTable*)out_param, g_strdup(tmp_key_outter), out_param_data);
+ }
outter_index++;
rv = sqlite3_step(stmt);
}
return TRUE;
}
-static gboolean insert_query_database(Storage *strg, void *handle, const char *query, GHashTable *in_param)
+static gboolean read_query_database(Storage *strg, void *handle, const char *query, GHashTable *in_param,
+ GHashTable **out_param, int out_param_cnt)
{
- int rv = 0;
- sqlite3_stmt* stmt = NULL;
- char szQuery[5000+1]; // +1 is for NULL Termination Character '\0'
+ GHashTable *out_hash_table;
- GHashTableIter iter;
- gpointer key, value;
- dbg("insert query");
+ if (out_param == NULL)
+ return FALSE;
- memset(szQuery, '\0', 5001);
- strncpy(szQuery, query, 5000);
+ out_hash_table = g_hash_table_new_full(g_str_hash, g_str_equal,
+ g_free, (GDestroyNotify)g_hash_table_destroy);
- rv = sqlite3_prepare_v2(handle, szQuery, strlen(szQuery), &stmt, NULL);
- if (rv != SQLITE_OK) {
- err("fail to connect to table (%d)", rv);
+ if (_read_query_database_internal(strg,
+ handle, query, in_param, out_hash_table, out_param_cnt, FALSE) == FALSE) {
+ g_hash_table_destroy(out_hash_table);
return FALSE;
}
- if(in_param){
- g_hash_table_iter_init(&iter, in_param);
- while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) {
- dbg("key(%s), value(%s)", (const char*)key, (const char*)value);
+ *out_param = out_hash_table;
- if (!value || g_strcmp0((const char*) value, "") == 0) {
- dbg("bind null");
- rv = sqlite3_bind_null(stmt, atoi((const char*) key));
- }
- else {
- dbg("bind value");
- rv = sqlite3_bind_text(stmt, atoi((const char*) key), (const char*) value, strlen((const char*) value),
- SQLITE_STATIC);
- }
-
- if (rv != SQLITE_OK) {
- dbg("fail to bind data (%d)", rv);
- return FALSE;
- }
- }
- }
-
- rv = sqlite3_step(stmt);
- dbg("insert query executed (%d)", rv);
- sqlite3_finalize(stmt);
+ return TRUE;
+}
- if (rv != SQLITE_DONE) {
+static gboolean read_query_database_in_order(Storage *strg, void *handle, const char *query, GHashTable *in_param,
+ GSList **out_param, int out_param_cnt)
+{
+ if (_read_query_database_internal(strg,
+ handle, query, in_param, out_param, out_param_cnt, TRUE) == FALSE)
return FALSE;
- }
+
return TRUE;
}
-static gboolean remove_query_database(Storage *strg, void *handle, const char *query, GHashTable *in_param)
+static gboolean insert_query_database(Storage *strg, void *handle, const char *query, GHashTable *in_param)
{
int rv = 0;
- sqlite3_stmt* stmt = NULL;
- char szQuery[1000+1]; // +1 is for NULL Termination Character '\0'
+ sqlite3_stmt *stmt = NULL;
+ char szQuery[5000+1]; /* +1 is for NULL Termination Character '\0' */
GHashTableIter iter;
gpointer key, value;
- dbg("remove query");
+ dbg("insert query");
- memset(szQuery, '\0', 1001);
- strncpy(szQuery, query, 1000);
+ memset(szQuery, '\0', 5001);
+ strncpy(szQuery, query, 5000);
rv = sqlite3_prepare_v2(handle, szQuery, strlen(szQuery), &stmt, NULL);
if (rv != SQLITE_OK) {
return FALSE;
}
- if(in_param){
+ if (in_param) {
g_hash_table_iter_init(&iter, in_param);
while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) {
- dbg("key(%s), value(%s)", (const char*)key, (const char*)value);
+ dbg("key(%s), value(%s)", (const char *)key, (const char *)value);
- if (!value || g_strcmp0((const char*) value, "") == 0) {
+ if (!value || g_strcmp0((const char *)value, "") == 0) {
dbg("bind null");
- rv = sqlite3_bind_null(stmt, atoi((const char*) key));
- }
- else {
+ rv = sqlite3_bind_null(stmt, atoi((const char *)key));
+ } else {
dbg("bind value");
- rv = sqlite3_bind_text(stmt, atoi((const char*) key), (const char*) value, strlen((const char*) value),
+ rv = sqlite3_bind_text(stmt, atoi((const char *)key), (const char *)value, strlen((const char *)value),
SQLITE_STATIC);
}
if (rv != SQLITE_OK) {
dbg("fail to bind data (%d)", rv);
- return FALSE;
+ break;
}
}
}
+ if (rv != SQLITE_OK) {
+ sqlite3_finalize(stmt);
+ return FALSE;
+ }
+
rv = sqlite3_step(stmt);
- dbg("remove query executed (%d)", rv);
+ dbg("insert query executed (%d)", rv);
sqlite3_finalize(stmt);
- if (rv != SQLITE_DONE) {
+ if (rv != SQLITE_DONE)
return FALSE;
- }
return TRUE;
}
+static gboolean remove_query_database(Storage *strg, void *handle, const char *query, GHashTable *in_param)
+{
+ gboolean ret = TRUE;
+
+ dbg("remove query");
+
+ ret = __update_query_database(strg, handle, query, in_param);
+
+ return ret;
+}
+
static struct storage_operations ops = {
.create_handle = create_handle,
.remove_handle = remove_handle,
.update_query_database = update_query_database,
.read_query_database = read_query_database,
+ .read_query_database_in_order = read_query_database_in_order,
.insert_query_database = insert_query_database,
.remove_query_database = remove_query_database,
};
static void on_unload(TcorePlugin *p)
{
+ Storage *strg;
+
+ if (!p)
+ return;
+
dbg("i'm unload!");
+
+ strg = tcore_server_find_storage(tcore_plugin_ref_server(p), "database");
+ if (!strg)
+ return;
+
+ tcore_storage_free(strg);
return;
+
}
-EXPORT_API struct tcore_plugin_define_desc plugin_define_desc =
-{
+EXPORT_API struct tcore_plugin_define_desc plugin_define_desc = {
.name = "DATABASE",
- .priority = TCORE_PLUGIN_PRIORITY_HIGH -1,
+ .priority = TCORE_PLUGIN_PRIORITY_HIGH - 1,
.version = PLUGIN_VERSION,
.load = on_load,
.init = on_init,