mirror of
https://github.com/ddnet/ddnet.git
synced 2024-11-10 10:08:18 +00:00
Reduce boilerplate code needed to start player info requesting thread
This commit is contained in:
parent
f18daa949c
commit
fd44b1dc5b
|
@ -82,6 +82,27 @@ std::shared_ptr<CSqlPlayerResult> CSqlScore::NewSqlPlayerResult(int ClientID)
|
||||||
return pCurPlayer->m_SqlQueryResult;
|
return pCurPlayer->m_SqlQueryResult;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CSqlScore::ExecPlayerThread(
|
||||||
|
bool (*pFuncPtr) (CSqlServer*, const CSqlData<CSqlPlayerResult> *, bool),
|
||||||
|
const char* pThreadName,
|
||||||
|
int ClientID,
|
||||||
|
const char* pName,
|
||||||
|
int Offset
|
||||||
|
) {
|
||||||
|
auto pResult = NewSqlPlayerResult(ClientID);
|
||||||
|
if(pResult == nullptr)
|
||||||
|
return;
|
||||||
|
CSqlPlayerRequest *Tmp = new CSqlPlayerRequest(pResult);
|
||||||
|
Tmp->m_Name = pName;
|
||||||
|
Tmp->m_Map = g_Config.m_SvMap;
|
||||||
|
Tmp->m_RequestingPlayer = Server()->ClientName(ClientID);
|
||||||
|
Tmp->m_Offset = Offset;
|
||||||
|
|
||||||
|
thread_init_and_detach(CSqlExecData<CSqlPlayerResult>::ExecSqlFunc,
|
||||||
|
new CSqlExecData<CSqlPlayerResult>(pFuncPtr, Tmp),
|
||||||
|
pThreadName);
|
||||||
|
}
|
||||||
|
|
||||||
LOCK CSqlScore::ms_FailureFileLock = lock_create();
|
LOCK CSqlScore::ms_FailureFileLock = lock_create();
|
||||||
|
|
||||||
CSqlScore::CSqlScore(CGameContext *pGameServer) :
|
CSqlScore::CSqlScore(CGameContext *pGameServer) :
|
||||||
|
@ -399,32 +420,23 @@ bool CSqlScore::MapVoteThread(CSqlServer* pSqlServer, const CSqlData<CSqlResult>
|
||||||
|
|
||||||
void CSqlScore::MapInfo(int ClientID, const char* MapName)
|
void CSqlScore::MapInfo(int ClientID, const char* MapName)
|
||||||
{
|
{
|
||||||
auto pResult = NewSqlPlayerResult(ClientID);
|
ExecPlayerThread(MapInfoThread, "map info", ClientID, MapName, 0);
|
||||||
if(pResult == nullptr)
|
|
||||||
return;
|
|
||||||
CSqlMapData *Tmp = new CSqlMapData(pResult);
|
|
||||||
|
|
||||||
Tmp->m_ClientID = ClientID;
|
|
||||||
Tmp->m_RequestedMap = MapName;
|
|
||||||
Tmp->m_Name = Server()->ClientName(ClientID);
|
|
||||||
str_copy(Tmp->m_aFuzzyMap, MapName, sizeof(Tmp->m_aFuzzyMap));
|
|
||||||
sqlstr::ClearString(Tmp->m_aFuzzyMap, sizeof(Tmp->m_aFuzzyMap));
|
|
||||||
sqlstr::FuzzyString(Tmp->m_aFuzzyMap, sizeof(Tmp->m_aFuzzyMap));
|
|
||||||
|
|
||||||
thread_init_and_detach(CSqlExecData<CSqlPlayerResult>::ExecSqlFunc,
|
|
||||||
new CSqlExecData<CSqlPlayerResult>(MapInfoThread, Tmp),
|
|
||||||
"map info");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CSqlScore::MapInfoThread(CSqlServer* pSqlServer, const CSqlData<CSqlPlayerResult> *pGameData, bool HandleFailure)
|
bool CSqlScore::MapInfoThread(CSqlServer* pSqlServer, const CSqlData<CSqlPlayerResult> *pGameData, bool HandleFailure)
|
||||||
{
|
{
|
||||||
const CSqlMapData *pData = dynamic_cast<const CSqlMapData *>(pGameData);
|
const CSqlPlayerRequest *pData = dynamic_cast<const CSqlPlayerRequest *>(pGameData);
|
||||||
|
|
||||||
if (HandleFailure)
|
if (HandleFailure)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
char aFuzzyMap[128];
|
||||||
|
str_copy(aFuzzyMap, pData->m_Name.Str(), sizeof(aFuzzyMap));
|
||||||
|
sqlstr::ClearString(aFuzzyMap, sizeof(aFuzzyMap));
|
||||||
|
sqlstr::FuzzyString(aFuzzyMap, sizeof(aFuzzyMap));
|
||||||
|
|
||||||
char aBuf[1024];
|
char aBuf[1024];
|
||||||
str_format(aBuf, sizeof(aBuf),
|
str_format(aBuf, sizeof(aBuf),
|
||||||
"SELECT l.Map, l.Server, Mapper, Points, Stars, "
|
"SELECT l.Map, l.Server, Mapper, Points, Stars, "
|
||||||
|
@ -446,18 +458,18 @@ bool CSqlScore::MapInfoThread(CSqlServer* pSqlServer, const CSqlData<CSqlPlayerR
|
||||||
") as l;",
|
") as l;",
|
||||||
pSqlServer->GetPrefix(), pSqlServer->GetPrefix(),
|
pSqlServer->GetPrefix(), pSqlServer->GetPrefix(),
|
||||||
pSqlServer->GetPrefix(), pSqlServer->GetPrefix(),
|
pSqlServer->GetPrefix(), pSqlServer->GetPrefix(),
|
||||||
pData->m_Name.ClrStr(),
|
pData->m_RequestingPlayer.ClrStr(),
|
||||||
pSqlServer->GetPrefix(),
|
pSqlServer->GetPrefix(),
|
||||||
pData->m_aFuzzyMap,
|
aFuzzyMap,
|
||||||
pData->m_RequestedMap.ClrStr(),
|
pData->m_Name.ClrStr(),
|
||||||
pData->m_RequestedMap.ClrStr()
|
pData->m_Name.ClrStr()
|
||||||
);
|
);
|
||||||
pSqlServer->executeSqlQuery(aBuf);
|
pSqlServer->executeSqlQuery(aBuf);
|
||||||
|
|
||||||
if(pSqlServer->GetResults()->rowsCount() != 1)
|
if(pSqlServer->GetResults()->rowsCount() != 1)
|
||||||
{
|
{
|
||||||
str_format(pData->m_pResult->m_aaMessages[0], sizeof(pData->m_pResult->m_aaMessages[0]),
|
str_format(pData->m_pResult->m_aaMessages[0], sizeof(pData->m_pResult->m_aaMessages[0]),
|
||||||
"No map like \"%s\" found.", pData->m_RequestedMap.Str());
|
"No map like \"%s\" found.", pData->m_Name.Str());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -804,17 +816,7 @@ bool CSqlScore::SaveTeamScoreThread(CSqlServer* pSqlServer, const CSqlData<CSqlP
|
||||||
|
|
||||||
void CSqlScore::ShowRank(int ClientID, const char* pName)
|
void CSqlScore::ShowRank(int ClientID, const char* pName)
|
||||||
{
|
{
|
||||||
auto pResult = NewSqlPlayerResult(ClientID);
|
ExecPlayerThread(ShowRankThread, "show rank", ClientID, pName, 0);
|
||||||
if(pResult == nullptr)
|
|
||||||
return;
|
|
||||||
CSqlPlayerRequest *Tmp = new CSqlPlayerRequest(pResult);
|
|
||||||
Tmp->m_Player = pName;
|
|
||||||
Tmp->m_Map = g_Config.m_SvMap;
|
|
||||||
Tmp->m_RequestingPlayer = Server()->ClientName(ClientID);
|
|
||||||
|
|
||||||
thread_init_and_detach(CSqlExecData<CSqlPlayerResult>::ExecSqlFunc,
|
|
||||||
new CSqlExecData<CSqlPlayerResult>(ShowRankThread, Tmp),
|
|
||||||
"show rank");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CSqlScore::ShowRankThread(CSqlServer* pSqlServer, const CSqlData<CSqlPlayerResult> *pGameData, bool HandleFailure)
|
bool CSqlScore::ShowRankThread(CSqlServer* pSqlServer, const CSqlData<CSqlPlayerResult> *pGameData, bool HandleFailure)
|
||||||
|
@ -843,7 +845,7 @@ bool CSqlScore::ShowRankThread(CSqlServer* pSqlServer, const CSqlData<CSqlPlayer
|
||||||
"WHERE Name = '%s';",
|
"WHERE Name = '%s';",
|
||||||
pSqlServer->GetPrefix(),
|
pSqlServer->GetPrefix(),
|
||||||
pData->m_Map.ClrStr(),
|
pData->m_Map.ClrStr(),
|
||||||
pData->m_Player.ClrStr()
|
pData->m_Name.ClrStr()
|
||||||
);
|
);
|
||||||
|
|
||||||
pSqlServer->executeSqlQuery(aBuf);
|
pSqlServer->executeSqlQuery(aBuf);
|
||||||
|
@ -851,7 +853,7 @@ bool CSqlScore::ShowRankThread(CSqlServer* pSqlServer, const CSqlData<CSqlPlayer
|
||||||
if(pSqlServer->GetResults()->rowsCount() != 1)
|
if(pSqlServer->GetResults()->rowsCount() != 1)
|
||||||
{
|
{
|
||||||
str_format(pData->m_pResult->m_aaMessages[0], sizeof(pData->m_pResult->m_aaMessages[0]),
|
str_format(pData->m_pResult->m_aaMessages[0], sizeof(pData->m_pResult->m_aaMessages[0]),
|
||||||
"%s is not ranked", pData->m_Player.Str());
|
"%s is not ranked", pData->m_Name.Str());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -888,17 +890,7 @@ bool CSqlScore::ShowRankThread(CSqlServer* pSqlServer, const CSqlData<CSqlPlayer
|
||||||
|
|
||||||
void CSqlScore::ShowTeamRank(int ClientID, const char* pName)
|
void CSqlScore::ShowTeamRank(int ClientID, const char* pName)
|
||||||
{
|
{
|
||||||
auto pResult = NewSqlPlayerResult(ClientID);
|
ExecPlayerThread(ShowTeamRankThread, "show team rank", ClientID, pName, 0);
|
||||||
if(pResult == nullptr)
|
|
||||||
return;
|
|
||||||
CSqlPlayerRequest *Tmp = new CSqlPlayerRequest(pResult);
|
|
||||||
Tmp->m_Player = pName;
|
|
||||||
Tmp->m_Map = g_Config.m_SvMap;
|
|
||||||
Tmp->m_RequestingPlayer = Server()->ClientName(ClientID);
|
|
||||||
|
|
||||||
thread_init_and_detach(CSqlExecData<CSqlPlayerResult>::ExecSqlFunc,
|
|
||||||
new CSqlExecData<CSqlPlayerResult>(ShowTeamRankThread, Tmp),
|
|
||||||
"show team rank");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CSqlScore::ShowTeamRankThread(CSqlServer* pSqlServer, const CSqlData<CSqlPlayerResult> *pGameData, bool HandleFailure)
|
bool CSqlScore::ShowTeamRankThread(CSqlServer* pSqlServer, const CSqlData<CSqlPlayerResult> *pGameData, bool HandleFailure)
|
||||||
|
@ -948,7 +940,7 @@ bool CSqlScore::ShowTeamRankThread(CSqlServer* pSqlServer, const CSqlData<CSqlPl
|
||||||
pData->m_Map.ClrStr(),
|
pData->m_Map.ClrStr(),
|
||||||
pSqlServer->GetPrefix(),
|
pSqlServer->GetPrefix(),
|
||||||
pData->m_Map.ClrStr(),
|
pData->m_Map.ClrStr(),
|
||||||
pData->m_Player.ClrStr(),
|
pData->m_Name.ClrStr(),
|
||||||
pSqlServer->GetPrefix()
|
pSqlServer->GetPrefix()
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -959,7 +951,7 @@ bool CSqlScore::ShowTeamRankThread(CSqlServer* pSqlServer, const CSqlData<CSqlPl
|
||||||
if(Rows < 1)
|
if(Rows < 1)
|
||||||
{
|
{
|
||||||
str_format(pData->m_pResult->m_aaMessages[0], sizeof(pData->m_pResult->m_aaMessages[0]),
|
str_format(pData->m_pResult->m_aaMessages[0], sizeof(pData->m_pResult->m_aaMessages[0]),
|
||||||
"%s has no team ranks", pData->m_Player.Str());
|
"%s has no team ranks", pData->m_Name.Str());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -84,16 +84,19 @@ struct CSqlMapData : CSqlData<CSqlPlayerResult>
|
||||||
int m_ClientID;
|
int m_ClientID;
|
||||||
|
|
||||||
sqlstr::CSqlString<128> m_RequestedMap;
|
sqlstr::CSqlString<128> m_RequestedMap;
|
||||||
char m_aFuzzyMap[128];
|
|
||||||
sqlstr::CSqlString<MAX_NAME_LENGTH> m_Name;
|
sqlstr::CSqlString<MAX_NAME_LENGTH> m_Name;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct CSqlPlayerRequest : CSqlData<CSqlPlayerResult>
|
struct CSqlPlayerRequest : CSqlData<CSqlPlayerResult>
|
||||||
{
|
{
|
||||||
using CSqlData<CSqlPlayerResult>::CSqlData;
|
using CSqlData<CSqlPlayerResult>::CSqlData;
|
||||||
sqlstr::CSqlString<MAX_NAME_LENGTH> m_Player;
|
// object being requested, either map (128 bytes) or player (16 bytes)
|
||||||
sqlstr::CSqlString<MAX_NAME_LENGTH> m_Map;
|
sqlstr::CSqlString<128> m_Name;
|
||||||
|
// current map
|
||||||
|
sqlstr::CSqlString<128> m_Map;
|
||||||
sqlstr::CSqlString<MAX_NAME_LENGTH> m_RequestingPlayer;
|
sqlstr::CSqlString<MAX_NAME_LENGTH> m_RequestingPlayer;
|
||||||
|
// relevant for /top5 kind of requests
|
||||||
|
int m_Offset;
|
||||||
};
|
};
|
||||||
|
|
||||||
// used for mapvote
|
// used for mapvote
|
||||||
|
@ -221,6 +224,14 @@ class CSqlScore: public IScore
|
||||||
|
|
||||||
// returns new SqlResult bound to the player, if no current Thread is active for this player
|
// returns new SqlResult bound to the player, if no current Thread is active for this player
|
||||||
std::shared_ptr<CSqlPlayerResult> NewSqlPlayerResult(int ClientID);
|
std::shared_ptr<CSqlPlayerResult> NewSqlPlayerResult(int ClientID);
|
||||||
|
// Creates for player database requests
|
||||||
|
void ExecPlayerThread(
|
||||||
|
bool (*pFuncPtr) (CSqlServer*, const CSqlData<CSqlPlayerResult> *, bool),
|
||||||
|
const char* pThreadName,
|
||||||
|
int ClientID,
|
||||||
|
const char* pName,
|
||||||
|
int OffSet
|
||||||
|
);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
// keeps track of score-threads
|
// keeps track of score-threads
|
||||||
|
|
Loading…
Reference in a new issue