[tracker] libtracker-data: Never delete URI <-> ID mapping
- From: Jürg Billeter <juergbi src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [tracker] libtracker-data: Never delete URI <-> ID mapping
- Date: Thu, 14 Jan 2010 10:40:54 +0000 (UTC)
commit ef4068797a7ea786ac0fa1705aaa6ccccfc32f27
Author: Jürg Billeter <j bitron ch>
Date: Thu Jan 14 11:38:31 2010 +0100
libtracker-data: Never delete URI <-> ID mapping
Deleting URI <-> ID mapping may cause dangling references leading to
issues in subsequent queries.
Fixes NB#151295.
src/libtracker-data/tracker-data-update.c | 54 +++++++++++++++++++++++++++++
1 files changed, 54 insertions(+), 0 deletions(-)
---
diff --git a/src/libtracker-data/tracker-data-update.c b/src/libtracker-data/tracker-data-update.c
index 6303673..d51b6c3 100644
--- a/src/libtracker-data/tracker-data-update.c
+++ b/src/libtracker-data/tracker-data-update.c
@@ -511,6 +511,60 @@ tracker_data_resource_buffer_flush (GError **error)
return;
}
+ if (strcmp (table_name, "rdfs:Resource") == 0) {
+ TrackerProperty **properties, *property;
+ guint n_props;
+ gboolean first;
+
+ /* never delete Uri <-> ID mapping to avoid dangling references,
+ do remove property values, though */
+
+ sql = g_string_new ("UPDATE \"rdfs:Resource\" SET");
+ first = TRUE;
+
+ properties = tracker_ontology_get_properties (&n_props);
+ for (i = 0; i < n_props; i++) {
+ property = properties[i];
+
+ if (tracker_property_get_multiple_values (property)) {
+ continue;
+ }
+
+ if (strcmp (tracker_class_get_name (tracker_property_get_domain (property)), table_name) == 0) {
+ if (strcmp (tracker_property_get_name (property), "tracker:added") == 0 ||
+ strcmp (tracker_property_get_name (property), "tracker:modified") == 0) {
+ /* do not touch tracker:added or tracker:modified */
+ continue;
+ }
+
+ /* set all other property columns to NULL */
+ if (first) {
+ first = FALSE;
+ } else {
+ g_string_append (sql, ",");
+ }
+ g_string_append_printf (sql, " \"%s\" = NULL",
+ tracker_property_get_name (property));
+ }
+ }
+
+ g_string_append (sql, " WHERE ID = ?");
+
+ stmt = tracker_db_interface_create_statement (iface, "%s", sql->str);
+ tracker_db_statement_bind_int (stmt, 0, resource_buffer->id);
+ tracker_db_statement_execute (stmt, &actual_error);
+ g_object_unref (stmt);
+
+ g_string_free (sql, TRUE);
+
+ if (actual_error) {
+ g_propagate_error (error, actual_error);
+ return;
+ }
+
+ continue;
+ }
+
/* remove row from class table */
stmt = tracker_db_interface_create_statement (iface, "DELETE FROM \"%s\" WHERE ID = ?", table_name);
tracker_db_statement_bind_int (stmt, 0, resource_buffer->id);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]