Sqlite: Inject RTTI into TU

We had problems on macOS with the catching of exceptions because the has
type_info::hash_code was different. This is probably a bug because RTTI
code is injected for an inline class.

To work around that problem we implemented the virtual what method for
every exception.

Task-number: QDS-9266
Change-Id: I79052c8b70adead412d1940b17195151fb19ebb9
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
Reviewed-by: Vikas Pachdha <vikas.pachdha@qt.io>
This commit is contained in:
Marco Bubke
2023-02-27 10:30:26 +01:00
parent 306f239c20
commit cc507063bc
17 changed files with 584 additions and 224 deletions

View File

@@ -79,7 +79,7 @@ void BaseStatement::waitForUnlockNotify() const
&unlockNotification); &unlockNotification);
if (resultCode == SQLITE_LOCKED) if (resultCode == SQLITE_LOCKED)
throw DeadLock("SqliteStatement::waitForUnlockNotify: database is in a dead lock!"); throw DeadLock();
unlockNotification.wait(); unlockNotification.wait();
} }
@@ -490,13 +490,13 @@ void BaseStatement::checkForBindingError(int resultCode) const
void BaseStatement::checkBindingParameterCount(int bindingParameterCount) const void BaseStatement::checkBindingParameterCount(int bindingParameterCount) const
{ {
if (bindingParameterCount != sqlite3_bind_parameter_count(m_compiledStatement.get())) if (bindingParameterCount != sqlite3_bind_parameter_count(m_compiledStatement.get()))
throw WrongBindingParameterCount{"Sqlite: wrong binding parameter count!"}; throw WrongBindingParameterCount{};
} }
void BaseStatement::checkColumnCount(int columnCount) const void BaseStatement::checkColumnCount(int columnCount) const
{ {
if (columnCount != sqlite3_column_count(m_compiledStatement.get())) if (columnCount != sqlite3_column_count(m_compiledStatement.get()))
throw WrongColumnCount{"Sqlite: wrong column count!"}; throw WrongColumnCount{};
} }
bool BaseStatement::isReadOnlyStatement() const bool BaseStatement::isReadOnlyStatement() const
@@ -504,102 +504,102 @@ bool BaseStatement::isReadOnlyStatement() const
return sqlite3_stmt_readonly(m_compiledStatement.get()); return sqlite3_stmt_readonly(m_compiledStatement.get());
} }
void BaseStatement::throwStatementIsBusy(const char *whatHasHappened) const void BaseStatement::throwStatementIsBusy(const char *) const
{ {
throw StatementIsBusy(whatHasHappened, sqlite3_errmsg(sqliteDatabaseHandle())); throw StatementIsBusy(sqlite3_errmsg(sqliteDatabaseHandle()));
} }
void BaseStatement::throwStatementHasError(const char *whatHasHappened) const void BaseStatement::throwStatementHasError(const char *) const
{ {
throw StatementHasError(whatHasHappened, sqlite3_errmsg(sqliteDatabaseHandle())); throw StatementHasError(sqlite3_errmsg(sqliteDatabaseHandle()));
} }
void BaseStatement::throwStatementIsMisused(const char *whatHasHappened) const void BaseStatement::throwStatementIsMisused(const char *) const
{ {
throw StatementIsMisused(whatHasHappened, sqlite3_errmsg(sqliteDatabaseHandle())); throw StatementIsMisused(sqlite3_errmsg(sqliteDatabaseHandle()));
} }
void BaseStatement::throwInputOutputError(const char *whatHasHappened) const void BaseStatement::throwInputOutputError(const char *) const
{ {
throw InputOutputError(whatHasHappened); throw InputOutputError();
} }
void BaseStatement::throwConstraintPreventsModification(const char *whatHasHappened) const void BaseStatement::throwConstraintPreventsModification(const char *) const
{ {
throw ConstraintPreventsModification(whatHasHappened, sqlite3_errmsg(sqliteDatabaseHandle())); throw ConstraintPreventsModification(sqlite3_errmsg(sqliteDatabaseHandle()));
} }
void BaseStatement::throwNoValuesToFetch(const char *whatHasHappened) const void BaseStatement::throwNoValuesToFetch(const char *) const
{ {
throw NoValuesToFetch(whatHasHappened); throw NoValuesToFetch();
} }
void BaseStatement::throwBindingIndexIsOutOfRange(const char *whatHasHappened) const void BaseStatement::throwBindingIndexIsOutOfRange(const char *) const
{ {
throw BindingIndexIsOutOfRange(whatHasHappened, sqlite3_errmsg(sqliteDatabaseHandle())); throw BindingIndexIsOutOfRange(sqlite3_errmsg(sqliteDatabaseHandle()));
} }
void BaseStatement::throwUnknowError(const char *whatHasHappened) const void BaseStatement::throwUnknowError(const char *whatHasHappened) const
{ {
if (sqliteDatabaseHandle()) if (sqliteDatabaseHandle())
throw UnknowError(whatHasHappened, sqlite3_errmsg(sqliteDatabaseHandle())); throw UnknowError(sqlite3_errmsg(sqliteDatabaseHandle()));
else else
throw UnknowError(whatHasHappened); throw UnknowError(whatHasHappened);
} }
void BaseStatement::throwBingingTooBig(const char *whatHasHappened) const void BaseStatement::throwBingingTooBig(const char *) const
{ {
throw BindingTooBig(whatHasHappened, sqlite3_errmsg(sqliteDatabaseHandle())); throw BindingTooBig(sqlite3_errmsg(sqliteDatabaseHandle()));
} }
void BaseStatement::throwTooBig(const char *whatHasHappened) const void BaseStatement::throwTooBig(const char *) const
{ {
throw TooBig{whatHasHappened, sqlite3_errmsg(sqliteDatabaseHandle())}; throw TooBig{sqlite3_errmsg(sqliteDatabaseHandle())};
} }
void BaseStatement::throwSchemaChangeError(const char *whatHasHappened) const void BaseStatement::throwSchemaChangeError(const char *) const
{ {
throw SchemeChangeError{whatHasHappened, sqlite3_errmsg(sqliteDatabaseHandle())}; throw SchemeChangeError{sqlite3_errmsg(sqliteDatabaseHandle())};
} }
void BaseStatement::throwCannotWriteToReadOnlyConnection(const char *whatHasHappened) const void BaseStatement::throwCannotWriteToReadOnlyConnection(const char *) const
{ {
throw CannotWriteToReadOnlyConnection{whatHasHappened, sqlite3_errmsg(sqliteDatabaseHandle())}; throw CannotWriteToReadOnlyConnection{sqlite3_errmsg(sqliteDatabaseHandle())};
} }
void BaseStatement::throwProtocolError(const char *whatHasHappened) const void BaseStatement::throwProtocolError(const char *) const
{ {
throw ProtocolError{whatHasHappened, sqlite3_errmsg(sqliteDatabaseHandle())}; throw ProtocolError{sqlite3_errmsg(sqliteDatabaseHandle())};
} }
void BaseStatement::throwDatabaseExceedsMaximumFileSize(const char *whatHasHappened) const void BaseStatement::throwDatabaseExceedsMaximumFileSize(const char *) const
{ {
throw DatabaseExceedsMaximumFileSize{whatHasHappened, sqlite3_errmsg(sqliteDatabaseHandle())}; throw DatabaseExceedsMaximumFileSize{sqlite3_errmsg(sqliteDatabaseHandle())};
} }
void BaseStatement::throwDataTypeMismatch(const char *whatHasHappened) const void BaseStatement::throwDataTypeMismatch(const char *) const
{ {
throw DataTypeMismatch{whatHasHappened, sqlite3_errmsg(sqliteDatabaseHandle())}; throw DataTypeMismatch{sqlite3_errmsg(sqliteDatabaseHandle())};
} }
void BaseStatement::throwConnectionIsLocked(const char *whatHasHappened) const void BaseStatement::throwConnectionIsLocked(const char *) const
{ {
throw ConnectionIsLocked{whatHasHappened, sqlite3_errmsg(sqliteDatabaseHandle())}; throw ConnectionIsLocked{sqlite3_errmsg(sqliteDatabaseHandle())};
} }
void BaseStatement::throwExecutionInterrupted(const char *whatHasHappened) const void BaseStatement::throwExecutionInterrupted(const char *) const
{ {
throw ExecutionInterrupted{whatHasHappened}; throw ExecutionInterrupted{};
} }
void BaseStatement::throwDatabaseIsCorrupt(const char *whatHasHappened) const void BaseStatement::throwDatabaseIsCorrupt(const char *) const
{ {
throw DatabaseIsCorrupt{whatHasHappened}; throw DatabaseIsCorrupt{};
} }
void BaseStatement::throwCannotOpen(const char *whatHasHappened) const void BaseStatement::throwCannotOpen(const char *) const
{ {
throw CannotOpen{whatHasHappened}; throw CannotOpen{};
} }
QString BaseStatement::columnName(int column) const QString BaseStatement::columnName(int column) const

View File

@@ -417,7 +417,7 @@ private:
: statement(statement) : statement(statement)
{ {
if (statement && !statement->database().isLocked()) if (statement && !statement->database().isLocked())
throw DatabaseIsNotLocked{"Database connection is not locked!"}; throw DatabaseIsNotLocked{};
} }
Resetter(Resetter &) = delete; Resetter(Resetter &) = delete;

View File

@@ -259,15 +259,17 @@ void DatabaseBackend::registerBusyHandler()
void DatabaseBackend::checkForOpenDatabaseWhichCanBeClosed() void DatabaseBackend::checkForOpenDatabaseWhichCanBeClosed()
{ {
if (m_databaseHandle == nullptr) if (m_databaseHandle == nullptr)
throw DatabaseIsAlreadyClosed("SqliteDatabaseBackend::close: database is not open so it cannot be closed."); throw DatabaseIsAlreadyClosed();
} }
void DatabaseBackend::checkDatabaseClosing(int resultCode) void DatabaseBackend::checkDatabaseClosing(int resultCode)
{ {
switch (resultCode) { switch (resultCode) {
case SQLITE_OK: return; case SQLITE_OK: return;
case SQLITE_BUSY: throw DatabaseIsBusy("SqliteDatabaseBackend::close: database is busy because of e.g. unfinalized statements and will stay open!"); case SQLITE_BUSY:
default: throwUnknowError("SqliteDatabaseBackend::close: unknown error happens at closing!"); throw DatabaseIsBusy();
default:
throw UnknowError("SqliteDatabaseBackend::close: unknown error happens at closing!");
} }
} }
@@ -277,8 +279,7 @@ void DatabaseBackend::checkCanOpenDatabase(Utils::SmallStringView databaseFilePa
throw DatabaseFilePathIsEmpty("SqliteDatabaseBackend::SqliteDatabaseBackend: database cannot be opened because the file path is empty!"); throw DatabaseFilePathIsEmpty("SqliteDatabaseBackend::SqliteDatabaseBackend: database cannot be opened because the file path is empty!");
if (!QFileInfo::exists(QFileInfo(QString(databaseFilePath)).path())) if (!QFileInfo::exists(QFileInfo(QString(databaseFilePath)).path()))
throw WrongFilePath("SqliteDatabaseBackend::SqliteDatabaseBackend: database cannot be opened because of wrong file path!", throw WrongFilePath(Utils::SmallString(databaseFilePath));
Utils::SmallString(databaseFilePath));
if (databaseIsOpen()) if (databaseIsOpen())
throw DatabaseIsAlreadyOpen("SqliteDatabaseBackend::SqliteDatabaseBackend: database cannot be opened because it is already open!"); throw DatabaseIsAlreadyOpen("SqliteDatabaseBackend::SqliteDatabaseBackend: database cannot be opened because it is already open!");
@@ -287,80 +288,73 @@ void DatabaseBackend::checkCanOpenDatabase(Utils::SmallStringView databaseFilePa
void DatabaseBackend::checkDatabaseCouldBeOpened(int resultCode) void DatabaseBackend::checkDatabaseCouldBeOpened(int resultCode)
{ {
switch (resultCode) { switch (resultCode) {
case SQLITE_OK: case SQLITE_OK:
return; return;
default: default:
closeWithoutException(); closeWithoutException();
throw UnknowError( throw UnknowError(sqlite3_errmsg(sqliteDatabaseHandle()));
"SqliteDatabaseBackend::SqliteDatabaseBackend: database cannot be opened:", }
sqlite3_errmsg(sqliteDatabaseHandle()));
}
} }
void DatabaseBackend::checkCarrayCannotBeIntialized(int resultCode) void DatabaseBackend::checkCarrayCannotBeIntialized(int resultCode)
{ {
if (resultCode != SQLITE_OK) if (resultCode != SQLITE_OK)
throwDatabaseIsNotOpen( throw DatabaseIsNotOpen();
"SqliteDatabaseBackend: database cannot be opened because carray failed!");
} }
void DatabaseBackend::checkPragmaValue(Utils::SmallStringView databaseValue, void DatabaseBackend::checkPragmaValue(Utils::SmallStringView databaseValue,
Utils::SmallStringView expectedValue) Utils::SmallStringView expectedValue)
{ {
if (databaseValue != expectedValue) if (databaseValue != expectedValue)
throw PragmaValueNotSet("SqliteDatabaseBackend::setPragmaValue: pragma value is not set!"); throw PragmaValueNotSet();
} }
void DatabaseBackend::checkDatabaseHandleIsNotNull() const void DatabaseBackend::checkDatabaseHandleIsNotNull() const
{ {
if (m_databaseHandle == nullptr) if (m_databaseHandle == nullptr)
throwDatabaseIsNotOpen("SqliteDatabaseBackend: database is not open!"); throw DatabaseIsNotOpen();
} }
void DatabaseBackend::checkIfMultithreadingIsActivated(int resultCode) void DatabaseBackend::checkIfMultithreadingIsActivated(int resultCode)
{ {
if (resultCode != SQLITE_OK) if (resultCode != SQLITE_OK)
throwExceptionStatic( throw MultiTheadingCannotBeActivated{};
"SqliteDatabaseBackend::activateMultiThreading: multithreading can't be activated!");
} }
void DatabaseBackend::checkIfLoogingIsActivated(int resultCode) void DatabaseBackend::checkIfLoogingIsActivated(int resultCode)
{ {
if (resultCode != SQLITE_OK) if (resultCode != SQLITE_OK)
throwExceptionStatic("SqliteDatabaseBackend::activateLogging: logging can't be activated!"); throw LoggingCannotBeActivated{};
} }
void DatabaseBackend::checkMmapSizeIsSet(int resultCode) void DatabaseBackend::checkMmapSizeIsSet(int resultCode)
{ {
if (resultCode != SQLITE_OK) if (resultCode != SQLITE_OK)
throwExceptionStatic( throw MemoryMappingCannotBeChanged{};
"SqliteDatabaseBackend::checkMmapSizeIsSet: mmap size can't be changed!");
} }
void DatabaseBackend::checkInitializeSqliteLibraryWasSuccesful(int resultCode) void DatabaseBackend::checkInitializeSqliteLibraryWasSuccesful(int resultCode)
{ {
if (resultCode != SQLITE_OK) if (resultCode != SQLITE_OK)
throwExceptionStatic( throw LibraryCannotBeInitialized{};
"SqliteDatabaseBackend::initializeSqliteLibrary: SqliteLibrary cannot initialized!");
} }
void DatabaseBackend::checkShutdownSqliteLibraryWasSuccesful(int resultCode) void DatabaseBackend::checkShutdownSqliteLibraryWasSuccesful(int resultCode)
{ {
if (resultCode != SQLITE_OK) if (resultCode != SQLITE_OK)
throwExceptionStatic( throw LibraryCannotBeShutdown{};
"SqliteDatabaseBackend::shutdownSqliteLibrary: SqliteLibrary cannot be shutdowned!");
} }
void DatabaseBackend::checkIfLogCouldBeCheckpointed(int resultCode) void DatabaseBackend::checkIfLogCouldBeCheckpointed(int resultCode)
{ {
if (resultCode != SQLITE_OK) if (resultCode != SQLITE_OK)
throwException("SqliteDatabaseBackend::checkpointFullWalLog: WAL log could not be checkpointed!"); throw LogCannotBeCheckpointed{};
} }
void DatabaseBackend::checkIfBusyTimeoutWasSet(int resultCode) void DatabaseBackend::checkIfBusyTimeoutWasSet(int resultCode)
{ {
if (resultCode != SQLITE_OK) if (resultCode != SQLITE_OK)
throwException("SqliteDatabaseBackend::setBusyTimeout: Busy timeout cannot be set!"); throw BusyTimerCannotBeSet{};
} }
namespace { namespace {
@@ -392,7 +386,7 @@ JournalMode DatabaseBackend::pragmaToJournalMode(Utils::SmallStringView pragma)
int index = indexOfPragma(pragma, journalModeStrings); int index = indexOfPragma(pragma, journalModeStrings);
if (index < 0) if (index < 0)
throwExceptionStatic("SqliteDatabaseBackend::pragmaToJournalMode: pragma can't be transformed in a journal mode enumeration!"); throw PragmaValueCannotBeTransformed{};
return static_cast<JournalMode>(index); return static_cast<JournalMode>(index);
} }
@@ -429,15 +423,14 @@ void DatabaseBackend::walCheckpointFull()
case SQLITE_BUSY_SNAPSHOT: case SQLITE_BUSY_SNAPSHOT:
case SQLITE_BUSY_TIMEOUT: case SQLITE_BUSY_TIMEOUT:
case SQLITE_BUSY: case SQLITE_BUSY:
throw DatabaseIsBusy("DatabaseBackend::walCheckpointFull: Operation could not concluded " throw DatabaseIsBusy();
"because database is busy!");
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:
case SQLITE_ERROR: case SQLITE_ERROR:
throwException("DatabaseBackend::walCheckpointFull: Error occurred!"); throw LogCannotBeCheckpointed{};
case SQLITE_MISUSE: case SQLITE_MISUSE:
throwExceptionStatic("DatabaseBackend::walCheckpointFull: Misuse of database!"); throw CheckpointIsMisused{};
} }
} }
@@ -489,29 +482,6 @@ void DatabaseBackend::resetProgressHandler()
sqlite3_progress_handler(sqliteDatabaseHandle(), 0, nullptr, nullptr); sqlite3_progress_handler(sqliteDatabaseHandle(), 0, nullptr, nullptr);
} }
void DatabaseBackend::throwExceptionStatic(const char *whatHasHappens)
{
throw Exception(whatHasHappens);
}
void DatabaseBackend::throwException(const char *whatHasHappens) const
{
if (m_databaseHandle)
throw ExceptionWithMessage(whatHasHappens, sqlite3_errmsg(m_databaseHandle));
else
throw Exception(whatHasHappens);
}
void DatabaseBackend::throwUnknowError(const char *whatHasHappens) const
{
throw UnknowError(whatHasHappens);
}
void DatabaseBackend::throwDatabaseIsNotOpen(const char *whatHasHappens) const
{
throw DatabaseIsNotOpen(whatHasHappens);
}
template<typename Type> template<typename Type>
Type DatabaseBackend::toValue(Utils::SmallStringView sqlStatement) const Type DatabaseBackend::toValue(Utils::SmallStringView sqlStatement) const
{ {

View File

@@ -108,11 +108,6 @@ protected:
static Utils::SmallStringView journalModeToPragma(JournalMode journalMode); static Utils::SmallStringView journalModeToPragma(JournalMode journalMode);
static JournalMode pragmaToJournalMode(Utils::SmallStringView pragma); static JournalMode pragmaToJournalMode(Utils::SmallStringView pragma);
Q_NORETURN static void throwExceptionStatic(const char *whatHasHappens);
[[noreturn]] void throwException(const char *whatHasHappens) const;
[[noreturn]] void throwUnknowError(const char *whatHasHappens) const;
[[noreturn]] void throwDatabaseIsNotOpen(const char *whatHasHappens) const;
private: private:
Database &m_database; Database &m_database;
sqlite3 *m_databaseHandle; sqlite3 *m_databaseHandle;

View File

@@ -11,7 +11,12 @@ namespace Sqlite {
const char *Exception::what() const noexcept const char *Exception::what() const noexcept
{ {
return m_whatErrorHasHappen; return "Sqlite::Exception";
}
const char *ExceptionWithMessage::what() const noexcept
{
return "Sqlite::ExceptionWithMessage";
} }
void ExceptionWithMessage::printWarning() const void ExceptionWithMessage::printWarning() const
@@ -19,4 +24,279 @@ void ExceptionWithMessage::printWarning() const
qWarning() << what() << m_sqliteErrorMessage; qWarning() << what() << m_sqliteErrorMessage;
} }
const char *StatementIsBusy::what() const noexcept
{
return "Sqlite::StatementIsBusy";
}
const char *DatabaseIsBusy::what() const noexcept
{
return "Sqlite::DatabaseIsBusy";
}
const char *StatementHasError::what() const noexcept
{
return "Sqlite::StatementHasError";
}
const char *StatementIsMisused::what() const noexcept
{
return "Sqlite::StatementIsMisused";
}
const char *InputOutputError::what() const noexcept
{
return "Sqlite::InputOutputError";
}
const char *ConstraintPreventsModification::what() const noexcept
{
return "Sqlite::ConstraintPreventsModification";
}
const char *NoValuesToFetch::what() const noexcept
{
return "Sqlite::NoValuesToFetch";
}
const char *BindingIndexIsOutOfRange::what() const noexcept
{
return "Sqlite::BindingIndexIsOutOfRange";
}
const char *WrongBindingName::what() const noexcept
{
return "Sqlite::WrongBindingName";
}
const char *DatabaseIsNotOpen::what() const noexcept
{
return "Sqlite::DatabaseIsNotOpen";
}
const char *DatabaseCannotBeOpened::what() const noexcept
{
return "Sqlite::DatabaseCannotBeOpened";
}
const char *DatabaseFilePathIsEmpty::what() const noexcept
{
return "Sqlite::DatabaseFilePathIsEmpty";
}
const char *DatabaseIsAlreadyOpen::what() const noexcept
{
return "Sqlite::DatabaseIsAlreadyOpen";
}
const char *DatabaseCannotBeClosed::what() const noexcept
{
return "Sqlite::DatabaseCannotBeClosed";
}
const char *DatabaseIsAlreadyClosed::what() const noexcept
{
return "Sqlite::DatabaseIsAlreadyClosed";
}
const char *WrongFilePath::what() const noexcept
{
return "Sqlite::WrongFilePath";
}
const char *PragmaValueNotSet::what() const noexcept
{
return "Sqlite::PragmaValueNotSet";
}
const char *NotReadOnlySqlStatement::what() const noexcept
{
return "Sqlite::NotReadOnlySqlStatement";
}
const char *NotWriteSqlStatement::what() const noexcept
{
return "Sqlite::NotWriteSqlStatement";
}
const char *DeadLock::what() const noexcept
{
return "Sqlite::DeadLock";
}
const char *UnknowError::what() const noexcept
{
return "Sqlite::UnknowError";
}
const char *BindingTooBig::what() const noexcept
{
return "Sqlite::BindingTooBig";
}
const char *TooBig::what() const noexcept
{
return "Sqlite::TooBig";
}
const char *CannotConvert::what() const noexcept
{
return "Sqlite::CannotConvert";
}
const char *ForeignKeyColumnIsNotUnique::what() const noexcept
{
return "Sqlite::ForeignKeyColumnIsNotUnique";
}
const char *CannotApplyChangeSet::what() const noexcept
{
return "Sqlite::CannotApplyChangeSet";
}
const char *ChangeSetIsMisused::what() const noexcept
{
return "Sqlite::ChangeSetIsMisused";
}
const char *SchemeChangeError::what() const noexcept
{
return "Sqlite::SchemeChangeError";
}
const char *CannotWriteToReadOnlyConnection::what() const noexcept
{
return "Sqlite::CannotWriteToReadOnlyConnection";
}
const char *ProtocolError::what() const noexcept
{
return "Sqlite::ProtocolError";
}
const char *DatabaseExceedsMaximumFileSize::what() const noexcept
{
return "Sqlite::DatabaseExceedsMaximumFileSize";
}
const char *DataTypeMismatch::what() const noexcept
{
return "Sqlite::DataTypeMismatch";
}
const char *ConnectionIsLocked::what() const noexcept
{
return "Sqlite::ConnectionIsLocked";
}
const char *ExecutionInterrupted::what() const noexcept
{
return "Sqlite::ExecutionInterrupted";
}
const char *DatabaseIsCorrupt::what() const noexcept
{
return "Sqlite::DatabaseIsCorrupt";
}
const char *CannotOpen::what() const noexcept
{
return "Sqlite::CannotOpen";
}
const char *CannotCreateChangeSetIterator::what() const noexcept
{
return "Sqlite::CannotCreateChangeSetIterator";
}
const char *CannotGetChangeSetOperation::what() const noexcept
{
return "Sqlite::CannotGetChangeSetOperation";
}
const char *ChangeSetTupleIsOutOfRange::what() const noexcept
{
return "Sqlite::ChangeSetTupleIsOutOfRange";
}
const char *ChangeSetTupleIsMisused::what() const noexcept
{
return "Sqlite::ChangeSetTupleIsMisused";
}
const char *UnknownError::what() const noexcept
{
return "Sqlite::UnknownError";
}
const char *DatabaseIsNotLocked::what() const noexcept
{
return "Sqlite::DatabaseIsNotLocked";
}
const char *WrongBindingParameterCount::what() const noexcept
{
return "Sqlite::WrongBindingParameterCount";
}
const char *WrongColumnCount::what() const noexcept
{
return "Sqlite::WrongColumnCount";
}
const char *IndexHasNoTableName::what() const noexcept
{
return "Sqlite::IndexHasNoTableName";
}
const char *IndexHasNoColumns::what() const noexcept
{
return "Sqlite::IndexHasNoColumns";
}
const char *MultiTheadingCannotBeActivated::what() const noexcept
{
return "Sqlite::MultiTheadingCannotBeActivated";
}
const char *LoggingCannotBeActivated::what() const noexcept
{
return "Sqlite::LoggingCannotBeActivated";
}
const char *MemoryMappingCannotBeChanged::what() const noexcept
{
return "Sqlite::MemoryMappingCannotBeChanged";
}
const char *LibraryCannotBeInitialized::what() const noexcept
{
return "Sqlite::LibraryCannotBeInitialized";
}
const char *LibraryCannotBeShutdown::what() const noexcept
{
return "Sqlite::LibraryCannotBeShutdown";
}
const char *LogCannotBeCheckpointed::what() const noexcept
{
return "Sqlite::LogCannotBeCheckPointed";
}
const char *BusyTimerCannotBeSet::what() const noexcept
{
return "Sqlite::BusyTimerCannotBeSet";
}
const char *PragmaValueCannotBeTransformed::what() const noexcept
{
return "Sqlite::PragmaValueCannotBeTransformed";
}
const char *CheckpointIsMisused::what() const noexcept
{
return "Sqlite::CheckpointIsMisused";
}
} // namespace Sqlite } // namespace Sqlite

