[tracker/blank-node-fix] Split of the function insert_statement
- From: Philip Van Hoof <pvanhoof src gnome org>
- To: svn-commits-list gnome org
- Subject: [tracker/blank-node-fix] Split of the function insert_statement
- Date: Tue, 30 Jun 2009 13:04:49 +0000 (UTC)
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]