diff --git a/src/libs/sqlite/sqlitebasestatement.cpp b/src/libs/sqlite/sqlitebasestatement.cpp index c22a966ac4a..e5996c9d159 100644 --- a/src/libs/sqlite/sqlitebasestatement.cpp +++ b/src/libs/sqlite/sqlitebasestatement.cpp @@ -310,11 +310,13 @@ void BaseStatement::checkForStepError(int resultCode) const { switch (resultCode) { case SQLITE_BUSY_RECOVERY: + throw StatementIsBusyRecovering(sqlite3_errmsg(sqliteDatabaseHandle())); case SQLITE_BUSY_SNAPSHOT: + throw StatementIsBusySnapshot(sqlite3_errmsg(sqliteDatabaseHandle())); case SQLITE_BUSY_TIMEOUT: + throw StatementIsBusyTimeout(sqlite3_errmsg(sqliteDatabaseHandle())); case SQLITE_BUSY: - throwStatementIsBusy("SqliteStatement::stepStatement: database engine was unable to " - "acquire the database locks!"); + throw StatementIsBusy(sqlite3_errmsg(sqliteDatabaseHandle())); case SQLITE_ERROR_MISSING_COLLSEQ: case SQLITE_ERROR_RETRY: case SQLITE_ERROR_SNAPSHOT: @@ -459,11 +461,13 @@ void BaseStatement::checkForPrepareError(int resultCode) const { switch (resultCode) { case SQLITE_BUSY_RECOVERY: + throw StatementIsBusyRecovering(sqlite3_errmsg(sqliteDatabaseHandle())); case SQLITE_BUSY_SNAPSHOT: + throw StatementIsBusySnapshot(sqlite3_errmsg(sqliteDatabaseHandle())); case SQLITE_BUSY_TIMEOUT: + throw StatementIsBusyTimeout(sqlite3_errmsg(sqliteDatabaseHandle())); case SQLITE_BUSY: - throwStatementIsBusy("SqliteStatement::prepareStatement: database engine was unable to " - "acquire the database locks!"); + throw StatementIsBusy(sqlite3_errmsg(sqliteDatabaseHandle())); case SQLITE_ERROR_MISSING_COLLSEQ: case SQLITE_ERROR_RETRY: case SQLITE_ERROR_SNAPSHOT: @@ -574,11 +578,6 @@ bool BaseStatement::isReadOnlyStatement() const return sqlite3_stmt_readonly(m_compiledStatement.get()); } -void BaseStatement::throwStatementIsBusy(const char *) const -{ - throw StatementIsBusy(sqlite3_errmsg(sqliteDatabaseHandle())); -} - void BaseStatement::throwStatementHasError(const char *) const { throw StatementHasError(sqlite3_errmsg(sqliteDatabaseHandle())); diff --git a/src/libs/sqlite/sqlitebasestatement.h b/src/libs/sqlite/sqlitebasestatement.h index f0b68e2ec99..0df533f0829 100644 --- a/src/libs/sqlite/sqlitebasestatement.h +++ b/src/libs/sqlite/sqlitebasestatement.h @@ -117,7 +117,6 @@ public: void checkBindingParameterCount(int bindingParameterCount) const; void checkColumnCount(int columnCount) const; bool isReadOnlyStatement() const; - [[noreturn]] void throwStatementIsBusy(const char *whatHasHappened) const; [[noreturn]] void throwStatementHasError(const char *whatHasHappened) const; [[noreturn]] void throwStatementIsMisused(const char *whatHasHappened) const; [[noreturn]] void throwConstraintPreventsModification(const char *whatHasHappened) const; diff --git a/src/libs/sqlite/sqlitedatabasebackend.cpp b/src/libs/sqlite/sqlitedatabasebackend.cpp index 2e0ef84b336..7765623745c 100644 --- a/src/libs/sqlite/sqlitedatabasebackend.cpp +++ b/src/libs/sqlite/sqlitedatabasebackend.cpp @@ -420,8 +420,11 @@ void DatabaseBackend::walCheckpointFull() case SQLITE_OK: break; case SQLITE_BUSY_RECOVERY: + throw DatabaseIsBusyRecovering(); case SQLITE_BUSY_SNAPSHOT: + throw DatabaseIsBusySnapshot(); case SQLITE_BUSY_TIMEOUT: + throw DatabaseIsBusyTimeout(); case SQLITE_BUSY: throw DatabaseIsBusy(); case SQLITE_ERROR_MISSING_COLLSEQ: diff --git a/src/libs/sqlite/sqliteexception.cpp b/src/libs/sqlite/sqliteexception.cpp index d3ed0d51c77..8d07ba45c20 100644 --- a/src/libs/sqlite/sqliteexception.cpp +++ b/src/libs/sqlite/sqliteexception.cpp @@ -464,4 +464,34 @@ const char *InputOutputCannotRead::what() const noexcept return "Sqlite::InputOutputCannotRead"; } +const char *StatementIsBusyRecovering::what() const noexcept +{ + return "Sqlite::StatementIsBusyRecovering"; +} + +const char *StatementIsBusySnapshot::what() const noexcept +{ + return "Sqlite::StatementIsBusySnapshot"; +} + +const char *StatementIsBusyTimeout::what() const noexcept +{ + return "Sqlite::StatementIsBusyTimeout"; +} + +const char *DatabaseIsBusyRecovering::what() const noexcept +{ + return "Sqlite::DatabaseIsBusyRecovering"; +} + +const char *DatabaseIsBusySnapshot::what() const noexcept +{ + return "Sqlite::DatabaseIsBusySnapshot"; +} + +const char *DatabaseIsBusyTimeout::what() const noexcept +{ + return "Sqlite::DatabaseIsBusyTimeout"; +} + } // namespace Sqlite diff --git a/src/libs/sqlite/sqliteexception.h b/src/libs/sqlite/sqliteexception.h index b8ec77dadee..a819e330b30 100644 --- a/src/libs/sqlite/sqliteexception.h +++ b/src/libs/sqlite/sqliteexception.h @@ -40,6 +40,27 @@ public: const char *what() const noexcept override; }; +class SQLITE_EXPORT StatementIsBusyRecovering : public StatementIsBusy +{ +public: + using StatementIsBusy::StatementIsBusy; + const char *what() const noexcept override; +}; + +class SQLITE_EXPORT StatementIsBusySnapshot : public StatementIsBusy +{ +public: + using StatementIsBusy::StatementIsBusy; + const char *what() const noexcept override; +}; + +class SQLITE_EXPORT StatementIsBusyTimeout : public StatementIsBusy +{ +public: + using StatementIsBusy::StatementIsBusy; + const char *what() const noexcept override; +}; + class SQLITE_EXPORT DatabaseIsBusy : public Exception { public: @@ -47,6 +68,24 @@ public: const char *what() const noexcept override; }; +class SQLITE_EXPORT DatabaseIsBusyRecovering : public DatabaseIsBusy +{ +public: + const char *what() const noexcept override; +}; + +class SQLITE_EXPORT DatabaseIsBusySnapshot : public DatabaseIsBusy +{ +public: + const char *what() const noexcept override; +}; + +class SQLITE_EXPORT DatabaseIsBusyTimeout : public DatabaseIsBusy +{ +public: + const char *what() const noexcept override; +}; + class SQLITE_EXPORT StatementHasError : public ExceptionWithMessage { public: