rendered paste bodyIndex: src/shared/Database/Database.h
===================================================================
--- src/shared/Database/Database.h (révision 5105)
+++ src/shared/Database/Database.h (copie de travail)
@@ -59,10 +59,14 @@
bool AsyncQuery(Class *object, void (Class::*method)(QueryResult*), const char *sql);
template<class Class, typename ParamType1>
bool AsyncQuery(Class *object, void (Class::*method)(QueryResult*, ParamType1), ParamType1 param1, const char *sql);
+ template<class Class, typename ParamType1, typename ParamType2, typename ParamType3>
+ bool AsyncQuery(Class *object, void (Class::*method)(QueryResult*, ParamType1, ParamType2, ParamType3), ParamType1 param1, ParamType2 param2, ParamType3 param3, const char *sql);
template<class Class>
bool AsyncPQuery(Class *object, void (Class::*method)(QueryResult*), const char *format,...) ATTR_PRINTF(4,5);
template<class Class, typename ParamType1>
bool AsyncPQuery(Class *object, void (Class::*method)(QueryResult*, ParamType1), ParamType1 param1, const char *format,...) ATTR_PRINTF(5,6);
+ template<class Class, typename ParamType1, typename ParamType2, typename ParamType3>
+ bool AsyncPQuery(Class *object, void (Class::*method)(QueryResult*, ParamType1, ParamType2, ParamType3), ParamType1 param1, ParamType2 param2, ParamType3 param3, const char *format,...) ATTR_PRINTF(5,6);
template<class Class>
bool DelayQueryHolder(Class *object, void (Class::*method)(QueryResult*, SqlQueryHolder*), SqlQueryHolder *holder);
template<class Class, typename ParamType1>
Index: src/shared/Database/DatabaseImpl.h
===================================================================
--- src/shared/Database/DatabaseImpl.h (révision 5105)
+++ src/shared/Database/DatabaseImpl.h (copie de travail)
@@ -45,6 +45,18 @@
return true;
}
+template<class Class, typename ParamType1, typename ParamType2, typename ParamType3>
+bool
+Database::AsyncQuery(Class *object, void (Class::*method)(QueryResult*, ParamType1, ParamType2, ParamType3), ParamType1 param1, ParamType2 param2, ParamType3 param3, const char *sql)
+{
+ if (!sql) return false;
+ ZThread::ThreadImpl * queryThread = ZThread::ThreadImpl::current();
+ QueryQueues::iterator itr = m_queryQueues.find(queryThread);
+ if (itr == m_queryQueues.end()) return false;
+ m_threadBody->Delay(new SqlQuery(sql, new MaNGOS::QueryCallback<Class, ParamType1, ParamType2, ParamType3>(object, method, (QueryResult*)NULL, param1, param2, param3), itr->second));
+ return true;
+}
+
template<class Class>
bool
Database::AsyncPQuery(Class *object, void (Class::*method)(QueryResult*), const char *format,...)
@@ -87,6 +99,28 @@
return AsyncQuery(object, method, param1, szQuery);
}
+
+template<class Class, typename ParamType1, typename ParamType2, typename ParamType3>
+bool
+Database::AsyncPQuery(Class *object, void (Class::*method)(QueryResult*, ParamType1, ParamType2, ParamType3), ParamType1 param1, ParamType2 param2, ParamType3 param3, const char *format,...)
+{
+ if(!format) return false;
+
+ va_list ap;
+ char szQuery [MAX_QUERY_LEN];
+ va_start(ap, format);
+ int res = vsnprintf( szQuery, MAX_QUERY_LEN, format, ap );
+ va_end(ap);
+
+ if(res==-1)
+ {
+ sLog.outError("SQL Query truncated (and not execute) for format: %s",format);
+ return false;
+ }
+
+ return AsyncQuery(object, method, param1, param2, param3, szQuery);
+}
+
template<class Class>
bool
Database::DelayQueryHolder(Class *object, void (Class::*method)(QueryResult*, SqlQueryHolder*), SqlQueryHolder *holder)
Index: src/game/Player.cpp
===================================================================
--- src/game/Player.cpp (révision 5105)
+++ src/game/Player.cpp (copie de travail)
@@ -14077,27 +14065,43 @@
tokens[index] = buf;
}
-void Player::SetUInt32ValueInDB(uint16 index, uint32 value, uint64 guid)
+class PlayerCallback
{
- Tokens tokens;
- if(!LoadValuesArrayFromDB(tokens,guid))
- return;
+ public:
+ void CallbackSetUInt32ValueInDB(QueryResult* result, uint16 index, uint32 value, uint64 guid)
+ {
+ if(!result)
+ return;
+
+ Tokens tokens;
+
+ Field *fields = result->Fetch();
- if(index >= tokens.size())
- return;
+ tokens = StrSplit(fields[0].GetCppString(), " ");
- char buf[11];
- snprintf(buf,11,"%u",value);
- tokens[index] = buf;
+ delete result;
- SaveValuesArrayInDB(tokens,guid);
+ if(index >= tokens.size())
+ return;
+
+ char buf[11];
+ snprintf(buf,11,"%u",value);
+ tokens[index] = buf;
+
+ Player::SaveValuesArrayInDB(tokens,guid);
+ }
+} pCallback;
+
+void Player::SetUInt32ValueInDB(uint16 index, uint32 value, uint64 guid)
+{
+ CharacterDatabase.AsyncPQuery(&pCallback, &PlayerCallback::CallbackSetUInt32ValueInDB, index, value, guid, "SELECT `data` FROM `character` WHERE `guid`='%u'", GUID_LOPART(guid));
}
void Player::SetFloatValueInDB(uint16 index, float value, uint64 guid)
{
uint32 temp;
memcpy(&temp, &value, sizeof(value));
Player::SetUInt32ValueInDB(index, temp, guid);
}
void Player::SendAttackSwingNotStanding()
Index: src/framework/Utilities/Callback.h
===================================================================
--- src/framework/Utilities/Callback.h (révision 5105)
+++ src/framework/Utilities/Callback.h (copie de travail)
@@ -23,10 +23,31 @@
namespace MaNGOS
{
- template < class Class, typename ParamType1 = void, typename ParamType2 = void, typename ParamType3 = void, typename ParamType4 = void >
+
+ template < class Class, typename ParamType1 = void, typename ParamType2 = void, typename ParamType3 = void, typename ParamType4 = void, typename ParamType5 = void >
class _Callback
{
protected:
+ typedef void (Class::*Method)(ParamType1, ParamType2, ParamType3, ParamType4, ParamType5);
+ Class *m_object;
+ Method m_method;
+ ParamType1 m_param1;
+ ParamType2 m_param2;
+ ParamType3 m_param3;
+ ParamType4 m_param4;
+ ParamType5 m_param5;
+ void _Execute() { (m_object->*m_method)(m_param1, m_param2, m_param3, m_param4, m_param5); }
+ public:
+ _Callback(Class *object, Method method, ParamType1 param1, ParamType2 param2, ParamType3 param3, ParamType4 param4, ParamType5 param5)
+ : m_object(object), m_method(method), m_param1(param1), m_param2(param2), m_param3(param3), m_param4(param4), m_param5(param5) {}
+ _Callback(_Callback < Class, ParamType1, ParamType2, ParamType3, ParamType4, ParamType5> const& cb)
+ : m_object(cb.object), m_method(cb.m_method), m_param1(cb.m_param1), m_param2(cb.m_param2), m_param3(cb.m_param3), m_param4(cb.m_param4), m_param5(cb.m_param5) {}
+ };
+
+ template < class Class, typename ParamType1, typename ParamType2, typename ParamType3, typename ParamType4 >
+ class _Callback < Class, ParamType1, ParamType2, ParamType3, ParamType4 >
+ {
+ protected:
typedef void (Class::*Method)(ParamType1, ParamType2, ParamType3, ParamType4);
Class *m_object;
Method m_method;
@@ -38,10 +59,11 @@
public:
_Callback(Class *object, Method method, ParamType1 param1, ParamType2 param2, ParamType3 param3, ParamType4 param4)
: m_object(object), m_method(method), m_param1(param1), m_param2(param2), m_param3(param3), m_param4(param4) {}
- _Callback(_Callback < Class, ParamType1, ParamType2, ParamType3, ParamType4> const& cb)
- : m_object(cb.object), m_method(cb.m_method), m_param1(cb.m_param1), m_param2(cb.m_param2), m_param3(cb.m_param3), m_param4(cb.m_param4) {}
+ _Callback(_Callback < Class, ParamType1, ParamType2, ParamType3, ParamType4 > const& cb)
+ : m_object(cb.m_object), m_method(cb.m_method), m_param1(cb.m_param1), m_param2(cb.m_param2), m_param3(cb.m_param3), m_param4(cb.m_param4) {}
};
+
template < class Class, typename ParamType1, typename ParamType2, typename ParamType3 >
class _Callback < Class, ParamType1, ParamType2, ParamType3 >
{
@@ -55,9 +77,9 @@
void _Execute() { (m_object->*m_method)(m_param1, m_param2, m_param3); }
public:
_Callback(Class *object, Method method, ParamType1 param1, ParamType2 param2, ParamType3 param3)
- : m_object(object), m_method(method), m_param1(param1), m_param2(param2) {}
+ : m_object(object), m_method(method), m_param1(param1), m_param2(param2), m_param3(param3) {}
_Callback(_Callback < Class, ParamType1, ParamType2, ParamType3 > const& cb)
- : m_object(cb.object), m_method(cb.m_method), m_param1(cb.m_param1), m_param2(cb.m_param2), m_param3(cb.m_param3) {}
+ : m_object(cb.m_object), m_method(cb.m_method), m_param1(cb.m_param1), m_param2(cb.m_param2), m_param3(cb.m_param3) {}
};
template < class Class, typename ParamType1, typename ParamType2 >
@@ -208,12 +230,26 @@
QueryResult* GetResult() { return CB::m_param1; }
};
- template < class Class, typename ParamType1 = void, typename ParamType2 = void, typename ParamType3 = void >
+
+ template < class Class, typename ParamType1 = void, typename ParamType2 = void, typename ParamType3 = void, typename ParamType4 = void >
class QueryCallback :
+ public _IQueryCallback< _Callback < Class, QueryResult*, ParamType1, ParamType2, ParamType3, ParamType4 > >
+ {
+ private:
+ typedef _Callback < Class, QueryResult*, ParamType1, ParamType2, ParamType3, ParamType4 > QC4;
+ public:
+ QueryCallback(Class *object, typename QC4::Method method, QueryResult* result, ParamType1 param1, ParamType2 param2, ParamType3 param3, ParamType4 param4)
+ : _IQueryCallback< QC4 >(QC4(object, method, result, param1, param2, param3, param4)) {}
+ };
+
+
+
+ template < class Class, typename ParamType1, typename ParamType2, typename ParamType3 >
+ class QueryCallback < Class, ParamType1, ParamType2, ParamType3 > :
public _IQueryCallback< _Callback < Class, QueryResult*, ParamType1, ParamType2, ParamType3 > >
{
private:
- typedef _Callback < Class, QueryResult*, ParamType1, ParamType2, ParamType3 > QC3;
+ typedef _Callback < Class, QueryResult*, ParamType1, ParamType2, ParamType3> QC3;
public:
QueryCallback(Class *object, typename QC3::Method method, QueryResult* result, ParamType1 param1, ParamType2 param2, ParamType3 param3)
: _IQueryCallback< QC3 >(QC3(object, method, result, param1, param2, param3)) {}