#include "stdafx.h" #include #include #include #include #define PRE_ADD_COMPARE_TABLE // bintitle. #include "DNTableFile.h" #include "MemPool.h" #include "DnItemCompounder.h" #include "SundriesFunc.h" using namespace std; struct SCell { int mainID; // 메인테이블에서의 ID. int enchantID; int enchatLevel; int id; // ItemID. string name; // 컬럼명. DNTableCell * pData; // 데이타. }; //typedef vector< vector< SCell > * > vNT; //vNT g_newTable; typedef std::map< int, vector< SCell > * > vNT; vNT g_newTable; enum E_TABLE { ENCHANTTABLE = 0, ENCHANTMAINTABLE = 1, ENCHANTMAXSTATETABLE = 2, ENCHANTNEEDITEMTABLE = 3, MAX }; int GetFiledNameIndex( vector< string > & vVector, const char * name ) { int resIndex = -1; int size = vVector.size(); for( int i=0; i vFileNames; //vFileNames.push_back("enchanttable"); //vFileNames.push_back("enchantmaintable"); //vFileNames.push_back("enchantmaxstatetable"); //vFileNames.push_back("enchantneeditemtable"); //// Tables. //std::vector< DNTableFileFormat * > vTables; //DNTableFileFormat * pTable = NULL; //// 테이블 생성. //for( int i=E_TABLE::ENCHANTTABLE; iLoad( ( vFileNames[ i ] + ".ext" ).c_str() ); // pTable->SetLoadName( vFileNames[ i ].c_str() ); // vTables.push_back( pTable ); //} // Before. printf("** Load [enchant]\n"); DNTableFileFormat * pTableBefore = new DNTableFileFormat; pTableBefore->Load( "out/enchanttable.dnt" ); pTableBefore->SetLoadName( "enchanttable.dnt" ); // Main Table. printf("** Load [enchantMain.dnt]\n"); DNTableFileFormat * pTableMain = new DNTableFileFormat; pTableMain->Load( "out/enchantmaintable.dnt" ); pTableMain->SetLoadName( "enchantmaintable.dnt" ); int sizeMain = pTableMain->GetItemCount(); int fieldCntMain = pTableMain->GetFieldCount(); // State. printf("** Load [enchantMaxState.dnt]\n"); DNTableFileFormat * pTableState = new DNTableFileFormat; pTableState->Load( "out/enchantmaxstatetable.dnt" ); pTableState->SetLoadName( "enchantmaxstatetable.dnt" ); // NeedItem. printf("** Load [enchantNeedItem.dnt]\n"); DNTableFileFormat * pTableNeedItem = new DNTableFileFormat; pTableNeedItem->Load( "out/enchantneeditemtable.dnt" ); pTableNeedItem->SetLoadName( "enchantneeditemtable.dnt" ); //// Main Table Data 컨테이너 설정. //g_newTable.reserve( sizeMain ); //for( int i=0; i * pVec = new vector< SCell >; // pVec->reserve( pTableBefore->GetFieldCount() ); // g_newTable.push_back( pVec ); //} //---------------------------------------------------------- // 나뉜 테이블을 하나로 취합. // DNTableCell * pTempCell = NULL; printf("\n** 데이타통합 [enchantMaxState--enchantMain--enchantNeedItem]\n"); for( int i=0; iGetItemID( i ); // 1행 데이터 벡터. //vector< SCell > * pVecRow = g_newTable[ i ]; vector< SCell > * pVecRow = new vector< SCell >; // 1행 채우기. for( int fidx=0; fidxGetFieldLabel( fidx ); SCell aCell; DNTableCell * pTableCell = pTableMain->GetFieldFromLablePtr( mainItemID, fieldNameMain ); DNTableCell * pTableCellEnchantID = pTableMain->GetFieldFromLablePtr( mainItemID, "_EnchantID" ); // EnchantID. DNTableCell * pTableCellEnchantLevel = pTableMain->GetFieldFromLablePtr( mainItemID, "_EnchantLevel" ); // EnchantLevel. //pTableMain->getfield aCell.mainID = mainItemID; aCell.enchantID = pTableCellEnchantID->GetInteger(); aCell.enchatLevel = pTableCellEnchantLevel->GetInteger(); //if( _stricmp( fieldNameMain, "_EnchantID" ) == 0 || // _stricmp( fieldNameMain, "_EnchantLevel" ) == 0 || // _stricmp( fieldNameMain, "_NeedCoin" ) == 0 || // _stricmp( fieldNameMain, "_DisjointDrop" ) == 0 ) // NeedItem Table. if( _stricmp( fieldNameMain, "_NeedItemTableID" ) == 0 ) { int itemID_Need = pTableCell->GetInteger(); for( int idxneedfield=0; idxneedfieldGetFieldCount(); ++idxneedfield ) { const char * pNeedFieldName = pTableNeedItem->GetFieldLabel( idxneedfield ); // NeedItemTable 에만 존재하는"_UpStateRatio" 컬럼은 제외. if( _stricmp( pNeedFieldName, "_UpStateRatio" ) != 0 ) { pTempCell = pTableNeedItem->GetFieldFromLablePtr( itemID_Need, pTableNeedItem->GetFieldLabel(idxneedfield) ); aCell.id = itemID_Need; aCell.name.assign( pNeedFieldName ); aCell.pData = pTempCell; // 행에 한셀 데이터 추가. pVecRow->push_back( aCell ); } } } // State Table. else if( _stricmp( fieldNameMain, "_StateID" ) == 0 ) { int itemID_State = pTableCell->GetInteger(); for( int idxstatefield=0; idxstatefieldGetFieldCount(); ++idxstatefield ) { const char * pStateFieldName = pTableState->GetFieldLabel( idxstatefield ); pTempCell = pTableState->GetFieldFromLablePtr( itemID_State, pStateFieldName ); aCell.id = itemID_State; aCell.name.assign( pStateFieldName ); aCell.pData = pTableState->GetFieldFromLablePtr( itemID_State, pStateFieldName ); // 행에 한셀 데이터 추가. pVecRow->push_back( aCell ); } } // 우선 [enchantMain] 과 [enchant] 의 비교는 제외. needcoin 과 disjointdrop 값이 서로 많이 다름. // Main Table. else { aCell.id = mainItemID; aCell.name.assign( fieldNameMain ); aCell.pData = pTableCell; // 행에 한셀 데이터 추가. pVecRow->push_back( aCell ); } } g_newTable.insert( vNT::value_type( mainItemID, pVecRow ) ); } // 필드명 등록. 데이타 타입구분용. vector< string > vFieldNames; vector< string >::iterator vFieldNameIt; int fieldCnt_Before = pTableBefore->GetFieldCount(); for( int i=0; iGetFieldLabel( i ) ) ); } //---------------------------------------------------------- // 기존테이블 데이타와 비교. // printf("\n** 데이타비교 [enchant] VS [enchat NeedItem--Main--MaxState]\n"); FILE * fpOut = fopen("out\\different.txt", "w"); fprintf( fpOut, "enchantmain:%d, enchant:%d\n\n", g_newTable.size(), pTableBefore->GetItemCount() ); int nDiffCnt = 0; for( int i=0; iGetItemID( i ); // Before Table. //vector< SCell > * pVecRow = g_newTable[ i ]; // newTableData vector. vNT::iterator it = g_newTable.find( itemID ); if( it == g_newTable.end() ) continue; vector< SCell > * pVecRow = (*it).second; DNTableCell * pCellBefore = NULL; for( int k=0; ksize(); ++k ) { SCell & aCell = pVecRow->at( k ); // Field Data Type. int idxField = GetFiledNameIndex( vFieldNames, aCell.name.c_str() ); if( idxField == -1 ) continue; CDNTableFile::FieldType::eCode cFldType = pTableBefore->m_nVecFieldType[ idxField ]; // 기존데이타. pCellBefore = pTableBefore->GetFieldFromLablePtr( itemID, aCell.name.c_str() ); // 둘다 NULL 인경우 무시. if( aCell.pData == NULL && pCellBefore == NULL ) continue; // NULL Data. if( aCell.pData == NULL && pCellBefore != NULL ) { //++nDiffCnt; switch( cFldType ) { case CDNTableFile::FieldType::eCode::STRING: // [NULL]-[] 무시. if( _stricmp( pCellBefore->GetString(), "0" ) != 0 ) { ++nDiffCnt; fprintf( fpOut, "MainID[%7d], EnchantID[%7d], Level[%2d], RefID[%7d] : Row:%6d, {%15s} [ %s ]-[ %s ]\n", aCell.mainID, aCell.enchantID, aCell.enchatLevel, aCell.id, i, aCell.name.c_str(), "NULL", pCellBefore->GetString()); } break; case CDNTableFile::FieldType::eCode::BOOL: case CDNTableFile::FieldType::eCode::NA: ++nDiffCnt; fprintf( fpOut, "MainID[%7d], EnchantID[%7d], Level[%2d], RefID[%7d] : Row:%6d, {%15s} [ %s ]-[ %d ]\n", aCell.mainID, aCell.enchantID, aCell.enchatLevel, aCell.id, i, aCell.name.c_str(), "NULL", pCellBefore->GetInteger()); break; case CDNTableFile::FieldType::eCode::INT: // NULL / 0 허용. if( pCellBefore->GetInteger() != 0 ) { ++nDiffCnt; fprintf( fpOut, "MainID[%7d], EnchantID[%7d], Level[%2d], RefID[%7d] : Row:%6d, {%15s} [ %s ]-[ %d ]\n", aCell.mainID, aCell.enchantID, aCell.enchatLevel, aCell.id, i, aCell.name.c_str(), "NULL", pCellBefore->GetInteger()); } break; case CDNTableFile::FieldType::eCode::PER: ++nDiffCnt; fprintf( fpOut, "MainID[%7d], EnchantID[%7d], Level[%2d], RefID[%7d] : Row:%6d, {%15s} [ %s ]-[ %.6f ]\n", aCell.mainID, aCell.enchantID, aCell.enchatLevel, aCell.id, i, aCell.name.c_str(), "NULL", pCellBefore->GetFloat()); break; case CDNTableFile::FieldType::eCode::FLOAT: // NULL / 0 허용. if( pCellBefore->GetFloat() != 0.0f ) { ++nDiffCnt; fprintf( fpOut, "MainID[%7d], EnchantID[%7d], Level[%2d], RefID[%7d] : Row:%6d, {%15s} [ %s ]-[ %.6f ]\n", aCell.mainID, aCell.enchantID, aCell.enchatLevel, aCell.id, i, aCell.name.c_str(), "NULL", pCellBefore->GetFloat()); } break; } } else { switch( cFldType ) { case CDNTableFile::FieldType::eCode::STRING: if( _stricmp( aCell.pData->GetString(), pCellBefore->GetString() ) != 0 ) { // []-[0] 무시. if( (strlen( aCell.pData->GetString() ) < 1) && (_stricmp( pCellBefore->GetString(), "0" ) == 0) ) continue; ++nDiffCnt; fprintf( fpOut, "MainID[%7d], EnchantID[%7d], Level[%2d], RefID[%7d] : Row:%6d, {%15s} [ %s ]-[ %s ]\n", aCell.mainID, aCell.enchantID, aCell.enchatLevel, aCell.id, i, aCell.name.c_str(), aCell.pData->GetString(), pCellBefore->GetString()); } break; case CDNTableFile::FieldType::eCode::BOOL: case CDNTableFile::FieldType::eCode::NA: if( aCell.pData->GetInteger() != pCellBefore->GetInteger() ) { ++nDiffCnt; fprintf( fpOut, "MainID[%7d], EnchantID[%7d], Level[%2d], RefID[%7d] : Row:%6d, {%15s} [ %d ]-[ %d ]\n", aCell.mainID, aCell.enchantID, aCell.enchatLevel, aCell.id, i, aCell.name.c_str(), aCell.pData->GetInteger(), pCellBefore->GetInteger()); } break; case CDNTableFile::FieldType::eCode::INT: { // 1의 오차 허용. int nValue = abs( aCell.pData->GetInteger() - pCellBefore->GetInteger() ); if( nValue > 1 ) //if( aCell.pData->GetInteger() != pCellBefore->GetInteger() ) { ++nDiffCnt; fprintf( fpOut, "MainID[%7d], EnchantID[%7d], Level[%2d], RefID[%7d] : Row:%6d, {%15s} [ %d ]-[ %d ]\n", aCell.mainID, aCell.enchantID, aCell.enchatLevel, aCell.id, i, aCell.name.c_str(), aCell.pData->GetInteger(), pCellBefore->GetInteger()); } } break; case CDNTableFile::FieldType::eCode::PER: case CDNTableFile::FieldType::eCode::FLOAT: int fValue = fabs( aCell.pData->GetFloat() - pCellBefore->GetFloat() ); // 1의 오차 허용. //if( aCell.pData->GetFloat() != pCellBefore->GetFloat() ) if( fValue > 1.0f ) { ++nDiffCnt; fprintf( fpOut, "MainID[%7d], EnchantID[%7d], Level[%2d], RefID[%7d] : Row:%6d, {%15s} [ %f ]-[ %.6f ]\n", aCell.mainID, aCell.enchantID, aCell.enchatLevel, aCell.id, i, aCell.name.c_str(), aCell.pData->GetFloat(), pCellBefore->GetFloat()); } break; } } } } fprintf( fpOut, "\n*** Different Count : %d", nDiffCnt); fclose( fpOut ); //------------- printf("** 총 %d 개 데이타 다름\n", nDiffCnt); //---------------------------------------------------------- // 출력용. //char * str[32]; //FILE * fp = fopen("out\\data.txt", "w"); //fprintf( fp, "Size : %d ", g_newTable.size() ); //// 컬럼명. //vector< SCell > * pVecRowTemp = g_newTable[ 0 ]; //for( int x=0; xsize(); ++x ) //{ // fprintf( fp, "%s ", pVecRowTemp->at(x).name.c_str() ); //} //for( int i=0; i * pVecRow = g_newTable[ i ]; // fprintf( fp, "%d : ", i); // for( int k=0; ksize(); ++k ) // { // SCell & aCell = pVecRow->at( k ); // if( aCell.pData == NULL ) // { // fprintf( fp, "NULL "); // continue; // } // int idxField = GetFiledNameIndex( vFieldNames, aCell.name.c_str() ); // if( idxField == -1 ) // continue; // char cFldType = (char)pTableBefore->m_nVecFieldType[ idxField ]; // // switch( cFldType ) { // case CSOXFile::FT_STRING: // fprintf( fp, "%s ", aCell.pData->GetString() ); // break; // case CSOXFile::FT_BOOL: // case CSOXFile::FT_NA: // case CSOXFile::FT_INT: // fprintf( fp, "%d ", aCell.pData->GetInteger() ); // break; // case CSOXFile::FT_PER: // case CSOXFile::FT_FLOAT: // fprintf( fp, "%f ", aCell.pData->GetFloat() ); // break; // } // } // fprintf( fp, "\n"); //} //fclose( fp ); //------------------------------------------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------------------------------------------ // g_newTable 제거. /*for( int i=0; iclear(); delete g_newTable[ i ]; }*/ vNT::iterator it = g_newTable.begin(); for( ; it != g_newTable.end(); it++ ) { (*it).second->clear(); delete (*it).second; } g_newTable.clear(); //// Table 제거. //for( int i=0; i