7#include "SqlOdbcPrelude.hpp"
11#include <source_location>
13#include <system_error>
43 return FromHandle(SQL_HANDLE_DBC, hDbc);
49 return FromHandle(SQL_HANDLE_STMT, hStmt);
55 return FromHandle(SQL_HANDLE_ENV, hEnv);
62 LIGHTWEIGHT_API
static SqlErrorInfo FromHandle(SQLSMALLINT handleType, SQLHANDLE handle);
106class SqlException: public std::runtime_error
109 LIGHTWEIGHT_API
explicit SqlException(
SqlErrorInfo info,
110 std::source_location location = std::source_location::current());
113 [[nodiscard]] LIGHTWEIGHT_FORCE_INLINE
SqlErrorInfo const& info() const noexcept
122enum class SqlError : std::int16_t
124 SUCCESS = SQL_SUCCESS,
125 SUCCESS_WITH_INFO = SQL_SUCCESS_WITH_INFO,
126 NODATA = SQL_NO_DATA,
128 INVALID_HANDLE = SQL_INVALID_HANDLE,
129 STILL_EXECUTING = SQL_STILL_EXECUTING,
130 NEED_DATA = SQL_NEED_DATA,
131 PARAM_DATA_AVAILABLE = SQL_PARAM_DATA_AVAILABLE,
132 NO_DATA_FOUND = SQL_NO_DATA_FOUND,
133 UNSUPPORTED_TYPE = 1'000,
134 INVALID_ARGUMENT = 1'001,
135 TRANSACTION_ERROR = 1'002,
138struct SqlErrorCategory: std::error_category
141 static SqlErrorCategory
const& get() noexcept
143 static SqlErrorCategory
const category;
147 [[nodiscard]]
char const* name() const noexcept
override
149 return "Lightweight";
152 [[nodiscard]] std::string message(
int code)
const override
154 using namespace std::string_literals;
155 switch (
static_cast<SqlError
>(code))
157 case SqlError::SUCCESS:
158 return "SQL_SUCCESS"s;
159 case SqlError::SUCCESS_WITH_INFO:
160 return "SQL_SUCCESS_WITH_INFO"s;
161 case SqlError::NODATA:
162 return "SQL_NO_DATA"s;
163 case SqlError::FAILURE:
165 case SqlError::INVALID_HANDLE:
166 return "SQL_INVALID_HANDLE"s;
167 case SqlError::STILL_EXECUTING:
168 return "SQL_STILL_EXECUTING"s;
169 case SqlError::NEED_DATA:
170 return "SQL_NEED_DATA"s;
171 case SqlError::PARAM_DATA_AVAILABLE:
172 return "SQL_PARAM_DATA_AVAILABLE"s;
173 case SqlError::UNSUPPORTED_TYPE:
174 return "SQL_UNSUPPORTED_TYPE"s;
175 case SqlError::INVALID_ARGUMENT:
176 return "SQL_INVALID_ARGUMENT"s;
177 case SqlError::TRANSACTION_ERROR:
178 return "SQL_TRANSACTION_ERROR"s;
180 return std::format(
"SQL error code {}", code);
188struct std::is_error_code_enum<Lightweight::SqlError>:
public std::true_type
194inline std::error_code make_error_code(Lightweight::SqlError e)
196 return {
static_cast<int>(e), Lightweight::SqlErrorCategory::get() };
200struct std::formatter<Lightweight::SqlError>: formatter<std::string>
202 auto format(Lightweight::SqlError value, format_context& ctx)
const -> format_context::iterator
206 return formatter<std::string>::format(Lightweight::SqlErrorCategory::get().message(
static_cast<int>(value)), ctx);
211struct std::formatter<Lightweight::SqlErrorInfo>: formatter<std::string>
215 return formatter<std::string>::format(std::format(
"{} ({}) - {}", info.sqlState, info.nativeErrorCode, info.message),
Supplies diagnostics for an ODBC handle.
virtual SqlErrorInfo Diagnose(SQLSMALLINT handleType, SQLHANDLE handle)=0
Returns the diagnostics for the given handle.
Represents an ODBC SQL error.
SQLINTEGER nativeErrorCode
The native ODBC error code.
std::string message
The human-readable error message.
static void RequireStatementSuccess(SQLRETURN result, SQLHSTMT hStmt, std::string_view message)
Asserts that the given result is a success code, otherwise throws an exception.
std::string sqlState
The SQLSTATE diagnostic code (5 characters).
static SqlErrorInfo FromStatementHandle(SQLHSTMT hStmt)
Constructs an ODBC error info object from the given ODBC statement handle.
static SqlErrorInfo FromEnvironmentHandle(SQLHENV hEnv)
Constructs an ODBC error info object from the given ODBC environment handle.
static SqlErrorInfo FromConnectionHandle(SQLHDBC hDbc)
Constructs an ODBC error info object from the given ODBC connection handle.