[tracker] libtracker-data: Fix error handling when using non-existing class
- From: Jürg Billeter <juergbi src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [tracker] libtracker-data: Fix error handling when using non-existing class
- Date: Wed, 10 Feb 2010 14:54:01 +0000 (UTC)
commit 7849e875bb01ca3086087f436cdf51dac171957d
Author: Jürg Billeter <j bitron ch>
Date: Wed Feb 10 15:49:46 2010 +0100
libtracker-data: Fix error handling when using non-existing class
src/libtracker-data/tracker-data-update.c | 1 +
src/libtracker-data/tracker-sparql-query.vala | 230 +++++++++++++------------
2 files changed, 118 insertions(+), 113 deletions(-)
---
diff --git a/src/libtracker-data/tracker-data-update.c b/src/libtracker-data/tracker-data-update.c
index 2aac07c..c6be97f 100644
--- a/src/libtracker-data/tracker-data-update.c
+++ b/src/libtracker-data/tracker-data-update.c
@@ -1541,6 +1541,7 @@ tracker_data_insert_statement_with_uri (const gchar *graph,
} else {
g_set_error (error, TRACKER_DATA_ERROR, TRACKER_DATA_ERROR_UNKNOWN_CLASS,
"Class '%s' not found in the ontology", object);
+ return;
}
} else if (strcmp (predicate, TRACKER_PREFIX "uri") == 0) {
/* internal property tracker:uri, used to change uri of existing element */
diff --git a/src/libtracker-data/tracker-sparql-query.vala b/src/libtracker-data/tracker-sparql-query.vala
index 319ea76..a536d6f 100644
--- a/src/libtracker-data/tracker-sparql-query.vala
+++ b/src/libtracker-data/tracker-sparql-query.vala
@@ -99,126 +99,130 @@ public class Tracker.SparqlQuery : Object {
public Class? domain;
- public string get_sql_query (SparqlQuery query) throws DBInterfaceError, SparqlError {
- var sql = new StringBuilder ();
+ public string get_sql_query (SparqlQuery query) throws SparqlError {
+ try {
+ var sql = new StringBuilder ();
+
+ if (subject != null) {
+ // single subject
+ var subject_id = Data.query_resource_id (subject);
+
+ DBResultSet result_set = null;
+ if (subject_id > 0) {
+ var iface = DBManager.get_db_interface ();
+ var stmt = iface.create_statement ("SELECT (SELECT Uri FROM Resource WHERE ID = \"rdf:type\") FROM \"rdfs:Resource_rdf:type\" WHERE ID = ?");
+ stmt.bind_int (0, subject_id);
+ result_set = stmt.execute ();
+ }
- if (subject != null) {
- // single subject
- var subject_id = Data.query_resource_id (subject);
+ if (result_set != null) {
+ bool first = true;
+ do {
+ Value value;
+ result_set._get_value (0, out value);
+ var domain = Ontology.get_class_by_uri (value.get_string ());
+
+ foreach (Property prop in Ontology.get_properties ()) {
+ if (prop.domain == domain) {
+ if (first) {
+ first = false;
+ } else {
+ sql.append (" UNION ALL ");
+ }
+ sql.append_printf ("SELECT ID, (SELECT ID FROM Resource WHERE Uri = '%s') AS \"predicate\", ", prop.uri);
+
+ append_expression_as_string (sql, "\"%s\"".printf (prop.name), prop.data_type);
+
+ sql.append (" AS \"object\" FROM ");
+ if (prop.multiple_values) {
+ sql.append_printf ("\"%s_%s\"", prop.domain.name, prop.name);
+ } else {
+ sql.append_printf ("\"%s\"", prop.domain.name);
+ }
+
+ sql.append (" WHERE ID = ?");
+
+ var binding = new LiteralBinding ();
+ binding.literal = subject_id.to_string ();
+ binding.data_type = PropertyType.INTEGER;
+ query.bindings.append (binding);
+ }
+ }
+ } while (result_set.iter_next ());
+ } else {
+ /* no match */
+ sql.append ("SELECT NULL AS ID, NULL AS \"predicate\", NULL AS \"object\"");
+ }
+ } else if (object != null) {
+ // single object
+ var object_id = Data.query_resource_id (object);
- DBResultSet result_set = null;
- if (subject_id > 0) {
var iface = DBManager.get_db_interface ();
var stmt = iface.create_statement ("SELECT (SELECT Uri FROM Resource WHERE ID = \"rdf:type\") FROM \"rdfs:Resource_rdf:type\" WHERE ID = ?");
- stmt.bind_int (0, subject_id);
- result_set = stmt.execute ();
- }
+ stmt.bind_int (0, object_id);
+ var result_set = stmt.execute ();
- if (result_set != null) {
bool first = true;
- do {
- Value value;
- result_set._get_value (0, out value);
- var domain = Ontology.get_class_by_uri (value.get_string ());
-
- foreach (Property prop in Ontology.get_properties ()) {
- if (prop.domain == domain) {
- if (first) {
- first = false;
- } else {
- sql.append (" UNION ALL ");
- }
- sql.append_printf ("SELECT ID, (SELECT ID FROM Resource WHERE Uri = '%s') AS \"predicate\", ", prop.uri);
-
- append_expression_as_string (sql, "\"%s\"".printf (prop.name), prop.data_type);
-
- sql.append (" AS \"object\" FROM ");
- if (prop.multiple_values) {
- sql.append_printf ("\"%s_%s\"", prop.domain.name, prop.name);
- } else {
- sql.append_printf ("\"%s\"", prop.domain.name);
+ if (result_set != null) {
+ do {
+ Value value;
+ result_set._get_value (0, out value);
+ var range = Ontology.get_class_by_uri (value.get_string ());
+
+ foreach (Property prop in Ontology.get_properties ()) {
+ if (prop.range == range) {
+ if (first) {
+ first = false;
+ } else {
+ sql.append (" UNION ALL ");
+ }
+ sql.append_printf ("SELECT ID, (SELECT ID FROM Resource WHERE Uri = '%s') AS \"predicate\", ", prop.uri);
+
+ append_expression_as_string (sql, "\"%s\"".printf (prop.name), prop.data_type);
+
+ sql.append (" AS \"object\" FROM ");
+ if (prop.multiple_values) {
+ sql.append_printf ("\"%s_%s\"", prop.domain.name, prop.name);
+ } else {
+ sql.append_printf ("\"%s\"", prop.domain.name);
+ }
}
-
- sql.append (" WHERE ID = ?");
-
- var binding = new LiteralBinding ();
- binding.literal = subject_id.to_string ();
- binding.data_type = PropertyType.INTEGER;
- query.bindings.append (binding);
}
- }
- } while (result_set.iter_next ());
- } else {
- /* no match */
- sql.append ("SELECT NULL AS ID, NULL AS \"predicate\", NULL AS \"object\"");
- }
- } else if (object != null) {
- // single object
- var object_id = Data.query_resource_id (object);
-
- var iface = DBManager.get_db_interface ();
- var stmt = iface.create_statement ("SELECT (SELECT Uri FROM Resource WHERE ID = \"rdf:type\") FROM \"rdfs:Resource_rdf:type\" WHERE ID = ?");
- stmt.bind_int (0, object_id);
- var result_set = stmt.execute ();
-
- bool first = true;
- if (result_set != null) {
- do {
- Value value;
- result_set._get_value (0, out value);
- var range = Ontology.get_class_by_uri (value.get_string ());
-
- foreach (Property prop in Ontology.get_properties ()) {
- if (prop.range == range) {
- if (first) {
- first = false;
- } else {
- sql.append (" UNION ALL ");
- }
- sql.append_printf ("SELECT ID, (SELECT ID FROM Resource WHERE Uri = '%s') AS \"predicate\", ", prop.uri);
-
- append_expression_as_string (sql, "\"%s\"".printf (prop.name), prop.data_type);
-
- sql.append (" AS \"object\" FROM ");
- if (prop.multiple_values) {
- sql.append_printf ("\"%s_%s\"", prop.domain.name, prop.name);
- } else {
- sql.append_printf ("\"%s\"", prop.domain.name);
- }
+ } while (result_set.iter_next ());
+ } else {
+ /* no match */
+ sql.append ("SELECT NULL AS ID, NULL AS \"predicate\", NULL AS \"object\"");
+ }
+ } else if (domain != null) {
+ // any subject, predicates limited to a specific domain
+ bool first = true;
+ foreach (Property prop in Ontology.get_properties ()) {
+ if (prop.domain == domain) {
+ if (first) {
+ first = false;
+ } else {
+ sql.append (" UNION ALL ");
}
- }
- } while (result_set.iter_next ());
- } else {
- /* no match */
- sql.append ("SELECT NULL AS ID, NULL AS \"predicate\", NULL AS \"object\"");
- }
- } else if (domain != null) {
- // any subject, predicates limited to a specific domain
- bool first = true;
- foreach (Property prop in Ontology.get_properties ()) {
- if (prop.domain == domain) {
- if (first) {
- first = false;
- } else {
- sql.append (" UNION ALL ");
- }
- sql.append_printf ("SELECT ID, (SELECT ID FROM Resource WHERE Uri = '%s') AS \"predicate\", ", prop.uri);
+ sql.append_printf ("SELECT ID, (SELECT ID FROM Resource WHERE Uri = '%s') AS \"predicate\", ", prop.uri);
- append_expression_as_string (sql, "\"%s\"".printf (prop.name), prop.data_type);
+ append_expression_as_string (sql, "\"%s\"".printf (prop.name), prop.data_type);
- sql.append (" AS \"object\" FROM ");
- if (prop.multiple_values) {
- sql.append_printf ("\"%s_%s\"", prop.domain.name, prop.name);
- } else {
- sql.append_printf ("\"%s\"", prop.domain.name);
+ sql.append (" AS \"object\" FROM ");
+ if (prop.multiple_values) {
+ sql.append_printf ("\"%s_%s\"", prop.domain.name, prop.name);
+ } else {
+ sql.append_printf ("\"%s\"", prop.domain.name);
+ }
}
}
+ } else {
+ // UNION over all properties would exceed SQLite limits
+ throw query.get_internal_error ("Unrestricted predicate variables not supported");
}
- } else {
- // UNION over all properties would exceed SQLite limits
- throw query.get_internal_error ("Unrestricted predicate variables not supported");
+ return sql.str;
+ } catch (DBInterfaceError e) {
+ throw new SparqlError.INTERNAL (e.message);
}
- return sql.str;
}
}
@@ -464,7 +468,7 @@ public class Tracker.SparqlQuery : Object {
}
}
- public DBResultSet? execute () throws SparqlError {
+ public DBResultSet? execute () throws DBInterfaceError, SparqlError {
assert (!update_extensions);
scanner = new SparqlScanner ((char*) query_string, (long) query_string.size ());
@@ -497,7 +501,7 @@ public class Tracker.SparqlQuery : Object {
}
}
- public PtrArray? execute_update (bool blank) throws SparqlError {
+ public PtrArray? execute_update (bool blank) throws DataError, DBInterfaceError, SparqlError {
assert (update_extensions);
scanner = new SparqlScanner ((char*) query_string, (long) query_string.size ());
@@ -722,7 +726,7 @@ public class Tracker.SparqlQuery : Object {
return exec_sql (sql.str);
}
- PropertyType translate_select (StringBuilder sql, bool subquery = false) throws DBInterfaceError, SparqlError {
+ PropertyType translate_select (StringBuilder sql, bool subquery = false) throws SparqlError {
var type = PropertyType.UNKNOWN;
var pattern_sql = new StringBuilder ();
@@ -1889,7 +1893,7 @@ public class Tracker.SparqlQuery : Object {
return translate_conditional_or_expression (sql);
}
- PropertyType translate_bracketted_expression (StringBuilder sql) throws DBInterfaceError, SparqlError {
+ PropertyType translate_bracketted_expression (StringBuilder sql) throws SparqlError {
expect (SparqlTokenType.OPEN_PARENS);
if (current () == SparqlTokenType.SELECT) {
@@ -2169,7 +2173,7 @@ public class Tracker.SparqlQuery : Object {
sql.append ("SELECT ");
}
- void end_triples_block (StringBuilder sql, ref bool first_where, bool in_group_graph_pattern) throws DBInterfaceError, SparqlError {
+ void end_triples_block (StringBuilder sql, ref bool first_where, bool in_group_graph_pattern) throws SparqlError {
// remove last comma and space
sql.truncate (sql.len - 2);
@@ -2266,7 +2270,7 @@ public class Tracker.SparqlQuery : Object {
pattern_bindings = null;
}
- void parse_triples (StringBuilder sql, long group_graph_pattern_start, ref bool in_triples_block, ref bool first_where, ref bool in_group_graph_pattern, bool found_simple_optional) throws DBInterfaceError, SparqlError {
+ void parse_triples (StringBuilder sql, long group_graph_pattern_start, ref bool in_triples_block, ref bool first_where, ref bool in_group_graph_pattern, bool found_simple_optional) throws SparqlError {
while (true) {
if (current () != SparqlTokenType.VAR &&
current () != SparqlTokenType.IRI_REF &&
@@ -2396,7 +2400,7 @@ public class Tracker.SparqlQuery : Object {
}
}
- void translate_group_graph_pattern (StringBuilder sql) throws DBInterfaceError, SparqlError {
+ void translate_group_graph_pattern (StringBuilder sql) throws SparqlError {
expect (SparqlTokenType.OPEN_BRACE);
if (current () == SparqlTokenType.SELECT) {
@@ -2586,7 +2590,7 @@ public class Tracker.SparqlQuery : Object {
}
}
- void translate_group_or_union_graph_pattern (StringBuilder sql) throws DBInterfaceError, SparqlError {
+ void translate_group_or_union_graph_pattern (StringBuilder sql) throws SparqlError {
var old_subgraph_var_set = subgraph_var_set;
Variable[] all_vars = { };
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]