Sqlite: Add extended exceptions for IO errors

Change-Id: I3862a91e3d9989c44c7c62171324c38b66a67ac0
Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
This commit is contained in:
Marco Bubke
2023-03-13 15:04:20 +01:00
parent 925b08d6e6
commit 0a38ae7e78
4 changed files with 491 additions and 64 deletions

View File

@@ -367,39 +367,74 @@ void BaseStatement::checkForStepError(int resultCode) const
case SQLITE_LOCKED_VTAB:
case SQLITE_LOCKED:
throwConnectionIsLocked("SqliteStatement::stepStatement: Database connection is locked.");
case SQLITE_IOERR_AUTH:
case SQLITE_IOERR_BEGIN_ATOMIC:
case SQLITE_IOERR_BLOCKED:
case SQLITE_IOERR_CHECKRESERVEDLOCK:
case SQLITE_IOERR_CLOSE:
case SQLITE_IOERR_COMMIT_ATOMIC:
case SQLITE_IOERR_CONVPATH:
case SQLITE_IOERR_DATA:
case SQLITE_IOERR_DELETE:
case SQLITE_IOERR_DELETE_NOENT:
case SQLITE_IOERR_DIR_CLOSE:
case SQLITE_IOERR_DIR_FSYNC:
case SQLITE_IOERR_FSTAT:
case SQLITE_IOERR_FSYNC:
case SQLITE_IOERR_GETTEMPPATH:
case SQLITE_IOERR_LOCK:
case SQLITE_IOERR_MMAP:
case SQLITE_IOERR_NOMEM:
case SQLITE_IOERR_RDLOCK:
case SQLITE_IOERR_READ:
case SQLITE_IOERR_ROLLBACK_ATOMIC:
case SQLITE_IOERR_SEEK:
case SQLITE_IOERR_SHMLOCK:
case SQLITE_IOERR_SHMMAP:
case SQLITE_IOERR_SHMOPEN:
case SQLITE_IOERR_SHMSIZE:
throw InputOutputCannotRead();
case SQLITE_IOERR_SHORT_READ:
case SQLITE_IOERR_TRUNCATE:
case SQLITE_IOERR_UNLOCK:
case SQLITE_IOERR_VNODE:
throw InputOutputCannotShortRead();
case SQLITE_IOERR_WRITE:
throw InputOutputCannotWrite();
case SQLITE_IOERR_FSYNC:
throw InputOutputCannotSynchronizeFile();
case SQLITE_IOERR_DIR_FSYNC:
throw InputOutputCannotSynchronizeDirectory();
case SQLITE_IOERR_TRUNCATE:
throw InputOutputCannotTruncate();
case SQLITE_IOERR_FSTAT:
throw InputOutputCannotFsStat();
case SQLITE_IOERR_UNLOCK:
throw InputOutputCannotUnlock();
case SQLITE_IOERR_RDLOCK:
throw InputOutputCannotReadLock();
case SQLITE_IOERR_DELETE:
throw InputOutputCannotDelete();
case SQLITE_IOERR_BLOCKED:
throw InputOutputBlocked();
case SQLITE_IOERR_NOMEM:
throw InputOutputNoMemory();
case SQLITE_IOERR_ACCESS:
throw InputOutputCannotAccess();
case SQLITE_IOERR_CHECKRESERVEDLOCK:
throw InputOutputCannotCheckReservedLock();
case SQLITE_IOERR_LOCK:
throw InputOutputCannotLock();
case SQLITE_IOERR_CLOSE:
throw InputOutputCannotClose();
case SQLITE_IOERR_DIR_CLOSE:
throw InputOutputCannotCloseDirectory();
case SQLITE_IOERR_SHMOPEN:
throw InputOutputCannotOpenSharedMemory();
case SQLITE_IOERR_SHMSIZE:
throw InputOutputCannotEnlargeSharedMemory();
case SQLITE_IOERR_SHMLOCK:
throw InputOutputCannotLockSharedMemory();
case SQLITE_IOERR_SHMMAP:
throw InputOutputCannotMapSharedMemory();
case SQLITE_IOERR_SEEK:
throw InputOutputCannotSeek();
case SQLITE_IOERR_DELETE_NOENT:
throw InputOutputCannotDeleteNonExistingFile();
case SQLITE_IOERR_MMAP:
throw InputOutputCannotMemoryMap();
case SQLITE_IOERR_GETTEMPPATH:
throw InputOutputCannotGetTemporaryPath();
case SQLITE_IOERR_CONVPATH:
throw InputOutputConvPathFailed();
case SQLITE_IOERR_VNODE:
throw InputOutputVNodeError();
case SQLITE_IOERR_AUTH:
throw InputOutputCannotAuthenticate();
case SQLITE_IOERR_BEGIN_ATOMIC:
throw InputOutputCannotBeginAtomic();
case SQLITE_IOERR_COMMIT_ATOMIC:
throw InputOutputCannotCommitAtomic();
case SQLITE_IOERR_ROLLBACK_ATOMIC:
throw InputOutputCannotRollbackAtomic();
case SQLITE_IOERR_DATA:
throw InputOutputDataError();
case SQLITE_IOERR_CORRUPTFS:
throw InputOutputFileSystemIsCorrupt();
case SQLITE_IOERR:
throwInputOutputError("SqliteStatement::stepStatement: An IO error happened.");
throw InputOutputError();
case SQLITE_INTERRUPT:
throwExecutionInterrupted("SqliteStatement::stepStatement: Execution was interrupted.");
case SQLITE_CORRUPT_INDEX:
@@ -437,39 +472,74 @@ void BaseStatement::checkForPrepareError(int resultCode) const
"constraint violation) has occurred!");
case SQLITE_MISUSE:
throwStatementIsMisused("SqliteStatement::prepareStatement: was called inappropriately!");
case SQLITE_IOERR_AUTH:
case SQLITE_IOERR_BEGIN_ATOMIC:
case SQLITE_IOERR_BLOCKED:
case SQLITE_IOERR_CHECKRESERVEDLOCK:
case SQLITE_IOERR_CLOSE:
case SQLITE_IOERR_COMMIT_ATOMIC:
case SQLITE_IOERR_CONVPATH:
case SQLITE_IOERR_DATA:
case SQLITE_IOERR_DELETE:
case SQLITE_IOERR_DELETE_NOENT:
case SQLITE_IOERR_DIR_CLOSE:
case SQLITE_IOERR_DIR_FSYNC:
case SQLITE_IOERR_FSTAT:
case SQLITE_IOERR_FSYNC:
case SQLITE_IOERR_GETTEMPPATH:
case SQLITE_IOERR_LOCK:
case SQLITE_IOERR_MMAP:
case SQLITE_IOERR_NOMEM:
case SQLITE_IOERR_RDLOCK:
case SQLITE_IOERR_READ:
case SQLITE_IOERR_ROLLBACK_ATOMIC:
case SQLITE_IOERR_SEEK:
case SQLITE_IOERR_SHMLOCK:
case SQLITE_IOERR_SHMMAP:
case SQLITE_IOERR_SHMOPEN:
case SQLITE_IOERR_SHMSIZE:
throw InputOutputCannotRead();
case SQLITE_IOERR_SHORT_READ:
case SQLITE_IOERR_TRUNCATE:
case SQLITE_IOERR_UNLOCK:
case SQLITE_IOERR_VNODE:
throw InputOutputCannotShortRead();
case SQLITE_IOERR_WRITE:
throw InputOutputCannotWrite();
case SQLITE_IOERR_FSYNC:
throw InputOutputCannotSynchronizeFile();
case SQLITE_IOERR_DIR_FSYNC:
throw InputOutputCannotSynchronizeDirectory();
case SQLITE_IOERR_TRUNCATE:
throw InputOutputCannotTruncate();
case SQLITE_IOERR_FSTAT:
throw InputOutputCannotFsStat();
case SQLITE_IOERR_UNLOCK:
throw InputOutputCannotUnlock();
case SQLITE_IOERR_RDLOCK:
throw InputOutputCannotReadLock();
case SQLITE_IOERR_DELETE:
throw InputOutputCannotDelete();
case SQLITE_IOERR_BLOCKED:
throw InputOutputBlocked();
case SQLITE_IOERR_NOMEM:
throw InputOutputNoMemory();
case SQLITE_IOERR_ACCESS:
throw InputOutputCannotAccess();
case SQLITE_IOERR_CHECKRESERVEDLOCK:
throw InputOutputCannotCheckReservedLock();
case SQLITE_IOERR_LOCK:
throw InputOutputCannotLock();
case SQLITE_IOERR_CLOSE:
throw InputOutputCannotClose();
case SQLITE_IOERR_DIR_CLOSE:
throw InputOutputCannotCloseDirectory();
case SQLITE_IOERR_SHMOPEN:
throw InputOutputCannotOpenSharedMemory();
case SQLITE_IOERR_SHMSIZE:
throw InputOutputCannotEnlargeSharedMemory();
case SQLITE_IOERR_SHMLOCK:
throw InputOutputCannotLockSharedMemory();
case SQLITE_IOERR_SHMMAP:
throw InputOutputCannotMapSharedMemory();
case SQLITE_IOERR_SEEK:
throw InputOutputCannotSeek();
case SQLITE_IOERR_DELETE_NOENT:
throw InputOutputCannotDeleteNonExistingFile();
case SQLITE_IOERR_MMAP:
throw InputOutputCannotMemoryMap();
case SQLITE_IOERR_GETTEMPPATH:
throw InputOutputCannotGetTemporaryPath();
case SQLITE_IOERR_CONVPATH:
throw InputOutputConvPathFailed();
case SQLITE_IOERR_VNODE:
throw InputOutputVNodeError();
case SQLITE_IOERR_AUTH:
throw InputOutputCannotAuthenticate();
case SQLITE_IOERR_BEGIN_ATOMIC:
throw InputOutputCannotBeginAtomic();
case SQLITE_IOERR_COMMIT_ATOMIC:
throw InputOutputCannotCommitAtomic();
case SQLITE_IOERR_ROLLBACK_ATOMIC:
throw InputOutputCannotRollbackAtomic();
case SQLITE_IOERR_DATA:
throw InputOutputDataError();
case SQLITE_IOERR_CORRUPTFS:
throw InputOutputFileSystemIsCorrupt();
case SQLITE_IOERR:
throwInputOutputError("SqliteStatement::prepareStatement: IO error happened!");
throw InputOutputError();
}
throwUnknowError("SqliteStatement::prepareStatement: unknown error has happened");
@@ -519,11 +589,6 @@ void BaseStatement::throwStatementIsMisused(const char *) const
throw StatementIsMisused(sqlite3_errmsg(sqliteDatabaseHandle()));
}
void BaseStatement::throwInputOutputError(const char *) const
{
throw InputOutputError();
}
void BaseStatement::throwConstraintPreventsModification(const char *) const
{
throw ConstraintPreventsModification(sqlite3_errmsg(sqliteDatabaseHandle()));

View File

@@ -120,7 +120,6 @@ public:
[[noreturn]] void throwStatementIsBusy(const char *whatHasHappened) const;
[[noreturn]] void throwStatementHasError(const char *whatHasHappened) const;
[[noreturn]] void throwStatementIsMisused(const char *whatHasHappened) const;
[[noreturn]] void throwInputOutputError(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;

View File

@@ -299,4 +299,169 @@ const char *CheckpointIsMisused::what() const noexcept
return "Sqlite::CheckpointIsMisused";
}
const char *InputOutputCannotAuthenticate::what() const noexcept
{
return "Sqlite::InputOutputCannotAuthenticate";
}
const char *InputOutputCannotBeginAtomic::what() const noexcept
{
return "Sqlite::InputOutputCannotBeginAtomic";
}
const char *InputOutputBlocked::what() const noexcept
{
return "Sqlite::InputOutputBlocked";
}
const char *InputOutputCannotCommitAtomic::what() const noexcept
{
return "Sqlite::InputOutputCannotCommitAtomic";
}
const char *InputOutputCannotRollbackAtomic::what() const noexcept
{
return "Sqlite::InputOutputCannotRollbackAtomic";
}
const char *InputOutputDataError::what() const noexcept
{
return "Sqlite::InputOutputDataError";
}
const char *InputOutputFileSystemIsCorrupt::what() const noexcept
{
return "Sqlite::InputOutputFileSystemIsCorrupt";
}
const char *InputOutputVNodeError::what() const noexcept
{
return "Sqlite::InputOutputVNodeError";
}
const char *InputOutputConvPathFailed::what() const noexcept
{
return "Sqlite::InputOutputConvPathFailed";
}
const char *InputOutputCannotGetTemporaryPath::what() const noexcept
{
return "Sqlite::InputOutputCannotGetTemporaryPath";
}
const char *InputOutputCannotMemoryMap::what() const noexcept
{
return "Sqlite::InputOutputCannotMemoryMap";
}
const char *InputOutputCannotDeleteNonExistingFile::what() const noexcept
{
return "Sqlite::InputOutputCannotDeleteNonExistingFile";
}
const char *InputOutputCannotSeek::what() const noexcept
{
return "Sqlite::InputOutputCannotSeek";
}
const char *InputOutputCannotMapSharedMemory::what() const noexcept
{
return "Sqlite::InputOutputCannotMapSharedMemory";
}
const char *InputOutputCannotLockSharedMemory::what() const noexcept
{
return "Sqlite::InputOutputCannotLockSharedMemory";
}
const char *InputOutputCannotEnlargeSharedMemory::what() const noexcept
{
return "Sqlite::InputOutputCannotEnlargeSharedMemory";
}
const char *InputOutputCannotOpenSharedMemory::what() const noexcept
{
return "Sqlite::InputOutputCannotOpenSharedMemory";
}
const char *InputOutputCannotCloseDirectory::what() const noexcept
{
return "Sqlite::InputOutputCannotCloseDirectory";
}
const char *InputOutputCannotClose::what() const noexcept
{
return "Sqlite::InputOutputCannotClose";
}
const char *InputOutputCannotLock::what() const noexcept
{
return "Sqlite::InputOutputCannotLock";
}
const char *InputOutputCannotCheckReservedLock::what() const noexcept
{
return "Sqlite::InputOutputCannotCheckReservedLock";
}
const char *InputOutputCannotAccess::what() const noexcept
{
return "Sqlite::InputOutputCannotAccess";
}
const char *InputOutputNoMemory::what() const noexcept
{
return "Sqlite::InputOutputNoMemory";
}
const char *InputOutputCannotDelete::what() const noexcept
{
return "Sqlite::InputOutputCannotDelete";
}
const char *InputOutputCannotReadLock::what() const noexcept
{
return "Sqlite::InputOutputCannotReadLock";
}
const char *InputOutputCannotUnlock::what() const noexcept
{
return "Sqlite::InputOutputCannotUnlock";
}
const char *InputOutputCannotFsStat::what() const noexcept
{
return "Sqlite::InputOutputCannotFsStat";
}
const char *InputOutputCannotTruncate::what() const noexcept
{
return "Sqlite::InputOutputCannotTruncate";
}
const char *InputOutputCannotSynchronizeDirectory::what() const noexcept
{
return "Sqlite::InputOutputCannotFsyncDirectory";
}
const char *InputOutputCannotSynchronizeFile::what() const noexcept
{
return "Sqlite::InputOutputCannotSynchronizeFile";
}
const char *InputOutputCannotWrite::what() const noexcept
{
return "Sqlite::InputOutputCannotWrite";
}
const char *InputOutputCannotShortRead::what() const noexcept
{
return "Sqlite::InputOutputCannotShortRead";
}
const char *InputOutputCannotRead::what() const noexcept
{
return "Sqlite::InputOutputCannotRead";
}
} // namespace Sqlite

