25#ifndef FBCPP_EXCEPTION_H
26#define FBCPP_EXCEPTION_H
29#include "fb-cpp-export.h"
46 class FB_CPP_EXPORT StatusWrapper :
public fb::IStatusImpl<StatusWrapper, StatusWrapper>
49 explicit StatusWrapper(Client& client, IStatus* status =
nullptr)
55 StatusWrapper(StatusWrapper&& o) noexcept
58 statusOwner{o.statusOwner},
62 o.statusOwner =
false;
66 StatusWrapper& operator=(StatusWrapper&& o)
noexcept
70 if (statusOwner && status)
75 statusOwner = o.statusOwner;
79 o.statusOwner =
false;
86 StatusWrapper(
const StatusWrapper&) =
delete;
87 StatusWrapper& operator=(
const StatusWrapper&) =
delete;
91 if (statusOwner && status)
96 static void checkException(StatusWrapper* status);
98 static void catchException(IStatus* status)
noexcept;
100 static void clearException(StatusWrapper* status)
noexcept
102 status->clearException();
105 void clearException()
114 bool isDirty() const noexcept
119 bool hasData() const noexcept
121 return getState() & IStatus::STATE_ERRORS;
124 bool isEmpty() const noexcept
129 static void setVersionError(
130 IStatus* status,
const char* interfaceName, uintptr_t currentVersion, uintptr_t expectedVersion)
noexcept
133 const intptr_t codes[] = {
134 isc_arg_gds, isc_interface_version_too_old,
135 isc_arg_number, (intptr_t) expectedVersion,
136 isc_arg_number, (intptr_t) currentVersion,
137 isc_arg_string, (intptr_t) interfaceName,
142 status->setErrors(codes);
146 void dispose() noexcept
override
156 void init() noexcept
override
161 unsigned getState() const noexcept
override
163 return dirty ? getStatus()->getState() : 0;
166 void setErrors2(
unsigned length,
const intptr_t* value)
noexcept override
169 getStatus()->setErrors2(length, value);
172 void setWarnings2(
unsigned length,
const intptr_t* value)
noexcept override
175 getStatus()->setWarnings2(length, value);
178 void setErrors(
const intptr_t* value)
noexcept override
181 getStatus()->setErrors(value);
184 void setWarnings(
const intptr_t* value)
noexcept override
187 getStatus()->setWarnings(value);
190 const intptr_t* getErrors() const noexcept
override
192 return dirty ? getStatus()->getErrors() : cleanStatus();
195 const intptr_t* getWarnings() const noexcept
override
197 return dirty ? getStatus()->getWarnings() : cleanStatus();
200 IStatus* clone() const noexcept
override
202 return getStatus()->clone();
207 mutable IStatus* status;
208 mutable bool statusOwner =
false;
211 IStatus* getStatus()
const;
213 static const intptr_t* cleanStatus() noexcept
215 static intptr_t clean[3] = {1, 0, 0};
233 using std::runtime_error::runtime_error;
239 : std::runtime_error{message}
255 sqlState{extractSqlState(statusVector)}
257 copyErrorVector(statusVector);
262 errorVector{other.errorVector},
263 errorStrings{other.errorStrings},
264 sqlState{other.sqlState}
266 fixupStringPointers();
269 DatabaseException(DatabaseException&&) =
default;
271 DatabaseException& operator=(
const DatabaseException&) =
delete;
272 DatabaseException& operator=(DatabaseException&&) =
delete;
278 const std::vector<std::intptr_t>&
getErrors() const noexcept
288 if (errorVector.size() >= 2 && errorVector[0] == isc_arg_gds)
289 return errorVector[1];
303 static std::string buildMessage(
Client& client,
const std::intptr_t* statusVector);
304 static std::string extractSqlState(
const std::intptr_t* statusVector);
306 void copyErrorVector(
const std::intptr_t* statusVector);
307 void fixupStringPointers();
310 std::vector<std::intptr_t> errorVector;
311 std::vector<std::string> errorStrings;
312 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.