summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2022-08-20 16:41:34 +0200
committerCarlos Garnacho <carlosg@gnome.org>2022-08-30 17:38:57 +0200
commitd6203d051fa290b7222364361f2e28ca06fbf3cc (patch)
treefcd3cdae38d3c775b1b91abde0cee4eeb0878f5d
parentf2454c990c91dc5f181502dd834941df84008637 (diff)
downloadtracker-d6203d051fa290b7222364361f2e28ca06fbf3cc.tar.gz
core: Avoid finding out resource insertion through GError
When ensuring that a resource IRI is known in the database, we optimize for newly added resources and try to insert them without further checks, only resorting to a query to fetch the resource ID if that insertion failed. But we figure it out after getting a GError, and clearing it. Instead, just check the return value, so that we don't create/free errors for every resource where that assumption fails. Also, we failed to cache the resource if the second querying step was taken, fix that to get another nice speed improvement.
-rw-r--r--src/libtracker-sparql/core/tracker-data-update.c48
1 files changed, 19 insertions, 29 deletions
diff --git a/src/libtracker-sparql/core/tracker-data-update.c b/src/libtracker-sparql/core/tracker-data-update.c
index a384ff9f9..9bb741020 100644
--- a/src/libtracker-sparql/core/tracker-data-update.c
+++ b/src/libtracker-sparql/core/tracker-data-update.c
@@ -960,8 +960,7 @@ tracker_data_update_ensure_resource (TrackerData *data,
TrackerDBManagerFlags db_flags;
TrackerDBInterface *iface;
TrackerDBStatement *stmt = NULL;
- GError *inner_error = NULL;
- gchar *key;
+ gboolean inserted;
TrackerRowid *value, id = 0;
TrackerOntologies *ontologies;
TrackerClass *class;
@@ -1005,37 +1004,28 @@ tracker_data_update_ensure_resource (TrackerData *data,
return id;
}
- if (tracker_data_ensure_insert_resource_stmt (data, &inner_error)) {
- stmt = data->update_buffer.insert_resource;
- tracker_db_statement_bind_text (stmt, 0, uri);
- tracker_db_statement_bind_int (stmt, 1, FALSE);
- tracker_db_statement_execute (stmt, &inner_error);
- }
-
- if (inner_error) {
- if (g_error_matches (inner_error,
- TRACKER_DB_INTERFACE_ERROR,
- TRACKER_DB_CONSTRAINT)) {
- g_clear_error (&inner_error);
- id = query_resource_id (data, uri, &inner_error);
-
- if (id != 0)
- return id;
- }
+ if (!tracker_data_ensure_insert_resource_stmt (data, error))
+ return 0;
- g_propagate_error (error, inner_error);
+ stmt = data->update_buffer.insert_resource;
+ tracker_db_statement_bind_text (stmt, 0, uri);
+ tracker_db_statement_bind_int (stmt, 1, FALSE);
+ inserted = tracker_db_statement_execute (stmt, NULL);
- return 0;
+ if (inserted) {
+ iface = tracker_data_manager_get_writable_db_interface (data->manager);
+ id = tracker_db_interface_sqlite_get_last_insert_id (iface);
+ g_hash_table_add (data->update_buffer.new_resources,
+ tracker_rowid_copy (&id));
+ } else {
+ id = query_resource_id (data, uri, error);
}
- iface = tracker_data_manager_get_writable_db_interface (data->manager);
- id = tracker_db_interface_sqlite_get_last_insert_id (iface);
- key = g_strdup (uri);
- g_hash_table_insert (data->update_buffer.resource_cache, key,
- tracker_rowid_copy (&id));
-
- g_hash_table_add (data->update_buffer.new_resources,
- tracker_rowid_copy (&id));
+ if (id != 0) {
+ g_hash_table_insert (data->update_buffer.resource_cache,
+ g_strdup (uri),
+ tracker_rowid_copy (&id));
+ }
return id;
}