[tracker] Error reporting for Turtle importer



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]