[tracker/wip/carlosg/sparql1.1: 1/113] libtracker-data: Handle CREATE/DROP graph operations



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]