All pastes #884820 Raw Edit

Someone

public text v1 · immutable
#884820 ·published 2008-01-30 16:54 UTC
rendered paste body
Index: 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)) {}