summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSam Thursfield <sam@afuera.me.uk>2020-12-11 10:59:46 +0000
committerSam Thursfield <sam@afuera.me.uk>2020-12-11 10:59:46 +0000
commit2696e63003d56dbc3e550e6965b308a77c75785c (patch)
tree96c689dc76e901f75385071ae30ee2668daf389b
parent011d335a80471c6c6ab53f1ceecf46c2f2b56b30 (diff)
parentb2a60f683cc21f7e1a756bce1a1098c394bfdc2c (diff)
downloadtracker-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.c128
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);