[tracker/tracker-store] tracker-indexer: Fix SPARQL escaping



commit 4f6db2cfcfc4193bdba249aeeedb034bbd8ad612
Author: Jürg Billeter <j bitron ch>
Date:   Wed May 27 13:40:59 2009 +0200

    tracker-indexer: Fix SPARQL escaping
---
 src/tracker-indexer/tracker-module-metadata.c |   55 ++++++++++++++++++++++++-
 1 files changed, 54 insertions(+), 1 deletions(-)

diff --git a/src/tracker-indexer/tracker-module-metadata.c b/src/tracker-indexer/tracker-module-metadata.c
index bfc9d4d..dfbe536 100644
--- a/src/tracker-indexer/tracker-module-metadata.c
+++ b/src/tracker-indexer/tracker-module-metadata.c
@@ -20,6 +20,7 @@
  */
 
 #include <glib.h>
+#include <string.h>
 #include <time.h>
 #include <libtracker-common/tracker-type-utils.h>
 #include "tracker-module-metadata-private.h"
@@ -307,6 +308,58 @@ tracker_module_metadata_foreach (TrackerModuleMetadata        *metadata,
 	}
 }
 
+static gchar *
+sparql_escape (const gchar *str)
+{
+	gchar       *escaped_string;
+	const gchar *p;
+	gchar       *q;
+
+	escaped_string = g_malloc (2 * strlen (str) + 1);
+
+	p = str;
+	q = escaped_string;
+	while (*p != '\0') {
+		switch (*p) {
+		case '\t':
+			*q++ = '\\';
+			*q++ = 't';
+			break;
+		case '\n':
+			*q++ = '\\';
+			*q++ = 'n';
+			break;
+		case '\r':
+			*q++ = '\\';
+			*q++ = 'r';
+			break;
+		case '\b':
+			*q++ = '\\';
+			*q++ = 'b';
+			break;
+		case '\f':
+			*q++ = '\\';
+			*q++ = 'f';
+			break;
+		case '"':
+			*q++ = '\\';
+			*q++ = '"';
+			break;
+		case '\\':
+			*q++ = '\\';
+			*q++ = '\\';
+			break;
+		default:
+			*q++ = *p;
+			break;
+		}
+		p++;
+	}
+	*q = '\0';
+
+	return escaped_string;
+}
+
 gchar *
 tracker_module_metadata_get_sparql (TrackerModuleMetadata        *metadata)
 {
@@ -321,7 +374,7 @@ tracker_module_metadata_get_sparql (TrackerModuleMetadata        *metadata)
 
 		stmt = &g_array_index (metadata->statements, Statement, i);
 
-		object = g_strescape (stmt->object, NULL);
+		object = sparql_escape (stmt->object);
 
 		g_string_append_printf (sparql, " <%s> <%s> \"%s\" .",
 		                        stmt->subject, stmt->predicate, object);



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