#include #include #include #include #include #include #include #include #include #include #include #include #include #include "json-c/json.h" #include "rkdb.h" #include "common.h" #include "dbus_helpers.h" static gboolean signal_datachanged(DBusConnection *conn, char *interface, char *json_str) { DBusMessage *signal; DBusMessageIter iter; if (interface == NULL) return FALSE; signal = dbus_message_new_signal(DB_PATH, interface, "DataChanged"); if (!signal) return FALSE; dbus_message_iter_init_append(signal, &iter); dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &json_str); dbus_connection_send(conn, signal, NULL); dbus_message_unref(signal); return TRUE; } static char *cmd_delete(json_object *j_cfg) { char *where = 0; char *table = 0; json_object *j_key = 0; table = (char *)json_object_get_string(json_object_object_get(j_cfg, "table")); j_key = json_object_object_get(j_cfg, "key"); json_object_object_foreach(j_key, key, val) { if (where) { char *tmp = where; if (json_object_get_type(val) == json_type_int) where = g_strdup_printf("%s and %s=%d", tmp, key, (int)json_object_get_int(val)); else where = g_strdup_printf("%s and %s='%s'", tmp, key, (char *)json_object_get_string(val)); g_free(tmp); } else { if (json_object_get_type(val) == json_type_int) where = g_strdup_printf("%s=%d", key, (int)json_object_get_int(val)); else where = g_strdup_printf("%s='%s'", key, (char *)json_object_get_string(val)); } } return rkdb_delete(table, where); } static char *cmd_drop(json_object *j_cfg) { char *table = (char *)json_object_get_string(json_object_object_get(j_cfg, "table")); return rkdb_drop(table); } static char *cmd_create(json_object *j_cfg) { char *table = (char *)json_object_get_string(json_object_object_get(j_cfg, "table")); char *col = (char *)json_object_get_string(json_object_object_get(j_cfg, "col")); return rkdb_create(table, col); } static char *cmd_select(json_object *j_cfg) { char *col = 0; char *where = 0; char *table = 0; json_object *j_key; json_object *j_data; table = (char *)json_object_get_string(json_object_object_get(j_cfg, "table")); j_key = json_object_object_get(j_cfg, "key"); j_data = json_object_object_get(j_cfg, "data"); json_object_object_foreach(j_key, key, val) { if (where) { char *tmp = where; if (json_object_get_type(val) == json_type_int) where = g_strdup_printf("%s and %s=%d", tmp, key, (int)json_object_get_int(val)); else where = g_strdup_printf("%s and %s='%s'", tmp, key, (char *)json_object_get_string(val)); g_free(tmp); } else { if (json_object_get_type(val) == json_type_int) where = g_strdup_printf("%s=%d", key, (int)json_object_get_int(val)); else where = g_strdup_printf("%s='%s'", key, (char *)json_object_get_string(val)); } } col = (char *)json_object_get_string(j_data); char *ret = rkdb_select(table, col, where, NULL, NULL); g_free(where); return ret; } static char *cmd_update(json_object *j_cfg) { int ret; char *table = 0; json_object *j_key = 0; json_object *j_data = 0; char *j_str; json_object *j_ret; table = (char *)json_object_get_string(json_object_object_get(j_cfg, "table")); j_key = json_object_object_get(j_cfg, "key"); j_data = json_object_object_get(j_cfg, "data"); char *where = 0; char *set = 0; json_object_object_foreach(j_key, key, val) { if (where) { char *tmp = where; if (json_object_get_type(val) == json_type_int) where = g_strdup_printf("%s and %s=%d", tmp, key, (int)json_object_get_int(val)); else where = g_strdup_printf("%s and %s='%s'", tmp, key, (char *)json_object_get_string(val)); g_free(tmp); } else { if (json_object_get_type(val) == json_type_int) where = g_strdup_printf("%s=%d", key, (int)json_object_get_int(val)); else where = g_strdup_printf("%s='%s'", key, (char *)json_object_get_string(val)); } } json_object_object_foreach(j_data, key1, val1) { if (set) { char *tmp = set; if (json_object_get_type(val1) == json_type_int) set = g_strdup_printf("%s,%s=%d", tmp, key1, (int)json_object_get_int(val1)); else set = g_strdup_printf("%s,%s='%s'", tmp, key1, (char *)json_object_get_string(val1)); g_free(tmp); } else { if (json_object_get_type(val1) == json_type_int) set = g_strdup_printf("%s=%d", key1, (int)json_object_get_int(val1)); else set = g_strdup_printf("%s='%s'", key1, (char *)json_object_get_string(val1)); } } j_str = rkdb_select(table, "*", where, NULL, "0,1"); j_ret = json_tokener_parse(j_str); json_object *j_array = json_object_object_get(j_ret, "jData"); int num = json_object_array_length(j_array); json_object_put(j_ret); g_free(j_str); if (num == 0) { char *cols = 0; char *vals = 0; json_object_object_foreach(j_key, key, val) { if (cols) { char *tmp = cols; cols = g_strdup_printf("%s,%s", tmp, key); g_free(tmp); } else { cols = g_strdup_printf("%s", key); } if (vals) { char *tmp = vals; if (json_object_get_type(val) == json_type_int) vals = g_strdup_printf("%s,%d", tmp, (int)json_object_get_int(val)); else vals = g_strdup_printf("%s,'%s'", tmp, (char *)json_object_get_string(val)); g_free(tmp); } else { if (json_object_get_type(val) == json_type_int) vals = g_strdup_printf("%d", (int)json_object_get_int(val)); else vals = g_strdup_printf("'%s'", (char *)json_object_get_string(val)); } } json_object_object_foreach(j_data, key1, val1) { if (cols) { char *tmp = cols; cols = g_strdup_printf("%s,%s", tmp, key1); g_free(tmp); } else { cols = g_strdup_printf("%s", key1); } if (vals) { char *tmp = vals; if (json_object_get_type(val1) == json_type_int) vals = g_strdup_printf("%s,%d", tmp, (int)json_object_get_int(val1)); else vals = g_strdup_printf("%s,'%s'", tmp, (char *)json_object_get_string(val1)); g_free(tmp); } else { if (json_object_get_type(val1) == json_type_int) vals = g_strdup_printf("%d", (int)json_object_get_int(val1)); else vals = g_strdup_printf("'%s'", (char *)json_object_get_string(val1)); } } j_str = rkdb_insert(table, cols, vals); if (cols) g_free(cols); if (vals) g_free(vals); } else { j_str = rkdb_update(table, set, where); } if (where) g_free(where); if (set) g_free(set); return j_str; } static char *cmd_insert(json_object *j_cfg) { char *cols = 0; char *vals = 0; char *ret; char *table = 0; json_object *j_key = 0; json_object *j_data = 0; table = (char *)json_object_get_string(json_object_object_get(j_cfg, "table")); j_key = json_object_object_get(j_cfg, "key"); j_data = json_object_object_get(j_cfg, "data"); json_object_object_foreach(j_key, key, val) { if (cols) { char *tmp = cols; cols = g_strdup_printf("%s,%s", tmp, key); g_free(tmp); } else { cols = g_strdup_printf("%s", key); } if (vals) { char *tmp = vals; if (json_object_get_type(val) == json_type_int) vals = g_strdup_printf("%s,%d", tmp, (int)json_object_get_int(val)); else vals = g_strdup_printf("%s,'%s'", tmp, (char *)json_object_get_string(val)); g_free(tmp); } else { if (json_object_get_type(val) == json_type_int) vals = g_strdup_printf("%d", (int)json_object_get_int(val)); else vals = g_strdup_printf("'%s'", (char *)json_object_get_string(val)); } } json_object_object_foreach(j_data, key1, val1) { if (cols) { char *tmp = cols; cols = g_strdup_printf("%s,%s", tmp, key1); g_free(tmp); } else { cols = g_strdup_printf("%s", key1); } if (vals) { char *tmp = vals; if (json_object_get_type(val1) == json_type_int) vals = g_strdup_printf("%s,%d", tmp, (int)json_object_get_int(val1)); else vals = g_strdup_printf("%s,'%s'", tmp, (char *)json_object_get_string(val1)); g_free(tmp); } else { if (json_object_get_type(val1) == json_type_int) vals = g_strdup_printf("%d", (int)json_object_get_int(val1)); else vals = g_strdup_printf("'%s'", (char *)json_object_get_string(val1)); } } ret = rkdb_insert(table, cols, vals); if (cols) g_free(cols); if (vals) g_free(vals); return ret; } DBusMessage *method_cmd(DBusConnection *conn, DBusMessage *msg, void *data) { int ret; const char *sender; DBusMessage *reply; char *json_str; json_object *j_cfg; DBusMessageIter array; char *str = NULL; sender = dbus_message_get_sender(msg); dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &json_str, DBUS_TYPE_INVALID); j_cfg = json_tokener_parse(json_str); char *cmd = (char *)json_object_get_string(json_object_object_get(j_cfg, "cmd")); int need_signal = 0; if (g_str_equal(cmd, "Drop")) { str = cmd_drop(j_cfg); need_signal = 1; } else if (g_str_equal(cmd, "Create")) { str = cmd_create(j_cfg); } else if (g_str_equal(cmd, "Select")) { str = cmd_select(j_cfg); } else if (g_str_equal(cmd, "Delete")) { str = cmd_delete(j_cfg); need_signal = 1; } else if (g_str_equal(cmd, "Insert")) { str = cmd_insert(j_cfg); need_signal = 1; } else if (g_str_equal(cmd, "Update")) { str = cmd_update(j_cfg); need_signal = 1; } if (need_signal && str) { json_object *j_ret = json_tokener_parse(str); if ((int)json_object_get_int(json_object_object_get(j_ret, "iReturn")) == 0) signal_datachanged(conn, data, json_str); json_object_put(j_ret); } json_object_put(j_cfg); reply = dbus_message_new_method_return(msg); if (!reply) return NULL; dbus_message_iter_init_append(reply, &array); dbus_message_iter_append_basic(&array, DBUS_TYPE_STRING, &str); g_free(str); return reply; } DBusMessage *method_sql(DBusConnection *conn, DBusMessage *msg, void *data) { const char *sender; DBusMessage *reply; DBusMessageIter array, dict; char *str; char *sql; sender = dbus_message_get_sender(msg); dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &sql, DBUS_TYPE_INVALID); str = rkdb_sql(sql); reply = dbus_message_new_method_return(msg); if (!reply) return NULL; dbus_message_iter_init_append(reply, &array); dbus_message_iter_append_basic(&array, DBUS_TYPE_STRING, &str); g_free(str); return reply; } void creat_version_table(char *table, char *version) { char *col_para = "id INTEGER PRIMARY KEY," \ "sVersion TEXT NOT NULL"; g_free(rkdb_create(table, col_para)); char *vals = g_strdup_printf("0,'%s'", version); g_free(rkdb_insert(table, "id,sVersion", vals)); g_free(vals); } int equal_version(char *table, char *version) { int ret = 0; char *j_str = rkdb_select(table, "sVersion", "id=0", NULL, NULL); json_object *j_ret = json_tokener_parse(j_str); json_object *j_array = json_object_object_get(j_ret, "jData"); int num = json_object_array_length(j_array); if (num > 0) { json_object *j_obj = json_object_array_get_idx(j_array, 0); char *ver = (char *)json_object_get_string(json_object_object_get(j_obj, "sVersion")); if (g_str_equal(ver, version)) ret = 1; } json_object_put(j_ret); g_free(j_str); return ret; } const GDBusMethodTable methods[] = { { GDBUS_ASYNC_METHOD("Cmd", GDBUS_ARGS({ "json", "s" }), GDBUS_ARGS({ "json", "s" }), method_cmd) }, { GDBUS_ASYNC_METHOD("Sql", GDBUS_ARGS({ "json", "s" }), GDBUS_ARGS({ "json", "s" }), method_sql) }, { }, }; const GDBusSignalTable signals[] = { { GDBUS_SIGNAL("DataChanged", GDBUS_ARGS({ "json", "s" })) }, { }, };