[tracker] Error reporting for Turtle importer
- From: Philip Van Hoof <pvanhoof src gnome org>
- To: svn-commits-list gnome org
- Subject: [tracker] Error reporting for Turtle importer
- Date: Wed, 15 Jul 2009 16:19:19 +0000 (UTC)
commit f7fef8323cc3bf3a8de54ecfd0ab4b34020a4499
Author: Philip Van Hoof <philip codeminded be>
Date: Wed Jul 15 18:19:00 2009 +0200
Error reporting for Turtle importer
src/libtracker-data/tracker-turtle.c | 32 +++++++++++++++++++++++++-------
src/libtracker-data/tracker-turtle.h | 1 +
src/tracker-store/tracker-store.c | 29 +++++++++++++++++++++--------
3 files changed, 47 insertions(+), 15 deletions(-)
---
diff --git a/src/libtracker-data/tracker-turtle.c b/src/libtracker-data/tracker-turtle.c
index d72c5f9..d454ef3 100644
--- a/src/libtracker-data/tracker-turtle.c
+++ b/src/libtracker-data/tracker-turtle.c
@@ -44,6 +44,7 @@ static char * volatile turtle_object;
static raptor_identifier_type volatile turtle_object_type;
static volatile gboolean turtle_eof;
+static volatile gboolean turtle_cancel;
typedef struct {
gchar *about_uri;
@@ -319,6 +320,8 @@ static void
turtle_statement_handler (void *user_data,
const raptor_statement *triple)
{
+ raptor_parser *parser = user_data;
+
g_mutex_lock (turtle_mutex);
/* wait until last statement has been released */
@@ -326,11 +329,15 @@ turtle_statement_handler (void *user_data,
g_cond_wait (turtle_cond, turtle_mutex);
}
- /* set new statement */
- turtle_subject = g_strdup ((const gchar *) raptor_uri_as_string ((raptor_uri *) triple->subject));
- turtle_predicate = g_strdup ((const gchar *) raptor_uri_as_string ((raptor_uri *) triple->predicate));
- turtle_object = g_strdup ((const gchar *) triple->object);
- turtle_object_type = triple->object_type;
+ if (turtle_cancel) {
+ raptor_parse_abort (parser);
+ } else {
+ /* set new statement */
+ turtle_subject = g_strdup ((const gchar *) raptor_uri_as_string ((raptor_uri *) triple->subject));
+ turtle_predicate = g_strdup ((const gchar *) raptor_uri_as_string ((raptor_uri *) triple->predicate));
+ turtle_object = g_strdup ((const gchar *) triple->object);
+ turtle_object_type = triple->object_type;
+ }
/* signal main thread to pull statement */
g_cond_signal (turtle_cond);
@@ -376,8 +383,8 @@ turtle_thread_func (gpointer data)
TurtleThreadData *thread_data;
unsigned char *uri_string;
raptor_uri *uri, *buri;
- raptor_parser *parser;
uuid_t base_uuid;
+ raptor_parser *parser;
thread_data = (TurtleThreadData *) data;
@@ -386,7 +393,7 @@ turtle_thread_func (gpointer data)
/* generate UUID as base for blank nodes */
uuid_generate (base_uuid);
- raptor_set_statement_handler (parser, NULL, (raptor_statement_handler) turtle_statement_handler);
+ raptor_set_statement_handler (parser, parser, (raptor_statement_handler) turtle_statement_handler);
raptor_set_generate_id_handler (parser, base_uuid, turtle_generate_id);
raptor_set_fatal_error_handler (parser, (void *)thread_data->file, raptor_error);
raptor_set_error_handler (parser, (void *)thread_data->file, raptor_error);
@@ -552,6 +559,7 @@ tracker_turtle_reader_init (const gchar *turtle_file,
thread_data->base_uri = g_strdup (base_uri);
turtle_first = TRUE;
+ turtle_cancel = FALSE;
parser_thread = g_thread_create (turtle_thread_func, thread_data, FALSE, NULL);
}
@@ -575,6 +583,16 @@ tracker_turtle_reader_next (void)
}
}
+
+void
+tracker_turtle_reader_cancel (void)
+{
+ if (!turtle_eof) {
+ turtle_cancel = TRUE;
+ while (tracker_turtle_reader_next ());
+ }
+}
+
const gchar *
tracker_turtle_reader_get_subject (void)
{
diff --git a/src/libtracker-data/tracker-turtle.h b/src/libtracker-data/tracker-turtle.h
index d7ced93..0f736f8 100644
--- a/src/libtracker-data/tracker-turtle.h
+++ b/src/libtracker-data/tracker-turtle.h
@@ -60,6 +60,7 @@ const gchar *tracker_turtle_reader_get_subject (void);
const gchar *tracker_turtle_reader_get_predicate (void);
const gchar *tracker_turtle_reader_get_object (void);
gboolean tracker_turtle_reader_object_is_uri (void);
+void tracker_turtle_reader_cancel (void);
/* Optimizer, reparser */
void tracker_turtle_optimize (const gchar *turtle_file);
diff --git a/src/tracker-store/tracker-store.c b/src/tracker-store/tracker-store.c
index 2693aff..6e66cee 100644
--- a/src/tracker-store/tracker-store.c
+++ b/src/tracker-store/tracker-store.c
@@ -87,37 +87,42 @@ store_task_free (TrackerStoreTask *task)
}
static gboolean
-process_turtle_file_part (void)
+process_turtle_file_part (GError **error)
{
int i;
+ GError *new_error = NULL;
/* process 10 statements at once before returning to main loop */
i = 0;
- while (tracker_turtle_reader_next ()) {
+ while (!new_error && tracker_turtle_reader_next ()) {
/* insert statement */
if (tracker_turtle_reader_object_is_uri ()) {
tracker_data_insert_statement_with_uri (
tracker_turtle_reader_get_subject (),
tracker_turtle_reader_get_predicate (),
tracker_turtle_reader_get_object (),
- NULL);
+ &new_error);
} else {
tracker_data_insert_statement_with_string (
tracker_turtle_reader_get_subject (),
tracker_turtle_reader_get_predicate (),
tracker_turtle_reader_get_object (),
- NULL);
+ &new_error);
}
i++;
- if (i >= 10) {
+ if (!new_error && i >= 10) {
/* return to main loop */
return TRUE;
}
}
+ if (new_error) {
+ g_propagate_error (error, new_error);
+ }
+
return FALSE;
}
@@ -180,6 +185,8 @@ queue_idle_handler (gpointer user_data)
task->callback.commit_callback (task->user_data);
}
} else if (task->type == TRACKER_STORE_TASK_TYPE_TURTLE) {
+ GError *error = NULL;
+
begin_batch (private);
if (!task->data.turtle.in_progress) {
@@ -187,13 +194,15 @@ queue_idle_handler (gpointer user_data)
task->data.turtle.in_progress = TRUE;
}
- if (process_turtle_file_part ()) {
+ if (process_turtle_file_part (&error)) {
/* import still in progress */
private->batch_count++;
if (private->batch_count >= TRACKER_STORE_TRANSACTION_MAX) {
end_batch (private);
}
+ /* Process function wont return true in case of error */
+
return TRUE;
} else {
/* import finished */
@@ -202,10 +211,14 @@ queue_idle_handler (gpointer user_data)
end_batch (private);
if (task->callback.turtle_callback) {
- task->callback.turtle_callback (NULL, task->user_data);
+ task->callback.turtle_callback (error, task->user_data);
}
- }
+ if (error) {
+ tracker_turtle_reader_cancel ();
+ g_clear_error (&error);
+ }
+ }
}
g_queue_pop_head (private->queue);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]