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



commit 2a0d91cfa6296c7138d6a7e1548d48ef379cebcc
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-sparql.c | 70 +++++++++++++++++++++++++++++++++---
 1 file changed, 65 insertions(+), 5 deletions(-)
---
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]