summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCharlie Brej <cbrej@cs.man.ac.uk>2010-08-05 20:38:15 +0100
committerCharlie Brej <cbrej@cs.man.ac.uk>2010-08-05 20:38:15 +0100
commit7d2531cbb597871d9abc4578fcf1dfaa468e06f7 (patch)
tree4b753c31461b59a5816e85528a60a3062de24dd7
parentc8b9a900476c8d206346f51a43f0cae9d02a809b (diff)
Implement http fontend query response
-rw-r--r--src/main.c6
-rw-r--r--src/tidbit-http.c55
2 files changed, 52 insertions, 9 deletions
diff --git a/src/main.c b/src/main.c
index 8c2fa78..cd46d6f 100644
--- a/src/main.c
+++ b/src/main.c
@@ -71,9 +71,9 @@ int main(int argc, char* argv[])
PtrTidbitDatabase database;
if (enable_http || enable_dbus)
- database = tidbit_database_fork_new(tidbit_database_mem_new (), tidbit_database_mem_new ());
+ database = tidbit_database_mem_new ();
else
- database = tidbit_database_dbus_new ();
+ database = tidbit_database_http_new ();
if (enable_http)
tidbit_http_setup (database);
@@ -105,7 +105,7 @@ int main(int argc, char* argv[])
tidbit_record_unref (record);
PtrTidbitQuery query = tidbit_query_new ("test/tablename");
- tidbit_query_add_exp (query, "key", "value", TIDBIT_QUERY_EXP_TyPE_EQ);
+ tidbit_query_add_exp (query, "key", "value", TIDBIT_QUERY_EXP_TYPE_EQ);
PtrTidbitGuidSet guid_set = tidbit_database_query (database, query);
tidbit_guid_set_foreach (guid_set, print_guid, database);
diff --git a/src/tidbit-http.c b/src/tidbit-http.c
index 3294cda..6582cca 100644
--- a/src/tidbit-http.c
+++ b/src/tidbit-http.c
@@ -31,25 +31,67 @@
static void tidbit_http_callback_insert (SoupServer *server, SoupMessage *msg, const char *path,
- GHashTable *query, SoupClientContext *context, gpointer user_data)
+ GHashTable *http_query, SoupClientContext *context, gpointer user_data)
{
PtrTidbitDatabase database = (PtrTidbitDatabase) user_data;
PtrTidbitRecord record = tidbit_record_from_raw ((char *) msg->request_body->data); //FIXME check record is ok
+ g_assert(record);
+ g_assert(record->status == TIDBIT_RECORD_STATUS_SIGNED);
+
+// g_print("inserted %s\n", record->guid->string);
tidbit_database_insert_record (database, record);
soup_message_set_status (msg, SOUP_STATUS_OK);
soup_message_set_response (msg, "text/plain", SOUP_MEMORY_STATIC, "KTHXBAI", strlen("KTHXBAI"));
}
static void tidbit_http_callback_fetch (SoupServer *server, SoupMessage *msg, const char *path,
- GHashTable *query, SoupClientContext *context, gpointer user_data)
+ GHashTable *http_query, SoupClientContext *context, gpointer user_data)
{
PtrTidbitDatabase database = (PtrTidbitDatabase) user_data;
- char* signature = g_hash_table_lookup(query, "signature");
- PtrTidbitGuid guid = tidbit_guid_new (signature);
+ char* guid_str = g_hash_table_lookup(http_query, "guid");
+// g_print("fetch: %s\n", guid_str);
+ g_assert(guid_str);
+ PtrTidbitGuid guid = tidbit_guid_new (guid_str);
PtrTidbitRecord record = tidbit_database_fetch_record (database, guid);
- tidbit_guid_unref (guid);
+ g_assert(record);
+ soup_message_set_status (msg, SOUP_STATUS_OK);
+ soup_message_set_response (msg, "text/plain", SOUP_MEMORY_COPY, record->raw, strlen(record->raw));
+}
+
+static void guid_set_to_string_gstring_func (PtrTidbitGuid guid, gpointer user_data)
+{
+ GString* string = (GString*) user_data;
+ g_string_append (string, tidbit_guid_get_string (guid));
+ g_string_append_c (string, '\n');
+}
+
+static void tidbit_http_callback_query (SoupServer *server, SoupMessage *msg, const char *path,
+ GHashTable *http_query, SoupClientContext *context, gpointer user_data)
+{
+ PtrTidbitDatabase database = (PtrTidbitDatabase) user_data;
+ GList* keys = g_hash_table_get_keys(http_query);
+
+ char* table_name = g_hash_table_lookup(http_query, "tidbit_table");
+ PtrTidbitQuery query = tidbit_query_new (table_name);
+
+ for (GList* keys_itter = keys; keys_itter; keys_itter = g_list_next(keys_itter)){
+ char* key = keys_itter->data;
+ if (strcmp(key, "tidbit_table")){
+ tidbit_query_add_exp (query, key, g_hash_table_lookup(http_query, key), TIDBIT_QUERY_EXP_TYPE_EQ);
+ }
+ }
+ g_list_free(keys);
+
+ PtrTidbitGuidSet guid_set = tidbit_database_query (database, query);
+
+ GString* reply_str = g_string_sized_new (tidbit_guid_set_get_count (guid_set) * 174);
+ tidbit_guid_set_foreach (guid_set, guid_set_to_string_gstring_func, reply_str);
+
+ tidbit_guid_set_unref(guid_set);
+
soup_message_set_status (msg, SOUP_STATUS_OK);
- soup_message_set_response (msg, "text/plain", SOUP_MEMORY_STATIC, record->raw, strlen(record->raw));
+ soup_message_set_response (msg, "text/plain", SOUP_MEMORY_COPY, reply_str->str, reply_str->len);
+ g_string_free (reply_str, TRUE);
}
@@ -59,6 +101,7 @@ void tidbit_http_setup (PtrTidbitDatabase database)
soup_server_run_async (server);
soup_server_add_handler (server, "/insert", tidbit_http_callback_insert, database, NULL);
soup_server_add_handler (server, "/fetch", tidbit_http_callback_fetch, database, NULL);
+ soup_server_add_handler (server, "/query", tidbit_http_callback_query, database, NULL);