[tracker/tracker-store-queue] Added Turtle parsing to the queue



commit 1661838624637ba2da6a56baf041390f537b62eb
Author: Philip Van Hoof <philip codeminded be>
Date:   Mon May 25 18:25:15 2009 +0200

    Added Turtle parsing to the queue
---
 src/tracker-store/tracker-removable-device.c |   43 +++-------
 src/tracker-store/tracker-resources.c        |   66 +++------------
 src/tracker-store/tracker-store.c            |  110 +++++++++++++++++++++++++-
 src/tracker-store/tracker-store.h            |    9 ++
 4 files changed, 143 insertions(+), 85 deletions(-)

diff --git a/src/tracker-store/tracker-removable-device.c b/src/tracker-store/tracker-removable-device.c
index 19c6736..d5f8014 100644
--- a/src/tracker-store/tracker-removable-device.c
+++ b/src/tracker-store/tracker-removable-device.c
@@ -269,32 +269,16 @@ consume_triple_storer (const gchar *subject,
 	}
 }
 
-static gboolean
-process_turtle_idle (gpointer user_data)
+static void
+process_turtle_statement (const gchar     *subject,
+                          const gchar     *predicate,
+                          const gchar     *object_,
+                          gpointer         user_data)
 {
-	guint i = 0;
-	gboolean cont = FALSE;
-
-	while (tracker_turtle_reader_next ()) {
-		const gchar *subject = tracker_turtle_reader_get_subject ();
-		const gchar *predicate = tracker_turtle_reader_get_predicate ();
-		const gchar *object_ = tracker_turtle_reader_get_object ();
-
-		if (subject && predicate && object_) {
-			consume_triple_storer (subject, predicate, object_, 
-			                       user_data);
-		}
-
-		cont = TRUE;
-
-		if (i > 100) {
-			break;
-		}
-
-		i++;
+	if (subject && predicate && object_) {
+		consume_triple_storer (subject, predicate, object_, 
+		                       user_data);
 	}
-
-	return cont;
 }
 
 static void
@@ -335,12 +319,11 @@ tracker_removable_device_load (const gchar    *mount_point)
 		tmp = g_file_get_uri (mountp_file);
 		base_uri = g_strconcat (tmp, "/", NULL);
 
-		tracker_turtle_reader_init (filename, base_uri);
-
-		g_idle_add_full (G_PRIORITY_DEFAULT,
-		                 process_turtle_idle,
-		                 info,
-		                 process_turtle_destroy);
+		tracker_store_queue_turtle_import (filename, 
+		                                   base_uri,
+		                                   process_turtle_statement,
+		                                   info,
+		                                   process_turtle_destroy);
 
 		g_free (base_uri);
 		g_free (tmp);
diff --git a/src/tracker-store/tracker-resources.c b/src/tracker-store/tracker-resources.c
index ac4b776..9776d12 100644
--- a/src/tracker-store/tracker-resources.c
+++ b/src/tracker-store/tracker-resources.c
@@ -35,7 +35,6 @@
 #include <libtracker-data/tracker-data-manager.h>
 #include <libtracker-data/tracker-data-query.h>
 #include <libtracker-data/tracker-data-update.h>
-#include <libtracker-data/tracker-turtle.h>
 
 #include "tracker-dbus.h"
 #include "tracker-marshal.h"
@@ -121,24 +120,6 @@ destroy_method_info (gpointer user_data)
 }
 
 
