[tracker/tracker-store-queue] Added Turtle parsing to the queue
- From: Philip Van Hoof <pvanhoof src gnome org>
- To: svn-commits-list gnome org
- Subject: [tracker/tracker-store-queue] Added Turtle parsing to the queue
- Date: Mon, 25 May 2009 12:26:30 -0400 (EDT)
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]