[tracker/journal: 15/21] libtracker-data: STATEMENT_DELETE_ID journal replay performance improvement



commit ea30ec38d901c432a06f15cecc9e3a9020176809
Author: Philip Van Hoof <philip codeminded be>
Date:   Mon Mar 15 18:10:47 2010 +0100

    libtracker-data: STATEMENT_DELETE_ID journal replay performance improvement

 src/libtracker-data/tracker-data-update.c |   85 ++++++++++++++---------------
 1 files changed, 41 insertions(+), 44 deletions(-)
---
diff --git a/src/libtracker-data/tracker-data-update.c b/src/libtracker-data/tracker-data-update.c
index d671b02..1456666 100644
--- a/src/libtracker-data/tracker-data-update.c
+++ b/src/libtracker-data/tracker-data-update.c
@@ -1244,7 +1244,8 @@ cache_set_metadata_decomposed (TrackerProperty  *property,
 
 static gboolean
 delete_metadata_decomposed (TrackerProperty  *property,
-                            const gchar              *value,
+                            const gchar      *value,
+                            gint              value_id,
                             GError          **error)
 {
 	gboolean            multiple_values, fts;
@@ -1269,11 +1270,15 @@ delete_metadata_decomposed (TrackerProperty  *property,
 		return FALSE;
 	}
 
-	string_to_gvalue (value, tracker_property_get_data_type (property), &gvalue, &new_error);
-
-	if (new_error) {
-		g_propagate_error (error, new_error);
-		return FALSE;
+	if (value) {
+		string_to_gvalue (value, tracker_property_get_data_type (property), &gvalue, &new_error);
+		if (new_error) {
+			g_propagate_error (error, new_error);
+			return FALSE;
+		}
+	} else {
+		g_value_init (&gvalue, G_TYPE_INT);
+		g_value_set_int (&gvalue, value_id);
 	}
 
 	if (!value_set_remove_value (old_values, &gvalue)) {
@@ -1289,7 +1294,7 @@ delete_metadata_decomposed (TrackerProperty  *property,
 	/* also delete super property values */
 	super_properties = tracker_property_get_super_properties (property);
 	while (*super_properties) {
-		delete_metadata_decomposed (*super_properties, value, error);
+		delete_metadata_decomposed (*super_properties, value, 0, error);
 		super_properties++;
 	}
 
@@ -1512,7 +1517,7 @@ tracker_data_delete_statement (const gchar  *graph,
 		if (field != NULL) {
 			gint id;
 
-			change = delete_metadata_decomposed (field, object, error);
+			change = delete_metadata_decomposed (field, object, 0, error);
 
 			id = tracker_property_get_id (field);
 			if (!in_journal_replay && change) {
@@ -2424,31 +2429,6 @@ tracker_data_sync (void)
 	tracker_db_journal_fsync ();
 }
 
-static gchar *
-query_resource_by_id (gint id)
-{
-	TrackerDBCursor *cursor;
-	TrackerDBInterface *iface;
-	TrackerDBStatement *stmt;
-	gchar *uri;
-
-	g_return_val_if_fail (id > 0, NULL);
-
-	iface = tracker_db_manager_get_db_interface ();
-
-	stmt = tracker_db_interface_create_statement (iface,
-	                                              "SELECT Uri FROM Resource WHERE ID = ?");
-	tracker_db_statement_bind_int (stmt, 0, id);
-	cursor = tracker_db_statement_start_cursor (stmt, NULL);
-	g_object_unref (stmt);
-
-	tracker_db_cursor_iter_next (cursor);
-	uri = g_strdup (tracker_db_cursor_get_string (cursor, 0));
-	g_object_unref (cursor);
-
-	return uri;
-}
-
 void
 tracker_data_replay_journal (GHashTable *classes,
                              GHashTable *properties)
@@ -2463,9 +2443,8 @@ tracker_data_replay_journal (GHashTable *classes,
 	tracker_db_journal_reader_init (NULL);
 
 	while (tracker_db_journal_reader_next (&journal_error)) {
-		GError *error = NULL;
 		TrackerDBJournalEntryType type;
-		const gchar *graph, *subject, *predicate, *object;
+		const gchar *object;
 		gint graph_id, subject_id, predicate_id, object_id;
 
 		type = tracker_db_journal_reader_get_type ();
@@ -2580,7 +2559,7 @@ tracker_data_replay_journal (GHashTable *classes,
 						g_warning ("Journal replay error: 'class with '%s' not found in the ontology'", object);
 					}
 				} else {
-					delete_metadata_decomposed (property, object, &new_error);
+					delete_metadata_decomposed (property, object, 0, &new_error);
 				}
 
 				if (new_error) {
@@ -2593,18 +2572,36 @@ tracker_data_replay_journal (GHashTable *classes,
 			}
 
 		} else if (type == TRACKER_DB_JOURNAL_DELETE_STATEMENT_ID) {
+			TrackerClass *class = NULL;
+			TrackerProperty *property;
+
 			tracker_db_journal_reader_get_statement_id (&graph_id, &subject_id, &predicate_id, &object_id);
 
-			if (graph_id > 0) {
-				graph = query_resource_by_id (graph_id);
+			property = g_hash_table_lookup (properties, GINT_TO_POINTER (predicate_id));
+			class = g_hash_table_lookup (classes, GINT_TO_POINTER (object_id));
+
+			if (property && class) {
+
+				resource_buffer_switch (NULL, graph_id, NULL, subject_id);
+
+				if (property == rdf_type) {
+					cache_delete_resource_type (class, NULL, graph_id);
+				} else {
+					GError *new_error = NULL;
+
+					delete_metadata_decomposed (property, NULL, object_id, &new_error);
+
+					if (new_error) {
+						g_warning ("Journal replay error: '%s'", new_error->message);
+						g_error_free (new_error);
+					}
+				}
 			} else {
-				graph = NULL;
+				if (!class)
+					g_warning ("Journal replay error: 'class with ID %d not found in the ontology'", object_id);
+				if (!property)
+					g_warning ("Journal replay error: 'property with ID %d doesn't exist'", predicate_id);
 			}
-			subject = query_resource_by_id (subject_id);
-			predicate = query_resource_by_id (predicate_id);
-			object = query_resource_by_id (object_id);
-
-			tracker_data_delete_statement (graph, subject, predicate, object, &error);
 		}
 	}
 



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