[tracker/wip/carlosg/data-update-error-propagation: 3/11] libtracker-data: Improve error handling with modseq management
- From: Carlos Garnacho <carlosg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [tracker/wip/carlosg/data-update-error-propagation: 3/11] libtracker-data: Improve error handling with modseq management
- Date: Sun, 21 Feb 2021 19:31:58 +0000 (UTC)
commit b9df73960b68b91445e3741abb93ea0dd843ab94
Author: Carlos Garnacho <carlosg gnome org>
Date: Sun Feb 21 18:06:52 2021 +0100
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.
src/libtracker-data/tracker-data-update.c | 37 ++++++++++++++++++-------------
1 file 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++;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]