View File

@@ -15,293 +15,407 @@ namespace Sqlite {
class SQLITE_EXPORT Exception : public std::exception class SQLITE_EXPORT Exception : public std::exception
{ {
public: public:
Exception(const char *whatErrorHasHappen) Exception() = default;
: m_whatErrorHasHappen(whatErrorHasHappen)
{}
const char *what() const noexcept override; const char *what() const noexcept override;
private:
const char *m_whatErrorHasHappen;
}; };
class SQLITE_EXPORT ExceptionWithMessage : public Exception class SQLITE_EXPORT ExceptionWithMessage : public Exception
{ {
public: public:
ExceptionWithMessage(const char *whatErrorHasHappen, ExceptionWithMessage(Utils::SmallString &&sqliteErrorMessage = Utils::SmallString{})
Utils::SmallString &&sqliteErrorMessage = Utils::SmallString{}) : m_sqliteErrorMessage(std::move(sqliteErrorMessage))
: Exception{whatErrorHasHappen}
, m_sqliteErrorMessage(std::move(sqliteErrorMessage))
{} {}
const char *what() const noexcept override;
void printWarning() const; void printWarning() const;
private: private:
Utils::SmallString m_sqliteErrorMessage; Utils::SmallString m_sqliteErrorMessage;
}; };
class StatementIsBusy : public ExceptionWithMessage class SQLITE_EXPORT StatementIsBusy : public ExceptionWithMessage
{ {
public: public:
using ExceptionWithMessage::ExceptionWithMessage; using ExceptionWithMessage::ExceptionWithMessage;
const char *what() const noexcept override;
}; };
class DatabaseIsBusy : public Exception class SQLITE_EXPORT DatabaseIsBusy : public Exception
{ {
public: public:
using Exception::Exception; using Exception::Exception;
const char *what() const noexcept override;
}; };
class StatementHasError : public ExceptionWithMessage class SQLITE_EXPORT StatementHasError : public ExceptionWithMessage
{ {
public: public:
using ExceptionWithMessage::ExceptionWithMessage; using ExceptionWithMessage::ExceptionWithMessage;
const char *what() const noexcept override;
}; };
class StatementIsMisused : public ExceptionWithMessage class SQLITE_EXPORT StatementIsMisused : public ExceptionWithMessage
{ {
public: public:
using ExceptionWithMessage::ExceptionWithMessage; using ExceptionWithMessage::ExceptionWithMessage;
const char *what() const noexcept override;
}; };
class InputOutputError : public Exception class SQLITE_EXPORT InputOutputError : public Exception
{ {
public: public:
using Exception::Exception; using Exception::Exception;
const char *what() const noexcept override;
}; };
class ConstraintPreventsModification : public ExceptionWithMessage class SQLITE_EXPORT ConstraintPreventsModification : public ExceptionWithMessage
{ {
public: public:
using ExceptionWithMessage::ExceptionWithMessage; using ExceptionWithMessage::ExceptionWithMessage;
const char *what() const noexcept override;
}; };
class NoValuesToFetch : public Exception class SQLITE_EXPORT NoValuesToFetch : public Exception
{ {
public: public:
using Exception::Exception; using Exception::Exception;
const char *what() const noexcept override;
}; };
class BindingIndexIsOutOfRange : public ExceptionWithMessage class SQLITE_EXPORT BindingIndexIsOutOfRange : public ExceptionWithMessage
{ {
public: public:
using ExceptionWithMessage::ExceptionWithMessage; using ExceptionWithMessage::ExceptionWithMessage;
const char *what() const noexcept override;
}; };
class WrongBindingName : public Exception class SQLITE_EXPORT WrongBindingName : public Exception
{ {
public: public:
using Exception::Exception; using Exception::Exception;
const char *what() const noexcept override;
}; };
class DatabaseIsNotOpen : public Exception class SQLITE_EXPORT DatabaseIsNotOpen : public Exception
{ {
public: public:
using Exception::Exception; using Exception::Exception;
const char *what() const noexcept override;
}; };
class DatabaseCannotBeOpened : public ExceptionWithMessage class SQLITE_EXPORT DatabaseCannotBeOpened : public ExceptionWithMessage
{ {
public: public:
using ExceptionWithMessage::ExceptionWithMessage; using ExceptionWithMessage::ExceptionWithMessage;
const char *what() const noexcept override;
}; };
class DatabaseFilePathIsEmpty : public DatabaseCannotBeOpened class SQLITE_EXPORT DatabaseFilePathIsEmpty : public DatabaseCannotBeOpened
{ {
public: public:
using DatabaseCannotBeOpened::DatabaseCannotBeOpened; using DatabaseCannotBeOpened::DatabaseCannotBeOpened;
const char *what() const noexcept override;
}; };
class DatabaseIsAlreadyOpen : public DatabaseCannotBeOpened class SQLITE_EXPORT DatabaseIsAlreadyOpen : public DatabaseCannotBeOpened
{ {
public: public:
using DatabaseCannotBeOpened::DatabaseCannotBeOpened; using DatabaseCannotBeOpened::DatabaseCannotBeOpened;
const char *what() const noexcept override;
}; };
class DatabaseCannotBeClosed : public Exception class SQLITE_EXPORT DatabaseCannotBeClosed : public Exception
{ {
public: public:
using Exception::Exception; using Exception::Exception;
const char *what() const noexcept override;
}; };
class DatabaseIsAlreadyClosed : public DatabaseCannotBeClosed class SQLITE_EXPORT DatabaseIsAlreadyClosed : public DatabaseCannotBeClosed
{ {
public: public:
using DatabaseCannotBeClosed::DatabaseCannotBeClosed; using DatabaseCannotBeClosed::DatabaseCannotBeClosed;
const char *what() const noexcept override;
}; };
class WrongFilePath : public ExceptionWithMessage class SQLITE_EXPORT WrongFilePath : public ExceptionWithMessage
{ {
public: public:
using ExceptionWithMessage::ExceptionWithMessage; using ExceptionWithMessage::ExceptionWithMessage;
const char *what() const noexcept override;
}; };
class PragmaValueNotSet : public Exception class SQLITE_EXPORT PragmaValueNotSet : public Exception
{ {
public: public:
using Exception::Exception; using Exception::Exception;
const char *what() const noexcept override;
}; };
class NotReadOnlySqlStatement : public Exception class SQLITE_EXPORT PragmaValueCannotBeTransformed : public Exception
{ {
public: public:
using Exception::Exception; using Exception::Exception;
const char *what() const noexcept override;
}; };
class NotWriteSqlStatement : public Exception class SQLITE_EXPORT NotReadOnlySqlStatement : public Exception
{ {
public: public:
using Exception::Exception; using Exception::Exception;
const char *what() const noexcept override;
}; };
class DeadLock : public Exception class SQLITE_EXPORT NotWriteSqlStatement : public Exception
{ {
public: public:
using Exception::Exception; using Exception::Exception;
const char *what() const noexcept override;
}; };
class UnknowError : public ExceptionWithMessage class SQLITE_EXPORT DeadLock : public Exception
{
public:
using Exception::Exception;
const char *what() const noexcept override;
};
class SQLITE_EXPORT UnknowError : public ExceptionWithMessage
{ {
public: public:
using ExceptionWithMessage::ExceptionWithMessage; using ExceptionWithMessage::ExceptionWithMessage;
const char *what() const noexcept override;
}; };
class BindingTooBig : public ExceptionWithMessage class SQLITE_EXPORT BindingTooBig : public ExceptionWithMessage
{ {
public: public:
using ExceptionWithMessage::ExceptionWithMessage; using ExceptionWithMessage::ExceptionWithMessage;
const char *what() const noexcept override;
}; };
class TooBig : public ExceptionWithMessage class SQLITE_EXPORT TooBig : public ExceptionWithMessage
{ {
public: public:
using ExceptionWithMessage::ExceptionWithMessage; using ExceptionWithMessage::ExceptionWithMessage;
const char *what() const noexcept override;
}; };
class CannotConvert : public Exception class SQLITE_EXPORT CannotConvert : public Exception
{ {
public: public:
using Exception::Exception; using Exception::Exception;
const char *what() const noexcept override;
}; };
class ForeignKeyColumnIsNotUnique : public Exception class SQLITE_EXPORT ForeignKeyColumnIsNotUnique : public Exception
{ {
public: public:
using Exception::Exception; using Exception::Exception;
const char *what() const noexcept override;
}; };
class CannotApplyChangeSet : public Exception class SQLITE_EXPORT CannotApplyChangeSet : public Exception
{ {
public: public:
using Exception::Exception; using Exception::Exception;
const char *what() const noexcept override;
}; };
class ChangeSetIsMisused : public Exception class SQLITE_EXPORT ChangeSetIsMisused : public Exception
{ {
public: public:
using Exception::Exception; using Exception::Exception;
const char *what() const noexcept override;
}; };
class SchemeChangeError : public ExceptionWithMessage class SQLITE_EXPORT SchemeChangeError : public ExceptionWithMessage
{ {
public: public:
using ExceptionWithMessage::ExceptionWithMessage; using ExceptionWithMessage::ExceptionWithMessage;
const char *what() const noexcept override;
}; };
class CannotWriteToReadOnlyConnection : public ExceptionWithMessage class SQLITE_EXPORT CannotWriteToReadOnlyConnection : public ExceptionWithMessage
{ {
public: public:
using ExceptionWithMessage::ExceptionWithMessage; using ExceptionWithMessage::ExceptionWithMessage;
const char *what() const noexcept override;
}; };
class ProtocolError : public ExceptionWithMessage class SQLITE_EXPORT ProtocolError : public ExceptionWithMessage
{ {
public: public:
using ExceptionWithMessage::ExceptionWithMessage; using ExceptionWithMessage::ExceptionWithMessage;
const char *what() const noexcept override;
}; };
class DatabaseExceedsMaximumFileSize : public ExceptionWithMessage class SQLITE_EXPORT DatabaseExceedsMaximumFileSize : public ExceptionWithMessage
{ {
public: public:
using ExceptionWithMessage::ExceptionWithMessage; using ExceptionWithMessage::ExceptionWithMessage;
const char *what() const noexcept override;
}; };
class DataTypeMismatch : public ExceptionWithMessage class SQLITE_EXPORT DataTypeMismatch : public ExceptionWithMessage
{ {
public: public:
using ExceptionWithMessage::ExceptionWithMessage; using ExceptionWithMessage::ExceptionWithMessage;
const char *what() const noexcept override;
}; };
class ConnectionIsLocked : public ExceptionWithMessage class SQLITE_EXPORT ConnectionIsLocked : public ExceptionWithMessage
{ {
public: public:
using ExceptionWithMessage::ExceptionWithMessage; using ExceptionWithMessage::ExceptionWithMessage;
const char *what() const noexcept override;
}; };
class ExecutionInterrupted : public ExceptionWithMessage class SQLITE_EXPORT ExecutionInterrupted : public Exception
{
public:
using ExceptionWithMessage::ExceptionWithMessage;
};
class DatabaseIsCorrupt : public ExceptionWithMessage
{
public:
using ExceptionWithMessage::ExceptionWithMessage;
};
class CannotOpen : public ExceptionWithMessage
{
public:
using ExceptionWithMessage::ExceptionWithMessage;
};
class CannotCreateChangeSetIterator : public Exception
{ {
public: public:
using Exception::Exception; using Exception::Exception;
const char *what() const noexcept override;
}; };
class CannotGetChangeSetOperation : public Exception class SQLITE_EXPORT DatabaseIsCorrupt : public Exception
{ {
public: public:
using Exception::Exception; using Exception::Exception;
const char *what() const noexcept override;
}; };
class ChangeSetTupleIsOutOfRange : public Exception class SQLITE_EXPORT CannotOpen : public Exception
{ {
public: public:
using Exception::Exception; using Exception::Exception;
const char *what() const noexcept override;
}; };
class ChangeSetTupleIsMisused : public Exception class SQLITE_EXPORT CannotCreateChangeSetIterator : public Exception
{ {
public: public:
using Exception::Exception; using Exception::Exception;
const char *what() const noexcept override;
}; };
class UnknownError : public Exception class SQLITE_EXPORT CannotGetChangeSetOperation : public Exception
{ {
public: public:
using Exception::Exception; using Exception::Exception;
const char *what() const noexcept override;
}; };
class DatabaseIsNotLocked : public Exception class SQLITE_EXPORT ChangeSetTupleIsOutOfRange : public Exception
{ {
public: public:
using Exception::Exception; using Exception::Exception;
const char *what() const noexcept override;
}; };
class WrongBindingParameterCount : public Exception class SQLITE_EXPORT ChangeSetTupleIsMisused : public Exception
{ {
public: public:
using Exception::Exception; using Exception::Exception;
const char *what() const noexcept override;
}; };
class WrongColumnCount : public Exception class SQLITE_EXPORT UnknownError : public Exception
{ {
public: public:
using Exception::Exception; using Exception::Exception;
const char *what() const noexcept override;
};
class SQLITE_EXPORT DatabaseIsNotLocked : public Exception
{
public:
using Exception::Exception;
const char *what() const noexcept override;
};
class SQLITE_EXPORT WrongBindingParameterCount : public Exception
{
public:
using Exception::Exception;
const char *what() const noexcept override;
};
class SQLITE_EXPORT WrongColumnCount : public Exception
{
public:
using Exception::Exception;
const char *what() const noexcept override;
};
class SQLITE_EXPORT IndexHasNoTableName : public Exception
{
public:
using Exception::Exception;
const char *what() const noexcept override;
};
class SQLITE_EXPORT IndexHasNoColumns : public Exception
{
public:
using Exception::Exception;
const char *what() const noexcept override;
};
class SQLITE_EXPORT MultiTheadingCannotBeActivated : public Exception
{
public:
using Exception::Exception;
const char *what() const noexcept override;
};
class SQLITE_EXPORT LoggingCannotBeActivated : public Exception
{
public:
using Exception::Exception;
const char *what() const noexcept override;
};
class SQLITE_EXPORT MemoryMappingCannotBeChanged : public Exception
{
public:
using Exception::Exception;
const char *what() const noexcept override;
};
class SQLITE_EXPORT LibraryCannotBeInitialized : public Exception
{
public:
using Exception::Exception;
const char *what() const noexcept override;
};
class SQLITE_EXPORT LibraryCannotBeShutdown : public Exception
{
public:
using Exception::Exception;
const char *what() const noexcept override;
};
class SQLITE_EXPORT LogCannotBeCheckpointed : public Exception
{
public:
using Exception::Exception;
const char *what() const noexcept override;
};
class SQLITE_EXPORT BusyTimerCannotBeSet : public Exception
{
public:
using Exception::Exception;
const char *what() const noexcept override;
};
class SQLITE_EXPORT CheckpointIsMisused : public Exception
{
public:
using Exception::Exception;
const char *what() const noexcept override;
}; };
} // namespace Sqlite } // namespace Sqlite

