[tracker/perf: 3/4] libtracker-data: Avoid querying for ID twice when inserting resources



commit de3b5d130a0c41a86e8558568a7b8c7e7ad76ea5
Author: Jürg Billeter <j bitron ch>
Date:   Wed Dec 16 16:46:01 2009 +0100

    libtracker-data: Avoid querying for ID twice when inserting resources

 src/libtracker-data/tracker-data-update.c |   17 ++++++++++-------
 1 files changed, 10 insertions(+), 7 deletions(-)
---
diff --git a/src/libtracker-data/tracker-data-update.c b/src/libtracker-data/tracker-data-update.c
index 44831d8..d620d02 100644
--- a/src/libtracker-data/tracker-data-update.c
+++ b/src/libtracker-data/tracker-data-update.c
@@ -374,7 +374,8 @@ query_resource_id (const gchar *uri)
 }
 
 static guint32
-ensure_resource_id (const gchar *uri)
+ensure_resource_id (const gchar *uri,
+                    gboolean    *create)
 {
 	TrackerDBInterface *iface, *common;
 	TrackerDBStatement *stmt;
@@ -383,6 +384,10 @@ ensure_resource_id (const gchar *uri)
 
 	id = query_resource_id (uri);
 
+	if (create) {
+		*create = (id == 0);
+	}
+
 	if (id == 0) {
 		/* object resource not yet in the database */
 		common = tracker_db_manager_get_db_interface ();
@@ -502,7 +507,7 @@ tracker_data_resource_buffer_flush (GError **error)
 				/* remove entry from rdf:type table */
 				stmt = tracker_db_interface_create_statement (iface, "DELETE FROM \"rdfs:Resource_rdf:type\" WHERE ID = ? AND \"rdf:type\" = ?");
 				tracker_db_statement_bind_int (stmt, 0, resource_buffer->id);
-				tracker_db_statement_bind_int (stmt, 1, ensure_resource_id (tracker_class_get_uri (table->class)));
+				tracker_db_statement_bind_int (stmt, 1, ensure_resource_id (tracker_class_get_uri (table->class), NULL));
 				tracker_db_statement_execute (stmt, &actual_error);
 				g_object_unref (stmt);
 
@@ -748,7 +753,7 @@ cache_create_service_decomposed (TrackerClass *cl,
 
 	cache_insert_row (cl);
 
-	g_value_set_int (&gvalue, ensure_resource_id (tracker_class_get_uri (cl)));
+	g_value_set_int (&gvalue, ensure_resource_id (tracker_class_get_uri (cl), NULL));
 	cache_insert_value ("rdfs:Resource_rdf:type", "rdf:type", &gvalue, TRUE, FALSE);
 
 	tracker_class_set_count (cl, tracker_class_get_count (cl) + 1);
@@ -1004,7 +1009,7 @@ string_to_gvalue (const gchar         *value,
 		g_value_set_int (gvalue, tracker_string_to_date (value));
 		break;
 	case TRACKER_PROPERTY_TYPE_RESOURCE:
-		object_id = ensure_resource_id (value);
+		object_id = ensure_resource_id (value, NULL);
 		g_value_init (gvalue, G_TYPE_UINT);
 		g_value_set_uint (gvalue, object_id);
 		break;
@@ -1390,11 +1395,9 @@ tracker_data_insert_statement_common (const gchar            *graph,
 		/* subject not yet in cache, retrieve or create ID */
 		resource_buffer = g_slice_new0 (TrackerDataUpdateBufferResource);
 		resource_buffer->subject = g_strdup (subject);
-		resource_buffer->id = query_resource_id (resource_buffer->subject);
-		resource_buffer->create = (resource_buffer->id == 0);
+		resource_buffer->id = ensure_resource_id (resource_buffer->subject, &resource_buffer->create);
 		resource_buffer->fts_updated = FALSE;
 		if (resource_buffer->create) {
-			resource_buffer->id = ensure_resource_id (resource_buffer->subject);
 			resource_buffer->types = g_ptr_array_new ();
 		} else {
 			resource_buffer->types = tracker_data_query_rdf_type (resource_buffer->id);



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