[couchdb-glib/wip/query-response] port dbwatch to the new api



commit e862f7d87d16c9f7e95bd555eb8c02ad63dd922d
Author: Krzysztof Klimonda <kklimonda syntaxhighlighted com>
Date:   Wed Jan 19 13:42:01 2011 +0100

    port dbwatch to the new api

 couchdb-glib/dbwatch.c |   90 ++++++++++++++++++++++++------------------------
 1 files changed, 45 insertions(+), 45 deletions(-)
---
diff --git a/couchdb-glib/dbwatch.c b/couchdb-glib/dbwatch.c
index df92e36..d76dbca 100644
--- a/couchdb-glib/dbwatch.c
+++ b/couchdb-glib/dbwatch.c
@@ -20,7 +20,6 @@
  */
 
 #include <libsoup/soup-method.h>
-#include "couchdb-document.h"
 #include "dbwatch.h"
 #include "utils.h"
 
@@ -28,28 +27,28 @@
 #define REMOTE_TIMEOUT_SECONDS 300
 
 static void
-process_change (DBWatch *watch, JsonNode *node)
+process_change (JsonArray * array, guint index_, gpointer user_data)
 {
-	JsonObject *this_change;
+	DBWatch *watch;
+	JsonObject *object, *document;
 	const gchar *id;
-	CouchdbDocument *document;
+
+	watch = (DBWatch *) user_data;
 	GError *error = NULL;
 
-	if (json_node_get_node_type (node) != JSON_NODE_OBJECT)
-		return;
+	object = json_array_get_object_element (array, index_);
 
-	this_change = json_node_get_object (node);
-	if (!json_object_has_member (this_change, "id"))
+	if (!json_object_has_member (object, "id"))
 		return;
 
-	id = json_object_get_string_member (this_change, "id");
+	id = json_object_get_string_member (object, "id");
 
 	/* We need to try retrieving the document, to check if it's removed or not */
-	document = couchdb_database_get_document (watch->database, id, &error);
+	document = couchdb_database_get_document (watch->database, id, NULL, &error);
 	if (document) {
 		const gchar *revision;
 
-		revision = couchdb_document_get_revision (document);
+		revision = json_object_get_string_member (document, "_id");
 		if (revision != NULL) {
 			if (revision[0] == '1')
 				g_signal_emit_by_name (watch->database, "document_created", document);
@@ -72,42 +71,43 @@ process_change (DBWatch *watch, JsonNode *node)
 static gboolean
 watch_timeout_cb (gpointer user_data)
 {
-	char *url;
-	JsonParser *parser;
-	GError *error = NULL;
-	DBWatch *watch = (DBWatch *) user_data;
-
-	url = g_strdup_printf ("%s/%s/_changes?since=%d",
-			       couchdb_session_get_uri (couchdb_database_get_session (watch->database)),
-			       couchdb_database_get_name (watch->database),
-			       watch->last_update_seq);
-	parser = json_parser_new ();
-	if (couchdb_session_send_message (couchdb_database_get_session (watch->database), SOUP_METHOD_GET, url, NULL, parser, &error)) {
-		JsonNode *root_node;
-
-		root_node = json_parser_get_root (parser);
-		if (json_node_get_node_type (root_node) == JSON_NODE_OBJECT) {
-			JsonObject *root_object;
-			JsonArray *results;
-
-			root_object = json_node_get_object (root_node);
-			results = json_object_get_array_member (root_object, "results");
-			if (results) {
-				GList *json_elements, *sl;
-
-				json_elements = json_array_get_elements (results);
-				for (sl = json_elements; sl != NULL; sl = sl->next)
-					process_change (watch, (JsonNode *) sl->data);
-			}
-
-			if (json_object_has_member (root_object, "last_seq"))
-				watch->last_update_seq = json_object_get_int_member (root_object, "last_seq");
-		}		
+	CouchdbQuery *query;
+	CouchdbResponse *response;
+	JsonObject *object;
+	JsonArray *results;
+	GError *error;
+	char *last_update_seq;
+	DBWatch *watch;
+
+	watch = (DBWatch *) user_data;
+
+	error = NULL;
+	last_update_seq = g_strdup_printf ("%d", watch->last_update_seq);
+	query = couchdb_query_new_for_path ("/_changes");
+	couchdb_query_set_option (query, "since", last_update_seq);
+	g_free (last_update_seq);
+
+	response = couchdb_database_execute_query (watch->database, query, &error);
+	if (!response) {
+		g_object_unref (query);
+		g_warning ("error: %s", error->message);
+		g_error_free (error);
+
+		return FALSE;
 	}
 
-	/* Free memory */
-	g_object_unref (G_OBJECT (parser));
-	g_free (url);
+	object = couchdb_response_get_json_object (response);
+	if (json_object_has_member (object, "last_seq")) {
+		watch->last_update_seq =
+			json_object_get_int_member (object, "last_seq");
+	}
+
+	results = json_object_get_array_member (object, "results");
+	json_array_foreach_element (results,
+				    (JsonArrayForeach) process_change, watch);
+
+	g_object_unref (response);
+	g_object_unref (query);
 
 	return TRUE;
 }



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]