// GetGameCharacterData.cpp : ÀÀ¿ë ÇÁ·Î±×·¥¿¡ ´ëÇÑ ÁøÀÔÁ¡À» Á¤ÀÇÇÕ´Ï´Ù. // #include "stdafx.h" #include #include #include #include #include #include #include #pragma pack(1) struct CharacterData { int CID; int Class; int Level; char CreateTime[20]; char UpdateTime[20]; }; #pragma pack() using namespace std; template inline basic_ostream<_Elem, _Traits>& __cdecl writetime(basic_ostream<_Elem, _Traits>& _Ostr) { SYSTEMTIME systime; GetLocalTime(&systime); _Elem fill = _Ostr.fill(); _Ostr << setfill('0') << "[" << setw(4) << systime.wYear << "-" << setw(2) << systime.wMonth << "-" << setw(2) << systime.wDay << " " << setw(2) << systime.wHour << ":" << setw(2) << systime.wMinute << ":" << setw(2) << systime.wSecond << "] " << setfill(fill); return (_Ostr); } bool LoadLastProcessedTime(const char* szFileName, __time64_t* lpLastProcessedTime) { FILE* file = fopen(szFileName, "rb"); if(0 != file) { if(0 != lpLastProcessedTime) { tm tmLastProcessedTime; memset(&tmLastProcessedTime, 0, sizeof(tm)); fscanf(file, "%04d-%02d-%02d %02d:%02d:%02d", &tmLastProcessedTime.tm_year, &tmLastProcessedTime.tm_mon, &tmLastProcessedTime.tm_mday, &tmLastProcessedTime.tm_hour, &tmLastProcessedTime.tm_min, &tmLastProcessedTime.tm_sec); tmLastProcessedTime.tm_year -= 1900; tmLastProcessedTime.tm_mon -= 1; *lpLastProcessedTime = _mktime64(&tmLastProcessedTime); fclose(file); return true; } fclose(file); } return false; } bool SaveLastProcessedTime(const char* szFileName, __time64_t LastProcessedTime) { FILE* file = fopen(szFileName, "wt"); if(0 != file) { tm tmLastProcessedTime = *_localtime64(&LastProcessedTime); fprintf(file, "%04d-%02d-%02d %02d:%02d:%02d", tmLastProcessedTime.tm_year + 1900, tmLastProcessedTime.tm_mon + 1, tmLastProcessedTime.tm_mday, tmLastProcessedTime.tm_hour, tmLastProcessedTime.tm_min, tmLastProcessedTime.tm_sec); fclose(file); return true; } return false; } int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { CLog log; CConfigurator config; OleDB gameDB; OleDB gamaDB; char szSelectQuery[OleDB::MaxQueryTextLen]; char szInserQuery[OleDB::MaxQueryTextLen]; int nQueryLen = 0; if(!log.RedirectStdOut("GetCharacterDataLog")) { return -1; } cout << endl << writetime << "Äõ¸®¸¦ ½ÇÇàÇÕ´Ï´Ù." << endl; TCHAR* tszConfigFileName = TEXT("CharacterData.cfg"); if(!config.Load(tszConfigFileName)) { cout << writetime << tszConfigFileName << "DB¼³Á¤ ÆÄÀÏÀ» ÀÐÀ» ¼ö ¾ø½À´Ï´Ù." << endl; return -1; } const char* szTimeFileName = "GetCharacterDataTime.txt"; unsigned long dwServerID = atoi(config.Get("GameServerID")); const char* szGameServerName = config.Get("GameServerName"); const char* szGameDBName = config.Get("GameDBName"); const char* szGameUserName = config.Get("GameUserName"); const char* szGamePassword = config.Get("GamePassword"); if(!gameDB.ConnectSQLServer(szGameServerName, szGameDBName, szGameUserName, szGamePassword, OleDB::ConnType_MSSQL)) { cout << writetime << "°ÔÀÓDB : Á¢¼ÓÇÒ ¼ö ¾ø½À´Ï´Ù. : " << gameDB.GetErrorString() << " ServerName : " << szGameServerName << " DBName : " << szGameDBName << " UserName : " << szGameUserName << " Password : " << szGamePassword << endl; return -1; } const char* szGamaServerName = config.Get("GamaServerName"); const char* szGamaDBName = config.Get("GamaDBName"); const char* szGamaUserName = config.Get("GamaUserName"); const char* szGamaPassword = config.Get("GamaPassword"); if(!gamaDB.ConnectSQLServer(szGamaServerName, szGamaDBName, szGamaUserName, szGamaPassword, OleDB::ConnType_MSSQL)) { cout << writetime << "°¡¸¶DB : Á¢¼ÓÇÒ ¼ö ¾ø½À´Ï´Ù. : " << gamaDB.GetErrorString() << " ServerName : " << szGamaServerName << " DBName : " << szGamaDBName << " UserName : " << szGamaUserName << " Password : " << szGamaPassword << endl; return -1; } __time64_t lastTime = 0; if(!LoadLastProcessedTime(szTimeFileName, &lastTime)) { cout << writetime << szTimeFileName << "½Ã°£ ¼³Á¤ ÆÄÀÏÀ» ÀÐÀ» ¼ö ¾ø½À´Ï´Ù." << endl; return -1; } __time64_t currentTime = _time64(0); tm tmLastTime = *_localtime64(&lastTime); tm tmCurrentTime = *_localtime64(¤tTime); _snprintf(szSelectQuery, OleDB::MaxQueryTextLen - 1, "SELECT " "CAST(CID AS INT), " "CAST(Class AS INT), " "CAST(Level AS INT), " "CONVERT(varchar(20), CreateTime, 20), " "CONVERT(varchar(20), UpdateTime, 20) " "FROM CharInfo A " "JOIN (SELECT CID,CreateTime,UpdateTime FROM CharInfo_Time WHERE UpdateTime >= '%04d-%02d-%02d %02d:%02d:%02d') B ON A.UID = B.CID", tmLastTime.tm_year + 1900, tmLastTime.tm_mon + 1, tmLastTime.tm_mday, tmLastTime.tm_hour, tmLastTime.tm_min, tmLastTime.tm_sec); szSelectQuery[OleDB::MaxQueryTextLen - 1] = 0; if(!gameDB.ExcuteQuery(szSelectQuery)) { cout << writetime << "°ÔÀÓDB : ij¸¯ÅÍ µ¥ÀÌÅÍ °¡Á®¿À±â ½ÇÆÐ" << gameDB.GetErrorString() << endl; return -1; } typedef std::list > InsertList; InsertList insertList; const int MAX_DATA = OleDB::MaxRowNum; CharacterData* lpCharacterData = new CharacterData[MAX_DATA]; int nReturnRow = 0; int nTotalRow = 0; while(gameDB.GetData((void**)lpCharacterData, sizeof(CharacterData), MAX_DATA, &nReturnRow)) { if(0 == nReturnRow) { if(0 != lpCharacterData) { delete [] lpCharacterData; lpCharacterData = 0; } break; } nTotalRow += nReturnRow; insertList.push_back(std::make_pair(nReturnRow, lpCharacterData)); lpCharacterData = new CharacterData[MAX_DATA]; } int nTotal_InsertRow = 0; InsertList::iterator pos = insertList.begin(); InsertList::iterator end = insertList.end(); for(;pos != end; ++pos) { CharacterData* lpCharacterData = pos->second; CharacterData* lpCharacterDataEnd = lpCharacterData + pos->first; for(; lpCharacterData != lpCharacterDataEnd; ++lpCharacterData) { _snprintf(szInserQuery, OleDB::MaxQueryTextLen - 1, "Statics_InsertCharData %d, %d, %d, %d, '%s', '%s'", dwServerID, lpCharacterData->CID, lpCharacterData->Class, lpCharacterData->Level, lpCharacterData->CreateTime, lpCharacterData->UpdateTime); szInserQuery[OleDB::MaxQueryTextLen - 1] = 0; if(!gamaDB.ExcuteQuery(szInserQuery)) { cout << writetime << "°¡¸¶DB : °ÔÀÓDB¿¡¼­ ¾ò¾î¿Â µ¥ÀÌÅ͸¦ ¼¼ÆÃÇÒ ¼ö ¾ø½À´Ï´Ù. : " << gamaDB.GetErrorString() << " " << szInserQuery; } else { ++nTotal_InsertRow; } } delete [] pos->second; } if(!SaveLastProcessedTime(szTimeFileName, currentTime)) { cout << writetime << szTimeFileName << "½Ã°£ ¼³Á¤ ÆÄÀÏ¿¡ ÀúÀåÇÒ ¼ö ¾ø½À´Ï´Ù." << endl; return -1; } if(nTotal_InsertRow != nTotalRow) { cout << writetime << "»ðÀÔ °Ç¼ö : " << nTotal_InsertRow << " ÀÐÀº °Ç¼ö : " << nTotalRow << endl; } cout << writetime << "Äõ¸® : " << szSelectQuery << "½ÇÇà¿¡ ¼º°øÇß½À´Ï´Ù. ó¸® °Ç¼ö : " << nTotalRow << endl; return 0; }