-static void
-update_callback (GError *error, gpointer user_data)
-{
-	TrackerDBusMethodInfo *info = user_data;
-
-	if (error) {
-		tracker_dbus_request_failed (info->request_id,
-					     &error,
-					     NULL);
-		dbus_g_method_return_error (info->context, error);
-		return;
-	}
-
-	dbus_g_method_return (info->context);
-
-	tracker_dbus_request_success (info->request_id);
-}
-
 void
 tracker_resources_insert (TrackerResources	     *self,
 			  const gchar                *subject,
@@ -202,38 +183,22 @@ tracker_resources_delete (TrackerResources	     *self,
 }
 
 
-static gboolean
-process_turtle_idle (gpointer user_data)
+static void
+on_turtle_process_statement (const gchar     *subject,
+                             const gchar     *predicate,
+                             const gchar     *object_,
+                             gpointer         user_data)
 {
-	guint i = 0;
-	gboolean cont = FALSE;
-
-	while (tracker_turtle_reader_next ()) {
-		const gchar *subject = tracker_turtle_reader_get_subject ();
-		const gchar *predicate = tracker_turtle_reader_get_predicate ();
-		const gchar *object_ = tracker_turtle_reader_get_object ();
-
-		if (subject && predicate && object_) {
-			tracker_store_queue_insert_statement (subject,
-			                                      predicate,
-			                                      object_,
-			                                      NULL, NULL, NULL);
-		}
-
-		cont = TRUE;
-
-		if (i > 100) {
-			break;
-		}
-
-		i++;
+	if (subject && predicate && object_) {
+		tracker_store_queue_insert_statement (subject,
+		                                      predicate,
+		                                      object_,
+		                                      NULL, NULL, NULL);
 	}
-
-	return cont;
 }
 
 static void
-process_turtle_destroy (gpointer user_data)
+on_turtle_destroy (gpointer user_data)
 {
 	tracker_store_queue_commit (NULL, NULL, NULL);
 }
@@ -261,12 +226,9 @@ tracker_resources_load (TrackerResources	 *object,
 	file = g_file_new_for_uri (uri);
 	path = g_file_get_path (file);
 
-	tracker_turtle_reader_init (path, NULL);
-
-	g_idle_add_full (G_PRIORITY_DEFAULT,
-	                 process_turtle_idle,
-	                 NULL,
-	                 process_turtle_destroy);
+	tracker_store_queue_turtle_import (path, NULL, 
+	                                   on_turtle_process_statement, 
+	                                   NULL, on_turtle_destroy);
 
 	g_free (path);
 	g_object_unref (file);
diff --git a/src/tracker-store/tracker-store.c b/src/tracker-store/tracker-store.c
index a2d1ca6..c11f51c 100644
--- a/src/tracker-store/tracker-store.c
+++ b/src/tracker-store/tracker-store.c
@@ -27,6 +27,7 @@
 
 #include <libtracker-data/tracker-data-update.h>
 #include <libtracker-data/tracker-data-query.h>
+#include <libtracker-data/tracker-turtle.h>
 
 #include "tracker-store.h"
 
@@ -43,7 +44,8 @@ typedef struct {
 typedef enum {
 	TRACKER_STORE_TASK_TYPE_UPDATE = 0,
 	TRACKER_STORE_TASK_TYPE_COMMIT = 1,
-	TRACKER_STORE_TASK_TYPE_INSERT_STATEMENT = 2
+	TRACKER_STORE_TASK_TYPE_TURTLE = 2,
+	TRACKER_STORE_TASK_TYPE_INSERT_STATEMENT = 3
 } TrackerStoreTaskType;
 
 typedef struct {
@@ -55,15 +57,26 @@ typedef struct {
 		gchar             *predicate;
 		gchar             *object;
 	  } statement;
+	  struct {
+		gchar             *file;
+		gchar             *base;
+	  } turtle;
 	} data;
 	gpointer                   user_data;
 	GDestroyNotify             destroy;
 	union {
 		TrackerStoreSparqlUpdateCallback update_callback;
 		TrackerStoreCommitCallback       commit_callback;
+		TrackerStoreTurtleCallback       turtle_callback;
 	} callback;
 } TrackerStoreTask;
 
+typedef struct {
+	gpointer                   user_data;
+	GDestroyNotify             destroy;
+	TrackerStoreTurtleCallback callback;
+} TtlImportInfo;
+
 static GStaticPrivate private_key = G_STATIC_PRIVATE_INIT;
 static gboolean im_done = TRUE;
 
@@ -79,10 +92,13 @@ private_free (gpointer data)
 static void
 tracker_store_task_free (TrackerStoreTask *task)
 {
-	if (task->type >= TRACKER_STORE_TASK_TYPE_INSERT_STATEMENT) {
+	if (task->type == TRACKER_STORE_TASK_TYPE_INSERT_STATEMENT) {
 		g_free (task->data.statement.subject);
 		g_free (task->data.statement.predicate);
 		g_free (task->data.statement.object);
+	} else if (task->type == TRACKER_STORE_TASK_TYPE_TURTLE) {
+		g_free (task->data.turtle.file);
+		g_free (task->data.turtle.base);
 	} else {
 		g_free (task->data.query);
 	}
@@ -90,11 +106,55 @@ tracker_store_task_free (TrackerStoreTask *task)
 }
 
 static gboolean
+process_turtle_idle (gpointer user_data)
+{
+	TtlImportInfo *info = user_data;
+	guint i = 0;
+	gboolean cont = FALSE;
+
+	while (tracker_turtle_reader_next ()) {
+		const gchar *subject = tracker_turtle_reader_get_subject ();
+		const gchar *predicate = tracker_turtle_reader_get_predicate ();
+		const gchar *object_ = tracker_turtle_reader_get_object ();
+		
+		if (info->callback) {
+			info->callback (subject, predicate, object_, 
+			                info->user_data);
+		}
+
+		cont = TRUE;
+
+		if (i > 100) {
+			break;
+		}
+
+		i++;
+	}
+
+	return cont;
+}
+
+
+static void
+process_turtle_destroy (gpointer user_data)
+{
+	TtlImportInfo *info = user_data;
+
+	if (info->destroy) {
+		info->destroy (info->user_data);
+	}
+
+	g_free (info);
+}
+
+
+static gboolean
 queue_idle_handler (gpointer user_data)
 {
 	TrackerStorePrivate *private = user_data;
 	TrackerStoreTask    *task;
-	GError                   *error = NULL;
+	GError              *error = NULL;
+	TtlImportInfo       *info;
 
 	task = g_queue_pop_head (private->queue);
 
@@ -140,6 +200,23 @@ queue_idle_handler (gpointer user_data)
 			private->batch_count++;
 		break;
 
+		case TRACKER_STORE_TASK_TYPE_TURTLE:
+
+			info = g_new (TtlImportInfo, 1);
+			info->user_data = task->user_data;
+			info->destroy = task->destroy;
+			info->callback = task->callback.turtle_callback;
+
+			tracker_turtle_reader_init (task->data.turtle.file, 
+			                            task->data.turtle.base);
+
+			g_idle_add_full (G_PRIORITY_DEFAULT,
+			                 process_turtle_idle,
+			                 info,
+			                 process_turtle_destroy);
+
+		break;
+
 		case TRACKER_STORE_TASK_TYPE_UPDATE:
 			tracker_data_update_sparql (task->data.query, &error);
 			if (task->callback.update_callback) {
@@ -325,6 +402,33 @@ tracker_store_queue_insert_statement (const gchar   *subject,
 	}
 }
 
+void
+tracker_store_queue_turtle_import (const gchar   *filename, 
+                                   const gchar   *base,
+                                   TrackerStoreTurtleCallback callback,
+                                   gpointer       user_data,
+                                   GDestroyNotify destroy)
+{
+	TrackerStorePrivate *private;
+	TrackerStoreTask    *task;
+
+	private = g_static_private_get (&private_key);
+	g_return_if_fail (private != NULL);
+
+	task = g_slice_new0 (TrackerStoreTask);
+	task->type = TRACKER_STORE_TASK_TYPE_TURTLE;
+	task->data.turtle.file = g_strdup (filename);
+	task->data.turtle.base = g_strdup (base);
+	task->user_data = user_data;
+	task->callback.turtle_callback = callback;
+	task->destroy = destroy;
+
+	g_queue_push_tail (private->queue, task);
+
+	if (!private->have_handler) {
+		start_handler (private);
+	}
+}
 
 void
 tracker_store_insert_statement (const gchar   *subject, 
diff --git a/src/tracker-store/tracker-store.h b/src/tracker-store/tracker-store.h
index deb4976..23f004a 100644
--- a/src/tracker-store/tracker-store.h
+++ b/src/tracker-store/tracker-store.h
@@ -33,6 +33,10 @@ G_BEGIN_DECLS
 typedef void (* TrackerStoreSparqlUpdateCallback)  (GError          *error,
                                                     gpointer         user_data);
 typedef void (* TrackerStoreCommitCallback)        (gpointer         user_data);
+typedef void (* TrackerStoreTurtleCallback)        (const gchar     *subject,
+                                                    const gchar     *predicate,
+                                                    const gchar     *object,
+                                                    gpointer         user_data);
 
 void         tracker_store_init                   (void);
 void         tracker_store_shutdown               (void);
@@ -60,6 +64,11 @@ void         tracker_store_delete_statement       (const gchar   *subject,
 TrackerDBResultSet* 
              tracker_store_sparql_query           (const gchar   *sparql,
                                                    GError       **error);
+void         tracker_store_queue_turtle_import    (const gchar   *filename, 
+                                                   const gchar   *base,
+                                                   TrackerStoreTurtleCallback callback,
+                                                   gpointer       user_data,
+                                                   GDestroyNotify destroy);
 
 G_END_DECLS
 



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