Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Loading...
Searching...
No Matches
QueryHolder.cpp
Go to the documentation of this file.
1/*
2* This file is part of Project SkyFire https://www.projectskyfire.org.
3* See LICENSE.md file for Copyright information
4*/
5
6#include "Log.h"
7#include "MySQLConnection.h"
8#include "PreparedStatement.h"
9#include "QueryHolder.h"
10#include "CompilerDefs.h"
11
12bool SQLQueryHolder::SetQuery(size_t index, const char* sql)
13{
14 if (m_queries.size() <= index)
15 {
16 SF_LOG_ERROR("sql.sql", "Query index (%u) out of range (size: %u) for query: %s", uint32(index), (uint32)m_queries.size(), sql);
17 return false;
18 }
19
21 SQLElementData element;
22 element.type = SQL_ELEMENT_RAW;
23 element.element.query = strdup(sql);
24
25 SQLResultSetUnion result;
26 result.qresult = NULL;
27
28 m_queries[index] = SQLResultPair(element, result);
29 return true;
30}
31
32bool SQLQueryHolder::SetPQuery(size_t index, const char* format, ...)
33{
34 if (!format)
35 {
36 SF_LOG_ERROR("sql.sql", "Query (index: %u) is empty.", uint32(index));
37 return false;
38 }
39
40 va_list ap;
41 char szQuery[MAX_QUERY_LEN];
42 va_start(ap, format);
43 int res = vsnprintf(szQuery, MAX_QUERY_LEN, format, ap);
44 va_end(ap);
45
46 if (res == -1)
47 {
48 SF_LOG_ERROR("sql.sql", "SQL Query truncated (and not execute) for format: %s", format);
49 return false;
50 }
51
52 return SetQuery(index, szQuery);
53}
54
56{
57 if (m_queries.size() <= index)
58 {
59 SF_LOG_ERROR("sql.sql", "Query index (%u) out of range (size: %u) for prepared statement", uint32(index), (uint32)m_queries.size());
60 return false;
61 }
62
64 SQLElementData element;
65 element.type = SQL_ELEMENT_PREPARED;
66 element.element.stmt = stmt;
67
68 SQLResultSetUnion result;
69 result.presult = NULL;
70
71 m_queries[index] = SQLResultPair(element, result);
72 return true;
73}
74
76{
77 // Don't call to this function if the index is of an ad-hoc statement
78 if (index < m_queries.size())
79 {
80 ResultSet* result = m_queries[index].second.qresult;
81 if (!result || !result->GetRowCount())
82 return QueryResult(NULL);
83
84 result->NextRow();
85 return QueryResult(result);
86 }
87 else
88 return QueryResult(NULL);
89}
90
92{
93 // Don't call to this function if the index is of a prepared statement
94 if (index < m_queries.size())
95 {
96 PreparedResultSet* result = m_queries[index].second.presult;
97 if (!result || !result->GetRowCount())
98 return PreparedQueryResult(NULL);
99
100 return PreparedQueryResult(result);
101 }
102 else
103 return PreparedQueryResult(NULL);
104}
105
106void SQLQueryHolder::SetResult(size_t index, ResultSet* result)
107{
108 if (result && !result->GetRowCount())
109 {
110 delete result;
111 result = NULL;
112 }
113
115 if (index < m_queries.size())
116 m_queries[index].second.qresult = result;
117}
118
120{
121 if (result && !result->GetRowCount())
122 {
123 delete result;
124 result = NULL;
125 }
126
128 if (index < m_queries.size())
129 m_queries[index].second.presult = result;
130}
131
133{
134 for (size_t i = 0; i < m_queries.size(); i++)
135 {
138 if (SQLElementData* data = &m_queries[i].first)
139 {
140 switch (data->type)
141 {
142 case SQL_ELEMENT_RAW:
143 free((void*)(const_cast<char*>(data->element.query)));
144 break;
146 delete data->element.stmt;
147 break;
148 }
149 }
150 }
151}
152
153void SQLQueryHolder::SetSize(size_t size)
154{
156 m_queries.resize(size);
157}
158
160{
161 //the result can't be ready as we are processing it right now
162 ASSERT(!m_result.ready());
163
164 if (!m_holder)
165 return false;
166
168 std::vector<SQLQueryHolder::SQLResultPair>& queries = m_holder->m_queries;
169
170 for (size_t i = 0; i < queries.size(); i++)
171 {
173 if (SQLElementData* data = &queries[i].first)
174 {
175 switch (data->type)
176 {
177 case SQL_ELEMENT_RAW:
178 {
179 char const* sql = data->element.query;
180 if (sql)
181 m_holder->SetResult(i, m_conn->Query(sql));
182 break;
183 }
185 {
186 PreparedStatement* stmt = data->element.stmt;
187 if (stmt)
188 m_holder->SetPreparedResult(i, m_conn->Query(stmt));
189 break;
190 }
191 }
192 }
193 }
194
195 m_result.set(m_holder);
196 return true;
197}
#define vsnprintf
Definition Common.h:100
#define MAX_QUERY_LEN
Definition Common.h:195
std::uint32_t uint32
Definition Define.h:77
#define ASSERT
Definition Errors.h:29
#define SF_LOG_ERROR(filterType__,...)
Definition Log.h:143
Skyfire::AutoPtr< PreparedResultSet, Skyfire::Mutex > PreparedQueryResult
Definition QueryResult.h:94
Skyfire::AutoPtr< ResultSet, Skyfire::Mutex > QueryResult
Definition QueryResult.h:48
@ SQL_ELEMENT_RAW
@ SQL_ELEMENT_PREPARED
uint64 GetRowCount() const
Definition QueryResult.h:57
uint64 GetRowCount() const
Definition QueryResult.h:25
bool NextRow()
MySQLConnection * m_conn
bool SetQuery(size_t index, const char *sql)
void SetSize(size_t size)
std::vector< SQLResultPair > m_queries
Definition QueryHolder.h:16
bool SetPQuery(size_t index, const char *format,...) ATTR_PRINTF(3
void SetPreparedResult(size_t index, PreparedResultSet *result)
std::pair< SQLElementData, SQLResultSetUnion > SQLResultPair
Definition QueryHolder.h:15
PreparedQueryResult GetPreparedResult(size_t index)
void SetResult(size_t index, ResultSet *result)
bool bool SetPreparedQuery(size_t index, PreparedStatement *stmt)
QueryResult GetResult(size_t index)
QueryResultHolderFuture m_result
Definition QueryHolder.h:36
SQLQueryHolder * m_holder
Definition QueryHolder.h:35
SQLElementUnion element
SQLElementDataType type
const char * query
PreparedStatement * stmt
PreparedResultSet * presult
ResultSet * qresult