2 * Copyright (C) 2005-2008 MaNGOS <http://getmangos.com/>
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 #include "Database/Database.h"
20 #include "Database/SqlOperations.h"
22 /// Function body definitions for the template function members of the Database class
24 #define ASYNC_QUERY_BODY(sql, queue_itr) \
25 if (!sql) return false; \
27 QueryQueues::iterator queue_itr; \
30 ZThread::ThreadImpl * queryThread = ZThread::ThreadImpl::current(); \
31 queue_itr = m_queryQueues.find(queryThread); \
32 if (queue_itr == m_queryQueues.end()) return false; \
35 #define ASYNC_PQUERY_BODY(format, szQuery) \
36 if(!format) return false; \
38 char szQuery [MAX_QUERY_LEN]; \
43 va_start(ap, format); \
44 int res = vsnprintf( szQuery, MAX_QUERY_LEN, format, ap ); \
49 sLog.outError("SQL Query truncated (and not execute) for format: %s",format); \
54 #define ASYNC_DELAYHOLDER_BODY(holder, queue_itr) \
55 if (!holder) return false; \
57 QueryQueues::iterator queue_itr; \
60 ZThread::ThreadImpl * queryThread = ZThread::ThreadImpl::current(); \
61 queue_itr = m_queryQueues.find(queryThread); \
62 if (queue_itr == m_queryQueues.end()) return false; \
65 // -- Query / member --
69 Database::AsyncQuery(Class
*object
, void (Class::*method
)(QueryResult
*), const char *sql
)
71 ASYNC_QUERY_BODY(sql
, itr
)
72 return m_threadBody
->Delay(new SqlQuery(sql
, new MaNGOS::QueryCallback
<Class
>(object
, method
), itr
->second
));
75 template<class Class
, typename ParamType1
>
77 Database::AsyncQuery(Class
*object
, void (Class::*method
)(QueryResult
*, ParamType1
), ParamType1 param1
, const char *sql
)
79 ASYNC_QUERY_BODY(sql
, itr
)
80 return m_threadBody
->Delay(new SqlQuery(sql
, new MaNGOS::QueryCallback
<Class
, ParamType1
>(object
, method
, (QueryResult
*)NULL
, param1
), itr
->second
));
83 template<class Class
, typename ParamType1
, typename ParamType2
>
85 Database::AsyncQuery(Class
*object
, void (Class::*method
)(QueryResult
*, ParamType1
, ParamType2
), ParamType1 param1
, ParamType2 param2
, const char *sql
)
87 ASYNC_QUERY_BODY(sql
, itr
)
88 return m_threadBody
->Delay(new SqlQuery(sql
, new MaNGOS::QueryCallback
<Class
, ParamType1
, ParamType2
>(object
, method
, (QueryResult
*)NULL
, param1
, param2
), itr
->second
));
91 template<class Class
, typename ParamType1
, typename ParamType2
, typename ParamType3
>
93 Database::AsyncQuery(Class
*object
, void (Class::*method
)(QueryResult
*, ParamType1
, ParamType2
, ParamType3
), ParamType1 param1
, ParamType2 param2
, ParamType3 param3
, const char *sql
)
95 ASYNC_QUERY_BODY(sql
, itr
)
96 return m_threadBody
->Delay(new SqlQuery(sql
, new MaNGOS::QueryCallback
<Class
, ParamType1
, ParamType2
, ParamType3
>(object
, method
, (QueryResult
*)NULL
, param1
, param2
, param3
), itr
->second
));
99 // -- Query / static --
101 template<typename ParamType1
>
103 Database::AsyncQuery(void (*method
)(QueryResult
*, ParamType1
), ParamType1 param1
, const char *sql
)
105 ASYNC_QUERY_BODY(sql
, itr
)
106 return m_threadBody
->Delay(new SqlQuery(sql
, new MaNGOS::SQueryCallback
<ParamType1
>(method
, (QueryResult
*)NULL
, param1
), itr
->second
));
109 template<typename ParamType1
, typename ParamType2
>
111 Database::AsyncQuery(void (*method
)(QueryResult
*, ParamType1
, ParamType2
), ParamType1 param1
, ParamType2 param2
, const char *sql
)
113 ASYNC_QUERY_BODY(sql
, itr
)
114 return m_threadBody
->Delay(new SqlQuery(sql
, new MaNGOS::SQueryCallback
<ParamType1
, ParamType2
>(method
, (QueryResult
*)NULL
, param1
, param2
), itr
->second
));
117 template<typename ParamType1
, typename ParamType2
, typename ParamType3
>
119 Database::AsyncQuery(void (*method
)(QueryResult
*, ParamType1
, ParamType2
, ParamType3
), ParamType1 param1
, ParamType2 param2
, ParamType3 param3
, const char *sql
)
121 ASYNC_QUERY_BODY(sql
, itr
)
122 return m_threadBody
->Delay(new SqlQuery(sql
, new MaNGOS::SQueryCallback
<ParamType1
, ParamType2
, ParamType3
>(method
, (QueryResult
*)NULL
, param1
, param2
, param3
), itr
->second
));
125 // -- PQuery / member --
127 template<class Class
>
129 Database::AsyncPQuery(Class
*object
, void (Class::*method
)(QueryResult
*), const char *format
,...)
131 ASYNC_PQUERY_BODY(format
, szQuery
)
132 return AsyncQuery(object
, method
, szQuery
);
135 template<class Class
, typename ParamType1
>
137 Database::AsyncPQuery(Class
*object
, void (Class::*method
)(QueryResult
*, ParamType1
), ParamType1 param1
, const char *format
,...)
139 ASYNC_PQUERY_BODY(format
, szQuery
)
140 return AsyncQuery(object
, method
, param1
, szQuery
);
143 template<class Class
, typename ParamType1
, typename ParamType2
>
145 Database::AsyncPQuery(Class
*object
, void (Class::*method
)(QueryResult
*, ParamType1
, ParamType2
), ParamType1 param1
, ParamType2 param2
, const char *format
,...)
147 ASYNC_PQUERY_BODY(format
, szQuery
)
148 return AsyncQuery(object
, method
, param1
, param2
, szQuery
);
151 template<class Class
, typename ParamType1
, typename ParamType2
, typename ParamType3
>
153 Database::AsyncPQuery(Class
*object
, void (Class::*method
)(QueryResult
*, ParamType1
, ParamType2
, ParamType3
), ParamType1 param1
, ParamType2 param2
, ParamType3 param3
, const char *format
,...)
155 ASYNC_PQUERY_BODY(format
, szQuery
)
156 return AsyncQuery(object
, method
, param1
, param2
, param3
, szQuery
);
159 // -- PQuery / static --
161 template<typename ParamType1
>
163 Database::AsyncPQuery(void (*method
)(QueryResult
*, ParamType1
), ParamType1 param1
, const char *format
,...)
165 ASYNC_PQUERY_BODY(format
, szQuery
)
166 return AsyncQuery(method
, param1
, szQuery
);
169 template<typename ParamType1
, typename ParamType2
>
171 Database::AsyncPQuery(void (*method
)(QueryResult
*, ParamType1
, ParamType2
), ParamType1 param1
, ParamType2 param2
, const char *format
,...)
173 ASYNC_PQUERY_BODY(format
, szQuery
)
174 return AsyncQuery(method
, param1
, param2
, szQuery
);
177 template<typename ParamType1
, typename ParamType2
, typename ParamType3
>
179 Database::AsyncPQuery(void (*method
)(QueryResult
*, ParamType1
, ParamType2
, ParamType3
), ParamType1 param1
, ParamType2 param2
, ParamType3 param3
, const char *format
,...)
181 ASYNC_PQUERY_BODY(format
, szQuery
)
182 return AsyncQuery(method
, param1
, param2
, param3
, szQuery
);
187 template<class Class
>
189 Database::DelayQueryHolder(Class
*object
, void (Class::*method
)(QueryResult
*, SqlQueryHolder
*), SqlQueryHolder
*holder
)
191 ASYNC_DELAYHOLDER_BODY(holder
, itr
)
192 return holder
->Execute(new MaNGOS::QueryCallback
<Class
, SqlQueryHolder
*>(object
, method
, (QueryResult
*)NULL
, holder
), m_threadBody
, itr
->second
);
195 template<class Class
, typename ParamType1
>
197 Database::DelayQueryHolder(Class
*object
, void (Class::*method
)(QueryResult
*, SqlQueryHolder
*, ParamType1
), SqlQueryHolder
*holder
, ParamType1 param1
)
199 ASYNC_DELAYHOLDER_BODY(holder
, itr
)
200 return holder
->Execute(new MaNGOS::QueryCallback
<Class
, SqlQueryHolder
*, ParamType1
>(object
, method
, (QueryResult
*)NULL
, holder
, param1
), m_threadBody
, itr
->second
);
203 #undef ASYNC_QUERY_BODY
204 #undef ASYNC_PQUERY_BODY
205 #undef ASYNC_DELAYHOLDER_BODY