/*************************************************************************** Validation ----------------------------------------- begin : 2012/05/14 copyright : (C) 2011 SolutionBox Inc. author : Service 1 Team email : svc1@solbox.com version : 3.1.0 CopyRight(C) 2011 SolutionBox Inc. All Rights reserved. Redistribution and use in source and binary forms, with or with out modification, are not permitted in outside of SolutionBox Inc. ***************************************************************************/ #include "rc_cmove.h" #include "parameter.h" #include "validation.h" #include "Database.h" #include "dbconnpool.h" #include "Logger.h" #include "ReportLog.h" #define RECHK_TIMEOUT (24*60*60 * 1000000LL) // 1 day static int64_t convert(string &s) { if (s.size() == 0) return 0; int64_t v = 0; size_t i = 0; char sign = (s[0] == '-' || s[0] == '+') ? (++i, s[0]) : '+'; for (; i < s.size(); ++i) { if (s[i] < '0' || s[i] > '9') return 0; v = v * 10 + s[i] - '0'; } return sign == '-' ? -v : v; } CValidation::CValidation(JOB_TYPE::JOB_TYPE type, vector & input) : m_type(type), m_syncdata(input), m_first(true) { } CValidation::~CValidation() { } DataBase* CValidation::GetDB(string & tblname, bool & usedisplay) { ostringstream msg; string s = m_syncdata[SYNCFILE_FIELD::slave_tran_id]; if (s.empty()) { msg << "Service information empty."; LOGACERR(LERR, msg); return NULL; } DataBase* db = masterdbpool::getInstance()->GetConnFromPool(); tblname = masterdbpool::getInstance()->GetMetaTableName(s.c_str()); usedisplay = masterdbpool::getInstance()->UseDisplayname(); if (db == NULL) { msg << "DB POOL doesn't assign a database.."; LOGACERR(LERR, msg); return NULL; } return db; } void CValidation::FreeDB(DataBase *db, bool success/* = true*/) { if (db) { masterdbpool::getInstance()->ReleaseConnToPool(db, success); db = NULL; } } vector CValidation::Current2Sync(string sflag, vector& curr) { vector r(SYNCFILE_FIELD::MAX_FILED); r[SYNCFILE_FIELD::flag] = sflag; r[SYNCFILE_FIELD::uri] = curr[CURRENT_FIELD::uri]; r[SYNCFILE_FIELD::filename_hash] = curr[CURRENT_FIELD::filename_hash]; r[SYNCFILE_FIELD::resource_type] = curr[CURRENT_FIELD::resource_type]; r[SYNCFILE_FIELD::file_lastmodified] = curr[CURRENT_FIELD::file_lastmodified]; r[SYNCFILE_FIELD::deleted_yn] = curr[CURRENT_FIELD::deleted_yn]; r[SYNCFILE_FIELD::host_name] = curr[CURRENT_FIELD::host_name]; r[SYNCFILE_FIELD::creation_date] = curr[CURRENT_FIELD::creation_date]; r[SYNCFILE_FIELD::get_content_length] = curr[CURRENT_FIELD::get_content_length]; r[SYNCFILE_FIELD::get_content_type] = curr[CURRENT_FIELD::get_content_type]; r[SYNCFILE_FIELD::src_uri] = m_syncdata[SYNCFILE_FIELD::src_uri]; r[SYNCFILE_FIELD::slave_tran_id] = m_syncdata[SYNCFILE_FIELD::slave_tran_id]; r[SYNCFILE_FIELD::uri_ignore_case] = m_syncdata[SYNCFILE_FIELD::uri_ignore_case]; return r; } string CValidation::GetFullFilenamehash() { string r; ostringstream msg; if (m_syncdata[SYNCFILE_FIELD::resource_type] != TYPE_FILE) { msg << "[" << m_syncdata[SYNCFILE_FIELD::uri] << "] isn't file."; LOGACOUT(LDBG, msg); return r; } if (m_type == JOB_TYPE::COPY) { //m_syncdata[SYNCFILE_FIELD::filename_hash] unsigned found = m_syncdata[SYNCFILE_FIELD::filename_hash].find_last_of("/"); string hash = "/" + m_syncdata[SYNCFILE_FIELD::slave_tran_id] + m_syncdata[SYNCFILE_FIELD::filename_hash].substr(found); if (m_fhsmount.size()) { for (vector::size_type i = 0; i < m_fhsmount.size(); ++i) { if (i > 0) r += ","; r += m_fhsmount[i] + hash; } } else { msg << "FHS mount empty.[" << m_syncdata[SYNCFILE_FIELD::uri] << "]"; LOGACOUT(LWAR, msg); r = m_syncdata[SYNCFILE_FIELD::filename_hash]; } } else { r = m_syncdata[SYNCFILE_FIELD::filename_hash]; } r = StringReplace(r, "{", "\\{"); r = StringReplace(r, "}", "\\}"); r = "{" + r + "}"; msg << "Useing SQL filename_hash : " << m_syncdata[SYNCFILE_FIELD::filename_hash] << " => " << r; LOGACOUT(LDBG, msg); return r; } bool CValidation::GetCurrent(DataBase *db, string& tblname, bool useDisyplay /* = true */) { ostringstream sql,msg; int index = 1; sql << "SELECT "; if (useDisyplay) sql << "display_name, "; else sql << "uri, "; sql << "filename_hash, resource_type, get_content_length, get_lastmodified, "; sql << "file_lastmodified, deleted_yn, host_name, creation_date, get_content_type "; sql << "FROM " << tblname << " "; sql << "WHERE "; if (m_syncdata[SYNCFILE_FIELD::resource_type] == TYPE_FILE) { index = 1; sql << "filename_hash = ANY ($1) "; } else { index = 2; sql << "depth = $1 "; sql << "AND "; if (useDisyplay && m_syncdata[SYNCFILE_FIELD::uri_ignore_case] == "Y") sql << "uri = lower($2) "; else sql << "uri = $2 "; } if (m_type == JOB_TYPE::MOVE) { sql << "AND "; sql << "host_name = $" << ++index << " "; } else { sql << "AND "; sql << "is_cache = 'N' "; } sql << "AND "; sql << "deleted_yn = 'N' "; ostringstream t; string struri = m_syncdata[SYNCFILE_FIELD::uri]; string strdepth; string strhash = GetFullFilenamehash(); // depth °ª ±¸Çϱâ. path : /tran_id/filename ( tran_id Á¦°ÅµÈ count ) int nDEPTH = StringCount(struri, "/") - 1; t << nDEPTH; strdepth = t.str(); t.str(""); const char *paramValues[5]; if (m_syncdata[SYNCFILE_FIELD::resource_type] == TYPE_FILE) { index = 1; paramValues[0] = strhash.c_str(); msg << " RCDB GetCurrent value : " << paramValues[0] << ","; } else { index = 2; paramValues[0] = strdepth.c_str(); paramValues[1] = struri.c_str(); msg << paramValues[0] << "," << paramValues[1] << ","; } if (m_type == JOB_TYPE::MOVE) { paramValues[index++] = m_syncdata[SYNCFILE_FIELD::host_name].c_str(); msg << paramValues[index - 1] << ",INDEX (" << index << ")"; } LOGACOUT(LDBG, msg); msg << "SQL - " << sql.str(); LOGACOUT(LDBG, msg); // Query ½ÇÇà db->PgDoExecParams((char*)sql.str().c_str(), index, paramValues); // Query °á°ú¸¦ °¡Á®¿Â´Ù. int nResult = db->PgResult(DataBase::NOT_CLEAR); if (nResult < 0) { msg << "RCDB GetCurrent failed : [" << db->GetErrorMessage() << "]"; LOGACERR(LERR, msg); return false; } for (int i = 0; i < db->GetNoTuples(); ++i) { vector vectcurr(CURRENT_FIELD::MAX_FILED); vectcurr[CURRENT_FIELD::uri] = db->GetValue(i, CURRENT_FIELD::uri); if (m_syncdata[SYNCFILE_FIELD::resource_type] == "0") vectcurr[CURRENT_FIELD::filename_hash] = db->GetValue(i, CURRENT_FIELD::filename_hash); vectcurr[CURRENT_FIELD::host_name] = db->GetValue(i, CURRENT_FIELD::host_name); vectcurr[CURRENT_FIELD::resource_type] = db->GetValue(i, CURRENT_FIELD::resource_type); vectcurr[CURRENT_FIELD::creation_date] = db->GetValue(i, CURRENT_FIELD::creation_date); vectcurr[CURRENT_FIELD::get_content_length] = db->GetValue(i, CURRENT_FIELD::get_content_length); vectcurr[CURRENT_FIELD::get_content_type] = db->GetValue(i, CURRENT_FIELD::get_content_type); vectcurr[CURRENT_FIELD::get_lastmodified] = db->GetValue(i, CURRENT_FIELD::get_lastmodified); vectcurr[CURRENT_FIELD::deleted_yn] = db->GetValue(i, CURRENT_FIELD::deleted_yn); vectcurr[CURRENT_FIELD::file_lastmodified] = db->GetValue(i, CURRENT_FIELD::file_lastmodified); m_current.insert(CCurretMap::value_type(vectcurr[CURRENT_FIELD::uri], vectcurr)); } db->PgClear(); return true; } vector CValidation::MakeFind() { vector r; string strtran = "/" + m_syncdata[SYNCFILE_FIELD::slave_tran_id]; if (m_first && m_type == JOB_TYPE::COPY) { if (m_syncdata[SYNCFILE_FIELD::flag] == FLAG_COPY || m_syncdata[SYNCFILE_FIELD::flag] == FLAG_MOVE) { // ¸¶½ºÅÍ ¸Á¿¡¼­ ÆÄÀÏ ¼öÁ¤ÀÏ(get_lastmodified)ÀÌ ÇØ´ç ÆÄÀϺ¸´Ù ÀÛÀº °ÍÀÌ ¾øÀ» °æ¿ì src_uri º¸³»Áö ¾ÊÀ½ if (m_syncdata[SYNCFILE_FIELD::src_uri].size()) { string srcuri = strtran + m_syncdata[SYNCFILE_FIELD::src_uri]; r.push_back(srcuri); } } } string input = m_syncdata[SYNCFILE_FIELD::uri]; r.push_back(input); return r; } int CValidation::IsAllow() { if (m_syncdata[SYNCFILE_FIELD::flag] == FLAG_RECHK) { return 1; } int r = -1; switch (m_type) { case JOB_TYPE::COPY: { if (m_syncdata[SYNCFILE_FIELD::flag] == FLAG_SYNC || m_syncdata[SYNCFILE_FIELD::flag] == FLAG_NSYNC || m_syncdata[SYNCFILE_FIELD::flag] == FLAG_DEL || m_syncdata[SYNCFILE_FIELD::flag] == FLAG_COPY || m_syncdata[SYNCFILE_FIELD::flag] == FLAG_MOVE) r = 0; } break; case JOB_TYPE::MOVE: { if (m_syncdata[SYNCFILE_FIELD::flag] == FLAG_MOVE) r = 0; } break; default: r = -2; break; } return r; } void CValidation::FindZero(string & input, CSyncData & outSync) { ostringstream msg; msg << "FALG::" << m_syncdata[SYNCFILE_FIELD::flag] << "-" << input << " ==> FIND ZERO"; LOGACOUT(LDBG, msg); string synctranid = "/" + m_syncdata[SYNCFILE_FIELD::slave_tran_id]; string src = synctranid + m_syncdata[SYNCFILE_FIELD::src_uri]; // ´Ù¸¥ uri·Î ÆÄÀÏ Á¸ÀçÇϹǷΠ°ËÃâµÈ µ¥ÀÌÅÍ¿¡ ´ëÇØ¼­ RECHK flag ¼³Á¤ if (m_type == JOB_TYPE::COPY && m_first && m_current.size()) { // RECHK for (CCurretMap::iterator it = m_current.begin(); it != m_current.end(); ++it) { vector newsync = Current2Sync(FLAG_RECHK, it->second); if (input == newsync[SYNCFILE_FIELD::uri]) continue; // input : destination if (src == newsync[SYNCFILE_FIELD::uri]) continue; // input : source if (src == input) continue; if (m_syncdata[SYNCFILE_FIELD::src_uri].empty()) { if (m_syncdata[SYNCFILE_FIELD::get_content_length] == newsync[SYNCFILE_FIELD::get_content_length]) { string newsrc = newsync[SYNCFILE_FIELD::uri]; m_syncdata[SYNCFILE_FIELD::src_uri] = newsrc.substr(synctranid.size()); } } //int64_t d = convert(it->second[CURRENT_FIELD::get_lastmodified]); //if (longtime_now() - d > RECHK_TIMEOUT) { outSync.push_back(newsync); msg << "Set RECHK....[" << newsync[SYNCFILE_FIELD::uri] << "]"; LOGACOUT(LDBG, msg); } } } // check if (m_syncdata[SYNCFILE_FIELD::flag] == FLAG_DEL) { msg << "Does not process a request to delete a file because it does not exist currently. [" << input << "]"; LOGACOUT(LINF, msg); } else if (m_syncdata[SYNCFILE_FIELD::flag] == FLAG_SYNC) { // ÇØ´ç ÆÄÀϰú µ¿ÀÏÇÑ ÆÄÀÏ Á¸Àç È®ÀÎ if (m_first) { for (CSyncData::iterator it = outSync.begin(); it != outSync.end(); ++it) { if ((*it)[SYNCFILE_FIELD::flag] == FLAG_RECHK) { if ((*it)[SYNCFILE_FIELD::get_content_length] == m_syncdata[SYNCFILE_FIELD::get_content_length]) { string newsrc = (*it)[SYNCFILE_FIELD::uri]; m_syncdata[SYNCFILE_FIELD::flag] = FLAG_COPY; m_syncdata[SYNCFILE_FIELD::src_uri] = newsrc.substr(synctranid.size()); break; } } } } outSync.push_back(m_syncdata); } else if (m_syncdata[SYNCFILE_FIELD::flag] == FLAG_NSYNC) { if (m_syncdata[SYNCFILE_FIELD::resource_type] == TYPE_FILE) { msg << "Because the file does not exist, " << "change the physical synchronization from the logical synchronization. [" << input << "]"; LOGACOUT(LINF, msg); m_syncdata[SYNCFILE_FIELD::flag] = FLAG_SYNC; } if (m_syncdata[SYNCFILE_FIELD::resource_type] == TYPE_DIR) { msg << "Create DIR. [" << m_syncdata[SYNCFILE_FIELD::uri] << "]"; LOGACOUT(LDBG, msg); m_syncdata[SYNCFILE_FIELD::host_name] = ""; } outSync.push_back(m_syncdata); } else if (m_syncdata[SYNCFILE_FIELD::flag] == FLAG_COPY ) { if (input == src) { vector newsync = m_syncdata; newsync[SYNCFILE_FIELD::flag] = FLAG_SYNC; newsync[SYNCFILE_FIELD::uri] = src; outSync.push_back(newsync); } else { if (m_syncdata[SYNCFILE_FIELD::src_uri].empty()) m_syncdata[SYNCFILE_FIELD::flag] = FLAG_SYNC; outSync.push_back(m_syncdata); } } else if (m_syncdata[SYNCFILE_FIELD::flag] == FLAG_MOVE) { if (m_type == JOB_TYPE::MOVE) { msg << "Because the file does not exist, can not be transferred. [" << input << "]"; LOGACOUT(LINF, msg); } else { if (input == src) { // Nothing msg << "The source file does not exist, Nothing... [" << input << "]"; LOGACOUT(LDBG, msg); } else { if (m_first) { bool findsrc = false; for (CSyncData::iterator it = outSync.begin(); it != outSync.end(); ++it) { if ((*it)[SYNCFILE_FIELD::flag] == FLAG_RECHK) { if ((*it)[SYNCFILE_FIELD::uri] == src) { findsrc = true; outSync.erase(it); break; } // ÇØ´ç ¼Ò½º¿Í µ¿ÀÏÇÑ uri Á¸ÀçÇÏÁö ÇÏÁö ¾ÊÁö¸¸ µ¿ÀÏÇÑ ÆÄÀÏ·Î ´Ù¸¥ uri Á¸ÀçÇÒ ¼ö ÀÖÀ¸¹Ç·Î // ÇØ´ç ÆÄÀÏÀ» ¼Ò½º ÆÄÀÏ·Î ÇÏ´Â copy º» »ý¼ºÇÔ // ¼Ò½º·Î ¼±Á¤µÈ ÆÄÀÏÀº RECHK ¿É¼Ç¿¡ ÀÇÇØ¼­ Àçó¸®µÊ if ((*it)[SYNCFILE_FIELD::get_content_length] == m_syncdata[SYNCFILE_FIELD::get_content_length]) { findsrc = true; string newsrc = (*it)[SYNCFILE_FIELD::uri]; m_syncdata[SYNCFILE_FIELD::flag] = FLAG_COPY; m_syncdata[SYNCFILE_FIELD::host_name] = (*it)[SYNCFILE_FIELD::host_name]; m_syncdata[SYNCFILE_FIELD::src_uri] = newsrc.substr(synctranid.size()); break; } } } // ¼Ò½º Á¸Àç ÇÏÁö ¾ÊÀ» °æ¿ì SYNC·Î º¯°æ if (findsrc == false) { m_syncdata[SYNCFILE_FIELD::flag] = FLAG_SYNC; } outSync.push_back(m_syncdata); } else { outSync.push_back(m_syncdata); } } } } else { msg << "Unknown flag.[" << m_syncdata[SYNCFILE_FIELD::flag] << ":"; msg << input; msg << "]"; LOGACERR(LERR, msg); return; } } void CValidation::FindOne(vector f, CSyncData & outSync) { ostringstream msg; string input = f[CURRENT_FIELD::uri]; string src = "/" + m_syncdata[SYNCFILE_FIELD::slave_tran_id] + m_syncdata[SYNCFILE_FIELD::src_uri]; msg << "FALG::" << m_syncdata[SYNCFILE_FIELD::flag] << "-" << input << " ==> FIND IT"; LOGACOUT(LDBG, msg); // ´Ù¸¥ uri·Î ÆÄÀÏ Á¸ÀçÇϹǷΠ°ËÃâµÈ µ¥ÀÌÅÍ¿¡ ´ëÇØ¼­ RECHK flag ¼³Á¤ if (m_type == JOB_TYPE::COPY && m_first && m_current.size() > 1) { // RECHK for (CCurretMap::iterator it = m_current.begin(); it != m_current.end(); ++it) { vector newsync = Current2Sync(FLAG_RECHK, it->second); if (input == newsync[SYNCFILE_FIELD::uri]) continue; // input : destination if (src == newsync[SYNCFILE_FIELD::uri]) continue; // input : source if (src == input) continue; //int64_t d = convert(it->second[CURRENT_FIELD::get_lastmodified]); //if (longtime_now() - d > RECHK_TIMEOUT) { outSync.push_back(newsync); msg << "Set RECHK(1)....[" << newsync[SYNCFILE_FIELD::uri] << "]"; LOGACOUT(LDBG, msg); } } } bool in2sync = false; // check if (m_syncdata[SYNCFILE_FIELD::flag] == FLAG_DEL) { in2sync = true; if (m_first && m_syncdata[SYNCFILE_FIELD::get_content_length] != f[CURRENT_FIELD::get_content_length]) { msg << "uri same but size different. change flag(RECHK).[" << input << "]"; LOGACOUT(LDBG, msg); m_syncdata[SYNCFILE_FIELD::flag] = FLAG_RECHK; } } else if (m_syncdata[SYNCFILE_FIELD::flag] == FLAG_SYNC) { in2sync = true; if (m_syncdata[SYNCFILE_FIELD::get_content_length] != f[CURRENT_FIELD::get_content_length]) { if (m_first) { msg << "uri same but size different. new syncdata(DEL) create.[" << input << "]"; LOGACOUT(LINF, msg); vector newsync = Current2Sync(FLAG_DEL, f); outSync.push_back(newsync); } } else if (m_syncdata[SYNCFILE_FIELD::file_lastmodified] != f[CURRENT_FIELD::file_lastmodified]) { if (m_first) { msg << "uri same but file_lastmodified different. new syncdata(NSYNC) create.[" << input << "]"; LOGACOUT(LINF, msg); vector newsync = Current2Sync(FLAG_NSYNC, f); newsync[SYNCFILE_FIELD::file_lastmodified] = m_syncdata[SYNCFILE_FIELD::file_lastmodified]; outSync.push_back(newsync); } } else { in2sync = false; msg << "Information all same. not synchronized.[" << input << "]"; LOGACOUT(LDBG, msg); } } else if (m_syncdata[SYNCFILE_FIELD::flag] == FLAG_NSYNC) { if (m_syncdata[SYNCFILE_FIELD::file_lastmodified] != f[CURRENT_FIELD::file_lastmodified]) { in2sync = true; if (f[CURRENT_FIELD::resource_type] == TYPE_DIR) m_syncdata[SYNCFILE_FIELD::host_name] = f[CURRENT_FIELD::host_name]; } if (f[CURRENT_FIELD::resource_type] == TYPE_FILE) { if (m_syncdata[SYNCFILE_FIELD::get_content_length] != f[CURRENT_FIELD::get_content_length]) { if (m_first) { msg << "uri same but size(or file_lastmodified) different. new syncdata(DEL) create.[" << input << "]"; LOGACOUT(LINF, msg); vector newsync = Current2Sync(FLAG_DEL, f); outSync.push_back(newsync); } else { msg << "Change flag NSYNC to SYNC. [" << input << "]"; LOGACOUT(LDBG, msg); m_syncdata[SYNCFILE_FIELD::flag] = FLAG_SYNC; } } } } else if (m_syncdata[SYNCFILE_FIELD::flag] == FLAG_COPY) { if (m_syncdata[SYNCFILE_FIELD::get_content_length] != f[CURRENT_FIELD::get_content_length]) { if (m_first) { msg << "uri same but size different. new syncdata(DEL) create.[" << input << "]"; LOGACOUT(LINF, msg); vector newsync = Current2Sync(FLAG_DEL, f); outSync.push_back(newsync); if (input == src) { msg << "uri same but size different. new syncdata(SYNC) create.[" << input << "]"; LOGACOUT(LINF, msg); newsync = Current2Sync(FLAG_SYNC, f); outSync.push_back(newsync); } else in2sync = true; } else in2sync = true; } else if (m_syncdata[SYNCFILE_FIELD::file_lastmodified] != f[CURRENT_FIELD::file_lastmodified]) { if (m_first) { if (input != src) { vector newsync = Current2Sync(FLAG_NSYNC, f); newsync[SYNCFILE_FIELD::file_lastmodified] = m_syncdata[SYNCFILE_FIELD::file_lastmodified]; outSync.push_back(newsync); } } } else { // nothing } } else if (m_syncdata[SYNCFILE_FIELD::flag] == FLAG_MOVE) { if (m_type == JOB_TYPE::MOVE) { in2sync = true; } else { if (m_syncdata[SYNCFILE_FIELD::get_content_length] != f[CURRENT_FIELD::get_content_length]) { if (m_first) { msg << "uri same but size different. new syncdata(DEL) create.[" << input << "]"; LOGACOUT(LINF, msg); vector newsync = Current2Sync(FLAG_DEL, f); outSync.push_back(newsync); } if (input != src) { msg << "uri same but size different. new syncdata(SYNC) create.[" << input << "]"; LOGACOUT(LINF, msg); vector newsync = Current2Sync(FLAG_SYNC, f); outSync.push_back(newsync); } } else { if (input == src) { vector newsync = Current2Sync(FLAG_RECHK, f); outSync.push_back(newsync); } else { for (CSyncData::iterator it = outSync.begin(); it != outSync.end(); ++it) { if ((*it)[SYNCFILE_FIELD::uri] == src ) { // ¼Ò½º Á¸ÀçÇÏ°í º¹»çµÈ ÆÄÀϵµ Á¸ÀçÇÏ¸é ¼Ò½º »èÁ¦ ó¸® (*it)[SYNCFILE_FIELD::flag] = FLAG_DEL; break; } } } } } } else { msg << "Unknown flag.[" << m_syncdata[SYNCFILE_FIELD::flag] << ":"; msg << input; msg << "]"; LOGACERR(LERR, msg); return; } // input to sync data if (in2sync) { outSync.push_back(m_syncdata); } } void CValidation::FindOver(pair &f, CSyncData & outSync) { ostringstream msg; //f.first CCurretMap::iterator vf = f.first; string input = (*vf).second[CURRENT_FIELD::uri]; msg << "FALG::" << m_syncdata[SYNCFILE_FIELD::flag] << "-" << input << " ==> DUPLICATE"; LOGACOUT(LDBG, msg); CReportLog rlog; if (rlog.Init(parameter::getInstance()->getlogpath().c_str())) { rlog.Write("NOT", "[%s] [The duplicate files.[uri :%s]]", PROG_NAME, input.c_str()); } } bool CValidation::CompareData(DataBase *db, string& tblname, vector & vecFind, CSyncData & outSync) { bool r = true; ostringstream msg; msg << "FIND vector Size : " << vecFind.size(); LOGACOUT(LDBG, msg); while (vecFind.size()) { string input = vecFind.front(); msg << "FIND input : " << input; LOGACOUT(LDEV1, msg); pair f = m_current.equal_range(input); CCurretMap::const_iterator ff = f.first; if (f.first == m_current.end()) { // find zero FindZero(input, outSync); } else if (++ff == f.second) { // find one CCurretMap::iterator v = f.first; FindOne((*v).second, outSync); } else { // find one over FindOver(f, outSync); return false; } vecFind.erase(vecFind.begin()); } return r; } int CValidation::CheckData(bool first, CSyncData & outSync) { DataBase* db = NULL; string tblname; bool usedisp = true; ostringstream msg; m_first = first; // check allow switch (IsAllow()) { case 0: // Allow msg << "ALLOW Validation.[" << m_syncdata[SYNCFILE_FIELD::uri] << "]"; LOGACOUT(LDEV2, msg); break; case 1: // SKIP msg << "SIKP Validation.[" << m_syncdata[SYNCFILE_FIELD::uri] << "]"; LOGACOUT(LDBG, msg); outSync.push_back(m_syncdata); return 0; break; default: // Deny msg << "DENY Validation.[" << m_syncdata[SYNCFILE_FIELD::uri] << "]"; LOGACOUT(LERR, msg); return -10; break; } // Get DB db = GetDB(tblname, usedisp); if (db == NULL) return -1; int r = 0; do { // Get Current if (GetCurrent(db, tblname, usedisp) == false) { r = -2; break; } // Make Find URI vector vecfind = MakeFind(); if (vecfind.empty()) { r = -3; msg << "Not Found 'FIND URI'.[" << m_syncdata[SYNCFILE_FIELD::uri] << "]"; LOGACOUT(LERR, msg); break; } // compare if (CompareData(db, tblname, vecfind, outSync) == false) { r = -4; break; } } while (false); // Free DB FreeDB(db, (r != -2)); return r; }