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 =
nullptr)
54 StatusWrapper(StatusWrapper&& o) noexcept
57 statusOwner{o.statusOwner},
61 o.statusOwner =
false;
65 StatusWrapper& operator=(StatusWrapper&& o)
noexcept
69 if (statusOwner && status)
74 statusOwner = o.statusOwner;
78 o.statusOwner =
false;
85 StatusWrapper(
const StatusWrapper&) =
delete;
86 StatusWrapper& operator=(
const StatusWrapper&) =
delete;
90 if (statusOwner && status)
95 static void checkException(StatusWrapper* status);
97 static void catchException(IStatus* status)
noexcept;
99 static void clearException(StatusWrapper* status)
noexcept
101 status->clearException();
104 void clearException()
113 bool isDirty() const noexcept
118 bool hasData() const noexcept
120 return getState() & IStatus::STATE_ERRORS;
123 bool isEmpty() const noexcept
128 static void setVersionError(
129 IStatus* status,
const char* interfaceName, uintptr_t currentVersion, uintptr_t expectedVersion)
noexcept
132 const intptr_t codes[] = {
133 isc_arg_gds, isc_interface_version_too_old,
134 isc_arg_number, (intptr_t) expectedVersion,
135 isc_arg_number, (intptr_t) currentVersion,
136 isc_arg_string, (intptr_t) interfaceName,
141 status->setErrors(codes);
145 void dispose() noexcept
override
155 void init() noexcept
override
160 unsigned getState() const noexcept
override
162 return dirty ? getStatus()->getState() : 0;
165 void setErrors2(
unsigned length,
const intptr_t* value)
noexcept override
168 getStatus()->setErrors2(length, value);
171 void setWarnings2(
unsigned length,
const intptr_t* value)
noexcept override
174 getStatus()->setWarnings2(length, value);
177 void setErrors(
const intptr_t* value)
noexcept override
180 getStatus()->setErrors(value);
183 void setWarnings(
const intptr_t* value)
noexcept override
186 getStatus()->setWarnings(value);
189 const intptr_t* getErrors() const noexcept
override
191 return dirty ? getStatus()->getErrors() : cleanStatus();
194 const intptr_t* getWarnings() const noexcept
override
196 return dirty ? getStatus()->getWarnings() : cleanStatus();
199 IStatus* clone() const noexcept
override
201 return getStatus()->clone();
206 mutable IStatus* status;
207 mutable bool statusOwner =
false;
210 IStatus* getStatus()
const;
212 static const intptr_t* cleanStatus() noexcept
214 static intptr_t clean[3] = {1, 0, 0};
232 using std::runtime_error::runtime_error;
238 : std::runtime_error{message}
254 sqlState{extractSqlState(statusVector)}
256 copyErrorVector(statusVector);
261 errorVector{other.errorVector},
262 errorStrings{other.errorStrings},
263 sqlState{other.sqlState}
265 fixupStringPointers();
268 DatabaseException(DatabaseException&&) =
default;
270 DatabaseException& operator=(
const DatabaseException&) =
delete;
271 DatabaseException& operator=(DatabaseException&&) =
delete;
277 const std::vector<std::intptr_t>&
getErrors() const noexcept
287 if (errorVector.size() >= 2 && errorVector[0] == isc_arg_gds)
288 return errorVector[1];
302 static std::string buildMessage(
Client& client,
const std::intptr_t* statusVector);
303 static std::string extractSqlState(
const std::intptr_t* statusVector);
305 void copyErrorVector(
const std::intptr_t* statusVector);
306 void fixupStringPointers();
309 std::vector<std::intptr_t> errorVector;
310 std::vector<std::string> errorStrings;
311 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.