6#include "SqlServerType.hpp"
20[[nodiscard]]
inline bool IsTableAlreadyExistsError(SqlErrorInfo
const& error, SqlServerType serverType)
noexcept
24 case SqlServerType::MICROSOFT_SQL:
27 return error.sqlState ==
"42S01" || error.nativeErrorCode == 2714;
28 case SqlServerType::POSTGRESQL:
30 return error.sqlState ==
"42P07";
31 case SqlServerType::SQLITE:
33 return error.message.contains(
"already exists");
34 case SqlServerType::MYSQL:
37 return error.sqlState ==
"42S01" || error.nativeErrorCode == 1050;
40 return error.message.contains(
"already exists");
49[[nodiscard]]
inline bool IsTableNotFoundError(SqlErrorInfo
const& error, SqlServerType serverType)
noexcept
53 case SqlServerType::MICROSOFT_SQL:
56 return error.sqlState ==
"42S02" || error.nativeErrorCode == 208;
57 case SqlServerType::POSTGRESQL:
59 return error.sqlState ==
"42P01";
60 case SqlServerType::SQLITE:
62 return error.message.contains(
"no such table");
63 case SqlServerType::MYSQL:
66 return error.sqlState ==
"42S02" || error.nativeErrorCode == 1146;
69 return error.message.contains(
"not found") || error.message.contains(
"no such")
70 || error.message.contains(
"does not exist");
81[[nodiscard]]
inline bool IsBindClassError(SqlErrorInfo
const& error)
noexcept
83 constexpr auto BindClassStates = std::array<std::string_view, 4> {
"HYC00",
"HY003",
"HY004",
"07006" };
84 return std::ranges::contains(BindClassStates, std::string_view { error.sqlState });
96[[nodiscard]]
inline bool IsQueryTimeoutError(SqlErrorInfo
const& error)
noexcept
98 constexpr auto QueryTimeoutStates = std::array<std::string_view, 2> {
"HYT00",
"57014" };
99 return std::ranges::contains(QueryTimeoutStates, std::string_view { error.sqlState });
109[[nodiscard]]
inline bool IsTransientError(SqlErrorInfo
const& error)
noexcept
111 std::string_view state = error.sqlState;
119 if (state.starts_with(
"08"))
125 if (state ==
"HYT00" || state ==
"HYT01")
132 if (state.starts_with(
"40"))
136 if (error.message.contains(
"database is locked"))
138 if (error.message.contains(
"SQLITE_BUSY"))
140 if (error.message.contains(
"SQLITE_LOCKED"))
145 switch (error.nativeErrorCode)
163[[nodiscard]]
inline bool IsUniqueConstraintViolation(SqlErrorInfo
const& error, SqlServerType serverType)
noexcept
167 case SqlServerType::MICROSOFT_SQL:
171 return error.nativeErrorCode == 2627 || error.nativeErrorCode == 2601;
172 case SqlServerType::POSTGRESQL:
174 return error.sqlState ==
"23505";
175 case SqlServerType::SQLITE:
177 return error.message.contains(
"UNIQUE constraint failed");
178 case SqlServerType::MYSQL:
180 return error.nativeErrorCode == 1062;
182 return error.sqlState ==
"23000" || error.sqlState ==
"23505";
191[[nodiscard]]
inline bool IsForeignKeyViolation(SqlErrorInfo
const& error, SqlServerType serverType)
noexcept
195 case SqlServerType::MICROSOFT_SQL:
197 return error.nativeErrorCode == 547;
198 case SqlServerType::POSTGRESQL:
200 return error.sqlState ==
"23503";
201 case SqlServerType::SQLITE:
203 return error.message.contains(
"FOREIGN KEY constraint failed");
204 case SqlServerType::MYSQL:
207 return error.nativeErrorCode == 1451 || error.nativeErrorCode == 1452;
209 return error.sqlState ==
"23503";