View File

@@ -55,13 +55,13 @@ public:
void checkTableName() const void checkTableName() const
{ {
if (m_tableName.isEmpty()) if (m_tableName.isEmpty())
throw Exception("SqliteIndex has not table name!"); throw IndexHasNoTableName();
} }
void checkColumns() const void checkColumns() const
{ {
if (m_columnNames.empty()) if (m_columnNames.empty())
throw Exception("SqliteIndex has no columns!"); throw IndexHasNoColumns();
} }
private: private:

View File

@@ -91,8 +91,7 @@ protected:
void checkIsReadOnlyStatement() void checkIsReadOnlyStatement()
{ {
if (!Base::isReadOnlyStatement()) if (!Base::isReadOnlyStatement())
throw NotReadOnlySqlStatement( throw NotReadOnlySqlStatement();
"SqliteStatement::SqliteReadStatement: is not read only statement!");
} }
}; };

View File

@@ -26,15 +26,13 @@ void checkSessionChangeSetCreation(int resultCode)
void checkIteratorCreation(int resultCode) void checkIteratorCreation(int resultCode)
{ {
if (resultCode != SQLITE_OK) if (resultCode != SQLITE_OK)
throw Sqlite::CannotCreateChangeSetIterator{ throw Sqlite::CannotCreateChangeSetIterator{};
"SessionChangeSet: Cannot create iterator from blob."};
} }
void checkIteratorOperation(int resultCode) void checkIteratorOperation(int resultCode)
{ {
if (resultCode != SQLITE_OK) if (resultCode != SQLITE_OK)
throw Sqlite::CannotGetChangeSetOperation{ throw Sqlite::CannotGetChangeSetOperation{};
"SessionChangeSet: Cannot create iterator from blob."};
} }
void checkChangeSetValue(int resultCode) void checkChangeSetValue(int resultCode)
@@ -43,14 +41,12 @@ void checkChangeSetValue(int resultCode)
case SQLITE_OK: case SQLITE_OK:
return; return;
case SQLITE_RANGE: case SQLITE_RANGE:
throw Sqlite::ChangeSetTupleIsOutOfRange{ throw Sqlite::ChangeSetTupleIsOutOfRange{};
"SessionChangeSet: You tried to access a non existing column."};
case SQLITE_MISUSE: case SQLITE_MISUSE:
throw Sqlite::ChangeSetIsMisused{ throw Sqlite::ChangeSetIsMisused{};
"SessionChangeSet: Some misuse happened as you tried to access."};
} }
throw Sqlite::UnknownError{"SessionChangeSet: Some unknown error happened."}; throw Sqlite::UnknownError{};
} }
ValueView convertSqliteValue(sqlite3_value *value) ValueView convertSqliteValue(sqlite3_value *value)

View File

@@ -20,13 +20,13 @@ void checkResultCode(int resultCode)
case SQLITE_NOMEM: case SQLITE_NOMEM:
throw std::bad_alloc(); throw std::bad_alloc();
case SQLITE_SCHEMA: case SQLITE_SCHEMA:
throw CannotApplyChangeSet("Cannot apply change set!"); throw CannotApplyChangeSet();
case SQLITE_MISUSE: case SQLITE_MISUSE:
throw ChangeSetIsMisused("Change set is misused!"); throw ChangeSetIsMisused();
} }
if (resultCode != SQLITE_OK) if (resultCode != SQLITE_OK)
throw UnknowError("Unknow exception"); throw UnknowError();
} }
int xConflict(void *, int conflict, sqlite3_changeset_iter *) int xConflict(void *, int conflict, sqlite3_changeset_iter *)

View File

@@ -88,7 +88,7 @@ public:
Constraints &&constraints = {}) Constraints &&constraints = {})
{ {
if (!constainsUniqueIndex(referencedColumn.constraints)) if (!constainsUniqueIndex(referencedColumn.constraints))
throw ForeignKeyColumnIsNotUnique("Foreign column key must be unique!"); throw ForeignKeyColumnIsNotUnique();
constraints.emplace_back(ForeignKey{referencedColumn.tableName, constraints.emplace_back(ForeignKey{referencedColumn.tableName,
referencedColumn.name, referencedColumn.name,

View File

@@ -347,7 +347,7 @@ private:
case QVariant::ByteArray: case QVariant::ByteArray:
return VariantType{Blob{value.toByteArray()}}; return VariantType{Blob{value.toByteArray()}};
default: default:
throw CannotConvert("Cannot convert this QVariant to a ValueBase"); throw CannotConvert();
} }
} }
@@ -365,7 +365,7 @@ private:
case ValueType::Blob: case ValueType::Blob:
return VariantType{view.toBlobView()}; return VariantType{view.toBlobView()};
default: default:
throw CannotConvert("Cannot convert this QVariant to a ValueBase"); throw CannotConvert();
} }
} }
}; };

View File

@@ -28,8 +28,7 @@ protected:
void checkIsWritableStatement() void checkIsWritableStatement()
{ {
if (Base::isReadOnlyStatement()) if (Base::isReadOnlyStatement())
throw NotWriteSqlStatement( throw NotWriteSqlStatement();
"SqliteStatement::SqliteWriteStatement: is not a writable statement!");
} }
}; };

View File

@@ -197,30 +197,37 @@ void SqlStatementBuilder::checkIfPlaceHolderExists(Utils::SmallStringView name)
void SqlStatementBuilder::checkIfNoPlaceHoldersAynmoreExists() const void SqlStatementBuilder::checkIfNoPlaceHoldersAynmoreExists() const
{ {
if (m_sqlStatement.contains('$')) if (m_sqlStatement.contains('$'))
throwException("SqlStatementBuilder::bind: there are still placeholder in the sql statement!", m_sqlTemplate.constData()); throwException(
"SqlStatementBuilder::bind: there are still placeholder in the sql statement!",
m_sqlTemplate);
} }
void SqlStatementBuilder::checkBindingTextIsNotEmpty(Utils::SmallStringView text) const void SqlStatementBuilder::checkBindingTextIsNotEmpty(Utils::SmallStringView text) const
{ {
if (text.isEmpty()) if (text.isEmpty())
throwException("SqlStatementBuilder::bind: binding text it empty!", m_sqlTemplate.constData()); throwException("SqlStatementBuilder::bind: binding text it empty!", m_sqlTemplate);
} }
void SqlStatementBuilder::checkBindingTextVectorIsNotEmpty(const Utils::SmallStringVector &textVector) const void SqlStatementBuilder::checkBindingTextVectorIsNotEmpty(const Utils::SmallStringVector &textVector) const
{ {
if (textVector.empty()) if (textVector.empty())
throwException("SqlStatementBuilder::bind: binding text vector it empty!", m_sqlTemplate.constData()); throwException("SqlStatementBuilder::bind: binding text vector it empty!", m_sqlTemplate);
} }
void SqlStatementBuilder::checkBindingIntegerVectorIsNotEmpty(const std::vector<int> &integerVector) const void SqlStatementBuilder::checkBindingIntegerVectorIsNotEmpty(const std::vector<int> &integerVector) const
{ {
if (integerVector.empty()) if (integerVector.empty())
throwException("SqlStatementBuilder::bind: binding integer vector it empty!", m_sqlTemplate.constData()); throwException("SqlStatementBuilder::bind: binding integer vector it empty!", m_sqlTemplate);
} }
void SqlStatementBuilder::throwException(const char *whatHasHappened, const char *errorMessage) void SqlStatementBuilder::throwException(const char *whatHasHappened, Utils::SmallString sqlTemplate)
{ {
throw SqlStatementBuilderException(whatHasHappened, errorMessage); throw SqlStatementBuilderException(whatHasHappened, std::move(sqlTemplate));
}
const char *SqlStatementBuilderException::what() const noexcept
{
return m_whatHasHappened;
} }
} // namespace Sqlite } // namespace Sqlite

View File

@@ -52,7 +52,8 @@ protected:
void checkBindingTextVectorIsNotEmpty(const Utils::SmallStringVector &textVector) const; void checkBindingTextVectorIsNotEmpty(const Utils::SmallStringVector &textVector) const;
void checkBindingIntegerVectorIsNotEmpty(const std::vector<int> &integerVector) const; void checkBindingIntegerVectorIsNotEmpty(const std::vector<int> &integerVector) const;
Q_NORETURN static void throwException(const char *whatHasHappened, const char *errorMessage); Q_NORETURN static void throwException(const char *whatHasHappened,
Utils::SmallString sqlTemplate);
private: private:
Utils::BasicSmallString<510> m_sqlTemplate; Utils::BasicSmallString<510> m_sqlTemplate;

View File

@@ -10,7 +10,16 @@ namespace Sqlite {
class SQLITE_EXPORT SqlStatementBuilderException : public ExceptionWithMessage class SQLITE_EXPORT SqlStatementBuilderException : public ExceptionWithMessage
{ {
public: public:
using ExceptionWithMessage::ExceptionWithMessage; SqlStatementBuilderException(const char *whatHasHappened,
Utils::SmallString &&sqliteErrorMessage)
: ExceptionWithMessage(std::move(sqliteErrorMessage))
, m_whatHasHappened{whatHasHappened}
{}
const char *what() const noexcept override;
private:
const char *m_whatHasHappened;
}; };
} // namespace Sqlite } // namespace Sqlite

View File

@@ -203,8 +203,7 @@ TEST_F(SqliteTransaction, ExclusiveTNonThrowingDestructorransactionRollBack)
TEST_F(SqliteTransaction, DeferredTransactionBeginThrows) TEST_F(SqliteTransaction, DeferredTransactionBeginThrows)
{ {
ON_CALL(mockTransactionBackend, deferredBegin()) ON_CALL(mockTransactionBackend, deferredBegin()).WillByDefault(Throw(Sqlite::Exception()));
.WillByDefault(Throw(Sqlite::Exception("foo")));
ASSERT_THROW(DeferredTransaction{mockTransactionBackend}, ASSERT_THROW(DeferredTransaction{mockTransactionBackend},
Sqlite::Exception); Sqlite::Exception);
@@ -212,8 +211,7 @@ TEST_F(SqliteTransaction, DeferredTransactionBeginThrows)
TEST_F(SqliteTransaction, ImmediateTransactionBeginThrows) TEST_F(SqliteTransaction, ImmediateTransactionBeginThrows)
{ {
ON_CALL(mockTransactionBackend, immediateBegin()) ON_CALL(mockTransactionBackend, immediateBegin()).WillByDefault(Throw(Sqlite::Exception()));
.WillByDefault(Throw(Sqlite::Exception("foo")));
ASSERT_THROW(ImmediateTransaction{mockTransactionBackend}, ASSERT_THROW(ImmediateTransaction{mockTransactionBackend},
Sqlite::Exception); Sqlite::Exception);
@@ -221,8 +219,7 @@ TEST_F(SqliteTransaction, ImmediateTransactionBeginThrows)
TEST_F(SqliteTransaction, ExclusiveTransactionBeginThrows) TEST_F(SqliteTransaction, ExclusiveTransactionBeginThrows)
{ {
ON_CALL(mockTransactionBackend, exclusiveBegin()) ON_CALL(mockTransactionBackend, exclusiveBegin()).WillByDefault(Throw(Sqlite::Exception()));
.WillByDefault(Throw(Sqlite::Exception("foo")));
ASSERT_THROW(ExclusiveTransaction{mockTransactionBackend}, ASSERT_THROW(ExclusiveTransaction{mockTransactionBackend},
Sqlite::Exception); Sqlite::Exception);
@@ -233,8 +230,7 @@ TEST_F(SqliteTransaction, DeferredTransactionBeginThrowsAndNotRollback)
InSequence s; InSequence s;
EXPECT_CALL(mockTransactionBackend, lock()); EXPECT_CALL(mockTransactionBackend, lock());
EXPECT_CALL(mockTransactionBackend, deferredBegin()) EXPECT_CALL(mockTransactionBackend, deferredBegin()).WillOnce(Throw(Sqlite::Exception()));
.WillOnce(Throw(Sqlite::Exception("foo")));
EXPECT_CALL(mockTransactionBackend, rollback()).Times(0); EXPECT_CALL(mockTransactionBackend, rollback()).Times(0);
EXPECT_CALL(mockTransactionBackend, unlock()); EXPECT_CALL(mockTransactionBackend, unlock());
@@ -246,8 +242,7 @@ TEST_F(SqliteTransaction, ImmediateTransactionBeginThrowsAndNotRollback)
InSequence s; InSequence s;
EXPECT_CALL(mockTransactionBackend, lock()); EXPECT_CALL(mockTransactionBackend, lock());
EXPECT_CALL(mockTransactionBackend, immediateBegin()) EXPECT_CALL(mockTransactionBackend, immediateBegin()).WillOnce(Throw(Sqlite::Exception()));
.WillOnce(Throw(Sqlite::Exception("foo")));
EXPECT_CALL(mockTransactionBackend, rollback()).Times(0); EXPECT_CALL(mockTransactionBackend, rollback()).Times(0);
EXPECT_CALL(mockTransactionBackend, unlock()); EXPECT_CALL(mockTransactionBackend, unlock());
@@ -260,8 +255,7 @@ TEST_F(SqliteTransaction, ExclusiveTransactionBeginThrowsAndNotRollback)
InSequence s; InSequence s;
EXPECT_CALL(mockTransactionBackend, lock()); EXPECT_CALL(mockTransactionBackend, lock());
EXPECT_CALL(mockTransactionBackend, exclusiveBegin()) EXPECT_CALL(mockTransactionBackend, exclusiveBegin()).WillOnce(Throw(Sqlite::Exception()));
.WillOnce(Throw(Sqlite::Exception("foo")));
EXPECT_CALL(mockTransactionBackend, rollback()).Times(0); EXPECT_CALL(mockTransactionBackend, rollback()).Times(0);
EXPECT_CALL(mockTransactionBackend, unlock()); EXPECT_CALL(mockTransactionBackend, unlock());
@@ -270,8 +264,7 @@ TEST_F(SqliteTransaction, ExclusiveTransactionBeginThrowsAndNotRollback)
TEST_F(SqliteTransaction, TransactionCommitThrows) TEST_F(SqliteTransaction, TransactionCommitThrows)
{ {
ON_CALL(mockTransactionBackend, commit()) ON_CALL(mockTransactionBackend, commit()).WillByDefault(Throw(Sqlite::Exception()));
.WillByDefault(Throw(Sqlite::Exception("foo")));
ImmediateTransaction transaction{mockTransactionBackend}; ImmediateTransaction transaction{mockTransactionBackend};
ASSERT_THROW(transaction.commit(), ASSERT_THROW(transaction.commit(),
@@ -280,8 +273,7 @@ TEST_F(SqliteTransaction, TransactionCommitThrows)
TEST_F(SqliteTransaction, TransactionRollbackInDestructorThrows) TEST_F(SqliteTransaction, TransactionRollbackInDestructorThrows)
{ {
ON_CALL(mockTransactionBackend, rollback()) ON_CALL(mockTransactionBackend, rollback()).WillByDefault(Throw(Sqlite::Exception()));
.WillByDefault(Throw(Sqlite::Exception("foo")));
ASSERT_THROW(ExclusiveTransaction{mockTransactionBackend}, ASSERT_THROW(ExclusiveTransaction{mockTransactionBackend},
Sqlite::Exception); Sqlite::Exception);
@@ -289,8 +281,7 @@ TEST_F(SqliteTransaction, TransactionRollbackInDestructorThrows)
TEST_F(SqliteTransaction, TransactionRollbackInDestructorDontThrows) TEST_F(SqliteTransaction, TransactionRollbackInDestructorDontThrows)
{ {
ON_CALL(mockTransactionBackend, rollback()) ON_CALL(mockTransactionBackend, rollback()).WillByDefault(Throw(Sqlite::Exception()));
.WillByDefault(Throw(Sqlite::Exception("foo")));
ASSERT_NO_THROW(ExclusiveNonThrowingDestructorTransaction{mockTransactionBackend}); ASSERT_NO_THROW(ExclusiveNonThrowingDestructorTransaction{mockTransactionBackend});
} }
@@ -322,15 +313,14 @@ TEST_F(SqliteTransaction, ImmediateSessionTransactionRollBack)
TEST_F(SqliteTransaction, SessionTransactionRollbackInDestructorThrows) TEST_F(SqliteTransaction, SessionTransactionRollbackInDestructorThrows)
{ {
ON_CALL(mockTransactionBackend, sessionRollback()).WillByDefault(Throw(Sqlite::Exception("foo"))); ON_CALL(mockTransactionBackend, sessionRollback()).WillByDefault(Throw(Sqlite::Exception()));
ASSERT_THROW(ImmediateSessionTransaction{mockTransactionBackend}, Sqlite::Exception); ASSERT_THROW(ImmediateSessionTransaction{mockTransactionBackend}, Sqlite::Exception);
} }
TEST_F(SqliteTransaction, ImmidiateSessionTransactionBeginThrows) TEST_F(SqliteTransaction, ImmidiateSessionTransactionBeginThrows)
{ {
ON_CALL(mockTransactionBackend, immediateSessionBegin()) ON_CALL(mockTransactionBackend, immediateSessionBegin()).WillByDefault(Throw(Sqlite::Exception()));
.WillByDefault(Throw(Sqlite::Exception("foo")));
ASSERT_THROW(ImmediateSessionTransaction{mockTransactionBackend}, Sqlite::Exception); ASSERT_THROW(ImmediateSessionTransaction{mockTransactionBackend}, Sqlite::Exception);
} }
@@ -340,7 +330,7 @@ TEST_F(SqliteTransaction, ImmediateSessionTransactionBeginThrowsAndNotRollback)
InSequence s; InSequence s;
EXPECT_CALL(mockTransactionBackend, lock()); EXPECT_CALL(mockTransactionBackend, lock());
EXPECT_CALL(mockTransactionBackend, immediateSessionBegin()).WillOnce(Throw(Sqlite::Exception("foo"))); EXPECT_CALL(mockTransactionBackend, immediateSessionBegin()).WillOnce(Throw(Sqlite::Exception()));
EXPECT_CALL(mockTransactionBackend, sessionRollback()).Times(0); EXPECT_CALL(mockTransactionBackend, sessionRollback()).Times(0);
EXPECT_CALL(mockTransactionBackend, unlock()); EXPECT_CALL(mockTransactionBackend, unlock());