diff options
author | Sam Thursfield <sam@afuera.me.uk> | 2020-12-11 10:59:46 +0000 |
---|---|---|
committer | Sam Thursfield <sam@afuera.me.uk> | 2020-12-11 10:59:46 +0000 |
commit | 2696e63003d56dbc3e550e6965b308a77c75785c (patch) | |
tree | 96c689dc76e901f75385071ae30ee2668daf389b | |
parent | 011d335a80471c6c6ab53f1ceecf46c2f2b56b30 (diff) | |
parent | b2a60f683cc21f7e1a756bce1a1098c394bfdc2c (diff) | |
download | tracker-2696e63003d56dbc3e550e6965b308a77c75785c.tar.gz |
Merge branch 'wip/carlosg/batches-and-resources' into 'master'
TrackerBatch fixes
See merge request GNOME/tracker!357
-rw-r--r-- | src/libtracker-data/tracker-data-update.c | 128 |
1 files changed, 84 insertions, 44 deletions
diff --git a/src/libtracker-data/tracker-data-update.c b/src/libtracker-data/tracker-data-update.c index cb2f39eff..2f461f4dc 100644 --- a/src/libtracker-data/tracker-data-update.c +++ b/src/libtracker-data/tracker-data-update.c @@ -1567,13 +1567,13 @@ get_bnode_for_resource (GHashTable *bnodes, const gchar *identifier; gchar *bnode; - bnode = g_hash_table_lookup (bnodes, resource); + identifier = tracker_resource_get_identifier (resource); + bnode = g_hash_table_lookup (bnodes, identifier); if (bnode) return bnode; iface = tracker_data_manager_get_writable_db_interface (data->manager); bnode = tracker_data_update_ensure_new_bnode (data, iface, NULL); - identifier = tracker_resource_get_identifier (resource); g_hash_table_insert (bnodes, g_strdup (identifier), bnode); return bnode; @@ -1648,6 +1648,18 @@ bytes_from_gvalue (GValue *gvalue, object = get_bnode_for_resource (bnodes, data, res); *bytes = g_bytes_new (object, strlen (object) + 1); + } else if (G_VALUE_HOLDS (gvalue, TRACKER_TYPE_DATE_TIME)) { + gdouble time; + gint offset; + + time = tracker_date_time_get_time (gvalue); + offset = tracker_date_time_get_offset (gvalue); + str = tracker_date_to_string (time, offset); + + *bytes = g_bytes_new_take (str, strlen (str) + 1); + } else { + g_warning ("Conversion to bytes unavailable for type %s", + G_VALUE_TYPE_NAME (gvalue)); } } @@ -2207,7 +2219,7 @@ tracker_data_delete_statement (TrackerData *data, } } -static void +static gboolean tracker_data_delete_all (TrackerData *data, const gchar *graph, const gchar *subject, @@ -2219,21 +2231,20 @@ tracker_data_delete_all (TrackerData *data, TrackerProperty *property; GArray *old_values; GError *inner_error = NULL; - guint i; - g_return_if_fail (subject != NULL); - g_return_if_fail (predicate != NULL); - g_return_if_fail (data->in_transaction); + g_return_val_if_fail (subject != NULL, FALSE); + g_return_val_if_fail (predicate != NULL, FALSE); + g_return_val_if_fail (data->in_transaction, FALSE); subject_id = query_resource_id (data, subject); if (subject_id == 0) { /* subject not in database */ - return; + return FALSE; } if (!resource_buffer_switch (data, graph, subject, error)) - return; + return FALSE; ontologies = tracker_data_manager_get_ontologies (data->manager); property = tracker_ontologies_get_property_by_uri (ontologies, @@ -2241,30 +2252,28 @@ tracker_data_delete_all (TrackerData *data, old_values = get_old_property_values (data, property, &inner_error); if (inner_error) { g_propagate_error (error, inner_error); - return; + return FALSE; + } else if (!old_values || old_values->len == 0) { + return FALSE; } - for (i = 0; i < old_values->len; i++) { - GValue *value; - GBytes *bytes; - - value = &g_array_index (old_values, GValue, i); - bytes_from_gvalue (value, - &bytes, - data, - NULL); - - tracker_data_delete_statement (data, graph, subject, - predicate, bytes, - &inner_error); - g_bytes_unref (bytes); - - if (inner_error) - break; + if (tracker_property_get_multiple_values (property)) { + cache_delete_all_values (data, + tracker_property_get_table_name (property), + tracker_property_get_name (property), + tracker_property_get_fulltext_indexed (property), + tracker_property_get_data_type (property) == TRACKER_PROPERTY_TYPE_DATETIME); + } else { + cache_delete_value (data, + tracker_property_get_table_name (property), + tracker_property_get_name (property), + &g_array_index (old_values, GValue, 0), + FALSE, + tracker_property_get_fulltext_indexed (property), + tracker_property_get_data_type (property) == TRACKER_PROPERTY_TYPE_DATETIME); } - if (inner_error) - g_propagate_error (error, inner_error); + return TRUE; } static gboolean @@ -2887,11 +2896,12 @@ resource_maybe_reset_property (TrackerData *data, if (g_str_has_prefix (subject, "_:")) return TRUE; - tracker_data_delete_all (data, - graph, subject_uri, property_uri, - &inner_error); - if (inner_error) { - g_propagate_error (error, inner_error); + if (!tracker_data_delete_all (data, + graph, subject_uri, property_uri, + &inner_error)) { + if (inner_error) + g_propagate_error (error, inner_error); + return FALSE; } @@ -2918,14 +2928,6 @@ update_resource_property (TrackerData *data, NULL, NULL, &property_uri); - if (tracker_resource_get_property_overwrite (resource, property) && - !resource_maybe_reset_property (data, graph_uri, resource, - subject, property_uri, - bnodes, error)) { - g_free (property_uri); - return FALSE; - } - for (v = values; v && !inner_error; v = v->next) { GBytes *bytes = NULL; @@ -2977,6 +2979,7 @@ update_resource_single (TrackerData *data, GError *inner_error = NULL; const gchar *subject; gchar *graph_uri = NULL; + gboolean is_bnode = FALSE; if (g_hash_table_lookup (visited, resource)) return TRUE; @@ -2986,8 +2989,10 @@ update_resource_single (TrackerData *data, properties = tracker_resource_get_properties (resource); subject = tracker_resource_get_identifier (resource); - if (!subject || g_str_has_prefix (subject, "_:")) + if (!subject || g_str_has_prefix (subject, "_:")) { + is_bnode = TRUE; subject = get_bnode_for_resource (bnodes, data, resource); + } if (graph) { tracker_data_manager_expand_prefix (data->manager, @@ -3008,6 +3013,40 @@ update_resource_single (TrackerData *data, } } + if (!is_bnode) { + gboolean need_flush = FALSE; + + for (l = properties; l; l = l->next) { + const gchar *property = l->data; + + if (tracker_resource_get_property_overwrite (resource, property)) { + gchar *property_uri; + + tracker_data_manager_expand_prefix (data->manager, + property, + NULL, NULL, + &property_uri); + + if (resource_maybe_reset_property (data, graph_uri, resource, + subject, property_uri, + bnodes, &inner_error)) { + need_flush = TRUE; + } else if (inner_error) { + g_free (property_uri); + goto out; + } + + g_free (property_uri); + } + } + + if (need_flush) { + tracker_data_update_buffer_flush (data, &inner_error); + if (inner_error) + goto out; + } + } + for (l = properties; l; l = l->next) { if (g_str_equal (l->data, "rdf:type")) continue; @@ -3021,6 +3060,7 @@ update_resource_single (TrackerData *data, g_list_free (properties); +out: if (inner_error) { g_propagate_error (error, inner_error); return FALSE; @@ -3075,7 +3115,7 @@ tracker_data_update_ensure_new_bnode (TrackerData *data, } while (TRUE) { - uuid = tracker_generate_uuid ("urn:bnode:"); + uuid = tracker_generate_uuid ("urn:bnode"); tracker_db_statement_bind_text (stmt, 0, uuid); tracker_db_statement_bind_int (stmt, 1, 1); |