[tracker/tracker-store] libtracker-common: Add TrackerSparqlBuilder



commit 993c2739caf28c7b9fa9dbee09709957a0750699
Author: Jürg Billeter <j bitron ch>
Date:   Thu May 28 17:14:19 2009 +0200

    libtracker-common: Add TrackerSparqlBuilder
---
 src/libtracker-common/.gitignore                  |    2 +
 src/libtracker-common/Makefile.am                 |   17 ++-
 src/libtracker-common/tracker-common.h            |    1 +
 src/libtracker-common/tracker-sparql-builder.vala |  180 +++++++++++++++++++++
 4 files changed, 198 insertions(+), 2 deletions(-)

diff --git a/src/libtracker-common/.gitignore b/src/libtracker-common/.gitignore
new file mode 100644
index 0000000..eb2fec8
--- /dev/null
+++ b/src/libtracker-common/.gitignore
@@ -0,0 +1,2 @@
+tracker-sparql-builder.c
+tracker-sparql-builder.h
diff --git a/src/libtracker-common/Makefile.am b/src/libtracker-common/Makefile.am
index df109a5..7f28133 100644
--- a/src/libtracker-common/Makefile.am
+++ b/src/libtracker-common/Makefile.am
@@ -34,6 +34,9 @@ hal_headers = 						\
 	tracker-storage.h
 endif
 
+libtracker_common_la_VALASOURCES =			\
+	tracker-sparql-builder.vala
+
 libtracker_common_la_SOURCES =	 			\
 	$(os_sources)					\
 	$(hal_sources)					\
@@ -56,7 +59,9 @@ libtracker_common_la_SOURCES =	 			\
 	tracker-type-utils.c				\
 	tracker-utils.c					\
 	tracker-thumbnailer.c				\
-	tracker-albumart.c
+	tracker-albumart.c				\
+	libtracker-common.vala.stamp			\
+	$(libtracker_common_la_VALASOURCES:.vala=.c)
 
 noinst_HEADERS =					\
 	$(hal_headers)					\
@@ -79,11 +84,16 @@ libtracker_commoninclude_HEADERS =			\
 	tracker-ontology.h				\
 	tracker-parser.h				\
 	tracker-property.h				\
+	tracker-sparql-builder.h						\
 	tracker-statement-list.h			\
 	tracker-status.h				\
 	tracker-type-utils.h				\
 	tracker-utils.h
 
+libtracker-common.vala.stamp: $(libtracker_common_la_VALASOURCES)
+	$(VALAC) -C $(VALAFLAGS) -H tracker-sparql-builder.h $^
+	touch $@
+
 libtracker_common_la_LDFLAGS = 				\
 	-version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE)
 
@@ -112,11 +122,14 @@ marshal_sources =                              		\
         tracker-marshal.c
 
 BUILT_SOURCES =						\
-	$(marshal_sources)
+	$(marshal_sources)				\
+	libtracker-common.vala.stamp
 
 CLEANFILES = $(BUILT_SOURCES)
 
 EXTRA_DIST = 						\
 	tracker-marshal.list				\
+	$(libtracker_common_la_VALASOURCES)		\
+	libtracker-common.vala.stamp			\
 	libtracker-common.vapi
 
diff --git a/src/libtracker-common/tracker-common.h b/src/libtracker-common/tracker-common.h
index 59ac595..46d090e 100644
--- a/src/libtracker-common/tracker-common.h
+++ b/src/libtracker-common/tracker-common.h
@@ -42,6 +42,7 @@ G_BEGIN_DECLS
 #include "tracker-parser.h"
 #include "tracker-power.h"
 #include "tracker-property.h"
+#include "tracker-sparql-builder.h"
 #include "tracker-storage.h"
 #include "tracker-type-utils.h"
 #include "tracker-utils.h"
diff --git a/src/libtracker-common/tracker-sparql-builder.vala b/src/libtracker-common/tracker-sparql-builder.vala
new file mode 100644
index 0000000..896df21
--- /dev/null
+++ b/src/libtracker-common/tracker-sparql-builder.vala
@@ -0,0 +1,180 @@
+/*
+ * Copyright (C) 2009, Nokia
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA  02110-1301, USA.
+ */
+
+public class Tracker.SparqlBuilder : Object {
+	enum State {
+		UPDATE,
+		INSERT,
+		DELETE,
+		SUBJECT,
+		PREDICATE,
+		OBJECT,
+		BLANK
+	}
+
+	public string result {
+		get { return str.str; }
+	}
+
+	State state {
+		get { return states[states.length - 1]; }
+	}
+
+	State[] states;
+	StringBuilder str = new StringBuilder ();
+
+	public SparqlBuilder.update () {
+		states += State.UPDATE;
+	}
+
+	public void insert_open ()
+		requires (state == State.UPDATE)
+	{
+		states += State.INSERT;
+		str.append ("INSERT {\n");
+	}
+
+	public void insert_close ()
+		requires (state == State.INSERT || state == State.OBJECT)
+	{
+		if (state == State.OBJECT) {
+			str.append (".\n");
+			states.length -= 3;
+		}
+		states.length--;
+		str.append ("}\n");
+	}
+
+	public void subject_iri (string iri) {
+		subject ("<%s>".printf (iri));
+	}
+
+	public void subject (string s)
+		requires (state == State.INSERT || state == State.OBJECT)
+	{
+		if (state == State.OBJECT) {
+			str.append (".\n");
+			states.length -= 3;
+		}
+		str.append (s);
+		states += State.SUBJECT;
+	}
+
+	public void predicate_iri (string iri) {
+		predicate ("<%s>".printf (iri));
+	}
+
+	public void predicate (string s)
+		requires (state == State.SUBJECT || state == State.OBJECT || state == State.BLANK)
+	{
+		if (state == State.OBJECT) {
+			str.append (";");
+			states.length -= 2;
+		}
+		str.append (" ");
+		str.append (s);
+		states += State.PREDICATE;
+	}
+
+	public void object_iri (string iri) {
+		object ("<%s>".printf (iri));
+	}
+
+	public void object (string s)
+		requires (state == State.PREDICATE || state == State.OBJECT)
+	{
+		if (state == State.OBJECT) {
+			str.append (",");
+			states.length--;
+		}
+		str.append (" ");
+		str.append (s);
+		states += State.OBJECT;
+	}
+
+	public void object_string (string literal)
+		requires (state == State.PREDICATE || state == State.OBJECT)
+	{
+		if (state == State.OBJECT) {
+			str.append (",");
+			states.length--;
+		}
+
+		str.append (" \"");
+
+		char* p = literal;
+		while (*p != '\0') {
+			switch (*p) {
+			case '\t':
+				str.append ("\\t");
+				break;
+			case '\n':
+				str.append ("\\n");
+				break;
+			case '\r':
+				str.append ("\\r");
+				break;
+			case '\b':
+				str.append ("\\b");
+				break;
+			case '\f':
+				str.append ("\\f");
+				break;
+			case '"':
+				str.append ("\\\"");
+				break;
+			case '\\':
+				str.append ("\\\\");
+				break;
+			default:
+				str.append_c (*p);
+				break;
+			}
+			p++;
+		}
+
+		str.append ("\"");
+
+		states += State.OBJECT;
+	}
+
+	public void object_boolean (bool literal) {
+		object (literal ? "true" : "false");
+	}
+
+	public void object_blank_open ()
+		requires (state == State.PREDICATE || state == State.OBJECT)
+	{
+		if (state == State.OBJECT) {
+			str.append (",");
+			states.length--;
+		}
+		str.append (" [");
+		states += State.BLANK;
+	}
+
+	public void object_blank_close ()
+		requires (state == State.OBJECT && states[states.length - 3] == state.BLANK)
+	{
+		str.append ("]");
+		states.length -= 3;
+		states += State.OBJECT;
+	}
+}
+



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