// GetHanBillingLogData.cpp : ÀÀ¿ë ÇÁ·Î±×·¥¿¡ ´ëÇÑ ÁøÀÔÁ¡À» Á¤ÀÇÇÕ´Ï´Ù. // #include "stdafx.h" #include #include #include #include #include #include #include #pragma pack(1) struct BillingLogData { char strClientID[20]; int UID; int intCRMIndex; char strIP[15]; char strBillingType[2]; int tinyServerID; char firstLoginTime[20]; char loginTime[20]; char logoutTime[20]; int intPlayTime; }; #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 _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { CLog log; CConfigurator config; OleDB hanDB; OleDB gamaDB; char szQuery[OleDB::MaxQueryTextLen]; int nQueryLen = 0; if(!log.RedirectStdOut("GetHanBillingLogData_Log")) { return -1; } cout << endl << writetime << "Äõ¸®¸¦ ½ÇÇàÇÕ´Ï´Ù." << endl; TCHAR* tszConfigFileName = TEXT("BillingLogData.cfg"); if(!config.Load(tszConfigFileName)) { cout << writetime << tszConfigFileName << "DB¼³Á¤ ÆÄÀÏÀ» ÀÐÀ» ¼ö ¾ø½À´Ï´Ù." << endl; return -1; } const char* szTimeFileName = "GetHanBillingLogDataTime.txt"; const char* szHanServerName = config.Get("HanServerName"); const char* szHanDBName = config.Get("HanDBName"); const char* szHanUserName = config.Get("HanUserName"); const char* szHanPassword = config.Get("HanPassword"); if(!hanDB.ConnectSQLServer(szHanServerName, szHanDBName, szHanUserName, szHanPassword, OleDB::ConnType_MSSQL)) { cout << writetime << "ÇѰÔÀÓDB : Á¢¼ÓÇÒ ¼ö ¾ø½À´Ï´Ù. : " << hanDB.GetErrorString() << " ServerName : " << szHanServerName << " DBName : " << szHanDBName << " UserName : " << szHanUserName << " Password : " << szHanPassword << 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(szQuery, OleDB::MaxQueryTextLen - 1, "select " "strClientID, " "UID, " "intCRMIndex, " "strIp, " "CAST(strBillingType AS VARCHAR(2)), " "CAST(tinyServerID AS INT), " "CONVERT(varchar(20), FirstLoginTime, 20), " "CONVERT(varchar(20), LoginTime, 20), " "CONVERT(varchar(20), LogoutTime, 20), " "intPlayTime " "from tblcurrentuser_log where firstlogintime >='%04d-%02d-%02d %02d:%02d:%02d' " "and firstlogintime < '%04d-%02d-%02d %02d:%02d:%02d'", tmLastTime.tm_year + 1900, tmLastTime.tm_mon + 1, tmLastTime.tm_mday, tmLastTime.tm_hour, tmLastTime.tm_min, tmLastTime.tm_sec, tmCurrentTime.tm_year + 1900, tmCurrentTime.tm_mon + 1, tmCurrentTime.tm_mday, tmCurrentTime.tm_hour, tmCurrentTime.tm_min, tmCurrentTime.tm_sec); szQuery[OleDB::MaxQueryTextLen - 1] = 0; if(!hanDB.ExcuteQuery(szQuery)) { cout << writetime << "ÇѰÔÀÓDB : °ú±Ý ·Î±× °¡Á®¿À±â ½ÇÆÐ" << hanDB.GetErrorString() << endl; return -1; } typedef std::list > InsertList; InsertList insertList; const int MAX_DATA = OleDB::MaxRowNum; BillingLogData* lpBillingLogData = new BillingLogData[MAX_DATA]; int nReturnRow = 0; int nTotalRow = 0; while(hanDB.GetData((void**)lpBillingLogData, sizeof(BillingLogData), MAX_DATA, &nReturnRow)) { if(0 == nReturnRow) { if(0 != lpBillingLogData) { delete [] lpBillingLogData; lpBillingLogData = 0; } break; } nTotalRow += nReturnRow; insertList.push_back(std::make_pair(nReturnRow, lpBillingLogData)); lpBillingLogData = new BillingLogData[MAX_DATA]; } InsertList::iterator pos = insertList.begin(); InsertList::iterator end = insertList.end(); int nInsertRow = 0; for(;pos != end; ++pos) { BillingLogData* lpBillingLogData = pos->second; BillingLogData* lpBillingLogDataEnd = lpBillingLogData + pos->first; for(; lpBillingLogData != lpBillingLogDataEnd; ++lpBillingLogData) { _snprintf(szQuery, OleDB::MaxQueryTextLen - 1, "INSERT INTO Tblcurrentuser_log values ('%s', %d, %d, '%s', '%c', %d, '%s', '%s', '%s', %d)", lpBillingLogData->strClientID, lpBillingLogData->UID, lpBillingLogData->intCRMIndex, lpBillingLogData->strIP, lpBillingLogData->strBillingType[0], lpBillingLogData->tinyServerID, lpBillingLogData->firstLoginTime, lpBillingLogData->loginTime, lpBillingLogData->logoutTime, lpBillingLogData->intPlayTime); szQuery[OleDB::MaxQueryTextLen - 1] = 0; if(!gamaDB.ExcuteQuery(szQuery, OleDB::Rowset_Update)) { cout << writetime << "°¡¸¶DB : ÇѰÔÀÓ¿¡¼­ ¾ò¾î¿Â µ¥ÀÌÅ͸¦ ¼¼ÆÃÇÒ ¼ö ¾ø½À´Ï´Ù. : " << gamaDB.GetErrorString() << " " << szQuery; } else { ++nInsertRow; } } delete [] pos->second; } if(!SaveLastProcessedTime(szTimeFileName, currentTime)) { cout << writetime << szTimeFileName << "½Ã°£ ¼³Á¤ ÆÄÀÏ¿¡ ÀúÀåÇÒ ¼ö ¾ø½À´Ï´Ù." << endl; return -1; } if(nInsertRow != nTotalRow) { cout << writetime << "»ðÀÔ °Ç¼ö : " << nInsertRow << " Àоî¿Â °Ç¼ö : " << nTotalRow << endl; } cout << writetime << "Äõ¸® ½ÇÇà¿¡ ¼º°øÇß½À´Ï´Ù. : ó¸® °Ç¼ö : " << nTotalRow << endl; return 0; }