// MediaWebBilling.cpp : ÀÀ¿ë ÇÁ·Î±×·¥¿¡ ´ëÇÑ ÁøÀÔÁ¡À» Á¤ÀÇÇÕ´Ï´Ù. // #include "stdafx.h" #include "MediaWebBilling.h" #include #include #include #include #include #include #include #include #include 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); } inline std::string& addNumber(std::string& str, const char* szData) { const char* szWriteData = (0 == strlen(szData)) ? "NULL" : szData; str += szWriteData; str += ", "; return str; } inline std::string& addString(std::string& str, const char* szData) { if(0 == strlen(szData)) { str += "NULL, "; } else { str += "'"; str += szData; str += "', "; } return str; } #pragma pack(1) struct MWBillingData { DBCHAR m_CRMCode[16]; // PC¹æ CRMCode DBCHAR m_Command[16]; // ó¸® command DBCHAR m_CRMIP1[13]; // ¼­ºñ½ºip´ë¿ª1 DBCHAR m_CRMIP2[13]; // ¼­ºñ½ºip´ë¿ª2 DBCHAR m_CRMIP3[13]; // ¼­ºñ½ºip´ë¿ª3 DBCHAR m_Index[11]; // ÀÚµ¿Áõ°¡(SEQID) DBCHAR m_ServiceTime[11]; // Á¤·®Á¦½Ã°£ DBCHAR m_EndTime[11]; // ¼±½ÂÀÏ, º¸»ó ¿äû½Ã°£ DBCHAR m_ServiceIPNum[11]; // Á¤¾×Á¦±¸¸Åip°³¼ö DBCHAR m_SysDay[20]; // °áÀçÀÏ YYYY-MM-DD HH24:MI:SS DBCHAR m_ServiceDay[11]; // Á¤¾×Á¦¸¸·áÀÏ YYYY-MM-DD DBCHAR m_EndDay[11]; // ¼±½ÂÀÏ, º¸»ó ¸¸·áÀÏ YYYY-MM-DD DBCHAR m_CRMStartIP1[4]; // ¼­ºñ½ºip´ë¿ª½ÃÀÛ1 DBCHAR m_CRMStopIP1[4]; // ¼­ºñ½ºip´ë¿ª³¡1 DBCHAR m_CRMStartIP2[4]; // ¼­ºñ½ºip´ë¿ª½ÃÀÛ2 DBCHAR m_CRMStopIP2[4]; // ¼­ºñ½ºip´ë¿ª³¡2 DBCHAR m_CRMStartIP3[4]; // ¼­ºñ½ºip´ë¿ª½ÃÀÛ3 DBCHAR m_CRMStopIP3[4]; // ¼­ºñ½ºip´ë¿ª³¡3 DBCHAR m_TimeProcess[2]; // ÀÜ¿©ÀÏó¸® ¹æ¹ý (m = -ó¸®, z = ²÷À½) DBCHAR m_PriceType[2]; // Á¤¾×Á¦,Á¤·®Á¦ ¿©ºÎ (D Á¤¾×Á¦, T Á¤·®Á¦) }; struct RemainTimeLog { DBCHAR m_CRMCode[20]; DBCHAR m_IntServiceTime[11]; DBCHAR m_DelColumn[2]; }; #pragma pack() int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { CLog log; CConfigurator config; OleDB mwDB; OleDB billingDB; char szQuery[OleDB::MaxQueryTextLen]; int nQueryLen = 0; if(!log.RedirectStdOut("MediaWebBilling")) { return -1; } cout << endl << writetime << "Äõ¸®¸¦ ½ÇÇàÇÕ´Ï´Ù." << endl; TCHAR* tszConfigFileName = TEXT("MWBillingInfo.cfg"); if(!config.Load(tszConfigFileName)) { cout << writetime << tszConfigFileName << "DB¼³Á¤ ÆÄÀÏÀ» ÀÐÀ» ¼ö ¾ø½À´Ï´Ù." << endl; return -1; } const char* szMWServerName = config.Get("MWServerName"); const char* szMWDBName = config.Get("MWDBName"); const char* szMWUserName = config.Get("MWUserName"); const char* szMWPassword = config.Get("MWPassword"); if(!mwDB.ConnectSQLServer(szMWServerName, szMWDBName, szMWUserName, szMWPassword, OleDB::ConnType_ORACLE)) { cout << writetime << "¹Ìµð¾îÀ¥DB : Á¢¼ÓÇÒ ¼ö ¾ø½À´Ï´Ù. : " << mwDB.GetErrorString() << " ServerName : " << szMWServerName << " DBName : " << szMWDBName << " UserName : " << szMWUserName << " Password : " << szMWPassword << endl; return -1; } const char* szBillingServerName = config.Get("BillingServerName"); const char* szBillingDBName = config.Get("BillingDBName"); const char* szBillingUserName = config.Get("BillingUserName"); const char* szBillingPassword = config.Get("BillingPassword"); if(!billingDB.ConnectSQLServer(szBillingServerName, szBillingDBName, szBillingUserName, szBillingPassword, OleDB::ConnType_MSSQL)) { cout << writetime << "ºô¸µDB : Á¢¼ÓÇÒ ¼ö ¾ø½À´Ï´Ù. : " << billingDB.GetErrorString() << " ServerName : " << szBillingServerName << " DBName : " << szBillingDBName << " UserName : " << szBillingUserName << " Password : " << szBillingPassword << endl; return -1; } // 1. Å×À̺í Ŭ¸®¾î if(!billingDB.ExcuteQuery("EXEC agt_CRM_RYLLOG_Delete")) { cout << writetime << "ºô¸µDB : Àӽà Å×ÀÌºí »èÁ¦¿¡ ½ÇÆÐÇß½À´Ï´Ù : " << billingDB.GetErrorString() << endl; return -1; } // 2. ¹Ìµð¾îÀ¥(Oracle) ¿¡¼­ µ¥ÀÌÅÍ °¡Á®¿À±â int nMinNum = 0; if(!billingDB.ExcuteQueryGetData( "SELECT intCount FROM TblImportedNum WHERE strCompType = 'M'", &nMinNum)) { cout << writetime << "ºô¸µDB : ¸¶Áö¸·À¸·Î ó¸®µÈ µ¥ÀÌÅÍ °Ç¼ö ¹øÈ£¸¦ ¾ò¾î¿Ã ¼ö ¾ø½À´Ï´Ù : " << billingDB.GetErrorString() << endl; return -1; } nQueryLen = _snprintf(szQuery, OleDB::MaxQueryTextLen, "SELECT " " CAST(crmcode AS VARCHAR(16)), " " CAST(command AS VARCHAR(16)), " " CAST(crmip1 AS VARCHAR(13)), " " CAST(crmip2 AS VARCHAR(13)), " " CAST(crmip3 AS VARCHAR(13)), " " CAST(seqid AS VARCHAR(11)), " " CAST(servicetime AS VARCHAR(11)), " " CAST(endtime AS VARCHAR(11)), " " CAST(serviceipnum AS VARCHAR(11)), " " TO_CHAR(regdate, 'YYYY-MM-DD HH24:MI:SS '), " " TO_CHAR(serviceday, 'YYYY-MM-DD '), " " TO_CHAR(endday, 'YYYY-MM-DD '), " " CAST(startcrmip1 AS VARCHAR(4)), " " CAST(endcrmip1 AS VARCHAR(4)), " " CAST(startcrmip2 AS VARCHAR(4)), " " CAST(endcrmip2 AS VARCHAR(4)), " " CAST(startcrmip3 AS VARCHAR(4)), " " CAST(endcrmip3 AS VARCHAR(4)), " " CAST(timeprocess AS VARCHAR(2)), " " CAST(pricetype AS VARCHAR(2)) " " FROM CRM.CRM_RYLLOG WHERE SEQID > %d AND RYLCHK = 'N' ORDER BY SEQID ASC", nMinNum); if(nQueryLen < 0) { cout << writetime << "¹Ìµð¾îÀ¥DB : ºô¸µ µ¥ÀÌÅ͸¦ ¾ò¾î¿À´Â Äõ¸®¸¦ ¸¸µé ¼ö ¾ø½À´Ï´Ù." << endl; return -1; } if(!mwDB.ExcuteQuery(szQuery)) { cout << writetime << "¹Ìµð¾îÀ¥DB : ºô¸µ Á¤º¸¸¦ ¾ò¾î¿Ã ¼ö ¾ø½À´Ï´Ù : " << mwDB.GetErrorString() << " Query : " << szQuery << endl; return -1; } typedef std::vector BillingDataArray; BillingDataArray mwBillingArray; mwBillingArray.reserve(5000); const int MAX_DATA = 1000; MWBillingData mwBillingData[MAX_DATA]; memset(mwBillingData, 0, sizeof(MWBillingData) * MAX_DATA); int nReturnRow = 0; while(mwDB.GetData((void**)&mwBillingData, sizeof(MWBillingData), MAX_DATA, &nReturnRow)) { if(0 == nReturnRow) { break; } mwBillingArray.insert(mwBillingArray.end(), mwBillingData, mwBillingData + nReturnRow); memset(mwBillingData, 0, sizeof(MWBillingData) * MAX_DATA); } // BillNum, MemberID, RylUID, BillingType, EndTime, GameMin const char* szInsertQuery = "INSERT INTO TblCRM_RYLLOG " " (intIndex, strCRMCode, strPriceType, dateSysDay, strCommand, " " strCRMIP1,strStartCRMIP1,strEndCRMIP1, " " strCRMIP2,strStartCRMIP2,strEndCRMIP2, " " strCRMIP3,strStartCRMIP3,strEndCRMIP3, " " strTimeprocess, intServiceTime, dateServiceDay, " " TinyServiceIPNum, dateEndday, intEndTime, strRylChk) values ( "; BillingDataArray::iterator pos = mwBillingArray.begin(); BillingDataArray::iterator end = mwBillingArray.end(); std::string strQuery; strQuery.reserve(OleDB::MaxQueryTextLen); for(; pos != end; ++pos) { MWBillingData& data = *pos; strQuery.assign(szInsertQuery); addNumber(strQuery, data.m_Index); addString(strQuery, data.m_CRMCode); addString(strQuery, data.m_PriceType); addString(strQuery, data.m_SysDay); addString(strQuery, data.m_Command); addString(strQuery, data.m_CRMIP1); addNumber(strQuery, data.m_CRMStartIP1); addNumber(strQuery, data.m_CRMStopIP1); addString(strQuery, data.m_CRMIP2); addNumber(strQuery, data.m_CRMStartIP2); addNumber(strQuery, data.m_CRMStopIP2); addString(strQuery, data.m_CRMIP3); addNumber(strQuery, data.m_CRMStartIP3); addNumber(strQuery, data.m_CRMStopIP3); addString(strQuery, data.m_TimeProcess); addNumber(strQuery, data.m_ServiceTime); addString(strQuery, data.m_ServiceDay); addNumber(strQuery, data.m_ServiceIPNum); addString(strQuery, data.m_EndDay); addNumber(strQuery, data.m_EndTime); strQuery += " 'N')"; if(!billingDB.ExcuteQuery(strQuery.c_str(), OleDB::Rowset_Update)) { cout << writetime << "ºô¸µDB : ¹Ìµð¾îÀ¥¿¡¼­ °¡Á®¿Â µ¥ÀÌÅ͸¦ ±â·ÏÇÒ ¼ö ¾ø½À´Ï´Ù. : " << billingDB.GetErrorString() << " ÇöÀç SEQIndex : " << data.m_Index << " Query : " << strQuery << endl; return -1; } } int nMaxNum = 0; if(!billingDB.ExcuteQueryGetData( "SELECT MAX(intIndex) FROM TblCRM_RYLLOG WHERE strRYLCHK = 'N' AND strConvertCHK ='N'", &nMaxNum)) { cout << writetime << "ºô¸µDB : ¹Ìµð¾îÀ¥¿¡¼­ °¡Á®¿Â µ¥ÀÌÅÍ °Ç¼ö ÃÖ´ë ¹øÈ£¸¦ ¾ò¾î¿Ã ¼ö ¾ø½À´Ï´Ù : " << billingDB.GetErrorString() << endl; return -1; } if(0 < nMaxNum) { nQueryLen = _snprintf(szQuery, OleDB::MaxQueryTextLen, "UPDATE CRM.CRM_RYLLOG SET RYLCHK = 'Y'" "WHERE SEQID > %d AND SEQID <= %d AND RYLCHK = 'N'", nMinNum, nMaxNum); if(nQueryLen < 0) { cout << writetime << "¹Ìµð¾îÀ¥DB : °ú±Ý ó¸® ¾÷µ¥ÀÌÆ® ½ÇÆÐ - Äõ¸® »ý¼º ½ÇÆÐ" << endl; return -1; } if(!mwDB.ExcuteQuery(szQuery, OleDB::Rowset_Update)) { cout << writetime << "¹Ìµð¾îÀ¥DB : °ú±Ý ó¸® ¾÷µ¥ÀÌÆ® ½ÇÆÐ - Äõ¸® ½ÇÆÐ : " << mwDB.GetErrorString() << " Query : " << szQuery << endl; return -1; } nQueryLen = _snprintf(szQuery, OleDB::MaxQueryTextLen, "UPDATE TblImportedNum SET intCount = %d WHERE strCompType = 'M'", nMaxNum); if(nQueryLen < 0) { cout << writetime << "ºô¸µDB : °ú±Ý ó¸® ¾÷µ¥ÀÌÆ® ½ÇÆÐ - Äõ¸® »ý¼º ½ÇÆÐ " << " MinBillingNum : " << nMinNum << " MaxBillingNum : " << nMaxNum << " Query : " << szQuery << endl; return -1; } if(!billingDB.ExcuteQuery(szQuery, OleDB::Rowset_Update)) { cout << writetime << "ºô¸µDB : °ú±Ý ó¸® ¾÷µ¥ÀÌÆ® ½ÇÆÐ - Äõ¸® ½ÇÆÐ : " << billingDB.GetErrorString() << " MinBillingNum : " << nMinNum << " MaxBillingNum : " << nMaxNum << " Query : " << szQuery << endl; return -1; } } // 3. µ¥ÀÌÅÍ Ã³¸® if(!billingDB.ExcuteQuery("EXEC agt_CRM_RYLLOG_EXECUTE")) { cout << writetime << "ºô¸µDB : agt_CRM_RYLLOG_EXECUTEÀ» ½ÇÆÐÇß½À´Ï´Ù. : " << billingDB.GetErrorString() << " MinBillingNum : " << nMinNum << " MaxBillingNum : " << nMaxNum << endl; // ºüÁ®³ª°¡Áö ¾Ê´Â´Ù. µ¥ÀÌÅÍ ¿À·ù°¡ ÀÖÀ¸¸é ¿¡·¯°¡ ³¯ ¼ö ÀÖ´Ù. // return -1; } // 4. ³²Àº ¼­ºñ½º ŸÀÓ °è»ê if(!billingDB.ExcuteQuery("EXEC agt_CRM_RemainServiceTime")) { cout << writetime << "ºô¸µDB : agt_CRM_RemainServiceTimeÀ» ½ÇÆÐÇß½À´Ï´Ù. : " << billingDB.GetErrorString() << " MinBillingNum : " << nMinNum << " MaxBillingNum : " << nMaxNum << endl; return -1; } // 5. ÀÜ¿©½Ã°£ ³Ñ°ÜÁÖ±â agt_CRM_RemainServiceTime_Transfer if(!billingDB.ExcuteQuery( "SELECT strCRMCode, " " CAST(MIN(intServiceTime) AS VARCHAR(11)), " " CAST(delColumn AS VARCHAR(2)) " " FROM TblCRM_SERVICETIME WHERE WebCHK = 'N' " " GROUP BY strCRMCode,delColumn")) { cout << writetime << "ºô¸µDB : ÀÜ¿©½Ã°£À» ¾ò¾î¿À´Â µ¥ ½ÇÆÐÇß½À´Ï´Ù. : " << billingDB.GetErrorString() << " MinBillingNum : " << nMinNum << " MaxBillingNum : " << nMaxNum << endl; return -1; } typedef std::vector RemainTimeLogArray; RemainTimeLogArray remainTimeLogArray; remainTimeLogArray.reserve(10000); const int MAX_REMAIN_TIME_DATA = 1000; RemainTimeLog remainTimes[MAX_REMAIN_TIME_DATA]; memset(remainTimes, 0, sizeof(RemainTimeLog) * MAX_REMAIN_TIME_DATA); int nGetRemainTimesNum = 0; while(billingDB.GetData((void**)&remainTimes, sizeof(RemainTimeLog), MAX_REMAIN_TIME_DATA, &nGetRemainTimesNum)) { if(0 == nGetRemainTimesNum) { break; } remainTimeLogArray.insert(remainTimeLogArray.end(), remainTimes, remainTimes + nGetRemainTimesNum); memset(remainTimes, 0, sizeof(RemainTimeLog) * MAX_REMAIN_TIME_DATA); } if(!billingDB.ExcuteQuery("UPDATE TblCRM_SERVICETIME SET WebCHK = 'Y' WHERE WebCHK ='N'", OleDB::Rowset_Update)) { cout << writetime << "ºô¸µDB : WebCHK¸¦ Y·Î ¼³Á¤ÇÏ´Â µ¥ ½ÇÆÐÇß½À´Ï´Ù. : " << billingDB.GetErrorString() << " MinBillingNum : " << nMinNum << " MaxBillingNum : " << nMaxNum << endl; return -1; } RemainTimeLogArray::iterator rtpos = remainTimeLogArray.begin(); RemainTimeLogArray::iterator rtend = remainTimeLogArray.end(); for(; rtpos != rtend; ++rtpos) { RemainTimeLog& data = *rtpos; char szCRMCode[20]; memset(szCRMCode, 0, sizeof(char) * 20); strQuery = "SELECT CRMCODE FROM GAME.CRM_SERVICETIME WHERE CRMCODE = '"; strQuery += data.m_CRMCode; strQuery += "' AND GAMECODE ='002' "; if(!mwDB.ExcuteQuery(strQuery.c_str())) { cout << writetime << "¹Ìµð¾îÀ¥DB : CRMCODE°Ë»ö¿¡ ½ÇÆÐÇß½À´Ï´Ù. : " << mwDB.GetErrorString() << " MinBillingNum : " << nMinNum << " MaxBillingNum : " << nMaxNum << " Query : " << strQuery << endl; return -1; } mwDB.GetData(szCRMCode); if(0 != strlen(szCRMCode)) { strQuery = "UPDATE GAME.CRM_SERVICETIME SET SERVICETIME = "; strQuery += data.m_IntServiceTime; strQuery += ",DELCHK = '"; strQuery += data.m_DelColumn; strQuery += "' WHERE CRMCODE = '"; strQuery += data.m_CRMCode; strQuery += "' AND GAMECODE ='002'"; if(!mwDB.ExcuteQuery(strQuery.c_str(), OleDB::Rowset_Update)) { cout << writetime << "¹Ìµð¾îÀ¥DB : ServiceTime Update¿¡ ½ÇÆÐÇß½À´Ï´Ù. : " << mwDB.GetErrorString() << " MinBillingNum : " << nMinNum << " MaxBillingNum : " << nMaxNum << " Query : " << strQuery << endl; return -1; } } else { strQuery = "INSERT INTO GAME.CRM_SERVICETIME (CRMCODE,GAMECODE,SERVICETIME,DELCHK) VALUES ('"; strQuery += data.m_CRMCode; strQuery += "','002',"; strQuery += data.m_IntServiceTime; strQuery += ", '"; strQuery += data.m_DelColumn; strQuery += "') "; if(!mwDB.ExcuteQuery(strQuery.c_str(), OleDB::Rowset_Update)) { cout << writetime << "¹Ìµð¾îÀ¥DB : ServiceTime Insert¿¡ ½ÇÆÐÇß½À´Ï´Ù. : " << mwDB.GetErrorString() << " MinBillingNum : " << nMinNum << " MaxBillingNum : " << nMaxNum << " Query : " << strQuery << endl; return -1; } } } // 6. ÀÜ¿©½Ã°£ ·Î±×³²±â±â if(!billingDB.ExcuteQuery("EXEC agt_CRM_RemainServiceTime_LOG")) { cout << writetime << "ºô¸µDB : agt_CRM_RemainServiceTime_LOG¸¦ ½ÇÆÐÇß½À´Ï´Ù. : " << billingDB.GetErrorString() << " MinBillingNum : " << nMinNum << " MaxBillingNum : " << nMaxNum << endl; return -1; } cout << writetime << "Äõ¸® ½ÇÇà ¿Ï·á." << endl; return 0; }