diff options
author | Carlos Garnacho <carlosg@gnome.org> | 2023-01-22 21:39:41 +0100 |
---|---|---|
committer | Carlos Garnacho <carlosg@gnome.org> | 2023-01-23 15:51:36 +0100 |
commit | b7f0bd26bdf257ad18de40bcd5aab2dee0bdda74 (patch) | |
tree | 46a5210ac9cab79a53c22cc3974394d33eb19ac3 /src | |
parent | 69db1874b52587442d29d1a5585540e3f87e8b5f (diff) | |
download | tracker-b7f0bd26bdf257ad18de40bcd5aab2dee0bdda74.tar.gz |
libtracker-sparql: Propagate corruption errors up
Right now the handling of those is somewhat inconsistent, we
loudly warn, but simply return FALSE from our stmt_step() function
without setting an error. Fortunately, the most common reason for
those errors has been the soft corruption resulting from FTS
index corruption, so continuing despite the error was alright.
Propagate these error situations properly through a new
TRACKER_SPARQL_ERROR_CORRUPT error code, so that callers can
fail, rollback, or otherwise react upon.
Diffstat (limited to 'src')
-rw-r--r-- | src/libtracker-sparql/core/tracker-db-interface-sqlite.c | 51 | ||||
-rw-r--r-- | src/libtracker-sparql/core/tracker-db-interface.h | 1 | ||||
-rw-r--r-- | src/libtracker-sparql/tracker-error.c | 2 | ||||
-rw-r--r-- | src/libtracker-sparql/tracker-error.h | 2 |
4 files changed, 37 insertions, 19 deletions
diff --git a/src/libtracker-sparql/core/tracker-db-interface-sqlite.c b/src/libtracker-sparql/core/tracker-db-interface-sqlite.c index e4959ce2e..6ec1c1194 100644 --- a/src/libtracker-sparql/core/tracker-db-interface-sqlite.c +++ b/src/libtracker-sparql/core/tracker-db-interface-sqlite.c @@ -2836,18 +2836,6 @@ execute_stmt (TrackerDBInterface *interface, tracker_db_interface_unref_use (interface); if (result != SQLITE_DONE) { - /* This is rather fatal */ - if (errno != ENOSPC && - (sqlite3_errcode (interface->db) == SQLITE_IOERR || - sqlite3_errcode (interface->db) == SQLITE_CORRUPT || - sqlite3_errcode (interface->db) == SQLITE_NOTADB)) { - - g_critical ("SQLite error: %s (errno: %s)", - sqlite3_errmsg (interface->db), - g_strerror (errno)); - return FALSE; - } - if (result == SQLITE_INTERRUPT) { g_set_error (error, TRACKER_DB_INTERFACE_ERROR, @@ -2859,15 +2847,40 @@ execute_stmt (TrackerDBInterface *interface, TRACKER_DB_CONSTRAINT, "Constraint would be broken: %s", sqlite3_errmsg (interface->db)); - } else { + } else if (result == SQLITE_FULL) { g_set_error (error, TRACKER_DB_INTERFACE_ERROR, - errno != ENOSPC ? TRACKER_DB_QUERY_ERROR : TRACKER_DB_NO_SPACE, - "%s%s%s%s", - sqlite3_errmsg (interface->db), - errno != 0 ? " (strerror of errno (not necessarily related): " : "", - errno != 0 ? g_strerror (errno) : "", - errno != 0 ? ")" : ""); + TRACKER_DB_NO_SPACE, + "No space to write database"); + } else { + int db_result; + + db_result = sqlite3_errcode (interface->db); + + if (db_result == SQLITE_CORRUPT || + db_result == SQLITE_NOTADB) { + g_set_error (error, + TRACKER_DB_INTERFACE_ERROR, + TRACKER_DB_CORRUPT, + "Database corrupt: %s", + sqlite3_errmsg (interface->db)); + } else if (db_result == SQLITE_IOERR) { + int db_errno; + + db_errno = sqlite3_system_errno (interface->db); + + g_set_error (error, + TRACKER_DB_INTERFACE_ERROR, + TRACKER_DB_QUERY_ERROR, + "I/O error (errno: %s)", + g_strerror (db_errno)); + } else { + g_set_error (error, + TRACKER_DB_INTERFACE_ERROR, + TRACKER_DB_QUERY_ERROR, + "%s", + sqlite3_errmsg (interface->db)); + } } } diff --git a/src/libtracker-sparql/core/tracker-db-interface.h b/src/libtracker-sparql/core/tracker-db-interface.h index db8381264..7516f980d 100644 --- a/src/libtracker-sparql/core/tracker-db-interface.h +++ b/src/libtracker-sparql/core/tracker-db-interface.h @@ -62,6 +62,7 @@ typedef enum { TRACKER_DB_OPEN_ERROR, TRACKER_DB_NO_SPACE, TRACKER_DB_CONSTRAINT, + TRACKER_DB_CORRUPT, } TrackerDBInterfaceError; typedef enum { diff --git a/src/libtracker-sparql/tracker-error.c b/src/libtracker-sparql/tracker-error.c index a26e955e3..600427433 100644 --- a/src/libtracker-sparql/tracker-error.c +++ b/src/libtracker-sparql/tracker-error.c @@ -38,6 +38,7 @@ static const GDBusErrorEntry tracker_sparql_error_entries[] = {TRACKER_SPARQL_ERROR_UNSUPPORTED, "org.freedesktop.Tracker.Error.Unsupported"}, {TRACKER_SPARQL_ERROR_MISSING_LAST_MODIFIED_HEADER, "org.freedesktop.Tracker.Error.MissingLastModifiedHeader"}, {TRACKER_SPARQL_ERROR_INCOMPLETE_PROPERTY_DEFINITION, "org.freedesktop.Tracker.Error.IncompleteProperty"}, + {TRACKER_SPARQL_ERROR_CORRUPT, "org.freedesktop.Tracker.Error.Corrupt"}, }; G_STATIC_ASSERT (G_N_ELEMENTS (tracker_sparql_error_entries) == TRACKER_SPARQL_N_ERRORS); @@ -94,6 +95,7 @@ _translate_internal_error (GError *error) * anywhere, so it doesn't get its own public error code. */ case TRACKER_DB_INTERRUPTED: new_code = TRACKER_SPARQL_ERROR_INTERNAL; break; case TRACKER_DB_CONSTRAINT: new_code = TRACKER_SPARQL_ERROR_CONSTRAINT; break; + case TRACKER_DB_CORRUPT: new_code = TRACKER_SPARQL_ERROR_CORRUPT; break; default: g_warn_if_reached (); } diff --git a/src/libtracker-sparql/tracker-error.h b/src/libtracker-sparql/tracker-error.h index f69961834..3ea9729a2 100644 --- a/src/libtracker-sparql/tracker-error.h +++ b/src/libtracker-sparql/tracker-error.h @@ -52,6 +52,7 @@ G_BEGIN_DECLS * @TRACKER_SPARQL_ERROR_UNSUPPORTED: Unsupported feature or method. * @TRACKER_SPARQL_ERROR_MISSING_LAST_MODIFIED_HEADER: The ontology doesn't contain nrl:lastModified header * @TRACKER_SPARQL_ERROR_INCOMPLETE_PROPERTY_DEFINITION: The property is not completely defined. + * @TRACKER_SPARQL_ERROR_CORRUPT: A soft/hard corruption was found in the database during operation. * @TRACKER_SPARQL_ERROR_LAST: The total number of error codes. * * Error domain for Tracker Sparql. Errors in this domain will be from the @@ -73,6 +74,7 @@ typedef enum { TRACKER_SPARQL_ERROR_UNSUPPORTED, TRACKER_SPARQL_ERROR_MISSING_LAST_MODIFIED_HEADER, TRACKER_SPARQL_ERROR_INCOMPLETE_PROPERTY_DEFINITION, + TRACKER_SPARQL_ERROR_CORRUPT, TRACKER_SPARQL_ERROR_LAST } TrackerSparqlError; |