29template<>
struct MySQLType<
uint8> : std::integral_constant<enum_field_types, MYSQL_TYPE_TINY> { };
30template<>
struct MySQLType<
uint16> : std::integral_constant<enum_field_types, MYSQL_TYPE_SHORT> { };
31template<>
struct MySQLType<
uint32> : std::integral_constant<enum_field_types, MYSQL_TYPE_LONG> { };
32template<>
struct MySQLType<
uint64> : std::integral_constant<enum_field_types, MYSQL_TYPE_LONGLONG> { };
33template<>
struct MySQLType<
int8> : std::integral_constant<enum_field_types, MYSQL_TYPE_TINY> { };
34template<>
struct MySQLType<
int16> : std::integral_constant<enum_field_types, MYSQL_TYPE_SHORT> { };
35template<>
struct MySQLType<
int32> : std::integral_constant<enum_field_types, MYSQL_TYPE_LONG> { };
36template<>
struct MySQLType<
int64> : std::integral_constant<enum_field_types, MYSQL_TYPE_LONGLONG> { };
37template<>
struct MySQLType<float> : std::integral_constant<enum_field_types, MYSQL_TYPE_FLOAT> { };
38template<>
struct MySQLType<double> : std::integral_constant<enum_field_types, MYSQL_TYPE_DOUBLE> { };
41 m_stmt(nullptr), m_Mstmt(stmt), m_bind(nullptr), m_queryString(
std::move(queryString))
51 mysql_stmt_attr_set(stmt, STMT_ATTR_UPDATE_MAX_LENGTH, &bool_tmp);
60 delete[]
m_Mstmt->bind->is_null;
73 std::visit([&](
auto&& param)
81 TC_LOG_WARN(
"sql.sql",
"[WARNING]: BindParameters() for statement {} did not bind all allocated parameters", stmt->
GetIndex());
90 m_bind[i].length =
nullptr;
91 delete[] (
char*)
m_bind[i].buffer;
92 m_bind[i].buffer =
nullptr;
99 TC_LOG_ERROR(
"sql.driver",
"Attempted to bind parameter {}{} on a PreparedStatement {} (statement has only {} parameters)",
uint32(index) + 1, (index == 1 ?
"st" : (index == 2 ?
"nd" : (index == 3 ?
"rd" :
"nd"))), stmtIndex, paramCount);
109 TC_LOG_ERROR(
"sql.sql",
"[ERROR] Prepared Statement (id: {}) trying to bind value on already bound index ({}).",
m_stmt->
GetIndex(), index);
116 MYSQL_BIND* param = &
m_bind[index];
117 param->buffer_type = MYSQL_TYPE_NULL;
118 delete[]
static_cast<char *
>(param->buffer);
119 param->buffer =
nullptr;
120 param->buffer_length = 0;
121 param->is_null_value = 1;
122 delete param->length;
123 param->length =
nullptr;
136 MYSQL_BIND* param = &
m_bind[index];
139 delete[]
static_cast<char*
>(param->buffer);
140 param->buffer =
new char[len];
141 param->buffer_length = 0;
142 param->is_null_value = 0;
143 param->length =
nullptr;
144 param->is_unsigned = std::is_unsigned_v<T>;
146 memcpy(param->buffer, &value, len);
153 MYSQL_BIND* param = &
m_bind[index];
154 uint32 len =
sizeof(MYSQL_TIME);
155 param->buffer_type = MYSQL_TYPE_DATETIME;
156 delete[]
static_cast<char*
>(param->buffer);
157 param->buffer =
new char[len];
158 param->buffer_length = len;
159 param->is_null_value = 0;
160 delete param->length;
161 param->length =
new unsigned long(len);
163 std::chrono::year_month_day ymd(time_point_cast<std::chrono::days>(value));
164 std::chrono::hh_mm_ss hms(duration_cast<std::chrono::microseconds>(value - std::chrono::sys_days(ymd)));
166 MYSQL_TIME* time =
reinterpret_cast<MYSQL_TIME*
>(
static_cast<char*
>(param->buffer));
167 time->year =
static_cast<int32>(ymd.year());
168 time->month =
static_cast<uint32>(ymd.month());
169 time->day =
static_cast<uint32>(ymd.day());
170 time->hour = hms.hours().count();
171 time->minute = hms.minutes().count();
172 time->second = hms.seconds().count();
173 time->second_part = hms.subseconds().count();
180 MYSQL_BIND* param = &
m_bind[index];
182 param->buffer_type = MYSQL_TYPE_VAR_STRING;
183 delete []
static_cast<char*
>(param->buffer);
184 param->buffer =
new char[len];
185 param->buffer_length = len;
186 param->is_null_value = 0;
187 delete param->length;
188 param->length =
new unsigned long(len);
190 memcpy(param->buffer, value.c_str(), len);
197 MYSQL_BIND* param = &
m_bind[index];
199 param->buffer_type = MYSQL_TYPE_BLOB;
200 delete []
static_cast<char *
>(param->buffer);
201 param->buffer =
new char[len];
202 param->buffer_length = len;
203 param->is_null_value = 0;
204 delete param->length;
205 param->length =
new unsigned long(len);
207 memcpy(param->buffer, value.data(), len);
217 pos = queryString.find(
'?', pos);
219 std::string replaceStr = std::visit([&](
auto&& data)
224 queryString.replace(pos, 1, replaceStr);
225 pos += replaceStr.length();
std::chrono::system_clock::time_point SystemTimePoint
#define TC_LOG_ERROR(filterType__, message__,...)
#define TC_LOG_WARN(filterType__, message__,...)
std::remove_pointer_t< decltype(std::declval< MYSQL_BIND >().is_null)> MySQLBool
static bool ParamenterIndexAssertFail(uint32 stmtIndex, uint8 index, uint32 paramCount)
PreparedStatementBase * m_stmt
void SetParameter(uint8 index, std::nullptr_t)
~MySQLPreparedStatement()
std::string getQueryString() const
void AssertValidIndex(uint8 index)
std::string const m_queryString
void BindParameters(PreparedStatementBase *stmt)
std::vector< bool > m_paramsSet
MySQLPreparedStatement(MySQLStmt *stmt, std::string queryString)
std::vector< PreparedStatementData > const & GetParameters() const
static std::string ToString(T value)