[tracker/wip/carlosg/sparql1.1: 128/201] libtracker-data: Make literal tokens hold a GBytes
- From: Carlos Garnacho <carlosg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [tracker/wip/carlosg/sparql1.1: 128/201] libtracker-data: Make literal tokens hold a GBytes
- Date: Mon, 9 Sep 2019 22:29:34 +0000 (UTC)
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]