View File

@@ -68,6 +68,204 @@ public:
const char *what() const noexcept override;
};
class SQLITE_EXPORT InputOutputCannotAuthenticate : public InputOutputError
{
public:
const char *what() const noexcept override;
};
class SQLITE_EXPORT InputOutputCannotBeginAtomic : public InputOutputError
{
public:
const char *what() const noexcept override;
};
class SQLITE_EXPORT InputOutputCannotCommitAtomic : public InputOutputError
{
public:
const char *what() const noexcept override;
};
class SQLITE_EXPORT InputOutputCannotRollbackAtomic : public InputOutputError
{
public:
const char *what() const noexcept override;
};
class SQLITE_EXPORT InputOutputDataError : public InputOutputError
{
public:
const char *what() const noexcept override;
};
class SQLITE_EXPORT InputOutputBlocked : public InputOutputError
{
public:
const char *what() const noexcept override;
};
class SQLITE_EXPORT InputOutputFileSystemIsCorrupt : public InputOutputError
{
public:
const char *what() const noexcept override;
};
class SQLITE_EXPORT InputOutputVNodeError : public InputOutputError
{
public:
const char *what() const noexcept override;
};
class SQLITE_EXPORT InputOutputConvPathFailed : public InputOutputError
{
public:
const char *what() const noexcept override;
};
class SQLITE_EXPORT InputOutputCannotGetTemporaryPath : public InputOutputError
{
public:
const char *what() const noexcept override;
};
class SQLITE_EXPORT InputOutputCannotMemoryMap : public InputOutputError
{
public:
const char *what() const noexcept override;
};
class SQLITE_EXPORT InputOutputCannotDeleteNonExistingFile : public InputOutputError
{
public:
const char *what() const noexcept override;
};
class SQLITE_EXPORT InputOutputCannotSeek : public InputOutputError
{
public:
const char *what() const noexcept override;
};
class SQLITE_EXPORT InputOutputCannotMapSharedMemory : public InputOutputError
{
public:
const char *what() const noexcept override;
};
class SQLITE_EXPORT InputOutputCannotLockSharedMemory : public InputOutputError
{
public:
const char *what() const noexcept override;
};
class SQLITE_EXPORT InputOutputCannotEnlargeSharedMemory : public InputOutputError
{
public:
const char *what() const noexcept override;
};
class SQLITE_EXPORT InputOutputCannotOpenSharedMemory : public InputOutputError
{
public:
const char *what() const noexcept override;
};
class SQLITE_EXPORT InputOutputCannotCloseDirectory : public InputOutputError
{
public:
const char *what() const noexcept override;
};
class SQLITE_EXPORT InputOutputCannotClose : public InputOutputError
{
public:
const char *what() const noexcept override;
};
class SQLITE_EXPORT InputOutputCannotLock : public InputOutputError
{
public:
const char *what() const noexcept override;
};
class SQLITE_EXPORT InputOutputCannotCheckReservedLock : public InputOutputError
{
public:
const char *what() const noexcept override;
};
class SQLITE_EXPORT InputOutputCannotAccess : public InputOutputError
{
public:
const char *what() const noexcept override;
};
class SQLITE_EXPORT InputOutputNoMemory : public InputOutputError
{
public:
const char *what() const noexcept override;
};
class SQLITE_EXPORT InputOutputCannotDelete : public InputOutputError
{
public:
const char *what() const noexcept override;
};
class SQLITE_EXPORT InputOutputCannotReadLock : public InputOutputError
{
public:
const char *what() const noexcept override;
};
class SQLITE_EXPORT InputOutputCannotUnlock : public InputOutputError
{
public:
const char *what() const noexcept override;
};
class SQLITE_EXPORT InputOutputCannotFsStat : public InputOutputError
{
public:
const char *what() const noexcept override;
};
class SQLITE_EXPORT InputOutputCannotTruncate : public InputOutputError
{
public:
const char *what() const noexcept override;
};
class SQLITE_EXPORT InputOutputCannotSynchronizeDirectory : public InputOutputError
{
public:
const char *what() const noexcept override;
};
class SQLITE_EXPORT InputOutputCannotSynchronizeFile : public InputOutputError
{
public:
const char *what() const noexcept override;
};
class SQLITE_EXPORT InputOutputCannotWrite : public InputOutputError
{
public:
const char *what() const noexcept override;
};
class SQLITE_EXPORT InputOutputCannotShortRead : public InputOutputError
{
public:
const char *what() const noexcept override;
};
class SQLITE_EXPORT InputOutputCannotRead : public InputOutputError
{
public:
const char *what() const noexcept override;
};
class SQLITE_EXPORT ConstraintPreventsModification : public ExceptionWithMessage
{
public: