Sqlite: Add extended exceptions for busy errors

Change-Id: I812650401f4a5d5a099abc0183d2f7ed4e1d64c6
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
This commit is contained in:
Marco Bubke
2023-03-13 15:36:55 +01:00
parent 0a38ae7e78
commit 093584a10c
5 changed files with 80 additions and 10 deletions

View File

@@ -310,11 +310,13 @@ void BaseStatement::checkForStepError(int resultCode) const
{ {
switch (resultCode) { switch (resultCode) {
case SQLITE_BUSY_RECOVERY: case SQLITE_BUSY_RECOVERY:
throw StatementIsBusyRecovering(sqlite3_errmsg(sqliteDatabaseHandle()));
case SQLITE_BUSY_SNAPSHOT: case SQLITE_BUSY_SNAPSHOT:
throw StatementIsBusySnapshot(sqlite3_errmsg(sqliteDatabaseHandle()));
case SQLITE_BUSY_TIMEOUT: case SQLITE_BUSY_TIMEOUT:
throw StatementIsBusyTimeout(sqlite3_errmsg(sqliteDatabaseHandle()));
case SQLITE_BUSY: case SQLITE_BUSY:
throwStatementIsBusy("SqliteStatement::stepStatement: database engine was unable to " throw StatementIsBusy(sqlite3_errmsg(sqliteDatabaseHandle()));
"acquire the database locks!");
case SQLITE_ERROR_MISSING_COLLSEQ: case SQLITE_ERROR_MISSING_COLLSEQ:
case SQLITE_ERROR_RETRY: case SQLITE_ERROR_RETRY:
case SQLITE_ERROR_SNAPSHOT: case SQLITE_ERROR_SNAPSHOT:
@@ -459,11 +461,13 @@ void BaseStatement::checkForPrepareError(int resultCode) const
{ {
switch (resultCode) { switch (resultCode) {
case SQLITE_BUSY_RECOVERY: case SQLITE_BUSY_RECOVERY:
throw StatementIsBusyRecovering(sqlite3_errmsg(sqliteDatabaseHandle()));
case SQLITE_BUSY_SNAPSHOT: case SQLITE_BUSY_SNAPSHOT:
throw StatementIsBusySnapshot(sqlite3_errmsg(sqliteDatabaseHandle()));
case SQLITE_BUSY_TIMEOUT: case SQLITE_BUSY_TIMEOUT:
throw StatementIsBusyTimeout(sqlite3_errmsg(sqliteDatabaseHandle()));
case SQLITE_BUSY: case SQLITE_BUSY:
throwStatementIsBusy("SqliteStatement::prepareStatement: database engine was unable to " throw StatementIsBusy(sqlite3_errmsg(sqliteDatabaseHandle()));
"acquire the database locks!");
case SQLITE_ERROR_MISSING_COLLSEQ: case SQLITE_ERROR_MISSING_COLLSEQ:
case SQLITE_ERROR_RETRY: case SQLITE_ERROR_RETRY:
case SQLITE_ERROR_SNAPSHOT: case SQLITE_ERROR_SNAPSHOT:
@@ -574,11 +578,6 @@ bool BaseStatement::isReadOnlyStatement() const
return sqlite3_stmt_readonly(m_compiledStatement.get()); return sqlite3_stmt_readonly(m_compiledStatement.get());
} }
void BaseStatement::throwStatementIsBusy(const char *) const
{
throw StatementIsBusy(sqlite3_errmsg(sqliteDatabaseHandle()));
}
void BaseStatement::throwStatementHasError(const char *) const void BaseStatement::throwStatementHasError(const char *) const
{ {
throw StatementHasError(sqlite3_errmsg(sqliteDatabaseHandle())); throw StatementHasError(sqlite3_errmsg(sqliteDatabaseHandle()));

View File

@@ -117,7 +117,6 @@ public:
void checkBindingParameterCount(int bindingParameterCount) const; void checkBindingParameterCount(int bindingParameterCount) const;
void checkColumnCount(int columnCount) const; void checkColumnCount(int columnCount) const;
bool isReadOnlyStatement() const; bool isReadOnlyStatement() const;
[[noreturn]] void throwStatementIsBusy(const char *whatHasHappened) const;
[[noreturn]] void throwStatementHasError(const char *whatHasHappened) const; [[noreturn]] void throwStatementHasError(const char *whatHasHappened) const;
[[noreturn]] void throwStatementIsMisused(const char *whatHasHappened) const; [[noreturn]] void throwStatementIsMisused(const char *whatHasHappened) const;
[[noreturn]] void throwConstraintPreventsModification(const char *whatHasHappened) const; [[noreturn]] void throwConstraintPreventsModification(const char *whatHasHappened) const;

View File

@@ -420,8 +420,11 @@ void DatabaseBackend::walCheckpointFull()
case SQLITE_OK: case SQLITE_OK:
break; break;
case SQLITE_BUSY_RECOVERY: case SQLITE_BUSY_RECOVERY:
throw DatabaseIsBusyRecovering();
case SQLITE_BUSY_SNAPSHOT: case SQLITE_BUSY_SNAPSHOT:
throw DatabaseIsBusySnapshot();
case SQLITE_BUSY_TIMEOUT: case SQLITE_BUSY_TIMEOUT:
throw DatabaseIsBusyTimeout();
case SQLITE_BUSY: case SQLITE_BUSY:
throw DatabaseIsBusy(); throw DatabaseIsBusy();
case SQLITE_ERROR_MISSING_COLLSEQ: case SQLITE_ERROR_MISSING_COLLSEQ:

View File

@@ -464,4 +464,34 @@ const char *InputOutputCannotRead::what() const noexcept
return "Sqlite::InputOutputCannotRead"; 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 } // namespace Sqlite

View File

@@ -40,6 +40,27 @@ public:
const char *what() const noexcept override; 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 class SQLITE_EXPORT DatabaseIsBusy : public Exception
{ {
public: public:
@@ -47,6 +68,24 @@ public:
const char *what() const noexcept override; 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 class SQLITE_EXPORT StatementHasError : public ExceptionWithMessage
{ {
public: public: