[tracker/blank-node-fix] Split of the function insert_statement



commit f7645bb59a9082912bc815704413016d97f54275
Author: Philip Van Hoof <philip codeminded be>
Date:   Tue Jun 30 15:02:27 2009 +0200

    Split of the function insert_statement
    
    Splits tracker_data_insert_statement into insert_statement_with_uri
    and insert_statement_with_string. This fixes string objects that have
    a ':' character upfront (for example strings that start with a smiley)

 src/libtracker-data/libtracker-data.vapi      |    3 +-
 src/libtracker-data/tracker-data-manager.c    |   15 +++-
 src/libtracker-data/tracker-data-update.c     |   99 +++++++++++++++++++++++--
 src/libtracker-data/tracker-data-update.h     |    6 +-
 src/libtracker-data/tracker-sparql-query.vala |   12 +++-
 src/libtracker-data/tracker-turtle.c          |    9 ++-
 src/libtracker-data/tracker-turtle.h          |    1 +
 src/tracker-store/tracker-backup.c            |    8 ++-
 src/tracker-store/tracker-resources.c         |    6 +-
 src/tracker-store/tracker-store.c             |   24 ++++--
 src/tracker-store/tracker-store.h             |    2 +-
 tests/libtracker-data/tracker-ontology-test.c |    6 +-
 tests/libtracker-data/tracker-sparql-test.c   |    6 +-
 13 files changed, 167 insertions(+), 30 deletions(-)
---
diff --git a/src/libtracker-data/libtracker-data.vapi b/src/libtracker-data/libtracker-data.vapi
index 5833400..bc4ce37 100644
--- a/src/libtracker-data/libtracker-data.vapi
+++ b/src/libtracker-data/libtracker-data.vapi
@@ -24,7 +24,8 @@ namespace Tracker {
 		public void begin_transaction ();
 		public void commit_transaction ();
 		public void delete_statement (string subject, string predicate, string object);
-		public void insert_statement (string subject, string predicate, string object);
+		public void insert_statement_with_uri (string subject, string predicate, string object);
+		public void insert_statement_with_string (string subject, string predicate, string object);
 		public void delete_resource_description (string uri);
 	}
 }
diff --git a/src/libtracker-data/tracker-data-manager.c b/src/libtracker-data/tracker-data-manager.c
index d05ba2d..fa10c29 100644
--- a/src/libtracker-data/tracker-data-manager.c
+++ b/src/libtracker-data/tracker-data-manager.c
@@ -283,10 +283,17 @@ import_ontology_file_from_path (const gchar	 *ontology_file)
 {
 	tracker_turtle_reader_init (ontology_file, NULL);
 	while (tracker_turtle_reader_next ()) {
-		tracker_data_insert_statement (
-			tracker_turtle_reader_get_subject (),
-			tracker_turtle_reader_get_predicate (),
-			tracker_turtle_reader_get_object ());
+		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 ());
+		} else {
+			tracker_data_insert_statement_with_string (
+				tracker_turtle_reader_get_subject (),
+				tracker_turtle_reader_get_predicate (),
+				tracker_turtle_reader_get_object ());
+		}
 	}
 }
 
diff --git a/src/libtracker-data/tracker-data-update.c b/src/libtracker-data/tracker-data-update.c
index e005a36..cee4863 100644
--- a/src/libtracker-data/tracker-data-update.c
+++ b/src/libtracker-data/tracker-data-update.c
@@ -75,6 +75,7 @@ struct _TrackerDataBlankBuffer {
 	gchar *subject;
 	GArray *predicates;
 	GArray *objects;
+	GArray *is_uris;
 };
 
 
@@ -461,9 +462,15 @@ tracker_data_blank_buffer_flush (void)
 		/* uri not found
 		   replay piled up statements to create resource */
 		for (i = 0; i < blank_buffer.predicates->len; i++) {
-			tracker_data_insert_statement (blank_uri,
-				g_array_index (blank_buffer.predicates, gchar *, i),
-				g_array_index (blank_buffer.objects, gchar *, i));
+			if (g_array_index (blank_buffer.is_uris, gboolean, i)) {
+				tracker_data_insert_statement_with_uri (blank_uri,
+					g_array_index (blank_buffer.predicates, gchar *, i),
+					g_array_index (blank_buffer.objects, gchar *, i));
+			} else {
+				tracker_data_insert_statement_with_string (blank_uri,
+					g_array_index (blank_buffer.predicates, gchar *, i),
+					g_array_index (blank_buffer.objects, gchar *, i));
+			}
 		}
 		tracker_data_update_buffer_flush ();
 	}
@@ -475,6 +482,7 @@ tracker_data_blank_buffer_flush (void)
 	}
 	g_array_free (blank_buffer.predicates, TRUE);
 	g_array_free (blank_buffer.objects, TRUE);
+	g_array_free (blank_buffer.is_uris, TRUE);
 
 	g_hash_table_insert (blank_buffer.table, subject, blank_uri);
 	g_checksum_free (checksum);
@@ -843,12 +851,84 @@ tracker_data_delete_statement (const gchar            *subject,
 }
 
 void
-tracker_data_insert_statement (const gchar            *subject,
-			       const gchar            *predicate,
-			       const gchar            *object)
+tracker_data_insert_statement_with_string (const gchar            *subject,
+					   const gchar            *predicate,
+					   const gchar            *object)
+{
+	g_return_if_fail (subject != NULL);
+	g_return_if_fail (predicate != NULL);
+	g_return_if_fail (object != NULL);
+
+	tracker_data_begin_transaction ();
+
+	if (g_str_has_prefix (subject, ":")) {
+		/* blank node definition
+		   pile up statements until the end of the blank node */
+		gchar *value;
+		gboolean false_value = FALSE;
+
+		if (blank_buffer.subject != NULL) {
+			/* active subject in buffer */
+			if (strcmp (blank_buffer.subject, subject) != 0) {
+				/* subject changed, need to flush buffer */
+				tracker_data_blank_buffer_flush ();
+			}
+		}
+
+		if (blank_buffer.subject == NULL) {
+			blank_buffer.subject = g_strdup (subject);
+			blank_buffer.predicates = g_array_sized_new (FALSE, FALSE, sizeof (char*), 4);
+			blank_buffer.objects = g_array_sized_new (FALSE, FALSE, sizeof (char*), 4);
+			blank_buffer.is_uris = g_array_sized_new (FALSE, FALSE, sizeof (gboolean), 4);
+		}
+
+		value = g_strdup (predicate);
+		g_array_append_val (blank_buffer.predicates, value);
+		value = g_strdup (object);
+		g_array_append_val (blank_buffer.objects, value);
+		g_array_append_val (blank_buffer.is_uris, false_value);
+
+		tracker_data_commit_transaction ();
+
+		return;
+	}
+
+	if (update_buffer.subject != NULL) {
+		/* active subject in cache */
+		if (strcmp (update_buffer.subject, subject) != 0) {
+			/* subject changed, need to flush cache */
+			tracker_data_update_buffer_flush ();
+		}
+	}
+
+	if (update_buffer.subject == NULL) {
+		GValue gvalue = { 0 };
+
+		g_value_init (&gvalue, G_TYPE_INT64);
+
+		/* subject not yet in cache, retrieve or create ID */
+		update_buffer.subject = g_strdup (subject);
+		update_buffer.id = ensure_resource_id (update_buffer.subject);
+		update_buffer.types = tracker_data_query_rdf_type (update_buffer.id);
+
+		g_value_set_int64 (&gvalue, (gint64) time (NULL));
+		cache_insert_value ("rdfs:Resource", "tracker:modified", &gvalue, FALSE, FALSE);
+	}
+
+	if (insert_callback) {
+		insert_callback (subject, predicate, object, update_buffer.types, insert_data);
+	}
+
+	tracker_data_commit_transaction ();
+}
+
+void
+tracker_data_insert_statement_with_uri (const gchar            *subject,
+					const gchar            *predicate,
+					const gchar            *object)
 {
 	TrackerClass       *service;
-	TrackerProperty       *field;
+	TrackerProperty    *field;
 
 	g_return_if_fail (subject != NULL);
 	g_return_if_fail (predicate != NULL);
@@ -872,7 +952,7 @@ tracker_data_insert_statement (const gchar            *subject,
 
 		if (blank_uri != NULL) {
 			/* now insert statement referring to blank node */
-			tracker_data_insert_statement (subject, predicate, blank_uri);
+			tracker_data_insert_statement_with_uri (subject, predicate, blank_uri);
 
 			g_hash_table_remove (blank_buffer.table, object);
 
@@ -891,6 +971,7 @@ tracker_data_insert_statement (const gchar            *subject,
 		/* blank node definition
 		   pile up statements until the end of the blank node */
 		gchar *value;
+		gboolean true_value = TRUE;
 
 		if (blank_buffer.subject != NULL) {
 			/* active subject in buffer */
@@ -904,12 +985,14 @@ tracker_data_insert_statement (const gchar            *subject,
 			blank_buffer.subject = g_strdup (subject);
 			blank_buffer.predicates = g_array_sized_new (FALSE, FALSE, sizeof (char*), 4);
 			blank_buffer.objects = g_array_sized_new (FALSE, FALSE, sizeof (char*), 4);
+			blank_buffer.is_uris = g_array_sized_new (FALSE, FALSE, sizeof (gboolean), 4);
 		}
 
 		value = g_strdup (predicate);
 		g_array_append_val (blank_buffer.predicates, value);
 		value = g_strdup (object);
 		g_array_append_val (blank_buffer.objects, value);
+		g_array_append_val (blank_buffer.is_uris, true_value);
 
 		tracker_data_commit_transaction ();
 
diff --git a/src/libtracker-data/tracker-data-update.h b/src/libtracker-data/tracker-data-update.h
index 1c32acc..622c1c8 100644
--- a/src/libtracker-data/tracker-data-update.h
+++ b/src/libtracker-data/tracker-data-update.h
@@ -41,9 +41,13 @@ void     tracker_data_delete_statement			(const gchar	     *subject,
 							 const gchar         *predicate,
 							 const gchar         *object);
 
-void     tracker_data_insert_statement			(const gchar	     *subject,
+void     tracker_data_insert_statement_with_uri		(const gchar	     *subject,
 							 const gchar         *predicate,
 							 const gchar         *object);
+void     tracker_data_insert_statement_with_string	(const gchar         *subject,
+							 const gchar         *predicate,
+							 const gchar         *object);
+
 void     tracker_data_begin_transaction			(void);
 void     tracker_data_commit_transaction		(void);
 
diff --git a/src/libtracker-data/tracker-sparql-query.vala b/src/libtracker-data/tracker-sparql-query.vala
index d29e1f9..7822152 100644
--- a/src/libtracker-data/tracker-sparql-query.vala
+++ b/src/libtracker-data/tracker-sparql-query.vala
@@ -611,7 +611,17 @@ public class Tracker.SparqlQuery : Object {
 						Data.delete_statement (subject, predicate, object);
 					} else {
 						// insert triple into database
-						Data.insert_statement (subject, predicate, object);
+						if (triple.object.type == Rasqal.Literal.Type.URI   || 
+						    triple.object.type == Rasqal.Literal.Type.BLANK ||
+						    triple.object.type == Rasqal.Literal.Type.VARIABLE) {
+							// TODO:
+							// According to Jürg is the VARIABLE case an uncertainty,
+							// I opted for with_uri for that case for now ...
+							Data.insert_statement_with_uri (subject, predicate, object);
+						
+						} else {
+							Data.insert_statement_with_string (subject, predicate, object);
+						}
 					}
 				}
 			} while (result_set.iter_next ());
diff --git a/src/libtracker-data/tracker-turtle.c b/src/libtracker-data/tracker-turtle.c
index e14b3d1..06b43be 100644
--- a/src/libtracker-data/tracker-turtle.c
+++ b/src/libtracker-data/tracker-turtle.c
@@ -41,6 +41,8 @@ static gboolean turtle_first;
 static gchar * volatile turtle_subject;
 static gchar * volatile turtle_predicate;
 static char * volatile turtle_object;
+static raptor_identifier_type volatile turtle_object_type;
+
 static volatile gboolean     turtle_eof;
 
 typedef struct {
@@ -328,7 +330,7 @@ turtle_statement_handler (void                   *user_data,
 	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);
 
@@ -590,3 +592,8 @@ tracker_turtle_reader_get_object (void)
 	return turtle_object;
 }
 
+gboolean 
+tracker_turtle_reader_object_is_uri (void)
+{
+	return (turtle_object_type == RAPTOR_IDENTIFIER_TYPE_RESOURCE);
+}
diff --git a/src/libtracker-data/tracker-turtle.h b/src/libtracker-data/tracker-turtle.h
index 1675f3e..d7ced93 100644
--- a/src/libtracker-data/tracker-turtle.h
+++ b/src/libtracker-data/tracker-turtle.h
@@ -59,6 +59,7 @@ gboolean     tracker_turtle_reader_next          (void);
 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);
 
 /* Optimizer, reparser */
 void        tracker_turtle_optimize      (const gchar          *turtle_file);
diff --git a/src/tracker-store/tracker-backup.c b/src/tracker-store/tracker-backup.c
index 852f2aa..f281107 100644
--- a/src/tracker-store/tracker-backup.c
+++ b/src/tracker-store/tracker-backup.c
@@ -93,7 +93,13 @@ restore_backup_cb (const gchar *subject,
 		   const gchar *object,
 		   gpointer     user_data)
 {
-	tracker_data_insert_statement (subject, predicate, object);
+	/* TODO: backup/restore is not ported to 0.7 yet, when porting you 
+	 * might have to replace this with either insert_statement_with_string
+	 * or this insert_statement_with_uri (reason why this one was picked
+	 * was to keep behaviour as original situation before this function
+	 * was split up) - Philip */
+
+	tracker_data_insert_statement_with_uri (subject, predicate, object);
 
 	g_main_context_iteration (NULL, FALSE);
 }
diff --git a/src/tracker-store/tracker-resources.c b/src/tracker-store/tracker-resources.c
index ee0bb48..5ea4975 100644
--- a/src/tracker-store/tracker-resources.c
+++ b/src/tracker-store/tracker-resources.c
@@ -141,7 +141,11 @@ tracker_resources_insert (TrackerResources	     *self,
 				  "'%s' '%s' '%s'",
 				  subject, predicate, object);
 
-	tracker_store_insert_statement (subject, predicate, object);
+	/* We want to get rid of Resources.Insert (), so I used with_uri here,
+	 * as that maintains the original behaviour before the function got
+	 * split. */
+
+	tracker_store_insert_statement_with_uri (subject, predicate, object);
 
 	dbus_g_method_return (context);
 
diff --git a/src/tracker-store/tracker-store.c b/src/tracker-store/tracker-store.c
index 581e1ab..3e17e6d 100644
--- a/src/tracker-store/tracker-store.c
+++ b/src/tracker-store/tracker-store.c
@@ -97,11 +97,17 @@ process_turtle_file_part (void)
 
 	while (tracker_turtle_reader_next ()) {
 		/* insert statement */
-		tracker_data_insert_statement (
-			tracker_turtle_reader_get_subject (),
-			tracker_turtle_reader_get_predicate (),
-			tracker_turtle_reader_get_object ());
-
+		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 ());
+		} else {
+			tracker_data_insert_statement_with_string (
+				tracker_turtle_reader_get_subject (),
+				tracker_turtle_reader_get_predicate (),
+				tracker_turtle_reader_get_object ());
+		}
 		i++;
 		if (i >= 10) {
 			/* return to main loop */
@@ -372,9 +378,9 @@ tracker_store_sparql_query (const gchar *sparql,
 }
 
 void
-tracker_store_insert_statement (const gchar   *subject,
-                                const gchar   *predicate,
-                                const gchar   *object)
+tracker_store_insert_statement_with_uri (const gchar   *subject,
+                                         const gchar   *predicate,
+                                         const gchar   *object)
 {
 	TrackerStorePrivate *private;
 
@@ -392,7 +398,7 @@ tracker_store_insert_statement (const gchar   *subject,
 		private->batch_count = 0;
 	}
 
-	tracker_data_insert_statement (subject, predicate, object);
+	tracker_data_insert_statement_with_uri (subject, predicate, object);
 }
 
 void
diff --git a/src/tracker-store/tracker-store.h b/src/tracker-store/tracker-store.h
index 0415b12..e316e5c 100644
--- a/src/tracker-store/tracker-store.h
+++ b/src/tracker-store/tracker-store.h
@@ -51,7 +51,7 @@ void         tracker_store_queue_turtle_import    (GFile         *file,
                                                    GDestroyNotify destroy);
 void         tracker_store_sparql_update          (const gchar   *sparql,
                                                    GError       **error);
-void         tracker_store_insert_statement       (const gchar   *subject,
+void         tracker_store_insert_statement_with_uri (const gchar   *subject,
                                                    const gchar   *predicate,
                                                    const gchar   *object);
 void         tracker_store_delete_statement       (const gchar   *subject,
diff --git a/tests/libtracker-data/tracker-ontology-test.c b/tests/libtracker-data/tracker-ontology-test.c
index 39749c4..ca64d98 100644
--- a/tests/libtracker-data/tracker-ontology-test.c
+++ b/tests/libtracker-data/tracker-ontology-test.c
@@ -79,7 +79,11 @@ consume_triple_storer (const gchar *subject,
                        const gchar *object,
                        void        *user_data)
 {
-	tracker_data_insert_statement (subject, predicate, object);
+	/* Function got split up into with_uri and with_string, using with_uri
+	 * here to maintain original behaviour (feel free to make a test-case 
+	 * for both instead) */
+
+	tracker_data_insert_statement_with_uri (subject, predicate, object);
 }
 
 static void
diff --git a/tests/libtracker-data/tracker-sparql-test.c b/tests/libtracker-data/tracker-sparql-test.c
index 44c59da..a24dbcd 100644
--- a/tests/libtracker-data/tracker-sparql-test.c
+++ b/tests/libtracker-data/tracker-sparql-test.c
@@ -66,7 +66,11 @@ consume_triple_storer (const gchar *subject,
                        const gchar *object,
                        void        *user_data)
 {
-	tracker_data_insert_statement (subject, predicate, object);
+	/* Function got split up into with_uri and with_string, using with_uri
+	 * here to maintain original behaviour (feel free to make a test-case 
+	 * for both instead) */
+
+	tracker_data_insert_statement_with_uri (subject, predicate, object);
 }
 
 static void



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