Index: src/game/TradeHandler.cpp =================================================================== --- src/game/TradeHandler.cpp (revision 3691) +++ src/game/TradeHandler.cpp (working copy) @@ -295,10 +295,10 @@ _player->pTrader->ClearTrade(); // desynced with the other saves here (SaveInventoryAndGoldToDB() not have own transaction guards) - //sDatabase.BeginTransaction(); + sDatabase.BeginTransaction(); _player->SaveInventoryAndGoldToDB(); _player->pTrader->SaveInventoryAndGoldToDB(); - //sDatabase.CommitTransaction(); + sDatabase.CommitTransaction(); _player->pTrader->GetSession()->SendTradeStatus(TRADE_STATUS_TRADE_COMPLETE); SendTradeStatus(TRADE_STATUS_TRADE_COMPLETE); Index: src/shared/Database/Database.h =================================================================== --- src/shared/Database/Database.h (revision 3691) +++ src/shared/Database/Database.h (working copy) @@ -53,7 +53,20 @@ bool ExecuteLog(const char * format,...); bool PExecuteLog(const char * format,...); - + + virtual bool BeginTransaction() // nothing do if DB not support transactions + { + return true; + } + virtual bool CommitTransaction() // nothing do if DB not support transactions + { + return true; + } + virtual bool RollbackTransaction() // can't rollback without transaction support + { + return false; + } + virtual void CheckConnections() = 0; inline DatabaseType GetType() { return mType; } @@ -102,7 +115,6 @@ Database* CreateDatabaseInterface(DatabaseType type); void DestroyDatabaseInterface(Database * ptr); -// shitty mangos coders extern Database * MainDatabase; extern Database * LogonDatabase; #define sDatabase (*MainDatabase) Index: src/shared/Database/impl/MySQLDatabase.cpp =================================================================== --- src/shared/Database/impl/MySQLDatabase.cpp (revision 3691) +++ src/shared/Database/impl/MySQLDatabase.cpp (working copy) @@ -17,8 +17,12 @@ */ #include "../DatabaseEnv.h" -#include "Timer.h" +#ifdef WIN32 +#define usleep Sleep +#else +#endif + #ifdef DATABASE_SUPPORT_MYSQL MySQLDatabase::MySQLDatabase() : Database(DATABASE_TYPE_MYSQL) @@ -28,7 +32,7 @@ QueryBuffer = NULL; mConnectionCount = -1; // Not connected. mNormalCount = -1; - mNextPing = getMSTime(); + mNextPing = time(NULL); mQueryThread = 0; } @@ -172,10 +176,10 @@ void MySQLDatabase::CheckConnections() { // Check every 30 seconds (TODO: MAKE CUSTOMIZABLE) - if(getMSTime() < mNextPing) + if(time(NULL) < mNextPing) return; - mNextPing = getMSTime() + 60000; + mNextPing = time(NULL) + 60000; mSearchMutex.acquire(); for(uint32 i = 0; i < mNormalCount; ++i) { @@ -239,7 +243,7 @@ int result = mysql_query(Connections[ConnectionIndex], Sql); if(result > 0) { - sLog.outDetail("Sql query failed due to [%s]", mysql_error(Connections[ConnectionIndex])); + sLog.outError("Sql query failed due to [%s]", mysql_error(Connections[ConnectionIndex])); if( Self == false && HandleError( ConnectionIndex, mysql_errno(Connections[ConnectionIndex]) ) ) { // Re-send the query, the connection was successful. @@ -321,6 +325,24 @@ return qResult; } +bool MySQLDatabase::BeginTransaction() +{ + Execute("BEGIN"); + return true; +} + +bool MySQLDatabase::CommitTransaction() +{ + Execute("COMMIT"); + return true; +} + +bool MySQLDatabase::RollbackTransaction() +{ + Execute("ROLLBACK"); + return true; +} + bool MySQLDatabase::Execute(const char* QueryString, ...) { if(QueryString == NULL) return false; @@ -400,7 +422,7 @@ { // set thread name //SetThreadName("MySQL Database Execute Thread"); - Sleep(2000); + usleep(2000); bool err = false; string query; MYSQL * conn = _db->Connections[_db->mDelayedID]; @@ -425,7 +447,7 @@ if(!_db->Connect(i) || !_db->SelectDatabase(i)) { sLog.outError("Delayed query thread failed reconnection. Trying again in 2 seconds."); - Sleep(2000); + usleep(2000); } else { @@ -442,7 +464,7 @@ _db->SendQuery(i, query.c_str(), false); } } - Sleep(200); + usleep(200); } } Index: src/shared/Database/impl/MySQLDatabase.h =================================================================== --- src/shared/Database/impl/MySQLDatabase.h (revision 3691) +++ src/shared/Database/impl/MySQLDatabase.h (working copy) @@ -43,6 +43,9 @@ QueryResult* Query(const char* QueryString, ...); bool WaitExecute(const char* QueryString, ...); bool Execute(const char* QueryString, ...); + bool BeginTransaction(); + bool CommitTransaction(); + bool RollbackTransaction(); void CheckConnections(); bool Active;