From 176ecdb1dbf526a2a7e8a254c74d46a311605d4d Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Mon, 13 Mar 2023 18:08:47 +0100 Subject: [PATCH] Sqlite: Add extended exceptions for corruption errors Change-Id: I705bffc54def12e914caf31cacf870ad2f9cbeea Reviewed-by: Qt CI Bot Reviewed-by: Tim Jenssen --- src/libs/sqlite/sqlitebasestatement.cpp | 10 ++++------ src/libs/sqlite/sqlitebasestatement.h | 1 - src/libs/sqlite/sqliteexception.cpp | 15 +++++++++++++++ src/libs/sqlite/sqliteexception.h | 21 +++++++++++++++++++++ 4 files changed, 40 insertions(+), 7 deletions(-) diff --git a/src/libs/sqlite/sqlitebasestatement.cpp b/src/libs/sqlite/sqlitebasestatement.cpp index c8dc9b09b17..e1acef8be1d 100644 --- a/src/libs/sqlite/sqlitebasestatement.cpp +++ b/src/libs/sqlite/sqlitebasestatement.cpp @@ -453,10 +453,13 @@ void BaseStatement::checkForStepError(int resultCode) const case SQLITE_INTERRUPT: throwExecutionInterrupted("SqliteStatement::stepStatement: Execution was interrupted."); case SQLITE_CORRUPT_INDEX: + throw DatabaseHasCorruptIndex(); case SQLITE_CORRUPT_SEQUENCE: + throw DatabaseHasCorruptSequence(); case SQLITE_CORRUPT_VTAB: + throw DatabaseHasCorruptVirtualTable(); case SQLITE_CORRUPT: - throwDatabaseIsCorrupt("SqliteStatement::stepStatement: Database is corrupt."); + throw DatabaseIsCorrupt(); case SQLITE_CANTOPEN_CONVPATH: case SQLITE_CANTOPEN_DIRTYWAL: case SQLITE_CANTOPEN_FULLPATH: @@ -661,11 +664,6 @@ void BaseStatement::throwExecutionInterrupted(const char *) const throw ExecutionInterrupted{}; } -void BaseStatement::throwDatabaseIsCorrupt(const char *) const -{ - throw DatabaseIsCorrupt{}; -} - void BaseStatement::throwCannotOpen(const char *) const { throw CannotOpen{}; diff --git a/src/libs/sqlite/sqlitebasestatement.h b/src/libs/sqlite/sqlitebasestatement.h index 80afc568952..285b50094a8 100644 --- a/src/libs/sqlite/sqlitebasestatement.h +++ b/src/libs/sqlite/sqlitebasestatement.h @@ -132,7 +132,6 @@ public: [[noreturn]] void throwDataTypeMismatch(const char *whatHasHappened) const; [[noreturn]] void throwConnectionIsLocked(const char *whatHasHappened) const; [[noreturn]] void throwExecutionInterrupted(const char *whatHasHappened) const; - [[noreturn]] void throwDatabaseIsCorrupt(const char *whatHasHappened) const; [[noreturn]] void throwCannotOpen(const char *whatHasHappened) const; QString columnName(int column) const; diff --git a/src/libs/sqlite/sqliteexception.cpp b/src/libs/sqlite/sqliteexception.cpp index b338d76a7cc..fd834e70451 100644 --- a/src/libs/sqlite/sqliteexception.cpp +++ b/src/libs/sqlite/sqliteexception.cpp @@ -569,4 +569,19 @@ const char *VirtualTableConstraintPreventsModification::what() const noexcept return "Sqlite::VirtualTableConstraintPreventsModification"; } +const char *DatabaseHasCorruptIndex::what() const noexcept +{ + return "Sqlite::DatabaseHasCorruptIndex"; +} + +const char *DatabaseHasCorruptSequence::what() const noexcept +{ + return "Sqlite::DatabaseHasCorruptSequence"; +} + +const char *DatabaseHasCorruptVirtualTable::what() const noexcept +{ + return "Sqlite::DatabaseHasCorruptVirtualTable"; +} + } // namespace Sqlite diff --git a/src/libs/sqlite/sqliteexception.h b/src/libs/sqlite/sqliteexception.h index 8bdb537fc16..0ef1ccf49cf 100644 --- a/src/libs/sqlite/sqliteexception.h +++ b/src/libs/sqlite/sqliteexception.h @@ -628,6 +628,27 @@ public: const char *what() const noexcept override; }; +class SQLITE_EXPORT DatabaseHasCorruptIndex : public DatabaseIsCorrupt +{ +public: + using DatabaseIsCorrupt::DatabaseIsCorrupt; + const char *what() const noexcept override; +}; + +class SQLITE_EXPORT DatabaseHasCorruptSequence : public DatabaseIsCorrupt +{ +public: + using DatabaseIsCorrupt::DatabaseIsCorrupt; + const char *what() const noexcept override; +}; + +class SQLITE_EXPORT DatabaseHasCorruptVirtualTable : public DatabaseIsCorrupt +{ +public: + using DatabaseIsCorrupt::DatabaseIsCorrupt; + const char *what() const noexcept override; +}; + class SQLITE_EXPORT CannotOpen : public Exception { public: