Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Toggle main menu visibility
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
12
bool
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
32
bool
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
55
bool
SQLQueryHolder::SetPreparedQuery
(
size_t
index,
PreparedStatement
* stmt)
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
75
QueryResult
SQLQueryHolder::GetResult
(
size_t
index)
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
91
PreparedQueryResult
SQLQueryHolder::GetPreparedResult
(
size_t
index)
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
106
void
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
119
void
SQLQueryHolder::SetPreparedResult
(
size_t
index,
PreparedResultSet
* result)
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
132
SQLQueryHolder::~SQLQueryHolder
()
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
;
145
case
SQL_ELEMENT_PREPARED
:
146
delete
data->element.stmt;
147
break
;
148
}
149
}
150
}
151
}
152
153
void
SQLQueryHolder::SetSize
(
size_t
size)
154
{
156
m_queries
.resize(size);
157
}
158
159
bool
SQLQueryHolderTask::Execute
()
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
}
184
case
SQL_ELEMENT_PREPARED
:
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
}
vsnprintf
#define vsnprintf
Definition
Common.h:100
MAX_QUERY_LEN
#define MAX_QUERY_LEN
Definition
Common.h:195
CompilerDefs.h
uint32
std::uint32_t uint32
Definition
Define.h:77
ASSERT
#define ASSERT
Definition
Errors.h:29
Log.h
SF_LOG_ERROR
#define SF_LOG_ERROR(filterType__,...)
Definition
Log.h:143
MySQLConnection.h
PreparedStatement.h
QueryHolder.h
PreparedQueryResult
Skyfire::AutoPtr< PreparedResultSet, Skyfire::Mutex > PreparedQueryResult
Definition
QueryResult.h:94
QueryResult
Skyfire::AutoPtr< ResultSet, Skyfire::Mutex > QueryResult
Definition
QueryResult.h:48
SQL_ELEMENT_RAW
@ SQL_ELEMENT_RAW
Definition
SQLOperation.h:24
SQL_ELEMENT_PREPARED
@ SQL_ELEMENT_PREPARED
Definition
SQLOperation.h:25
PreparedResultSet
Definition
QueryResult.h:51
PreparedResultSet::GetRowCount
uint64 GetRowCount() const
Definition
QueryResult.h:57
PreparedStatement
Definition
PreparedStatement.h:63
ResultSet
Definition
QueryResult.h:19
ResultSet::GetRowCount
uint64 GetRowCount() const
Definition
QueryResult.h:25
ResultSet::NextRow
bool NextRow()
Definition
QueryResult.cpp:139
SQLOperation::m_conn
MySQLConnection * m_conn
Definition
SQLOperation.h:57
SQLQueryHolder::SetQuery
bool SetQuery(size_t index, const char *sql)
Definition
QueryHolder.cpp:12
SQLQueryHolder::SetSize
void SetSize(size_t size)
Definition
QueryHolder.cpp:153
SQLQueryHolder::m_queries
std::vector< SQLResultPair > m_queries
Definition
QueryHolder.h:16
SQLQueryHolder::SetPQuery
bool SetPQuery(size_t index, const char *format,...) ATTR_PRINTF(3
Definition
QueryHolder.cpp:32
SQLQueryHolder::SetPreparedResult
void SetPreparedResult(size_t index, PreparedResultSet *result)
Definition
QueryHolder.cpp:119
SQLQueryHolder::~SQLQueryHolder
~SQLQueryHolder()
Definition
QueryHolder.cpp:132
SQLQueryHolder::SQLResultPair
std::pair< SQLElementData, SQLResultSetUnion > SQLResultPair
Definition
QueryHolder.h:15
SQLQueryHolder::GetPreparedResult
PreparedQueryResult GetPreparedResult(size_t index)
Definition
QueryHolder.cpp:91
SQLQueryHolder::SetResult
void SetResult(size_t index, ResultSet *result)
Definition
QueryHolder.cpp:106
SQLQueryHolder::SetPreparedQuery
bool bool SetPreparedQuery(size_t index, PreparedStatement *stmt)
Definition
QueryHolder.cpp:55
SQLQueryHolder::GetResult
QueryResult GetResult(size_t index)
Definition
QueryHolder.cpp:75
SQLQueryHolderTask::m_result
QueryResultHolderFuture m_result
Definition
QueryHolder.h:36
SQLQueryHolderTask::Execute
bool Execute()
Definition
QueryHolder.cpp:159
SQLQueryHolderTask::m_holder
SQLQueryHolder * m_holder
Definition
QueryHolder.h:35
SQLElementData
Definition
SQLOperation.h:30
SQLElementData::element
SQLElementUnion element
Definition
SQLOperation.h:31
SQLElementData::type
SQLElementDataType type
Definition
SQLOperation.h:32
SQLElementUnion::query
const char * query
Definition
SQLOperation.h:18
SQLElementUnion::stmt
PreparedStatement * stmt
Definition
SQLOperation.h:17
SQLResultSetUnion
Definition
SQLOperation.h:37
SQLResultSetUnion::presult
PreparedResultSet * presult
Definition
SQLOperation.h:38
SQLResultSetUnion::qresult
ResultSet * qresult
Definition
SQLOperation.h:39
src
server
shared
Database
QueryHolder.cpp
Generated on
for Project SkyFire Core by
1.17.0