[tracker/wip/carlosg/update-perf: 37/43] core: Keep statement to query resource IDs




commit ae80b31f48dc04a7861f150dcaade1e8bb5af493
Author: Carlos Garnacho <carlosg gnome org>
Date:   Sat Aug 20 15:49:49 2022 +0200

    core: Keep statement to query resource IDs
    
    This is quite a hot path during updates of already existing resources,
    it makes sense to keep the statement around, instead of resorting to
    cache lookups.

 src/libtracker-sparql/core/tracker-data-update.c | 45 +++++++++++++++++++-----
 1 file changed, 36 insertions(+), 9 deletions(-)
---
diff --git a/src/libtracker-sparql/core/tracker-data-update.c 
b/src/libtracker-sparql/core/tracker-data-update.c
index ad6fcbce9..d6cedd85d 100644
--- a/src/libtracker-sparql/core/tracker-data-update.c
+++ b/src/libtracker-sparql/core/tracker-data-update.c
@@ -93,6 +93,7 @@ struct _TrackerDataUpdateBuffer {
        GPtrArray *graphs;
        /* Statement to insert in Resource table */
        TrackerDBStatement *insert_resource;
+       TrackerDBStatement *query_resource;
 
        /* Array of TrackerDataPropertyEntry */
        GArray *properties;
@@ -668,6 +669,7 @@ tracker_data_finalize (GObject *object)
        g_clear_pointer (&data->update_buffer.update_log, g_array_unref);
        g_clear_pointer (&data->update_buffer.class_updates, g_hash_table_unref);
        g_clear_object (&data->update_buffer.insert_resource);
+       g_clear_object (&data->update_buffer.query_resource);
        tracker_db_statement_mru_finish (&data->update_buffer.stmt_mru);
 
        g_clear_pointer (&data->insert_callbacks, g_ptr_array_unref);
@@ -887,23 +889,48 @@ query_resource_id (TrackerData  *data,
                    GError      **error)
 {
        TrackerDBInterface *iface;
-       TrackerRowid *value, id;
+       TrackerDBStatement *stmt;
+       TrackerRowid *value, id = 0;
+       GError *inner_error = NULL;
+       GArray *res = NULL;
 
        value = g_hash_table_lookup (data->update_buffer.resource_cache, uri);
+       if (value)
+               return *value;
 
-       if (value == NULL) {
+       stmt = data->update_buffer.query_resource;
+       if (!stmt) {
                iface = tracker_data_manager_get_writable_db_interface (data->manager);
-               id = tracker_data_query_resource_id (data->manager, iface, uri, error);
+               stmt = data->update_buffer.query_resource =
+                       tracker_db_interface_create_statement (iface,
+                                                              TRACKER_DB_STATEMENT_CACHE_TYPE_NONE,
+                                                              &inner_error,
+                                                              "SELECT ID FROM Resource WHERE Uri = ?");
+       }
 
-               if (id != 0) {
-                       g_hash_table_insert (data->update_buffer.resource_cache, g_strdup (uri),
-                                            tracker_rowid_copy (&id));
-               }
+       if (stmt) {
+               tracker_db_statement_bind_text (stmt, 0, uri);
+               res = tracker_db_statement_get_values (stmt,
+                                                      TRACKER_PROPERTY_TYPE_INTEGER,
+                                                      &inner_error);
+       }
 
-               return id;
+       if (G_UNLIKELY (inner_error)) {
+               g_propagate_prefixed_error (error,
+                                           inner_error,
+                                           "Querying resource ID:");
+               return 0;
+       }
+
+       if (res && res->len == 1) {
+               id = g_value_get_int64 (&g_array_index (res, GValue, 0));
+               g_hash_table_insert (data->update_buffer.resource_cache, g_strdup (uri),
+                                    tracker_rowid_copy (&id));
        }
 
-       return *value;
+       g_clear_pointer (&res, g_array_unref);
+
+       return id;
 }
 
 static gboolean


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