TrinityCore
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"
21#include "QueryResult.h"
22#include "StringFormat.h"
23#include <fmt/chrono.h>
24
26 m_index(index), statement_data(capacity) { }
27
29
30//- Bind to buffer
32{
33 ASSERT(index < statement_data.size());
34 statement_data[index].data = value;
35}
36
38{
39 ASSERT(index < statement_data.size());
40 statement_data[index].data = value;
41}
42
44{
45 ASSERT(index < statement_data.size());
46 statement_data[index].data = value;
47}
48
50{
51 ASSERT(index < statement_data.size());
52 statement_data[index].data = value;
53}
54
56{
57 ASSERT(index < statement_data.size());
58 statement_data[index].data = value;
59}
60
62{
63 ASSERT(index < statement_data.size());
64 statement_data[index].data = value;
65}
66
68{
69 ASSERT(index < statement_data.size());
70 statement_data[index].data = value;
71}
72
74{
75 ASSERT(index < statement_data.size());
76 statement_data[index].data = value;
77}
78
80{
81 ASSERT(index < statement_data.size());
82 statement_data[index].data = value;
83}
84
85void PreparedStatementBase::setFloat(uint8 index, float value)
86{
87 ASSERT(index < statement_data.size());
88 statement_data[index].data = value;
89}
90
91void PreparedStatementBase::setDouble(uint8 index, double value)
92{
93 ASSERT(index < statement_data.size());
94 statement_data[index].data = value;
95}
96
98{
99 ASSERT(index < statement_data.size());
100 statement_data[index].data = value;
101}
102
103void PreparedStatementBase::setString(uint8 index, std::string&& value)
104{
105 ASSERT(index < statement_data.size());
106 statement_data[index].data = std::move(value);
107}
108
109void PreparedStatementBase::setString(uint8 index, std::string_view value)
110{
111 ASSERT(index < statement_data.size());
112 statement_data[index].data.emplace<std::string>(value);
113}
114
115void PreparedStatementBase::setBinary(uint8 index, std::vector<uint8>&& value)
116{
117 ASSERT(index < statement_data.size());
118 statement_data[index].data = std::move(value);
119}
120
121void PreparedStatementBase::setBinary(uint8 index, std::span<uint8 const> value)
122{
123 ASSERT(index < statement_data.size());
124 statement_data[index].data.emplace<std::vector<uint8>>(value.begin(), value.end());
125}
126
128{
129 ASSERT(index < statement_data.size());
130 statement_data[index].data = nullptr;
131}
132
133//- Execution
135{
136 PreparedResultSet* result = conn->Query(stmt);
137 if (!result || !result->GetRowCount())
138 {
139 delete result;
140 result = nullptr;
141 }
142
143 return PreparedQueryResult(result);
144}
145
147{
148 return conn->Execute(stmt);
149}
150
151template<typename T>
153{
154 return Trinity::StringFormat("{}", value);
155}
156
157std::string PreparedStatementData::ToString(bool value)
158{
159 return ToString<uint32>(value);
160}
161
163{
164 return ToString<uint32>(value);
165}
166
167template std::string PreparedStatementData::ToString<uint16>(uint16);
168template std::string PreparedStatementData::ToString<uint32>(uint32);
169template std::string PreparedStatementData::ToString<uint64>(uint64);
170
172{
173 return ToString<int32>(value);
174}
175
176template std::string PreparedStatementData::ToString<int16>(int16);
177template std::string PreparedStatementData::ToString<int32>(int32);
178template std::string PreparedStatementData::ToString<int64>(int64);
179template std::string PreparedStatementData::ToString<float>(float);
180template std::string PreparedStatementData::ToString<double>(double);
181
182std::string PreparedStatementData::ToString(std::string const& value)
183{
184 return Trinity::StringFormat("'{}'", value);
185}
186
187std::string PreparedStatementData::ToString(std::vector<uint8> const& /*value*/)
188{
189 return "BINARY";
190}
191
193{
194 return Trinity::StringFormat("{:%F %T}", value);
195}
196
197std::string PreparedStatementData::ToString(std::nullptr_t)
198{
199 return "NULL";
200}
std::shared_ptr< PreparedResultSet > PreparedQueryResult
uint8_t uint8
Definition: Define.h:144
int64_t int64
Definition: Define.h:137
int16_t int16
Definition: Define.h:139
int8_t int8
Definition: Define.h:140
int32_t int32
Definition: Define.h:138
uint64_t uint64
Definition: Define.h:141
uint16_t uint16
Definition: Define.h:143
uint32_t uint32
Definition: Define.h:142
std::chrono::system_clock::time_point SystemTimePoint
Definition: Duration.h:41
#define ASSERT
Definition: Errors.h:68
bool Execute(char const *sql)
ResultSet * Query(char const *sql)
uint64 GetRowCount() const
Definition: QueryResult.h:88
void setInt8(uint8 index, int8 value)
void setBinary(uint8 index, std::vector< uint8 > &&value)
void setInt16(uint8 index, int16 value)
void setUInt16(uint8 index, uint16 value)
void setDate(uint8 index, SystemTimePoint value)
void setString(uint8 index, std::string &&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 setUInt64(uint8 index, uint64 value)
void setInt32(uint8 index, int32 value)
void setUInt8(uint8 index, uint8 value)
void setNull(uint8 index)
std::vector< PreparedStatementData > statement_data
void setDouble(uint8 index, double value)
PreparedStatementBase(uint32 index, uint8 capacity)
static PreparedQueryResult Query(MySQLConnection *conn, PreparedStatementBase *stmt)
static bool Execute(MySQLConnection *conn, PreparedStatementBase *stmt)
std::string StringFormat(FormatString< Args... > fmt, Args &&... args)
Default TC string format function.
Definition: StringFormat.h:38
static std::string ToString(T value)