summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2021-02-21 18:06:52 +0100
committerCarlos Garnacho <carlosg@gnome.org>2021-02-21 20:29:04 +0100
commitb9df73960b68b91445e3741abb93ea0dd843ab94 (patch)
treecd08db6a614aeb07eafe762f038b9f7c86c9b30e
parent3b58109fa2805f5490aeec6aee6877c779e98f4a (diff)
downloadtracker-b9df73960b68b91445e3741abb93ea0dd843ab94.tar.gz
libtracker-data: Improve error handling with modseq management
Instead of initializing the modseq from the database at a random point without possibility of error propagation, ensure this is initialized when beginning the first non-ontology transaction, and propagate the possible error. This allows the rest of the modseq code be oblivious about GErrors without shame.
-rw-r--r--src/libtracker-data/tracker-data-update.c37
1 files changed, 21 insertions, 16 deletions
diff --git a/src/libtracker-data/tracker-data-update.c b/src/libtracker-data/tracker-data-update.c
index 9ad19b009..f78ccaf39 100644
--- a/src/libtracker-data/tracker-data-update.c
+++ b/src/libtracker-data/tracker-data-update.c
@@ -409,39 +409,45 @@ tracker_data_dispatch_delete_statement_callbacks (TrackerData *data,
}
}
-static gint
-tracker_data_update_get_next_modseq (TrackerData *data)
+static gboolean
+tracker_data_update_initialize_modseq (TrackerData *data,
+ GError **error)
{
TrackerDBCursor *cursor = NULL;
TrackerDBInterface *temp_iface;
TrackerDBStatement *stmt;
- GError *error = NULL;
+ GError *inner_error = NULL;
gint max_modseq = 0;
+ /* Is it already initialized? */
+ if (data->transaction_modseq != 0)
+ return TRUE;
+
temp_iface = tracker_data_manager_get_writable_db_interface (data->manager);
- stmt = tracker_db_interface_create_statement (temp_iface, TRACKER_DB_STATEMENT_CACHE_TYPE_SELECT, &error,
+ stmt = tracker_db_interface_create_statement (temp_iface, TRACKER_DB_STATEMENT_CACHE_TYPE_SELECT, &inner_error,
"SELECT MAX(\"nrl:modified\") AS A FROM \"rdfs:Resource\"");
if (stmt) {
- cursor = tracker_db_statement_start_cursor (stmt, &error);
+ cursor = tracker_db_statement_start_cursor (stmt, &inner_error);
g_object_unref (stmt);
}
if (cursor) {
- if (tracker_db_cursor_iter_next (cursor, NULL, &error)) {
- max_modseq = MAX (tracker_db_cursor_get_int (cursor, 0), max_modseq);
+ if (tracker_db_cursor_iter_next (cursor, NULL, &inner_error)) {
+ max_modseq = tracker_db_cursor_get_int (cursor, 0);
+ data->transaction_modseq = max_modseq + 1;
}
g_object_unref (cursor);
}
- if (G_UNLIKELY (error)) {
- g_warning ("Could not get new resource ID: %s\n", error->message);
- g_error_free (error);
+ if (G_UNLIKELY (inner_error)) {
+ g_propagate_error (error, inner_error);
+ return FALSE;
}
- return ++max_modseq;
+ return TRUE;
}
static void
@@ -514,10 +520,6 @@ tracker_data_new (TrackerDataManager *manager)
static gint
get_transaction_modseq (TrackerData *data)
{
- if (G_UNLIKELY (data->transaction_modseq == 0)) {
- data->transaction_modseq = tracker_data_update_get_next_modseq (data);
- }
-
/* Always use 1 for ontology transactions */
if (data->in_ontology_transaction) {
return 1;
@@ -2801,6 +2803,10 @@ tracker_data_begin_transaction (TrackerData *data,
return;
}
+ if (!data->in_ontology_transaction &&
+ !tracker_data_update_initialize_modseq (data, error))
+ return;
+
data->resource_time = time (NULL);
data->has_persistent = FALSE;
@@ -2858,7 +2864,6 @@ tracker_data_commit_transaction (TrackerData *data,
return;
}
- get_transaction_modseq (data);
if (data->has_persistent && !data->in_ontology_transaction) {
data->transaction_modseq++;
}