[tracker/wip/carlosg/sparql1.1: 128/201] libtracker-data: Make literal tokens hold a GBytes



commit 825dc68ec7403c0969a13f65dd365de9cfb9e488
Author: Carlos Garnacho <carlosg gnome org>
Date:   Sun Jun 16 22:43:19 2019 +0200

    libtracker-data: Make literal tokens hold a GBytes
    
    They will most usually be NUL-terminated strings, but we might want
    to have something able to hold NULs in between.

 src/libtracker-data/tracker-sparql-types.c | 20 +++++++------
 src/libtracker-data/tracker-sparql-types.h | 12 ++++----
 src/libtracker-data/tracker-sparql.c       | 46 ++++++++++++++++++------------
 3 files changed, 46 insertions(+), 32 deletions(-)
---
diff --git a/src/libtracker-data/tracker-sparql-types.c b/src/libtracker-data/tracker-sparql-types.c
index 4f100ae03..e8f97faf7 100644
--- a/src/libtracker-data/tracker-sparql-types.c
+++ b/src/libtracker-data/tracker-sparql-types.c
@@ -141,10 +141,13 @@ tracker_variable_equal (gconstpointer data1,
 
 void
 tracker_token_literal_init (TrackerToken *token,
-                            const gchar  *literal)
+                            const gchar  *literal,
+                            gsize         len)
 {
+       if (len < 0)
+               len = strlen (literal);
        token->type = TOKEN_TYPE_LITERAL;
-       token->content.literal = g_strdup (literal);
+       token->content.literal = g_bytes_new (literal, len);
 }
 
 void
@@ -175,7 +178,7 @@ void
 tracker_token_unset (TrackerToken *token)
 {
        if (token->type == TOKEN_TYPE_LITERAL)
-               g_clear_pointer (&token->content.literal, g_free);
+               g_clear_pointer (&token->content.literal, g_bytes_unref);
        else if (token->type == TOKEN_TYPE_PARAMETER)
                g_clear_pointer (&token->content.parameter, g_free);
        token->type = TOKEN_TYPE_NONE;
@@ -187,7 +190,7 @@ tracker_token_is_empty (TrackerToken *token)
        return token->type == TOKEN_TYPE_NONE;
 }
 
