Sqlite: Add extended exceptions for readonly errors

Change-Id: I96a8f1c87ce116e99b7e6333166299b39fb9c27c
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 18:22:39 +01:00
parent 176ecdb1db
commit 481c82b957
4 changed files with 79 additions and 8 deletions

View File

@@ -359,14 +359,19 @@ void BaseStatement::checkForStepError(int resultCode) const
throwSchemaChangeError("SqliteStatement::stepStatement: Schema changed but the statement " throwSchemaChangeError("SqliteStatement::stepStatement: Schema changed but the statement "
"cannot be recompiled."); "cannot be recompiled.");
case SQLITE_READONLY_CANTINIT: case SQLITE_READONLY_CANTINIT:
throw CannotInitializeReadOnlyConnection(sqlite3_errmsg(sqliteDatabaseHandle()));
case SQLITE_READONLY_CANTLOCK: case SQLITE_READONLY_CANTLOCK:
throw CannotLockReadOnlyConnection(sqlite3_errmsg(sqliteDatabaseHandle()));
case SQLITE_READONLY_DBMOVED: case SQLITE_READONLY_DBMOVED:
throw CannotWriteToMovedDatabase(sqlite3_errmsg(sqliteDatabaseHandle()));
case SQLITE_READONLY_DIRECTORY: case SQLITE_READONLY_DIRECTORY:
throw CannotCreateLogInReadonlyDirectory(sqlite3_errmsg(sqliteDatabaseHandle()));
case SQLITE_READONLY_RECOVERY: case SQLITE_READONLY_RECOVERY:
throw DatabaseNeedsToBeRecovered(sqlite3_errmsg(sqliteDatabaseHandle()));
case SQLITE_READONLY_ROLLBACK: case SQLITE_READONLY_ROLLBACK:
throw CannotRollbackToReadOnlyConnection(sqlite3_errmsg(sqliteDatabaseHandle()));
case SQLITE_READONLY: case SQLITE_READONLY:
throwCannotWriteToReadOnlyConnection( throw CannotWriteToReadOnlyConnection(sqlite3_errmsg(sqliteDatabaseHandle()));
"SqliteStatement::stepStatement: Cannot write to read only connection");
case SQLITE_PROTOCOL: case SQLITE_PROTOCOL:
throwProtocolError( throwProtocolError(
"SqliteStatement::stepStatement: Something strang with the file locking happened."); "SqliteStatement::stepStatement: Something strang with the file locking happened.");
@@ -634,11 +639,6 @@ void BaseStatement::throwSchemaChangeError(const char *) const
throw SchemeChangeError{sqlite3_errmsg(sqliteDatabaseHandle())}; throw SchemeChangeError{sqlite3_errmsg(sqliteDatabaseHandle())};
} }
void BaseStatement::throwCannotWriteToReadOnlyConnection(const char *) const
{
throw CannotWriteToReadOnlyConnection{sqlite3_errmsg(sqliteDatabaseHandle())};
}
void BaseStatement::throwProtocolError(const char *) const void BaseStatement::throwProtocolError(const char *) const
{ {
throw ProtocolError{sqlite3_errmsg(sqliteDatabaseHandle())}; throw ProtocolError{sqlite3_errmsg(sqliteDatabaseHandle())};

View File

@@ -126,7 +126,6 @@ public:
[[noreturn]] void throwBingingTooBig(const char *whatHasHappened) const; [[noreturn]] void throwBingingTooBig(const char *whatHasHappened) const;
[[noreturn]] void throwTooBig(const char *whatHasHappened) const; [[noreturn]] void throwTooBig(const char *whatHasHappened) const;
[[noreturn]] void throwSchemaChangeError(const char *whatHasHappened) const; [[noreturn]] void throwSchemaChangeError(const char *whatHasHappened) const;
[[noreturn]] void throwCannotWriteToReadOnlyConnection(const char *whatHasHappened) const;
[[noreturn]] void throwProtocolError(const char *whatHasHappened) const; [[noreturn]] void throwProtocolError(const char *whatHasHappened) const;
[[noreturn]] void throwDatabaseExceedsMaximumFileSize(const char *whatHasHappened) const; [[noreturn]] void throwDatabaseExceedsMaximumFileSize(const char *whatHasHappened) const;
[[noreturn]] void throwDataTypeMismatch(const char *whatHasHappened) const; [[noreturn]] void throwDataTypeMismatch(const char *whatHasHappened) const;

View File

@@ -584,4 +584,34 @@ const char *DatabaseHasCorruptVirtualTable::what() const noexcept
return "Sqlite::DatabaseHasCorruptVirtualTable"; return "Sqlite::DatabaseHasCorruptVirtualTable";
} }
const char *CannotInitializeReadOnlyConnection::what() const noexcept
{
return "Sqlite::CannotInitializeReadOnlyConnection";
}
const char *CannotLockReadOnlyConnection::what() const noexcept
{
return "Sqlite::CannotLockReadOnlyConnection";
}
const char *CannotWriteToMovedDatabase::what() const noexcept
{
return "Sqlite::CannotWriteToMovedDatabase";
}
const char *CannotCreateLogInReadonlyDirectory::what() const noexcept
{
return "Sqlite::CannotCreateLogInReadonlyDirectory";
}
const char *DatabaseNeedsToBeRecovered::what() const noexcept
{
return "Sqlite::DatabaseNeedsToBeRecovered";
}
const char *CannotRollbackToReadOnlyConnection::what() const noexcept
{
return "Sqlite::CannotRollbackToReadOnlyConnection";
}
} // namespace Sqlite } // namespace Sqlite

View File

@@ -586,6 +586,48 @@ public:
const char *what() const noexcept override; const char *what() const noexcept override;
}; };
class SQLITE_EXPORT CannotInitializeReadOnlyConnection : public CannotWriteToReadOnlyConnection
{
public:
using CannotWriteToReadOnlyConnection::CannotWriteToReadOnlyConnection;
const char *what() const noexcept override;
};
class SQLITE_EXPORT CannotLockReadOnlyConnection : public CannotWriteToReadOnlyConnection
{
public:
using CannotWriteToReadOnlyConnection::CannotWriteToReadOnlyConnection;
const char *what() const noexcept override;
};
class SQLITE_EXPORT CannotWriteToMovedDatabase : public CannotWriteToReadOnlyConnection
{
public:
using CannotWriteToReadOnlyConnection::CannotWriteToReadOnlyConnection;
const char *what() const noexcept override;
};
class SQLITE_EXPORT CannotCreateLogInReadonlyDirectory : public CannotWriteToReadOnlyConnection
{
public:
using CannotWriteToReadOnlyConnection::CannotWriteToReadOnlyConnection;
const char *what() const noexcept override;
};
class SQLITE_EXPORT DatabaseNeedsToBeRecovered : public CannotWriteToReadOnlyConnection
{
public:
using CannotWriteToReadOnlyConnection::CannotWriteToReadOnlyConnection;
const char *what() const noexcept override;
};
class SQLITE_EXPORT CannotRollbackToReadOnlyConnection : public CannotWriteToReadOnlyConnection
{
public:
using CannotWriteToReadOnlyConnection::CannotWriteToReadOnlyConnection;
const char *what() const noexcept override;
};
class SQLITE_EXPORT ProtocolError : public ExceptionWithMessage class SQLITE_EXPORT ProtocolError : public ExceptionWithMessage
{ {
public: public: