[tracker/wip/carlosg/data-update-cleanups: 6/11] libtracker-data: Pass object bytes further down updates



commit dda1142bc588780c4b70c7f7a8626c7a0b7e53a0
Author: Carlos Garnacho <carlosg gnome org>
Date:   Sat Apr 25 17:10:23 2020 +0200

    libtracker-data: Pass object bytes further down updates
    
    Converting it to a GValue at the top of our updates handling may
    slightly break for properties that have superproperties of different
    types.
    
    A practical case, nmm:performer can store nmm:Artist resources, but
    is a subproperty of dc:contributor, which can store strings.
    Converting to a GValue with the "resource" type will look up a
    resource ID, so the superproperty would contain an integer matching
    the ID of the resource, instead of its URI.
    
    To behave better in these situations, pass the GBytes as is further
    down, and convert it to a GValue according to the (super)property
    being currently handled. This results URIs being properly casted to
    strings in this case.

 src/libtracker-data/tracker-data-update.c | 78 ++++++++++++++-----------------
 1 file changed, 35 insertions(+), 43 deletions(-)
---
diff --git a/src/libtracker-data/tracker-data-update.c b/src/libtracker-data/tracker-data-update.c
index dd3ea6401..a96ea1978 100644
--- a/src/libtracker-data/tracker-data-update.c
+++ b/src/libtracker-data/tracker-data-update.c
@@ -158,7 +158,7 @@ static GArray      *get_old_property_values    (TrackerData      *data,
                                                 GError          **error);
 static gboolean     delete_metadata_decomposed (TrackerData      *data,
                                                 TrackerProperty  *property,
-                                                GValue           *gvalue,
+                                                GBytes           *object,
                                                 GError          **error);
 static gboolean     resource_buffer_switch     (TrackerData  *data,
                                                 const gchar  *graph,
@@ -896,7 +896,6 @@ tracker_data_resource_buffer_flush (TrackerData                      *data,
                                if (strcmp (table_name, "rdfs:Resource") == 0) {
                                        g_string_append (sql, ", \"tracker:added\", \"tracker:modified\"");
                                        g_string_append (values_sql, ", ?, ?");
-                               } else {
                                }
                        } else {
                                g_string_append (sql, " SET ");
@@ -1564,7 +1563,7 @@ process_domain_indexes (TrackerData     *data,
 static gboolean
 cache_insert_metadata_decomposed (TrackerData      *data,
                                   TrackerProperty  *property,
-                                  GValue           *value,
+                                  GBytes           *object,
                                   GError          **error)
 {
        gboolean            multiple_values;
@@ -1574,6 +1573,7 @@ cache_insert_metadata_decomposed (TrackerData      *data,
        GArray             *old_values;
        GError             *new_error = NULL;
        gboolean            change = FALSE;
+       GValue              value = G_VALUE_INIT;
 
        /* read existing property values */
        old_values = get_old_property_values (data, property, &new_error);
@@ -1598,7 +1598,7 @@ cache_insert_metadata_decomposed (TrackerData      *data,
                }
 
                if (super_is_multi || super_old_values->len == 0) {
-                       change |= cache_insert_metadata_decomposed (data, *super_properties, value,
+                       change |= cache_insert_metadata_decomposed (data, *super_properties, object,
                                                                    &new_error);
                        if (new_error) {
                                g_propagate_error (error, new_error);
@@ -1608,10 +1608,17 @@ cache_insert_metadata_decomposed (TrackerData      *data,
                super_properties++;
        }
 
+       bytes_to_gvalue (object, tracker_property_get_data_type (property),
+                        &value, data, &new_error);
+       if (new_error) {
+               g_propagate_error (error, new_error);
+               return FALSE;
+       }
+
        table_name = tracker_property_get_table_name (property);
        field_name = tracker_property_get_name (property);
 
-       if (!value_set_add_value (old_values, value)) {
+       if (!value_set_add_value (old_values, &value)) {
                /* value already inserted */
        } else if (!multiple_values && old_values->len > 1) {
                /* trying to add second value to single valued property */
@@ -1650,25 +1657,27 @@ cache_insert_metadata_decomposed (TrackerData      *data,
                g_value_unset (&new_value);
        } else {
                cache_insert_value (data, table_name, field_name,
-                                   value,
+                                   &value,
                                    multiple_values,
                                    tracker_property_get_fulltext_indexed (property),
                                    tracker_property_get_data_type (property) == 
TRACKER_PROPERTY_TYPE_DATETIME);
 
                if (!multiple_values) {
-                       process_domain_indexes (data, property, value, field_name);
+                       process_domain_indexes (data, property, &value, field_name);
                }
 
                change = TRUE;
        }
 
+       g_value_unset (&value);
+
        return change;
 }
 
 static gboolean
 delete_metadata_decomposed (TrackerData      *data,
                             TrackerProperty  *property,
-                            GValue           *value,
+                            GBytes           *object,
                             GError          **error)
 {
        gboolean            multiple_values;
@@ -1678,6 +1687,14 @@ delete_metadata_decomposed (TrackerData      *data,
        GArray             *old_values;
        GError             *new_error = NULL;
        gboolean            change = FALSE;
+       GValue              value = G_VALUE_INIT;
+
+       bytes_to_gvalue (object, tracker_property_get_data_type (property),
+                        &value, data, &new_error);
+       if (new_error) {
+               g_propagate_error (error, new_error);
+               return FALSE;
+       }
 
        multiple_values = tracker_property_get_multiple_values (property);
        table_name = tracker_property_get_table_name (property);
@@ -1687,15 +1704,16 @@ delete_metadata_decomposed (TrackerData      *data,
        old_values = get_old_property_values (data, property, &new_error);
        if (new_error) {
                /* no need to error out if statement does not exist for any reason */
+               g_value_unset (&value);
                g_clear_error (&new_error);
                return FALSE;
        }
 
-       if (!value_set_remove_value (old_values, value)) {
+       if (!value_set_remove_value (old_values, &value)) {
                /* value not found */
        } else {
                cache_delete_value (data, table_name, field_name,
-                                   value, multiple_values,
+                                   &value, multiple_values,
                                    tracker_property_get_fulltext_indexed (property),
                                    tracker_property_get_data_type (property) == 
TRACKER_PROPERTY_TYPE_DATETIME);
 
@@ -1709,7 +1727,7 @@ delete_metadata_decomposed (TrackerData      *data,
                                        cache_delete_value (data,
                                                            tracker_class_get_name (*domain_index_classes),
                                                            field_name,
-                                                           value, multiple_values,
+                                                           &value, multiple_values,
                                                            tracker_property_get_fulltext_indexed (property),
                                                            tracker_property_get_data_type (property) == 
TRACKER_PROPERTY_TYPE_DATETIME);
                                }
@@ -1720,10 +1738,12 @@ delete_metadata_decomposed (TrackerData      *data,
                change = TRUE;
        }
 
+       g_value_unset (&value);
+
        /* also delete super property values */
        super_properties = tracker_property_get_super_properties (property);
        while (*super_properties) {
-               change |= delete_metadata_decomposed (data, *super_properties, value, error);
+               change |= delete_metadata_decomposed (data, *super_properties, object, error);
                super_properties++;
        }
 
@@ -2052,20 +2072,9 @@ tracker_data_delete_statement (TrackerData  *data,
 
                field = tracker_ontologies_get_property_by_uri (ontologies, predicate);
                if (field != NULL) {
-                       GError *inner_error = NULL;
-                       GValue object_value = G_VALUE_INIT;
-
                        pred_id = tracker_property_get_id (field);
                        data->has_persistent = TRUE;
-
-                       bytes_to_gvalue (object, tracker_property_get_data_type (field), &object_value, data, 
&inner_error);
-                       if (inner_error) {
-                               g_propagate_error (error, inner_error);
-                               return;
-                       }
-
-                       change = delete_metadata_decomposed (data, field, &object_value, error);
-                       g_value_unset (&object_value);
+                       change = delete_metadata_decomposed (data, field, object, error);
                } else {
                        g_set_error (error, TRACKER_SPARQL_ERROR, TRACKER_SPARQL_ERROR_UNKNOWN_PROPERTY,
                                     "Property '%s' not found in the ontology", predicate);
@@ -2242,17 +2251,8 @@ tracker_data_insert_statement_with_uri (TrackerData  *data,
 
                change = TRUE;
        } else {
-               GValue object_value = G_VALUE_INIT;
-
-               bytes_to_gvalue (object, tracker_property_get_data_type (property), &object_value, data, 
&actual_error);
-               if (actual_error) {
-                       g_propagate_error (error, actual_error);
-                       return;
-               }
-
                /* add value to metadata database */
-               change = cache_insert_metadata_decomposed (data, property, &object_value, &actual_error);
-               g_value_unset (&object_value);
+               change = cache_insert_metadata_decomposed (data, property, object, &actual_error);
 
                if (actual_error) {
                        g_propagate_error (error, actual_error);
@@ -2294,7 +2294,6 @@ tracker_data_insert_statement_with_string (TrackerData  *data,
        gint             graph_id = 0, pred_id = 0;
        TrackerOntologies *ontologies;
        TrackerDBInterface *iface;
-       GValue object_value = G_VALUE_INIT;
        const gchar *object_str;
 
        g_return_if_fail (subject != NULL);
@@ -2327,15 +2326,8 @@ tracker_data_insert_statement_with_string (TrackerData  *data,
        if (graph)
                graph_id = tracker_data_manager_find_graph (data->manager, graph);
 
-       bytes_to_gvalue (object, tracker_property_get_data_type (property), &object_value, data, 
&actual_error);
-       if (actual_error) {
-               g_propagate_error (error, actual_error);
-               return;
-       }
-
        /* add value to metadata database */
-       change = cache_insert_metadata_decomposed (data, property, &object_value, &actual_error);
-       g_value_unset (&object_value);
+       change = cache_insert_metadata_decomposed (data, property, object, &actual_error);
 
        if (actual_error) {
                g_propagate_error (error, actual_error);


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