diff options
author | Charlie Brej <cbrej@cs.man.ac.uk> | 2010-08-05 20:38:15 +0100 |
---|---|---|
committer | Charlie Brej <cbrej@cs.man.ac.uk> | 2010-08-05 20:38:15 +0100 |
commit | 7d2531cbb597871d9abc4578fcf1dfaa468e06f7 (patch) | |
tree | 4b753c31461b59a5816e85528a60a3062de24dd7 | |
parent | c8b9a900476c8d206346f51a43f0cae9d02a809b (diff) |
Implement http fontend query response
-rw-r--r-- | src/main.c | 6 | ||||
-rw-r--r-- | src/tidbit-http.c | 55 |
2 files changed, 52 insertions, 9 deletions
@@ -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); |