28template<>
struct MySQLType<
uint8> : std::integral_constant<enum_field_types, MYSQL_TYPE_TINY> { };
29template<>
struct MySQLType<
uint16> : std::integral_constant<enum_field_types, MYSQL_TYPE_SHORT> { };
30template<>
struct MySQLType<
uint32> : std::integral_constant<enum_field_types, MYSQL_TYPE_LONG> { };
31template<>
struct MySQLType<
uint64> : std::integral_constant<enum_field_types, MYSQL_TYPE_LONGLONG> { };
32template<>
struct MySQLType<
int8> : std::integral_constant<enum_field_types, MYSQL_TYPE_TINY> { };
33template<>
struct MySQLType<
int16> : std::integral_constant<enum_field_types, MYSQL_TYPE_SHORT> { };
34template<>
struct MySQLType<
int32> : std::integral_constant<enum_field_types, MYSQL_TYPE_LONG> { };
35template<>
struct MySQLType<
int64> : std::integral_constant<enum_field_types, MYSQL_TYPE_LONGLONG> { };
36template<>
struct MySQLType<float> : std::integral_constant<enum_field_types, MYSQL_TYPE_FLOAT> { };
37template<>
struct MySQLType<double> : std::integral_constant<enum_field_types, MYSQL_TYPE_DOUBLE> { };
40 m_stmt(nullptr), m_Mstmt(stmt), m_bind(nullptr), m_queryString(
std::move(queryString))
50 mysql_stmt_attr_set(stmt, STMT_ATTR_UPDATE_MAX_LENGTH, &bool_tmp);
59 delete[]
m_Mstmt->bind->is_null;
72 std::visit([&](
auto&& param)
80 TC_LOG_WARN(
"sql.sql",
"[WARNING]: BindParameters() for statement {} did not bind all allocated parameters", stmt->
GetIndex());
89 m_bind[i].length =
nullptr;
90 delete[] (
char*)
m_bind[i].buffer;
91 m_bind[i].buffer =
nullptr;
98 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);
108 TC_LOG_ERROR(
"sql.sql",
"[ERROR] Prepared Statement (id: {}) trying to bind value on already bound index ({}).",
m_stmt->
GetIndex(), index);
115 MYSQL_BIND* param = &
m_bind[index];
116 param->buffer_type = MYSQL_TYPE_NULL;
117 delete[]
static_cast<char *
>(param->buffer);
118 param->buffer =
nullptr;
119 param->buffer_length = 0;
120 param->is_null_value = 1;
121 delete param->length;
122 param->length =
nullptr;
135 MYSQL_BIND* param = &
m_bind[index];
138 delete[]
static_cast<char*
>(param->buffer);
139 param->buffer =
new char[len];
140 param->buffer_length = 0;
141 param->is_null_value = 0;
142 param->length =
nullptr;
143 param->is_unsigned = std::is_unsigned_v<T>;
145 memcpy(param->buffer, &value, len);
152 MYSQL_BIND* param = &
m_bind[index];
154 param->buffer_type = MYSQL_TYPE_VAR_STRING;
155 delete []
static_cast<char*
>(param->buffer);
156 param->buffer =
new char[len];
157 param->buffer_length = len;
158 param->is_null_value = 0;
159 delete param->length;
160 param->length =
new unsigned long(len);
162 memcpy(param->buffer, value.c_str(), len);
169 MYSQL_BIND* param = &
m_bind[index];
171 param->buffer_type = MYSQL_TYPE_BLOB;
172 delete []
static_cast<char *
>(param->buffer);
173 param->buffer =
new char[len];
174 param->buffer_length = len;
175 param->is_null_value = 0;
176 delete param->length;
177 param->length =
new unsigned long(len);
179 memcpy(param->buffer, value.data(), len);
189 pos = queryString.find(
'?', pos);
191 std::string replaceStr = std::visit([&](
auto&& data)
196 queryString.replace(pos, 1, replaceStr);
197 pos += replaceStr.length();
#define TC_LOG_WARN(filterType__,...)
#define TC_LOG_ERROR(filterType__,...)
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)