[tracker/wip/carlosg/sparql1.1: 85/145] libtracker-data: Refactor string builder creation into separate function



commit fcc233cd3158e01c420d25e58f58134a213dcd18
Author: Carlos Garnacho <carlosg gnome org>
Date:   Thu Jun 13 13:53:58 2019 +0200

    libtracker-data: Refactor string builder creation into separate function
    
    This is done in several places, so do it centrally. Also, we now make the
    Query body go into a separate substring, in order to ensure _prepend_string()
    during query parsing doesn't end up with strings being prepended before the
    set of WITH clauses.

 src/libtracker-data/tracker-sparql.c | 31 +++++++++++++++++++------------
 1 file changed, 19 insertions(+), 12 deletions(-)
---
diff --git a/src/libtracker-data/tracker-sparql.c b/src/libtracker-data/tracker-sparql.c
index 56145ecac..0121641aa 100644
--- a/src/libtracker-data/tracker-sparql.c
+++ b/src/libtracker-data/tracker-sparql.c
@@ -1387,6 +1387,22 @@ tracker_sparql_apply_quad (TrackerSparql  *sparql,
        return TRUE;
 }
 
+static void
+tracker_sparql_init_string_builder (TrackerSparql *sparql)
+{
+       TrackerStringBuilder *str;
+
+       g_clear_pointer (&sparql->sql, tracker_string_builder_free);
+       sparql->sql = sparql->current_state.sql = tracker_string_builder_new ();
+       sparql->current_state.with_clauses = _prepend_placeholder (sparql);
+
+       /* Ensure the select clause goes to a different substring than the
+        * WITH clauses, so _prepend_string() works as expected.
+        */
+       str = _append_placeholder (sparql);
+       tracker_sparql_swap_builder (sparql, str);
+}
+
 static TrackerParserNode *
 _skip_rule (TrackerSparql *sparql,
             guint          named_rule)
@@ -3054,10 +3070,7 @@ get_solution_for_pattern (TrackerSparql      *sparql,
        sparql->current_state.select_context = sparql->context;
        tracker_sparql_push_context (sparql, sparql->context);
 
-       g_clear_pointer (&sparql->sql, tracker_string_builder_free);
-       sparql->sql = tracker_string_builder_new ();
-       tracker_sparql_swap_builder (sparql, sparql->sql);
-       sparql->current_state.with_clauses = _prepend_placeholder (sparql);
+       tracker_sparql_init_string_builder (sparql);
 
        retval = prepare_solution_select (sparql, pattern, error);
        tracker_sparql_pop_context (sparql, FALSE);
@@ -7326,11 +7339,8 @@ tracker_sparql_new (TrackerDataManager *manager,
                                           &sparql->parser_error);
        if (tree) {
                sparql->tree = tree;
-               sparql->sql = tracker_string_builder_new ();
-
                sparql->current_state.node = tracker_node_tree_get_root (sparql->tree);
-               sparql->current_state.sql = sparql->sql;
-               sparql->current_state.with_clauses = _prepend_placeholder (sparql);
+               tracker_sparql_init_string_builder (sparql);
        }
 
        return sparql;
@@ -7504,11 +7514,8 @@ tracker_sparql_new_update (TrackerDataManager *manager,
 
        if (tree) {
                sparql->tree = tree;
-               sparql->sql = tracker_string_builder_new ();
-
                sparql->current_state.node = tracker_node_tree_get_root (sparql->tree);
-               sparql->current_state.sql = sparql->sql;
-               sparql->current_state.with_clauses = _prepend_placeholder (sparql);
+               tracker_sparql_init_string_builder (sparql);
        }
 
        return sparql;


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