25#ifndef FBCPP_EXCEPTION_H
26#define FBCPP_EXCEPTION_H
45 class StatusWrapper :
public fb::IStatusImpl<StatusWrapper, StatusWrapper>
48 explicit StatusWrapper(Client& client, IStatus* status)
55 static void checkException(StatusWrapper* status);
57 static void catchException(IStatus* status)
noexcept;
59 static void clearException(StatusWrapper* status)
noexcept
61 status->clearException();
73 bool isDirty() const noexcept
78 bool hasData() const noexcept
80 return getState() & IStatus::STATE_ERRORS;
83 bool isEmpty() const noexcept
88 static void setVersionError(
89 IStatus* status,
const char* interfaceName, uintptr_t currentVersion, uintptr_t expectedVersion)
noexcept
92 const intptr_t codes[] = {
93 isc_arg_gds, isc_interface_version_too_old,
94 isc_arg_number, (intptr_t) expectedVersion,
95 isc_arg_number, (intptr_t) currentVersion,
96 isc_arg_string, (intptr_t) interfaceName,
101 status->setErrors(codes);
105 void dispose() noexcept
override
112 void init() noexcept
override
117 unsigned getState() const noexcept
override
119 return dirty ? status->getState() : 0;
122 void setErrors2(
unsigned length,
const intptr_t* value)
noexcept override
125 status->setErrors2(length, value);
128 void setWarnings2(
unsigned length,
const intptr_t* value)
noexcept override
131 status->setWarnings2(length, value);
134 void setErrors(
const intptr_t* value)
noexcept override
137 status->setErrors(value);
140 void setWarnings(
const intptr_t* value)
noexcept override
143 status->setWarnings(value);
146 const intptr_t* getErrors() const noexcept
override
148 return dirty ? status->getErrors() : cleanStatus();
151 const intptr_t* getWarnings() const noexcept
override
153 return dirty ? status->getWarnings() : cleanStatus();
156 IStatus* clone() const noexcept
override
158 return status->clone();
166 static const intptr_t* cleanStatus() noexcept
168 static intptr_t clean[3] = {1, 0, 0};
186 using std::runtime_error::runtime_error;
192 : std::runtime_error{message}
208 sqlState{extractSqlState(statusVector)}
210 copyErrorVector(statusVector);
215 errorVector{other.errorVector},
216 errorStrings{other.errorStrings},
217 sqlState{other.sqlState}
219 fixupStringPointers();
222 DatabaseException(DatabaseException&&) =
default;
224 DatabaseException& operator=(
const DatabaseException&) =
delete;
225 DatabaseException& operator=(DatabaseException&&) =
delete;
231 const std::vector<std::intptr_t>&
getErrors() const noexcept
241 if (errorVector.size() >= 2 && errorVector[0] == isc_arg_gds)
242 return errorVector[1];
256 static std::string buildMessage(
Client& client,
const std::intptr_t* statusVector);
257 static std::string extractSqlState(
const std::intptr_t* statusVector);
259 void copyErrorVector(
const std::intptr_t* statusVector);
260 void fixupStringPointers();
263 std::vector<std::intptr_t> errorVector;
264 std::vector<std::string> errorStrings;
265 std::string sqlState;
Represents a Firebird client library instance.
Exception thrown when a Firebird database operation fails.
const std::vector< std::intptr_t > & getErrors() const noexcept
Returns the Firebird error vector.
std::intptr_t getErrorCode() const noexcept
Returns the primary ISC error code (first isc_arg_gds value), or 0 if none.
DatabaseException(Client &client, const std::intptr_t *statusVector)
Constructs a DatabaseException from a Firebird status vector.
const std::string & getSqlState() const noexcept
Returns the SQL state string (e.g.
Base exception class for all fb-cpp exceptions.
FbCppException(const std::string &message)
Constructs an FbCppException with the specified error message.