summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2023-01-22 21:39:41 +0100
committerCarlos Garnacho <carlosg@gnome.org>2023-01-23 15:51:36 +0100
commitb7f0bd26bdf257ad18de40bcd5aab2dee0bdda74 (patch)
tree46a5210ac9cab79a53c22cc3974394d33eb19ac3 /src
parent69db1874b52587442d29d1a5585540e3f87e8b5f (diff)
downloadtracker-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.c51
-rw-r--r--src/libtracker-sparql/core/tracker-db-interface.h1
-rw-r--r--src/libtracker-sparql/tracker-error.c2
-rw-r--r--src/libtracker-sparql/tracker-error.h2
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;