From 4502a02fbb95bd32ad7bb367485184fc977ab1b2 Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Mon, 13 Mar 2023 16:00:29 +0100 Subject: [PATCH] Sqlite: Add extended exceptions for contraint errors Change-Id: I2e3030de7496703ba1e9fbd1a28ed55061e1b2b5 Reviewed-by: Tim Jenssen Reviewed-by: Qt CI Bot --- src/libs/sqlite/sqlitebasestatement.cpp | 20 ++++-- src/libs/sqlite/sqlitebasestatement.h | 1 - src/libs/sqlite/sqliteexception.cpp | 60 +++++++++++++++++ src/libs/sqlite/sqliteexception.h | 85 +++++++++++++++++++++++++ 4 files changed, 158 insertions(+), 8 deletions(-) diff --git a/src/libs/sqlite/sqlitebasestatement.cpp b/src/libs/sqlite/sqlitebasestatement.cpp index ff94b830183..c8dc9b09b17 100644 --- a/src/libs/sqlite/sqlitebasestatement.cpp +++ b/src/libs/sqlite/sqlitebasestatement.cpp @@ -328,20 +328,31 @@ void BaseStatement::checkForStepError(int resultCode) const case SQLITE_MISUSE: throwStatementIsMisused("SqliteStatement::stepStatement: was called inappropriately!"); case SQLITE_CONSTRAINT_CHECK: + throw CheckConstraintPreventsModification(sqlite3_errmsg(sqliteDatabaseHandle())); case SQLITE_CONSTRAINT_COMMITHOOK: + throw CommitHookConstraintPreventsModification(sqlite3_errmsg(sqliteDatabaseHandle())); case SQLITE_CONSTRAINT_DATATYPE: + throw DataTypeConstraintPreventsModification(sqlite3_errmsg(sqliteDatabaseHandle())); case SQLITE_CONSTRAINT_FOREIGNKEY: + throw ForeignKeyConstraintPreventsModification(sqlite3_errmsg(sqliteDatabaseHandle())); case SQLITE_CONSTRAINT_FUNCTION: + throw FunctionConstraintPreventsModification(sqlite3_errmsg(sqliteDatabaseHandle())); case SQLITE_CONSTRAINT_NOTNULL: + throw NotNullConstraintPreventsModification(sqlite3_errmsg(sqliteDatabaseHandle())); case SQLITE_CONSTRAINT_PINNED: + throw PinnedConstraintPreventsModification(sqlite3_errmsg(sqliteDatabaseHandle())); case SQLITE_CONSTRAINT_PRIMARYKEY: + throw PrimaryKeyConstraintPreventsModification(sqlite3_errmsg(sqliteDatabaseHandle())); case SQLITE_CONSTRAINT_ROWID: + throw RowIdConstraintPreventsModification(sqlite3_errmsg(sqliteDatabaseHandle())); case SQLITE_CONSTRAINT_TRIGGER: + throw TriggerConstraintPreventsModification(sqlite3_errmsg(sqliteDatabaseHandle())); case SQLITE_CONSTRAINT_UNIQUE: + throw UniqueConstraintPreventsModification(sqlite3_errmsg(sqliteDatabaseHandle())); case SQLITE_CONSTRAINT_VTAB: + throw VirtualTableConstraintPreventsModification(sqlite3_errmsg(sqliteDatabaseHandle())); case SQLITE_CONSTRAINT: - throwConstraintPreventsModification( - "SqliteStatement::stepStatement: contraint prevent insert or update!"); + throw ConstraintPreventsModification(sqlite3_errmsg(sqliteDatabaseHandle())); case SQLITE_TOOBIG: throwTooBig("SqliteStatement::stepStatement: Some is to bigger than SQLITE_MAX_LENGTH."); case SQLITE_SCHEMA: @@ -587,11 +598,6 @@ void BaseStatement::throwStatementIsMisused(const char *) const throw StatementIsMisused(sqlite3_errmsg(sqliteDatabaseHandle())); } -void BaseStatement::throwConstraintPreventsModification(const char *) const -{ - throw ConstraintPreventsModification(sqlite3_errmsg(sqliteDatabaseHandle())); -} - void BaseStatement::throwNoValuesToFetch(const char *) const { throw NoValuesToFetch(); diff --git a/src/libs/sqlite/sqlitebasestatement.h b/src/libs/sqlite/sqlitebasestatement.h index 2b09a6d13ba..80afc568952 100644 --- a/src/libs/sqlite/sqlitebasestatement.h +++ b/src/libs/sqlite/sqlitebasestatement.h @@ -118,7 +118,6 @@ public: void checkColumnCount(int columnCount) const; bool isReadOnlyStatement() const; [[noreturn]] void throwStatementIsMisused(const char *whatHasHappened) const; - [[noreturn]] void throwConstraintPreventsModification(const char *whatHasHappened) const; [[noreturn]] void throwNoValuesToFetch(const char *whatHasHappened) const; [[noreturn]] void throwInvalidColumnFetched(const char *whatHasHappened) const; [[noreturn]] void throwBindingIndexIsOutOfRange(const char *whatHasHappened) const; diff --git a/src/libs/sqlite/sqliteexception.cpp b/src/libs/sqlite/sqliteexception.cpp index d5bb72816ef..b338d76a7cc 100644 --- a/src/libs/sqlite/sqliteexception.cpp +++ b/src/libs/sqlite/sqliteexception.cpp @@ -509,4 +509,64 @@ const char *StatementHasErrorSnapshot::what() const noexcept return "Sqlite::StatementHasErrorSnapshot"; } +const char *CheckConstraintPreventsModification::what() const noexcept +{ + return "Sqlite::CheckConstraintPreventsModification"; +} + +const char *CommitHookConstraintPreventsModification::what() const noexcept +{ + return "Sqlite::CommitHookConstraintPreventsModification"; +} + +const char *DataTypeConstraintPreventsModification::what() const noexcept +{ + return "Sqlite::DataTypeConstraintPreventsModification"; +} + +const char *ForeignKeyConstraintPreventsModification::what() const noexcept +{ + return "Sqlite::ForeignKeyConstraintPreventsModification"; +} + +const char *FunctionConstraintPreventsModification::what() const noexcept +{ + return "Sqlite::FunctionConstraintPreventsModification"; +} + +const char *NotNullConstraintPreventsModification::what() const noexcept +{ + return "Sqlite::NotNullConstraintPreventsModification"; +} + +const char *PinnedConstraintPreventsModification::what() const noexcept +{ + return "Sqlite::PinnedConstraintPreventsModification"; +} + +const char *PrimaryKeyConstraintPreventsModification::what() const noexcept +{ + return "Sqlite::PrimaryKeyConstraintPreventsModification"; +} + +const char *RowIdConstraintPreventsModification::what() const noexcept +{ + return "Sqlite::RowIdConstraintPreventsModification"; +} + +const char *TriggerConstraintPreventsModification::what() const noexcept +{ + return "Sqlite::TriggerConstraintPreventsModification"; +} + +const char *UniqueConstraintPreventsModification::what() const noexcept +{ + return "Sqlite::UniqueConstraintPreventsModification"; +} + +const char *VirtualTableConstraintPreventsModification::what() const noexcept +{ + return "Sqlite::VirtualTableConstraintPreventsModification"; +} + } // namespace Sqlite diff --git a/src/libs/sqlite/sqliteexception.h b/src/libs/sqlite/sqliteexception.h index 1677d7ef946..8bdb537fc16 100644 --- a/src/libs/sqlite/sqliteexception.h +++ b/src/libs/sqlite/sqliteexception.h @@ -333,6 +333,91 @@ public: const char *what() const noexcept override; }; +class SQLITE_EXPORT CheckConstraintPreventsModification : public ConstraintPreventsModification +{ +public: + using ConstraintPreventsModification::ConstraintPreventsModification; + const char *what() const noexcept override; +}; + +class SQLITE_EXPORT CommitHookConstraintPreventsModification : public ConstraintPreventsModification +{ +public: + using ConstraintPreventsModification::ConstraintPreventsModification; + const char *what() const noexcept override; +}; + +class SQLITE_EXPORT DataTypeConstraintPreventsModification : public ConstraintPreventsModification +{ +public: + using ConstraintPreventsModification::ConstraintPreventsModification; + const char *what() const noexcept override; +}; + +class SQLITE_EXPORT ForeignKeyConstraintPreventsModification : public ConstraintPreventsModification +{ +public: + using ConstraintPreventsModification::ConstraintPreventsModification; + const char *what() const noexcept override; +}; + +class SQLITE_EXPORT FunctionConstraintPreventsModification : public ConstraintPreventsModification +{ +public: + using ConstraintPreventsModification::ConstraintPreventsModification; + const char *what() const noexcept override; +}; + +class SQLITE_EXPORT NotNullConstraintPreventsModification : public ConstraintPreventsModification +{ +public: + using ConstraintPreventsModification::ConstraintPreventsModification; + const char *what() const noexcept override; +}; + +class SQLITE_EXPORT PinnedConstraintPreventsModification : public ConstraintPreventsModification +{ +public: + using ConstraintPreventsModification::ConstraintPreventsModification; + const char *what() const noexcept override; +}; + +class SQLITE_EXPORT PrimaryKeyConstraintPreventsModification : public ConstraintPreventsModification +{ +public: + using ConstraintPreventsModification::ConstraintPreventsModification; + const char *what() const noexcept override; +}; + +class SQLITE_EXPORT RowIdConstraintPreventsModification : public ConstraintPreventsModification +{ +public: + using ConstraintPreventsModification::ConstraintPreventsModification; + const char *what() const noexcept override; +}; + +class SQLITE_EXPORT TriggerConstraintPreventsModification : public ConstraintPreventsModification +{ +public: + using ConstraintPreventsModification::ConstraintPreventsModification; + const char *what() const noexcept override; +}; + +class SQLITE_EXPORT UniqueConstraintPreventsModification : public ConstraintPreventsModification +{ +public: + using ConstraintPreventsModification::ConstraintPreventsModification; + const char *what() const noexcept override; +}; + +class SQLITE_EXPORT VirtualTableConstraintPreventsModification + : public ConstraintPreventsModification +{ +public: + using ConstraintPreventsModification::ConstraintPreventsModification; + const char *what() const noexcept override; +}; + class SQLITE_EXPORT NoValuesToFetch : public Exception { public: