summaryrefslogtreecommitdiff
path: root/src/libtracker-sparql/tracker-resource.c
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2022-07-20 14:01:39 +0200
committerCarlos Garnacho <carlosg@gnome.org>2022-08-30 17:16:48 +0200
commitbc743f30abcc67c5e11c84acc163109a247546c4 (patch)
treed8cc9b3246114be4d214ae8090996e95e67547fa /src/libtracker-sparql/tracker-resource.c
parent0cbd8a938e917b575272840f772ebe5c7809f798 (diff)
downloadtracker-bc743f30abcc67c5e11c84acc163109a247546c4.tar.gz
libtracker-sparql: Add private call to determine if a resource is a blank node
Currently, we always go ahead at generating blank node labels, even though the resource might get an identifier assigned later on, the blank node label never be relevant, etc... Make this a bit easier for mass TrackerResource generation and avoid generating blank node labels until we are quite sure that the resource is being referenced somewhere else.
Diffstat (limited to 'src/libtracker-sparql/tracker-resource.c')
-rw-r--r--src/libtracker-sparql/tracker-resource.c90
1 files changed, 36 insertions, 54 deletions
diff --git a/src/libtracker-sparql/tracker-resource.c b/src/libtracker-sparql/tracker-resource.c
index a59d98ebb..c027eecee 100644
--- a/src/libtracker-sparql/tracker-resource.c
+++ b/src/libtracker-sparql/tracker-resource.c
@@ -82,7 +82,6 @@ enum {
};
static void dispose (GObject *object);
-static void constructed (GObject *object);
static void finalize (GObject *object);
static void get_property (GObject *object,
guint param_id,
@@ -100,7 +99,6 @@ tracker_resource_class_init (TrackerResourceClass *klass)
GObjectClass *object_class = G_OBJECT_CLASS (klass);
object_class->dispose = dispose;
- object_class->constructed = constructed;
object_class->finalize = finalize;
object_class->get_property = get_property;
object_class->set_property = set_property;
@@ -162,29 +160,13 @@ dispose (GObject *object)
}
static void
-constructed (GObject *object)
-{
- TrackerResourcePrivate *priv;
-
- priv = GET_PRIVATE (TRACKER_RESOURCE (object));
-
- if (! priv->identifier) {
- priv->identifier = generate_blank_node_identifier ();
- }
-
- G_OBJECT_CLASS (tracker_resource_parent_class)->constructed (object);
-}
-
-static void
finalize (GObject *object)
{
TrackerResourcePrivate *priv;
priv = GET_PRIVATE (TRACKER_RESOURCE (object));
- if (priv->identifier) {
- g_free (priv->identifier);
- }
+ g_clear_pointer (&priv->identifier, g_free);
(G_OBJECT_CLASS (tracker_resource_parent_class)->finalize)(object);
}
@@ -195,13 +177,9 @@ get_property (GObject *object,
GValue *value,
GParamSpec *pspec)
{
- TrackerResourcePrivate *priv;
-
- priv = GET_PRIVATE (TRACKER_RESOURCE (object));
-
switch (param_id) {
case PROP_IDENTIFIER:
- g_value_set_string (value, priv->identifier);
+ g_value_set_string (value, tracker_resource_get_identifier (TRACKER_RESOURCE (object)));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
@@ -855,6 +833,9 @@ tracker_resource_get_identifier (TrackerResource *self)
priv = GET_PRIVATE (self);
+ if (!priv->identifier)
+ priv->identifier = generate_blank_node_identifier ();
+
return priv->identifier;
}
@@ -881,19 +862,8 @@ tracker_resource_set_identifier (TrackerResource *self,
priv = GET_PRIVATE (self);
- g_free (priv->identifier);
-
- if (identifier == NULL) {
- /* We take NULL to mean "this is a blank node", and generate a
- * unique blank node identifier right away. This is easier than
- * leaving it NULL and trying to generate a blank node ID at
- * serialization time, and it means that the serialization
- * output is stable when called multiple times.
- */
- priv->identifier = generate_blank_node_identifier ();
- } else {
- priv->identifier = g_strdup (identifier);
- }
+ g_clear_pointer (&priv->identifier, g_free);
+ priv->identifier = g_strdup (identifier);
}
/**
@@ -911,14 +881,10 @@ gint
tracker_resource_identifier_compare_func (TrackerResource *resource,
const char *identifier)
{
- TrackerResourcePrivate *priv;
-
g_return_val_if_fail (TRACKER_IS_RESOURCE (resource), 0);
g_return_val_if_fail (identifier != NULL, 0);
- priv = GET_PRIVATE (resource);
-
- return strcmp (priv->identifier, identifier);
+ return strcmp (tracker_resource_get_identifier (resource), identifier);
}
/**
@@ -938,15 +904,11 @@ gint
tracker_resource_compare (TrackerResource *a,
TrackerResource *b)
{
- TrackerResourcePrivate *a_priv, *b_priv;
-
g_return_val_if_fail (TRACKER_IS_RESOURCE (a), 0);
g_return_val_if_fail (TRACKER_IS_RESOURCE (b), 0);
- a_priv = GET_PRIVATE (a);
- b_priv = GET_PRIVATE (b);
-
- return strcmp (a_priv->identifier, b_priv->identifier);
+ return strcmp (tracker_resource_get_identifier (a),
+ tracker_resource_get_identifier (b));
}
/**
@@ -1324,7 +1286,8 @@ generate_sparql_delete_queries (TrackerResource *resource,
}
g_string_append (data->string, " ");
- generate_turtle_uri_value (priv->identifier, data->string, data->namespaces, NULL);
+ generate_turtle_uri_value (tracker_resource_get_identifier (resource),
+ data->string, data->namespaces, NULL);
g_string_append_printf (data->string, " %s ?%s }", property, variable_name);
g_free (variable_name);
@@ -1349,7 +1312,7 @@ generate_sparql_deletes (TrackerResource *resource,
data->done_list = g_list_prepend (data->done_list, resource);
- if (! is_blank_node (priv->identifier) && g_hash_table_size (priv->overwrite) > 0) {
+ if (!tracker_resource_is_blank_node (resource) && g_hash_table_size (priv->overwrite) > 0) {
generate_sparql_delete_queries (resource, priv->overwrite, data);
}
@@ -1377,7 +1340,8 @@ generate_sparql_insert_pattern (TrackerResource *resource,
/* First, emit any sub-resources. */
g_hash_table_foreach (priv->properties, generate_sparql_relation_inserts_foreach, data);
- generate_turtle_uri_value (priv->identifier, data->string, data->namespaces, NULL);
+ generate_turtle_uri_value (tracker_resource_get_identifier (resource),
+ data->string, data->namespaces, NULL);
g_string_append_printf (data->string, " ");
/* rdf:type needs to be first, otherwise you'll see 'subject x is not in domain y'
@@ -1506,7 +1470,7 @@ tracker_resource_generate_jsonld (TrackerResource *self,
* (where the caller passed NULL as an identifier) than to emit something
* SPARQL-specific like '_:123'.
*/
- if (strncmp (priv->identifier, "_:", 2) != 0) {
+ if (!tracker_resource_is_blank_node (self)) {
json_builder_set_member_name (builder, "@id");
json_builder_add_string_value (builder, priv->identifier);
}
@@ -1794,8 +1758,7 @@ tracker_resource_serialize (TrackerResource *resource)
g_variant_builder_init (&builder, G_VARIANT_TYPE_ARRAY);
- if (priv->identifier &&
- strncmp (priv->identifier, "_:", 2) != 0) {
+ if (!tracker_resource_is_blank_node (resource)) {
g_variant_builder_add (&builder, "{sv}", "@id",
g_variant_new_string (priv->identifier));
}
@@ -2034,3 +1997,22 @@ tracker_resource_iterator_next (TrackerResourceIterator *iter,
*value = val;
return TRUE;
}
+
+const gchar *
+tracker_resource_get_identifier_internal (TrackerResource *resource)
+{
+ TrackerResourcePrivate *priv = GET_PRIVATE (resource);
+
+ return priv->identifier;
+}
+
+gboolean
+tracker_resource_is_blank_node (TrackerResource *resource)
+{
+ TrackerResourcePrivate *priv = GET_PRIVATE (resource);
+
+ if (!priv->identifier)
+ return TRUE;
+
+ return strncmp (priv->identifier, "_:", 2) == 0;
+}