Files
2026-06-01 12:46:52 +02:00

595 lines
20 KiB
C++

#include <toolkit/XEnv.h>
#include <dump/XException.h>
#include <toolkit/XConsole.h>
#include <logging/FileLog.h>
#include "CommunityLoader.h"
#include "GuildManager.h"
#include "GameDBUtil.h"
#include "SendMessage.h"
#include "GameMessage.h"
#include "DB_Commands.h"
#include "DBPerformanceTracker.h"
#include "ADOConnection.h"
struct dbAlliance : public CADORecordBinding
{
BEGIN_ADO_BINDING(dbAlliance)
ADO_VARIABLE_LENGTH_ENTRY4(1, adInteger, alliance_sid, sizeof(alliance_sid), FALSE)
ADO_VARIABLE_LENGTH_ENTRY4(2, adVarWChar, szAllianceName, _countof(szAllianceName) - 1, FALSE)
ADO_VARIABLE_LENGTH_ENTRY4(3, adInteger, leader_sid, sizeof(leader_sid), FALSE)
ADO_VARIABLE_LENGTH_ENTRY4(4, adInteger, max_alliance_cnt, sizeof(max_alliance_cnt), FALSE)
ADO_VARIABLE_LENGTH_ENTRY4(5, adInteger, name_changed, sizeof(name_changed), FALSE)
END_ADO_BINDING()
int alliance_sid;
wchar_t szAllianceName[61];
int leader_sid;
int max_alliance_cnt;
int name_changed;
};
struct dbGuild : public CADORecordBinding
{
BEGIN_ADO_BINDING(dbGuild)
ADO_VARIABLE_LENGTH_ENTRY4(1, adInteger, guild_sid, sizeof(guild_sid), FALSE)
ADO_VARIABLE_LENGTH_ENTRY4(2, adVarWChar, szGuildName, _countof(szGuildName) - 1, FALSE)
ADO_VARIABLE_LENGTH_ENTRY4(3, adVarWChar, szGuildNotice, _countof(szGuildNotice) - 1, FALSE)
ADO_VARIABLE_LENGTH_ENTRY4(4, adVarWChar, szGuildURL, _countof(szGuildURL) - 1, FALSE)
ADO_VARIABLE_LENGTH_ENTRY4(5, adVarChar, szIconFileName, _countof(szIconFileName) - 1, FALSE)
ADO_VARIABLE_LENGTH_ENTRY4(6, adInteger, icon_size, sizeof(icon_size), FALSE)
ADO_VARIABLE_LENGTH_ENTRY4(7, adVarChar, szBannerFileName, _countof(szBannerFileName) - 1, FALSE)
ADO_VARIABLE_LENGTH_ENTRY4(8, adInteger, nBannerSize, sizeof(nBannerSize), FALSE)
ADO_VARIABLE_LENGTH_ENTRY4(9, adTinyInt, nAdvertiseType, sizeof(nAdvertiseType), FALSE)
ADO_VARIABLE_LENGTH_ENTRY4(10, adDBTimeStamp, tAdvertiseEnd, sizeof( tAdvertiseEnd ), FALSE)
ADO_VARIABLE_LENGTH_ENTRY4(11, adVarWChar, szAdvertiseComment, _countof(szAdvertiseComment) - 1, FALSE)
ADO_VARIABLE_LENGTH_ENTRY4(12, adBoolean, bRecruiting, sizeof( bRecruiting ), FALSE)
ADO_VARIABLE_LENGTH_ENTRY4(13, adSmallInt, nMinRecruitLevel, sizeof(nMinRecruitLevel), FALSE)
ADO_VARIABLE_LENGTH_ENTRY4(14, adSmallInt, nMaxRecruitLevel, sizeof(nMaxRecruitLevel), FALSE)
ADO_VARIABLE_LENGTH_ENTRY4(15, adInteger, name_changed, sizeof(name_changed), FALSE)
ADO_VARIABLE_LENGTH_ENTRY4(16, adInteger, dungeon_id, sizeof(dungeon_id), FALSE)
ADO_VARIABLE_LENGTH_ENTRY4(17, adBigInt, dungeon_block_time, sizeof(dungeon_block_time), FALSE)
ADO_VARIABLE_LENGTH_ENTRY4(18, adBigInt, gold, sizeof(gold), FALSE)
ADO_VARIABLE_LENGTH_ENTRY4(19, adInteger, chaos, sizeof(chaos), FALSE)
ADO_VARIABLE_LENGTH_ENTRY4(20, adInteger, alliance_id, sizeof(alliance_id), FALSE)
ADO_VARIABLE_LENGTH_ENTRY4(21, adBigInt, alliance_block_time, sizeof(alliance_block_time), FALSE)
ADO_VARIABLE_LENGTH_ENTRY4(22, adInteger, donation_point, sizeof(donation_point), FALSE)
ADO_VARIABLE_LENGTH_ENTRY4(23, adVarWChar, permission_name[ 0 ], _countof(permission_name[ 0 ]) - 1, FALSE)
ADO_VARIABLE_LENGTH_ENTRY4(24, adInteger, permission_set[ 0 ], sizeof(permission_set[ 0 ]), FALSE)
ADO_VARIABLE_LENGTH_ENTRY4(25, adVarWChar, permission_name[ 1 ], _countof(permission_name[ 1 ]) - 1, FALSE)
ADO_VARIABLE_LENGTH_ENTRY4(26, adInteger, permission_set[ 1 ], sizeof(permission_set[ 1 ]), FALSE)
ADO_VARIABLE_LENGTH_ENTRY4(27, adVarWChar, permission_name[ 2 ], _countof(permission_name[ 2 ]) - 1, FALSE)
ADO_VARIABLE_LENGTH_ENTRY4(28, adInteger, permission_set[ 2 ], sizeof(permission_set[ 2 ]), FALSE)
ADO_VARIABLE_LENGTH_ENTRY4(29, adVarWChar, permission_name[ 3 ], _countof(permission_name[ 3 ]) - 1, FALSE)
ADO_VARIABLE_LENGTH_ENTRY4(30, adInteger, permission_set[ 3 ], sizeof(permission_set[ 3 ]), FALSE)
ADO_VARIABLE_LENGTH_ENTRY4(31, adVarWChar, permission_name[ 4 ], _countof(permission_name[ 4 ]) - 1, FALSE)
ADO_VARIABLE_LENGTH_ENTRY4(32, adInteger, permission_set[ 4 ], sizeof(permission_set[ 4 ]), FALSE)
ADO_VARIABLE_LENGTH_ENTRY4(33, adVarWChar, permission_name[ 5 ], _countof(permission_name[ 5 ]) - 1, FALSE)
ADO_VARIABLE_LENGTH_ENTRY4(34, adInteger, permission_set[ 5 ], sizeof(permission_set[ 5 ]), FALSE)
ADO_VARIABLE_LENGTH_ENTRY4(35, adInteger, grade, sizeof(grade), FALSE)
ADO_VARIABLE_LENGTH_ENTRY4(36, adInteger, point, sizeof(point), FALSE)
END_ADO_BINDING()
int guild_sid;
wchar_t szGuildName[61];
wchar_t szGuildNotice[256];
wchar_t szGuildURL[129];
char szIconFileName[256];
int icon_size;
char szBannerFileName[256];
int nBannerSize;
unsigned char nAdvertiseType;
wchar_t szAdvertiseComment[256];
DBTIMESTAMP tAdvertiseEnd;
bool bRecruiting;
short nMinRecruitLevel;
short nMaxRecruitLevel;
int name_changed;
int dungeon_id;
time_t dungeon_block_time;
__int64 gold;
int chaos;
int alliance_id;
time_t alliance_block_time;
int donation_point;
wchar_t permission_name[ GuildManager::PERMISSION_SET_TYPE_COUNT ][ 33 ];
int permission_set[ GuildManager::PERMISSION_SET_TYPE_COUNT ];
int grade;
int point;
};
bool GuildLoader::onProcess( int nThreadNum )
{
if( !GuildManager::GetInstance().Init() )
{
FILELOG( "Guild load error!" );
_cprint( "Guild load error!\n" );
return false;
}
return true;
}
void GuildManager::LoadGuildIconInfo( int nGuildID )
{
DBConnection db;
InitUserDbConnection( db.connection );
if( db.CreateCommand( db.command ) == false )
{
throw XException( "ADO COMMAND_PTR CREATE ERROR!" );
}
db.command->CommandType = adCmdStoredProc;
db.command->CommandText = _bstr_t( "dbo.smp_read_guild_icon_info" );
db.command->Parameters->Append( db.command->CreateParameter( "IN_GUILD_SID", adInteger, adParamInput, sizeof( nGuildID ), nGuildID ) );
_RecordsetPtr rs;
DBPerformanceTrackHelper helper;
try
{
helper.start();
rs = db.command->Execute(NULL,NULL,adCmdStoredProc);
helper.end( "smp_read_guild_icon_info" );
}
catch( _com_error &e )
{
helper.end( e.Error(), "smp_read_guild_icon_info" );
LogDBError( e, "GuildManager", "smp_read_guild_icon_info" );
std::string strError = "GameDB ERROR : ";
strError += e.Description();
throw XException( strError );
}
if( rs->State != adStateClosed && !rs->EndOfFile )
{
if( updateGuildInfo( nGuildID, (_bstr_t) rs->Fields->GetItem("icon")->Value, rs->Fields->GetItem("icon_size")->Value ) )
{
char szBuf[255];
s_sprintf( szBuf, _countof( szBuf ), "GICON_UPDATE|%d", nGuildID );
SendGlobalChatMessage( CHAT_GUILD_SYSTEM, "@GUILD", szBuf, static_cast<unsigned int>( strlen( szBuf ) ) );
}
}
}
void GuildManager::LoadGuildBannerInfo( int nGuildID )
{
DBConnection db;
InitUserDbConnection( db.connection );
if( db.CreateCommand( db.command ) == false )
{
throw XException( "ADO COMMAND_PTR CREATE ERROR!" );
}
db.command->CommandType = adCmdStoredProc;
db.command->CommandText = _bstr_t( "dbo.smp_read_guild_banner_info" );
db.command->Parameters->Append( db.command->CreateParameter( "IN_GUILD_SID", adInteger, adParamInput, sizeof( nGuildID ), nGuildID ) );
_RecordsetPtr rs;
DBPerformanceTrackHelper helper;
try
{
helper.start();
rs = db.command->Execute(NULL,NULL,adCmdStoredProc);
helper.end( "smp_read_guild_banner_info" );
}
catch( _com_error &e )
{
helper.end( e.Error(), "smp_read_guild_banner_info" );
LogDBError( e, "GuildManager", "smp_read_guild_banner_info" );
std::string strError = "GameDB ERROR : ";
strError += e.Description();
throw XException( strError );
}
if( rs->State != adStateClosed && !rs->EndOfFile )
{
if( updateGuildBannerInfo( nGuildID, (_bstr_t) rs->Fields->GetItem("banner")->Value, rs->Fields->GetItem("banner_size")->Value ) )
{
char szBuf[255];
s_sprintf( szBuf, _countof( szBuf ), "GBANNER_UPDATE|%d", nGuildID );
SendGlobalChatMessage( CHAT_GUILD_SYSTEM, "@GUILD", szBuf, static_cast<unsigned int>( strlen( szBuf ) ) );
}
}
}
void GuildManager::loadAllianceList()
{
#ifdef FRAUN_PERFORMANCE_LOG
DWORD dwTime = GetSafeTickCount();
#endif
_ConnectionPtr ConnPtr = NULL;
InitUserDbConnection( ConnPtr );
_RecordsetPtr pRstAlliance = NULL;
IADORecordBinding *picRs = NULL; // Interface Pointer declared.
dbAlliance emprs; // C++ Class object
pRstAlliance.CreateInstance( __uuidof(Recordset) );
pRstAlliance->Open("Alliance",
_variant_t((IDispatch *)ConnPtr,true),
adOpenForwardOnly, adLockReadOnly, adCmdTable);
pRstAlliance->QueryInterface( __uuidof(IADORecordBinding),(LPVOID*)&picRs );
picRs->BindToRecordset(&emprs);
int cnt = 0;
while( pRstAlliance->State != adStateClosed && !pRstAlliance->EndOfFile )
{
// max 길드 ID 수정
if( m_nMaxAllianceId < emprs.alliance_sid ) m_nMaxAllianceId = emprs.alliance_sid;
char szAllianceName[61];
int code_page = ENV().GetInt( "CodePage", CP_ACP );
WideCharToMultiByte( code_page, 0, emprs.szAllianceName, 61, szAllianceName, 61, NULL, NULL );
// 길드 생성
makeAlliance( emprs.alliance_sid, emprs.leader_sid, szAllianceName, emprs.max_alliance_cnt, emprs.name_changed );
pRstAlliance->MoveNext();
cnt++;
}
picRs->Release();
pRstAlliance->Close();
#ifdef FRAUN_PERFORMANCE_LOG
DWORD loadingTime = GetSafeTickCount() - dwTime;
_cprint("Total %d Alliances loaded; time taken: %d\n", cnt, loadingTime);
FILELOG("Total %d Alliances loaded; time taken: %d", cnt, loadingTime);
#else
_cprint( "Total %d Alliances loaded.\n", cnt );
FILELOG( "Total %d Alliances loaded.", cnt );
#endif
return;
}
void GuildManager::loadGuildMemberTagList()
{
DBPerformanceTrackHelper helper;
try
{
DBConnection db;
InitUserDbConnection( db.connection );
if( db.CreateCommand( db.command ) == false )
{
throw XException( "ADO COMMAND_PTR CREATE ERROR!" );
}
db.command->CommandType = adCmdText;
db.command->CommandText = _bstr_t( "dbo.smp_read_guild_member_list" );
db.command->CommandTimeout = 10*60; // 10분
_RecordsetPtr rs;
helper.start();
rs = db.command->Execute( NULL, NULL, adCmdText );
helper.end( "smp_read_guild_member_list" );
int nLoadingGuildID = 0;
std::vector< GuildMemberTag > *pvLoadingGuildMemberTagList = NULL;
while( rs->State != adStateClosed && !rs->EndOfFile )
{
_bstr_t name = rs->Fields->GetItem("name")->Value;
PlayerUID sid = rs->Fields->GetItem("player_id")->Value;
int guild_id = rs->Fields->GetItem("guild_id")->Value;
int level = rs->Fields->GetItem("lv")->Value;
int job = rs->Fields->GetItem("job")->Value;
char permission = rs->Fields->GetItem("permission")->Value;
std::string memo = static_cast< const char * >( _bstr_t( rs->Fields->GetItem("memo")->Value.bstrVal ) );
int point = rs->Fields->GetItem( "point" )->Value;
int total_point = rs->Fields->GetItem( "total_point" )->Value;
// 최초 로딩이거나 이전 로딩된 데이터의 길드 ID가 현재 로드된 길드 ID와 다를 경우 해쉬에서 새로 검색
if( !nLoadingGuildID || nLoadingGuildID != guild_id )
{
// 기존 해쉬에 없던 길드 ID면 벡터 새로 생성
if( !m_hshGuildMemberTagList.lookup( guild_id, pvLoadingGuildMemberTagList ) )
{
pvLoadingGuildMemberTagList = new std::vector< GuildMemberTag >;
m_hshGuildMemberTagList.add( guild_id, pvLoadingGuildMemberTagList );
}
nLoadingGuildID = guild_id;
}
assert( nLoadingGuildID == guild_id && pvLoadingGuildMemberTagList );
StructPlayer::RegisterPlayerName( sid, static_cast< const char* >( name ) );
pvLoadingGuildMemberTagList->push_back( GuildManager::GuildMemberTag( sid, level, job, permission, memo.c_str(), point, total_point ) );
rs->MoveNext();
}
}
catch( _com_error &e )
{
helper.end( e.Error(), "smp_read_guild_member_list" );
LogDBError( e, "GuildManager", "smp_read_guild_member_list" );
std::string strError = "GameDB ERROR : ";
strError += e.Description();
throw XException( strError );
}
}
int GuildManager::_getGuildMemberTagList( const int guild_id, std::vector< GuildManager::GuildMemberTag > & result )
{
std::vector< GuildManager::GuildMemberTag > *pvMemberTagList = NULL;
if( !m_hshGuildMemberTagList.lookup( guild_id, pvMemberTagList ) )
{
_cprint( "Guild info with no member detected: guild_id(%d)\n", guild_id );
FILELOG( "Guild info with no member detected: guild_id(%d)", guild_id );
return 0;
}
// 벡터를 복사함
// GuildMemberTag의 복사 생성자 호출이 벡터 길이만큼 이루어 짐
// 그!러!나! DB에 매번 Select 하는 짓거리보단 나음 -_ -;
result = *pvMemberTagList;
// 길드 리더 인덱스 찾기
int leader_index = 0;
for( std::vector< GuildManager::GuildMemberTag >::iterator it = pvMemberTagList->begin() ; it != pvMemberTagList->end() ; ++it, ++leader_index )
{
if( (*it).nPermission == PERMISSION_LEADER )
break;
}
if( leader_index == pvMemberTagList->size() ) // leader_sid에 해당하는 Character 데이터 없음
{
_cprint( "Guild info with no leader detected: guild_id(%d)\n", guild_id );
FILELOG( "Guild info with no leader detected: guild_id(%d)", guild_id );
leader_index = -1;
}
// 사용된 GuildMemberTag 리스트는 제거
m_hshGuildMemberTagList.erase( guild_id );
pvMemberTagList->clear();
delete pvMemberTagList;
return leader_index;
}
int GuildManager::getUserIndexInGuild( const int guild_id, const PlayerUID user_sid )
{
THREAD_SYNCRONIZE( m_IntfLock );
GuildInfo *pInfo = getGuildInfo( guild_id );
if( !pInfo ) return -1;
int nIndex = 0;
for( std::vector< GuildManager::GuildMemberTag >::iterator it = pInfo->vMemberNameList.begin() ; it != pInfo->vMemberNameList.end() ; ++it, ++nIndex )
{
if( (*it).sid == user_sid )
return nIndex;
}
return -1;
}
void GuildManager::loadGuildList()
{
#ifdef FRAUN_PERFORMANCE_LOG
DWORD dwTime = GetSafeTickCount();
#endif
_ConnectionPtr ConnPtr = NULL;
InitUserDbConnection( ConnPtr );
_RecordsetPtr pRstGuild = NULL;
IADORecordBinding *picRs = NULL; // Interface Pointer declared.
dbGuild emprs; // C++ Class object
pRstGuild.CreateInstance( __uuidof(Recordset) );
pRstGuild->Open("Guild",
_variant_t((IDispatch *)ConnPtr,true),
adOpenForwardOnly, adLockReadOnly, adCmdTable);
pRstGuild->QueryInterface( __uuidof(IADORecordBinding),(LPVOID*)&picRs );
picRs->BindToRecordset(&emprs);
int cnt = 0;
while( pRstGuild->State != adStateClosed && !pRstGuild->EndOfFile )
{
// 잘못된 길드 정보일 경우 수정을 위해 DB 업뎃이 필요한지를 나타내는 플래그
bool bNeedToUpdateGuildInfo = false;
// max 길드 ID 수정
if( m_nMaxGuildId < emprs.guild_sid )
m_nMaxGuildId = emprs.guild_sid;
char szGuildName[ 61 ];
char szGuildURL[ 128 ];
char szGuildNotice[ 256 ];
char szAdvertiseComment[ 256 ];
char szPermissionName[ GuildManager::PERMISSION_SET_TYPE_COUNT ][ 33 ];
int code_page = ENV().GetInt( "CodePage", CP_ACP );
WideCharToMultiByte( code_page, 0, emprs.szGuildName, -1, szGuildName, _countof( szGuildName ), NULL, NULL );
WideCharToMultiByte( code_page, 0, emprs.szGuildURL, -1, szGuildURL, _countof( szGuildURL ), NULL, NULL );
WideCharToMultiByte( code_page, 0, emprs.szGuildNotice, -1, szGuildNotice, _countof( szGuildName ), NULL, NULL );
WideCharToMultiByte( code_page, 0, emprs.szAdvertiseComment, -1, szAdvertiseComment, _countof( szAdvertiseComment ), NULL, NULL );
for( int i = 0 ; i < GuildManager::PERMISSION_SET_TYPE_COUNT ; ++i )
WideCharToMultiByte( code_page, 0, emprs.permission_name[ i ], -1, szPermissionName[ i ], _countof( szPermissionName[ i ] ), NULL, NULL );
struct tm tmAdvertiseEnd;
tmAdvertiseEnd.tm_year = emprs.tAdvertiseEnd.year - 1900;
tmAdvertiseEnd.tm_mon = emprs.tAdvertiseEnd.month - 1;
tmAdvertiseEnd.tm_mday = emprs.tAdvertiseEnd.day;
tmAdvertiseEnd.tm_hour = emprs.tAdvertiseEnd.hour;
tmAdvertiseEnd.tm_min = emprs.tAdvertiseEnd.minute;
tmAdvertiseEnd.tm_sec = emprs.tAdvertiseEnd.second;
tmAdvertiseEnd.tm_isdst = -1;
time_t tAdvertiseEnd = mktime( &tmAdvertiseEnd );
// 길드 생성
GuildInfo *pInfo = makeGuild( emprs.guild_sid, szGuildName, szGuildNotice, szGuildURL, emprs.szIconFileName, emprs.icon_size,
emprs.szBannerFileName, emprs.nBannerSize, static_cast< GuildManager::_ADVERTISE_TYPE >( emprs.nAdvertiseType ), szAdvertiseComment, tAdvertiseEnd,
emprs.bRecruiting, emprs.nMinRecruitLevel, emprs.nMaxRecruitLevel, emprs.name_changed,
emprs.dungeon_id, emprs.dungeon_block_time, emprs.gold, emprs.chaos, emprs.alliance_block_time, emprs.donation_point,
szPermissionName[ 0 ], emprs.permission_set[ 0 ], szPermissionName[ 1 ], emprs.permission_set[ 1 ],
szPermissionName[ 2 ], emprs.permission_set[ 2 ], szPermissionName[ 3 ], emprs.permission_set[ 3 ],
szPermissionName[ 4 ], emprs.permission_set[ 4 ], szPermissionName[ 5 ], emprs.permission_set[ 5 ],
emprs.grade, emprs.point );
if( pInfo == NULL )
{
FILELOG( "ERROR: makeGuild failed, GuildID: %d, GuildName: %s", emprs.guild_sid, szGuildName );
_cprint( "ERROR: makeGuild failed, GuildID: %d, GuildName: %s\n", emprs.guild_sid, szGuildName );
pRstGuild->MoveNext();
continue;
}
// 멤버 정보 얻어온다
int leader_index = _getGuildMemberTagList( emprs.guild_sid, pInfo->vMemberNameList );
// 길드원 없다면 길드 삭제
if( pInfo->vMemberNameList.empty() )
{
DestroyGuild( pInfo->nGuildId );
pRstGuild->MoveNext();
continue;
}
// 길마가 없는 길드는 첫 번째 멤버를 그냥 길마로 변경
if( leader_index == -1 )
{
leader_index = 0;
bNeedToUpdateGuildInfo = true;
}
pInfo->nLeaderSID = pInfo->vMemberNameList[ leader_index ].sid;
pInfo->nLeaderLevel = pInfo->vMemberNameList[ leader_index ].nLevel;
if( emprs.alliance_id )
{
AllianceInfo * pAllianceInfo = getAllianceInfo( emprs.alliance_id );
if( !pAllianceInfo )
{
Push( new DB_SetGuildAllianceID( emprs.guild_sid, 0 ) );
}
else
{
pAllianceInfo->vGuildList.push_back( pInfo );
}
pInfo->pAllianceInfo = pAllianceInfo;
}
if( bNeedToUpdateGuildInfo )
{
Push( new DB_SetGuildLeader( pInfo->nGuildId, pInfo->nLeaderSID ) );
}
pRstGuild->MoveNext();
cnt++;
}
for( std::vector< AllianceInfo * >::iterator it = m_vAllianceList.begin(); it != m_vAllianceList.end(); )
{
if( (*it)->vGuildList.size() == 0 )
{
Push( new DB_DeleteAllianceInfo( (*it)->nAllianceID ) );
delete (*it);
it = m_vAllianceList.erase( it );
continue;
}
bool bLeaderFound = false;
for( std::vector< GuildInfo * >::iterator itGuild = (*it)->vGuildList.begin(); itGuild != (*it)->vGuildList.end(); ++itGuild )
{
if( (*it)->nLeadGuildID == (*itGuild)->nGuildId )
{
bLeaderFound = true;
}
}
if( !bLeaderFound )
{
for( std::vector< GuildInfo * >::iterator itGuild = (*it)->vGuildList.begin(); itGuild != (*it)->vGuildList.end(); ++itGuild )
{
Push( new DB_SetGuildAllianceID( (*itGuild)->nGuildId, 0 ) );
(*itGuild)->pAllianceInfo = NULL;
}
Push( new DB_DeleteAllianceInfo( (*it)->nAllianceID ) );
delete (*it);
it = m_vAllianceList.erase( it );
}
++it;
}
picRs->Release();
pRstGuild->Close();
#ifdef FRAUN_PERFORMANCE_LOG
DWORD loadingTime = GetSafeTickCount() - dwTime;
_cprint("Total %d Guilds loaded; time taken: %d\n", cnt, loadingTime);
FILELOG("Total %d Guilds loaded; time taken: %d", cnt, loadingTime);
#else
_cprint( "Total %d Guilds loaded.\n", cnt );
FILELOG( "Total %d Guilds loaded.", cnt );
#endif
return;
}
void GuildManager::finishLoading()
{
// 로딩에 사용되는 GuildMemberTag 가 남아있으면 제거
KHash< std::vector< GuildMemberTag > *, hashPr_mod_int >::node *pValueNode = NULL;
bool bQuitFlag = m_hshGuildMemberTagList.get_first_node( pValueNode );
while( bQuitFlag )
{
_cprint( "Guild info does not exist: guild_id(%d)\n", pValueNode->key );
FILELOG( "Guild info does not exist: guild_id(%d)", pValueNode->key );
pValueNode->value->clear();
delete pValueNode->value;
bQuitFlag = m_hshGuildMemberTagList.get_next_node( pValueNode );
}
m_hshGuildMemberTagList.clear();
}