-const gchar *
+GBytes *
 tracker_token_get_literal (TrackerToken *token)
 {
        if (token->type == TOKEN_TYPE_LITERAL)
@@ -223,7 +226,7 @@ const gchar *
 tracker_token_get_idstring (TrackerToken *token)
 {
        if (token->type == TOKEN_TYPE_LITERAL)
-               return token->content.literal;
+               return g_bytes_get_data (token->content.literal, NULL);
        else if (token->type == TOKEN_TYPE_VARIABLE)
                return token->content.var->sql_expression;
        else if (token->type == TOKEN_TYPE_PATH)
@@ -391,7 +394,7 @@ tracker_literal_binding_finalize (GObject *object)
 {
        TrackerLiteralBinding *binding = TRACKER_LITERAL_BINDING (object);
 
-       g_free (binding->literal);
+       g_bytes_unref (binding->bytes);
 
        G_OBJECT_CLASS (tracker_literal_binding_parent_class)->finalize (object);
 }
@@ -410,14 +413,15 @@ tracker_literal_binding_init (TrackerLiteralBinding *binding)
 }
 
 TrackerBinding *
-tracker_literal_binding_new (const gchar      *literal,
+tracker_literal_binding_new (GBytes           *bytes,
                             TrackerDataTable *table)
 {
        TrackerBinding *binding;
 
        binding = g_object_new (TRACKER_TYPE_LITERAL_BINDING, NULL);
        binding->table = table;
-       TRACKER_LITERAL_BINDING (binding)->literal = g_strdup (literal);
+       TRACKER_LITERAL_BINDING (binding)->bytes = g_bytes_ref (bytes);
+       TRACKER_LITERAL_BINDING (binding)->literal = g_bytes_get_data (bytes, NULL);
 
        return binding;
 }
diff --git a/src/libtracker-data/tracker-sparql-types.h b/src/libtracker-data/tracker-sparql-types.h
index 616405205..f99327ff9 100644
--- a/src/libtracker-data/tracker-sparql-types.h
+++ b/src/libtracker-data/tracker-sparql-types.h
@@ -94,7 +94,8 @@ struct _TrackerBindingClass {
 /* Represents a mapping of a SPARQL literal to a SQL table and column */
 struct _TrackerLiteralBinding {
        TrackerBinding parent_instance;
-       gchar *literal;
+       GBytes *bytes;
+       const gchar *literal;
 };
 
 struct _TrackerLiteralBindingClass {
@@ -132,7 +133,7 @@ struct _TrackerVariable {
 struct _TrackerToken {
        guint type;
        union {
-               gchar *literal;
+               GBytes *literal;
                gchar *parameter;
                TrackerVariable *var;
                TrackerPathElement *path;
@@ -258,7 +259,7 @@ gchar * tracker_binding_get_extra_sql_expression (TrackerBinding *binding,
 
 /* Literal binding */
 GType            tracker_literal_binding_get_type (void) G_GNUC_CONST;
-TrackerBinding * tracker_literal_binding_new (const gchar      *literal,
+TrackerBinding * tracker_literal_binding_new (GBytes           *bytes,
                                              TrackerDataTable *table);
 
 /* Parameter binding */
@@ -290,7 +291,8 @@ TrackerVariableBinding * tracker_variable_get_sample_binding (TrackerVariable *v
 
 /* Token */
 void tracker_token_literal_init  (TrackerToken    *token,
-                                 const gchar     *literal);
+                                  const gchar     *literal,
+                                  gsize            len);
 void tracker_token_variable_init (TrackerToken    *token,
                                   TrackerVariable *variable);
 void tracker_token_parameter_init (TrackerToken   *token,
@@ -300,7 +302,7 @@ void tracker_token_path_init      (TrackerToken       *token,
 void tracker_token_unset (TrackerToken *token);
 
 gboolean           tracker_token_is_empty     (TrackerToken *token);
-const gchar      * tracker_token_get_literal  (TrackerToken *token);
+GBytes           * tracker_token_get_literal  (TrackerToken *token);
 TrackerVariable  * tracker_token_get_variable (TrackerToken *token);
 const gchar      * tracker_token_get_idstring (TrackerToken *token);
 const gchar      * tracker_token_get_parameter (TrackerToken *token);
diff --git a/src/libtracker-data/tracker-sparql.c b/src/libtracker-data/tracker-sparql.c
index 2f1851659..29e5ca360 100644
--- a/src/libtracker-data/tracker-sparql.c
+++ b/src/libtracker-data/tracker-sparql.c
@@ -793,8 +793,12 @@ _convert_terminal (TrackerSparql *sparql)
        if (is_parameter) {
                binding = tracker_parameter_binding_new (str, NULL);
        } else {
-               binding = tracker_literal_binding_new (str, NULL);
+               GBytes *bytes;
+
+               bytes = g_bytes_new (str, strlen (str) + 1);
+               binding = tracker_literal_binding_new (bytes, NULL);
                tracker_binding_set_data_type (binding, sparql->current_state.expression_type);
+               g_bytes_unref (bytes);
        }
 
        g_hash_table_insert (ht, str, g_object_ref (binding));
@@ -892,12 +896,12 @@ _init_token (TrackerToken      *token,
 
                        value = g_hash_table_lookup (sparql->solution_var_map, str);
                        if (value)
-                               tracker_token_literal_init (token, value);
+                               tracker_token_literal_init (token, value, -1);
                }
        } else if (tracker_grammar_rule_is_a (rule, RULE_TYPE_TERMINAL, TERMINAL_TYPE_PARAMETERIZED_VAR)) {
                tracker_token_parameter_init (token, str);
        } else {
-               tracker_token_literal_init (token, str);
+               tracker_token_literal_init (token, str, -1);
        }
 
        g_free (str);
@@ -1218,7 +1222,7 @@ _add_quad (TrackerSparql  *sparql,
                        variable = tracker_token_get_variable (subject);
                        binding = tracker_variable_binding_new (variable, subject_type, table);
                } else if (tracker_token_get_literal (subject)) {
-                       binding = tracker_literal_binding_new (tracker_token_get_idstring (subject),
+                       binding = tracker_literal_binding_new (tracker_token_get_literal (subject),
                                                               table);
                } else if (tracker_token_get_parameter (subject)) {
                        binding = tracker_parameter_binding_new (tracker_token_get_parameter (subject),
@@ -1282,7 +1286,7 @@ _add_quad (TrackerSparql  *sparql,
                g_object_unref (binding);
        } else if (is_fts) {
                if (tracker_token_get_literal (object)) {
-                       binding = tracker_literal_binding_new (tracker_token_get_idstring (object), table);
+                       binding = tracker_literal_binding_new (tracker_token_get_literal (object), table);
                } else if (tracker_token_get_parameter (object)) {
                        binding = tracker_parameter_binding_new (tracker_token_get_parameter (object), table);
                } else {
@@ -1330,7 +1334,7 @@ _add_quad (TrackerSparql  *sparql,
                }
        } else {
                if (tracker_token_get_literal (object)) {
-                       binding = tracker_literal_binding_new (tracker_token_get_idstring (object), table);
+                       binding = tracker_literal_binding_new (tracker_token_get_literal (object), table);
                } else if (tracker_token_get_parameter (object)) {
                        binding = tracker_parameter_binding_new (tracker_token_get_parameter (object), table);
                } else {
@@ -2157,7 +2161,7 @@ translate_DescribeQuery (TrackerSparql  *sparql,
                        _init_token (&resource, sparql->current_state.prev_node, sparql);
 
                        if (tracker_token_get_literal (&resource)) {
-                               binding = tracker_literal_binding_new (tracker_token_get_idstring (&resource),
+                               binding = tracker_literal_binding_new (tracker_token_get_literal (&resource),
                                                                       NULL);
                        } else {
                                TrackerVariable *variable;
@@ -4754,7 +4758,7 @@ translate_VerbPath (TrackerSparql  *sparql,
 
                prop = tracker_sparql_parser_tree_find_first (sparql->current_state.node, TRUE);
                str = _extract_node_string (prop, sparql);
-               tracker_token_literal_init (&sparql->current_state.predicate, str);
+               tracker_token_literal_init (&sparql->current_state.predicate, str, -1);
                g_free (str);
 
                _skip_rule (sparql, NAMED_RULE_Path);
@@ -5211,7 +5215,7 @@ translate_BlankNodePropertyList (TrackerSparql  *sparql,
 
                iface = tracker_data_manager_get_writable_db_interface (sparql->data_manager);
                bnode_id = tracker_data_query_unused_uuid (sparql->data_manager, iface);
-               tracker_token_literal_init (&sparql->current_state.subject, bnode_id);
+               tracker_token_literal_init (&sparql->current_state.subject, bnode_id, -1);
                g_free (bnode_id);
        }
 
@@ -5308,7 +5312,7 @@ translate_Collection (TrackerSparql  *sparql,
 
                /* rdf:first */
                tracker_token_literal_init (&sparql->current_state.predicate,
-                                           RDF_NS "first");
+                                           RDF_NS "first", -1);
                sparql->current_state.token = &sparql->current_state.object;
                _call_rule (sparql, NAMED_RULE_GraphNode, error);
                sparql->current_state.token = NULL;
@@ -5316,7 +5320,7 @@ translate_Collection (TrackerSparql  *sparql,
 
                /* rdf:rest */
                tracker_token_literal_init (&sparql->current_state.predicate,
-                                           RDF_NS "rest");
+                                           RDF_NS "rest", -1);
 
                if (_check_in_rule (sparql, NAMED_RULE_GraphNode)) {
                        /* Generate variable for next element */
@@ -5325,7 +5329,7 @@ translate_Collection (TrackerSparql  *sparql,
                } else {
                        /* Make last element point to rdf:nil */
                        tracker_token_literal_init (&sparql->current_state.object,
-                                                   RDF_NS "nil");
+                                                   RDF_NS "nil", -1);
                }
 
                if (!tracker_sparql_apply_quad (sparql, error))
@@ -5376,7 +5380,7 @@ translate_CollectionPath (TrackerSparql  *sparql,
 
                /* rdf:first */
                tracker_token_literal_init (&sparql->current_state.predicate,
-                                           RDF_NS "first");
+                                           RDF_NS "first", -1);
                sparql->current_state.token = &sparql->current_state.object;
                _call_rule (sparql, NAMED_RULE_GraphNodePath, error);
                sparql->current_state.token = NULL;
@@ -5384,7 +5388,7 @@ translate_CollectionPath (TrackerSparql  *sparql,
 
                /* rdf:rest */
                tracker_token_literal_init (&sparql->current_state.predicate,
-                                           RDF_NS "rest");
+                                           RDF_NS "rest", -1);
 
                if (_check_in_rule (sparql, NAMED_RULE_GraphNodePath)) {
                        /* Generate variable for next element */
@@ -5393,7 +5397,7 @@ translate_CollectionPath (TrackerSparql  *sparql,
                } else {
                        /* Make last element point to rdf:nil */
                        tracker_token_literal_init (&sparql->current_state.object,
-                                                   RDF_NS "nil");
+                                                   RDF_NS "nil", -1);
                }
 
                if (!_add_quad (sparql,
@@ -6640,6 +6644,7 @@ translate_BuiltInCall (TrackerSparql  *sparql,
                   _accept (sparql, RULE_TYPE_LITERAL, LITERAL_ISURI)) {
                TrackerBinding *binding;
                const gchar *str;
+               GBytes *bytes;
 
                _expect (sparql, RULE_TYPE_LITERAL, LITERAL_OPEN_PARENS);
 
@@ -6647,7 +6652,10 @@ translate_BuiltInCall (TrackerSparql  *sparql,
 
                str = (sparql->current_state.expression_type == TRACKER_PROPERTY_TYPE_RESOURCE) ? "1" : "0";
 
-               binding = tracker_literal_binding_new (str, NULL);
+               bytes = g_bytes_new (str, strlen (str) + 1);
+               binding = tracker_literal_binding_new (bytes, NULL);
+               g_bytes_unref (bytes);
+
                tracker_select_context_add_literal_binding (TRACKER_SELECT_CONTEXT (sparql->context),
                                                            TRACKER_LITERAL_BINDING (binding));
                _append_literal_sql (sparql, TRACKER_LITERAL_BINDING (binding));
@@ -7325,7 +7333,7 @@ translate_BlankNode (TrackerSparql  *sparql,
         if (sparql->current_state.type != TRACKER_SPARQL_TYPE_SELECT) {
                if (_accept (sparql, RULE_TYPE_TERMINAL, TERMINAL_TYPE_ANON)) {
                        bnode_id = tracker_data_query_unused_uuid (sparql->data_manager, iface);
-                       tracker_token_literal_init (sparql->current_state.token, bnode_id);
+                       tracker_token_literal_init (sparql->current_state.token, bnode_id, -1);
                        g_free (bnode_id);
                } else if (_accept (sparql, RULE_TYPE_TERMINAL, TERMINAL_TYPE_BLANK_NODE_LABEL)) {
                        gchar *str;
@@ -7343,9 +7351,9 @@ translate_BlankNode (TrackerSparql  *sparql,
                                                g_variant_builder_add (sparql->blank_nodes, "{ss}", str, 
bnode_id);
                                }
 
-                               tracker_token_literal_init (sparql->current_state.token, bnode_id);
+                               tracker_token_literal_init (sparql->current_state.token, bnode_id, -1);
                        } else {
-                               tracker_token_literal_init (sparql->current_state.token, str);
+                               tracker_token_literal_init (sparql->current_state.token, str, -1);
                        }
 
                        g_free (str);


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