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) {
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()));

View File

@@ -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;

View File

@@ -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:

View File

@@ -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

View File

@@ -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: