[tracker/wip/carlosg/sparql1.1: 1/113] libtracker-data: Handle CREATE/DROP graph operations
- From: Carlos Garnacho <carlosg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [tracker/wip/carlosg/sparql1.1: 1/113] libtracker-data: Handle CREATE/DROP graph operations
- Date: Sun, 21 Jul 2019 14:29:19 +0000 (UTC)
commit 26a21e5f7997189032624c6438ef1876a12c608a
Author: Carlos Garnacho <carlosg gnome org>
Date: Sat Apr 20 16:31:40 2019 +0200
libtracker-data: Handle CREATE/DROP graph operations
src/libtracker-data/tracker-data-manager.c | 8 ++++
src/libtracker-data/tracker-sparql.c | 70 +++++++++++++++++++++++++++---
2 files changed, 73 insertions(+), 5 deletions(-)
---
diff --git a/src/libtracker-data/tracker-data-manager.c b/src/libtracker-data/tracker-data-manager.c
index 15f4d976b..b3b24d6f7 100644
--- a/src/libtracker-data/tracker-data-manager.c
+++ b/src/libtracker-data/tracker-data-manager.c
@@ -4854,6 +4854,14 @@ tracker_data_manager_drop_graph (TrackerDataManager *manager,
iface = tracker_db_manager_get_writable_db_interface (manager->db_manager);
+ /* Silently refuse to drop the main graph, clear it instead */
+ if (!name)
+ return tracker_data_manager_clear_graph (manager, name, error);
+
+ /* Ensure the current transaction doesn't keep tables in this database locked */
+ tracker_data_commit_transaction (manager->data_update, NULL);
+ tracker_data_begin_transaction (manager->data_update, NULL);
+
if (!tracker_db_manager_detach_database (manager->db_manager, iface,
name, error))
return FALSE;
diff --git a/src/libtracker-data/tracker-sparql.c b/src/libtracker-data/tracker-sparql.c
index 347960e53..2db7f18f2 100644
--- a/src/libtracker-data/tracker-sparql.c
+++ b/src/libtracker-data/tracker-sparql.c
@@ -2384,14 +2384,69 @@ static gboolean
translate_Drop (TrackerSparql *sparql,
GError **error)
{
- _unimplemented ("DROP");
+ gboolean silent = FALSE;
+ GError *inner_error = NULL;
+
+ _expect (sparql, RULE_TYPE_LITERAL, LITERAL_DROP);
+
+ if (_accept (sparql, RULE_TYPE_LITERAL, LITERAL_SILENT))
+ silent = TRUE;
+
+ _call_rule (sparql, NAMED_RULE_GraphRefAll, error);
+
+ if (!tracker_token_is_empty (&sparql->current_state.graph)) {
+ const gchar *graph_name;
+
+ graph_name = tracker_token_get_idstring (&sparql->current_state.graph);
+ if (!tracker_data_manager_drop_graph (sparql->data_manager,
+ graph_name,
+ &inner_error)) {
+ if (silent) {
+ g_error_free (inner_error);
+ return TRUE;
+ } else {
+ g_propagate_error (error, inner_error);
+ return FALSE;
+ }
+ }
+ }
+
+ return TRUE;
}
static gboolean
translate_Create (TrackerSparql *sparql,
GError **error)
{
- _unimplemented ("CREATE");
+ gboolean silent = FALSE;
+ GError *inner_error = NULL;
+
+ _expect (sparql, RULE_TYPE_LITERAL, LITERAL_CREATE);
+
+ if (_accept (sparql, RULE_TYPE_LITERAL, LITERAL_SILENT))
+ silent = TRUE;
+
+ _call_rule (sparql, NAMED_RULE_GraphRef, error);
+
+ if (!tracker_token_is_empty (&sparql->current_state.graph)) {
+ const gchar *graph_name;
+
+ graph_name = tracker_token_get_idstring (&sparql->current_state.graph);
+
+ if (!tracker_data_manager_create_graph (sparql->data_manager,
+ graph_name,
+ &inner_error)) {
+ if (silent) {
+ g_error_free (inner_error);
+ return TRUE;
+ } else {
+ g_propagate_error (error, inner_error);
+ return FALSE;
+ }
+ }
+ }
+
+ return TRUE;
}
static gboolean
@@ -2843,11 +2898,16 @@ translate_GraphRefAll (TrackerSparql *sparql,
{
/* GraphRefAll ::= GraphRef | 'DEFAULT' | 'NAMED' | 'ALL'
*/
- if (_accept (sparql, RULE_TYPE_LITERAL, LITERAL_DEFAULT) ||
- _accept (sparql, RULE_TYPE_LITERAL, LITERAL_NAMED) ||
- _accept (sparql, RULE_TYPE_LITERAL, LITERAL_ALL)) {
+ if (_accept (sparql, RULE_TYPE_LITERAL, LITERAL_DEFAULT)) {
+ _unimplemented ("DROP/CLEAR DEFAULT");
+ } else if (_accept (sparql, RULE_TYPE_LITERAL, LITERAL_NAMED)) {
+ _unimplemented ("DROP/CLEAR NAMED");
+ } else if (_accept (sparql, RULE_TYPE_LITERAL, LITERAL_ALL)) {
+ _unimplemented ("DROP/CLEAR ALL");
} else {
_call_rule (sparql, NAMED_RULE_GraphRef, error);
+ _init_token (&sparql->current_state.graph,
+ sparql->current_state.prev_node, sparql);
}
return TRUE;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]