TrinityCore
Loading...
Searching...
No Matches
PreparedStatement.cpp
Go to the documentation of this file.
1/*
2 * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the
6 * Free Software Foundation; either version 2 of the License, or (at your
7 * option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along
15 * with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18#include "PreparedStatement.h"
19#include "Errors.h"
20#include "MySQLConnection.h"
22#include "QueryResult.h"
23#include "Log.h"
24#include "MySQLWorkaround.h"
25#include <fmt/chrono.h>
26
28m_index(index), statement_data(capacity) { }
29
31
32//- Bind to buffer
34{
35 ASSERT(index < statement_data.size());
36 statement_data[index].data = value;
37}
38
40{
41 ASSERT(index < statement_data.size());
42 statement_data[index].data = value;
43}
44
46{
47 ASSERT(index < statement_data.size());
48 statement_data[index].data = value;
49}
50
52{
53 ASSERT(index < statement_data.size());
54 statement_data[index].data = value;
55}
56
58{
59 ASSERT(index < statement_data.size());
60 statement_data[index].data = value;
61}
62
64{
65 ASSERT(index < statement_data.size());
66 statement_data[index].data = value;
67}
68
70{
71 ASSERT(index < statement_data.size());
72 statement_data[index].data = value;
73}
74
76{
77 ASSERT(index < statement_data.size());
78 statement_data[index].data = value;
79}
80
82{
83 ASSERT(index < statement_data.size());
84 statement_data[index].data = value;
85}
86
87void PreparedStatementBase::setFloat(uint8 index, float value)
88{
89 ASSERT(index < statement_data.size());
90 statement_data[index].data = value;
91}
92
93void PreparedStatementBase::setDouble(uint8 index, double value)
94{
95 ASSERT(index < statement_data.size());
96 statement_data[index].data = value;
97}
98
100{
101 ASSERT(index < statement_data.size());
102 statement_data[index].data = value;
103}
104
105void PreparedStatementBase::setString(uint8 index, std::string const& value)
106{
107 ASSERT(index < statement_data.size());
108 statement_data[index].data = value;
109}
110
111void PreparedStatementBase::setStringView(uint8 index, std::string_view value)
112{
113 ASSERT(index < statement_data.size());
114 statement_data[index].data.emplace<std::string>(value);
115}
116
117void PreparedStatementBase::setBinary(uint8 index, std::vector<uint8> const& value)
118{
119 ASSERT(index < statement_data.size());
120 statement_data[index].data = value;
121}
122
124{
125 ASSERT(index < statement_data.size());
126 statement_data[index].data = nullptr;
127}
128
129//- Execution
131m_stmt(stmt), m_result(nullptr)
132{
133 m_has_result = async; // If it's async, then there's a result
134 if (async)
136}
137
139{
140 delete m_stmt;
141 if (m_has_result && m_result != nullptr)
142 delete m_result;
143}
144
146{
147 if (m_has_result)
148 {
150 if (!result || !result->GetRowCount())
151 {
152 delete result;
153 m_result->set_value(PreparedQueryResult(nullptr));
154 return false;
155 }
156 m_result->set_value(PreparedQueryResult(result));
157 return true;
158 }
159
160 return m_conn->Execute(m_stmt);
161}
162
163template<typename T>
165{
166 return fmt::format("{}", value);
167}
168
169std::string PreparedStatementData::ToString(bool value)
170{
171 return ToString<uint32>(value);
172}
173
175{
176 return ToString<uint32>(value);
177}
178
179template std::string PreparedStatementData::ToString<uint16>(uint16);
180template std::string PreparedStatementData::ToString<uint32>(uint32);
181template std::string PreparedStatementData::ToString<uint64>(uint64);
182
184{
185 return ToString<int32>(value);
186}
187
188template std::string PreparedStatementData::ToString<int16>(int16);
189template std::string PreparedStatementData::ToString<int32>(int32);
190template std::string PreparedStatementData::ToString<int64>(int64);
191template std::string PreparedStatementData::ToString<float>(float);
192template std::string PreparedStatementData::ToString<double>(double);
193
194std::string PreparedStatementData::ToString(std::string const& value)
195{
196 return Trinity::StringFormat("'{}'", value);
197}
198
199std::string PreparedStatementData::ToString(std::vector<uint8> const& /*value*/)
200{
201 return "BINARY";
202}
203
205{
206 return Trinity::StringFormat("{:%F %T}", value);
207}
208
209std::string PreparedStatementData::ToString(std::nullptr_t)
210{
211 return "NULL";
212}
std::promise< PreparedQueryResult > PreparedQueryResultPromise
std::shared_ptr< PreparedResultSet > PreparedQueryResult
uint8_t uint8
Definition Define.h:135
int64_t int64
Definition Define.h:128
int16_t int16
Definition Define.h:130
int8_t int8
Definition Define.h:131
int32_t int32
Definition Define.h:129
uint64_t uint64
Definition Define.h:132
uint16_t uint16
Definition Define.h:134
uint32_t uint32
Definition Define.h:133
std::chrono::system_clock::time_point SystemTimePoint
Definition Duration.h:37
#define ASSERT
Definition Errors.h:68
bool Execute(char const *sql)
ResultSet * Query(char const *sql)
uint64 GetRowCount() const
Definition QueryResult.h:62
void setInt8(uint8 index, int8 value)
void setInt16(uint8 index, int16 value)
void setUInt16(uint8 index, uint16 value)
void setDate(uint8 index, SystemTimePoint value)
void setUInt32(uint8 index, uint32 value)
void setInt64(uint8 index, int64 value)
void setBool(uint8 index, bool value)
void setFloat(uint8 index, float value)
void setStringView(uint8 index, std::string_view value)
void setUInt64(uint8 index, uint64 value)
void setInt32(uint8 index, int32 value)
void setUInt8(uint8 index, uint8 value)
void setBinary(uint8 index, std::vector< uint8 > const &value)
void setString(uint8 index, std::string const &value)
std::vector< PreparedStatementData > statement_data
void setDouble(uint8 index, double value)
PreparedStatementBase(uint32 index, uint8 capacity)
PreparedStatementTask(PreparedStatementBase *stmt, bool async=false)
PreparedQueryResultPromise * m_result
PreparedStatementBase * m_stmt
MySQLConnection * m_conn
std::string StringFormat(FormatString< Args... > fmt, Args &&... args)
Default TC string format function.
static std::string ToString(T value)