diff --git a/src/DBManager.cpp b/src/DBManager.cpp index 4e9a7cfe50bcae8cecf5c1d12d2448f609c0afd0..5068f4cb03295536986949205f6e699066902792 100644 --- a/src/DBManager.cpp +++ b/src/DBManager.cpp @@ -108,13 +108,6 @@ DBManager::InformationList DBManager::retrieveInformation(std::string schema, std::copy(rows.begin(), rows.end(), std::back_inserter(informationList)); - if(informationList.empty()) - { - std::stringstream errorStream; - errorStream << schema << "." << table << " not exists"; - throw soci::soci_error(errorStream.str()); - } - return informationList; } @@ -122,7 +115,7 @@ DBManager::InformationList DBManager::retrieveInformation(std::string schema, // DBManager::retrieveNewTuples() //============================================================================== DBManager::RowsetSP DBManager::retrieveNewTuples(std::string schema, - std::string table, std::tm update_time) throw(soci::soci_error) + std::string table, std::tm update_time) throw(soci::soci_error, std::out_of_range) { DEBUG_STREAM << "DBManager::retrieveNewTuples()" << endl; diff --git a/src/DBManager.h b/src/DBManager.h index 0af36a7789aab91b657cd9dde10e5e603036733f..2ca33ab3bf35303349d60086671989a7f96eb8f2 100644 --- a/src/DBManager.h +++ b/src/DBManager.h @@ -78,7 +78,7 @@ public: typedef boost::shared_ptr< soci::rowset<soci::row> > RowsetSP; virtual RowsetSP retrieveNewTuples(std::string, std::string, std::tm) - throw(soci::soci_error); + throw(soci::soci_error, std::out_of_range); protected: //------------------------------------------------------------------------------ diff --git a/src/ProtocolManager.cpp b/src/ProtocolManager.cpp index d0532a0f24ea2ac2f79453b6ae61b24aedc38b35..a878c87ed1df812a052ac0d017a4749e678fa1ec 100644 --- a/src/ProtocolManager.cpp +++ b/src/ProtocolManager.cpp @@ -1,5 +1,7 @@ #include <ProtocolManager.h> +#include <boost/date_time.hpp> + namespace MetadataExporter_ns { @@ -55,6 +57,9 @@ ResponseSP ProtocolManager::prepareResponse(RequestSP request_sp) { DEBUG_STREAM << "ProtocolManager::prepareResponse()" << endl; + if(!request_sp->IsInitialized()) + throw std::runtime_error("Not initialized request!"); + ResponseSP response_sp; switch(request_sp->type()) @@ -88,7 +93,6 @@ ResponseSP ProtocolManager::prepareResponse(RequestSP request_sp) // ProtocolManager::prepareAuthroisation() //============================================================================== ResponseSP ProtocolManager::prepareAuthroisation(RequestSP request_sp) - throw(std::runtime_error) { DEBUG_STREAM << "ProtocolManager::prepareAuthroisation()" << endl; @@ -141,7 +145,6 @@ ResponseSP ProtocolManager::prepareAuthroisation(RequestSP request_sp) // ProtocolManager::prepareValidation() //============================================================================== ResponseSP ProtocolManager::prepareValidation(RequestSP request_sp) - throw(std::runtime_error) { DEBUG_STREAM << "ProtocolManager::prepareValidation()" << endl; @@ -165,17 +168,24 @@ ResponseSP ProtocolManager::prepareValidation(RequestSP request_sp) DBManager::InformationList informationList = m_dBManager_sp->retrieveInformation(m_validatedSchema, m_validatedTable); - if(validationReq.columns_size() != (int)informationList.size()) - throw std::runtime_error("Columns number does not match"); - - const google::protobuf::RepeatedPtrField - < Request::Validation::Column >& columns = validationReq.columns(); + if(informationList.empty()) + { + std::stringstream errorStream; + errorStream << "Table " << m_validatedSchema << "." + << m_validatedTable << " not exists"; + throw soci::soci_error(errorStream.str()); + } - google::protobuf::RepeatedPtrField - < Request::Validation::Column >::const_iterator it; + if(validationReq.columns_size() != (int)informationList.size()) + { + std::stringstream errorStream; + errorStream << "Table " << m_validatedSchema << "." + << m_validatedTable << " has different columns size"; + throw soci::soci_error(errorStream.str()); + } - for(it=columns.begin(); it!=columns.end(); ++it) - validateColumn(*it, informationList); + for(int i=0; i<validationReq.columns_size(); ++i) + validateColumn(validationReq.columns(i), informationList); INFO_STREAM << "ProtocolManager::prepareValidation() " << "Validation accepted for " << m_validatedSchema << "." @@ -194,14 +204,6 @@ ResponseSP ProtocolManager::prepareValidation(RequestSP request_sp) validationRes->set_state(Response::Validation::REJECTED); validationRes->set_status(ex.what()); } - catch(...) - { - WARN_STREAM << "ProtocolManager::prepareValidation() " - << "Unknown exception from " << m_remoteEndpoint << endl; - - validationRes->set_state(Response::Validation::REJECTED); - validationRes->set_status("Unknown exception"); - } } else { @@ -228,7 +230,6 @@ ResponseSP ProtocolManager::prepareValidation(RequestSP request_sp) // ProtocolManager::prepareMetadata() //============================================================================== ResponseSP ProtocolManager::prepareMetadata(RequestSP request_sp) - throw(std::runtime_error) { DEBUG_STREAM << "ProtocolManager::prepareMetadata()" << endl; @@ -247,12 +248,16 @@ ResponseSP ProtocolManager::prepareMetadata(RequestSP request_sp) int64_t rawTimestamp = metadataReq.timestamp(); std::tm tmTimestamp = *localtime(&rawTimestamp); - DEBUG_STREAM << "ProtocolManager::prepareMetadata() Searching in " - << m_validatedSchema << "." << m_validatedTable << " timestamp " - << asctime(&tmTimestamp) << " from " << m_remoteEndpoint << endl; - try { + boost::posix_time::ptime ptTimestamp = + boost::posix_time::ptime_from_tm(tmTimestamp); + + DEBUG_STREAM << "ProtocolManager::prepareMetadata() Searching in " + << m_validatedSchema << "." << m_validatedTable << " timestamp " + << boost::posix_time::to_simple_string(ptTimestamp) + << " from " << m_remoteEndpoint << endl; + if(!m_rowSet_sp) { m_rowSet_sp = m_dBManager_sp->retrieveNewTuples( @@ -274,7 +279,7 @@ ResponseSP ProtocolManager::prepareMetadata(RequestSP request_sp) metadataRes->set_status("No more data"); } } - catch(std::runtime_error& ex) + catch(std::exception& ex) { WARN_STREAM << "ProtocolManager::prepareMetadata() " << ex.what() << " from " << m_remoteEndpoint << endl; @@ -282,16 +287,6 @@ ResponseSP ProtocolManager::prepareMetadata(RequestSP request_sp) metadataRes->set_state(Response::Metadata::REJECTED); metadataRes->set_status(ex.what()); - m_rowSet_sp.reset(); - } - catch(...) - { - WARN_STREAM << "ProtocolManager::prepareMetadata() " - << "Unknown exception from " << m_remoteEndpoint << endl; - - metadataRes->set_state(Response::Metadata::REJECTED); - metadataRes->set_status("Unknown exception"); - m_rowSet_sp.reset(); } } @@ -330,7 +325,7 @@ void ProtocolManager::validateColumn(const Request::Validation::Column& column, for(it=informationList.begin(); it!=informationList.end(); ++it) { if(!it->get<0>()) - throw std::runtime_error("Empty column name"); + throw std::runtime_error("Empty column name in information schema"); std::string columnName = it->get<0>().get(); if(column.name().compare(columnName)==0) @@ -338,7 +333,7 @@ void ProtocolManager::validateColumn(const Request::Validation::Column& column, found = true; if(!it->get<1>()) - throw std::runtime_error("Empty column type"); + throw std::runtime_error("Empty column type in information schema"); std::string columnType = it->get<1>().get(); if(column.type().compare(columnType)!=0) @@ -350,7 +345,7 @@ void ProtocolManager::validateColumn(const Request::Validation::Column& column, } if(!it->get<2>()) - throw std::runtime_error("Empty is nullable"); + throw std::runtime_error("Empty column nullable in information schema"); std::string isNullable = it->get<2>().get(); if(column.nullable().compare(isNullable)!=0) @@ -362,10 +357,10 @@ void ProtocolManager::validateColumn(const Request::Validation::Column& column, } #ifdef VERBOSE_DEBUG - DEBUG_STREAM << "CLIENT: " << columnName << " | " << columnType - << " | " << isNullable << endl; - DEBUG_STREAM << "SERVER: " << column.name() << " | " - << column.type() << " | " << column.nullable() << endl; + INFO_STREAM << "ProtocolManager::validateColumn(): " << columnName + << " " << columnType << " " << isNullable << endl; + INFO_STREAM << "ProtocolManager::validateColumn(): " << column.name() + << " " << column.type() << " " << column.nullable() << endl; #endif } } @@ -373,7 +368,7 @@ void ProtocolManager::validateColumn(const Request::Validation::Column& column, if(!found) { std::stringstream errorStream; - errorStream << "Column " << column.name() << " not found on server"; + errorStream << "Column " << column.name() << " not found"; throw std::runtime_error(errorStream.str()); } } @@ -382,38 +377,33 @@ void ProtocolManager::validateColumn(const Request::Validation::Column& column, // ProtocolManager::fillMetadata() //============================================================================== void ProtocolManager::fillMetadata(Response::Metadata* metadataRes) - throw(std::runtime_error) + throw(std::runtime_error, std::out_of_range) { DEBUG_STREAM << "ProtocolManager::fillMetadata()" << endl; - std::time_t currentTime = 0; + boost::posix_time::ptime ptCurrent; while(m_it != m_rowSet_sp->end()) { int id = m_it->get<int>("id"); - std::string file_path = m_it->get<std::string>("file_path"); int file_version = m_it->get<int>("file_version"); std::string file_name = m_it->get<std::string>("file_name"); - std::tm newTm = m_it->get<std::tm>("update_time"); - - #ifdef VERBOSE_DEBUG - INFO_STREAM << "|" << id << "|" << file_path << "|" << file_version - << "|" << file_name << "|" << asctime(&newTm) << "|" << endl; - #endif + std::tm tmNew = m_it->get<std::tm>("update_time"); - std::time_t newTime = mktime(&newTm); + boost::posix_time::ptime ptNew = boost::posix_time::ptime_from_tm(tmNew); - if(currentTime == 0) - currentTime = newTime; + if(ptCurrent.is_not_a_date_time()) + ptCurrent = ptNew; - std::tm currentTm = *localtime(¤tTime); + INFO_STREAM << "ProtocolManager::fillMetadata() sending " + << id << " " << file_version << " " << file_name << " " + << boost::posix_time::to_simple_string(ptNew) << endl; - INFO_STREAM << "NEW TIME: " << asctime(&newTm) << endl; - INFO_STREAM << "CURRENT TIME: " << asctime(¤tTm) << endl; - - if(difftime(newTime, currentTime)>0) + if(ptNew > ptCurrent) { - INFO_STREAM << "BREAK" << endl; + INFO_STREAM << "ProtocolManager::fillMetadata() stop [" + << boost::posix_time::to_simple_string(ptNew) << " > " + << boost::posix_time::to_simple_string(ptCurrent) << "]" << endl; break; } @@ -425,7 +415,7 @@ void ProtocolManager::fillMetadata(Response::Metadata* metadataRes) if(m_it == m_rowSet_sp->end()) { - INFO_STREAM << "RESET" << endl; + INFO_STREAM << "ProtocolManager::fillMetadata() all data sent" << endl; m_rowSet_sp.reset(); } } @@ -434,7 +424,7 @@ void ProtocolManager::fillMetadata(Response::Metadata* metadataRes) // ProtocolManager::fillRow() //============================================================================== void ProtocolManager::fillRow(Response::Metadata::Row* row) - throw(std::runtime_error) + throw(std::runtime_error, std::out_of_range) { DEBUG_STREAM << "ProtocolManager::fillRow()" << endl; @@ -446,7 +436,10 @@ void ProtocolManager::fillRow(Response::Metadata::Row* row) if(m_it->get_indicator(i) == soci::i_null) { - DEBUG_STREAM << "NAME: " << name << " NULL" << endl; + #ifdef VERBOSE_DEBUG + INFO_STREAM << "ProtocolManager::fillRow() name " + << name << " null" << endl; + #endif continue; } @@ -456,7 +449,10 @@ void ProtocolManager::fillRow(Response::Metadata::Row* row) { std::string value = m_it->get<std::string>(i); - DEBUG_STREAM << "NAME: " << name << " " << value << endl; + #ifdef VERBOSE_DEBUG + INFO_STREAM << "ProtocolManager::fillRow() name " + << name << " " << value << endl; + #endif Response::Metadata::Row::DtString* dtString = row->add_strings_list(); dtString->set_key(name); @@ -468,7 +464,10 @@ void ProtocolManager::fillRow(Response::Metadata::Row* row) { double value = m_it->get<double>(i); - DEBUG_STREAM << "NAME: " << name << " VALUE: " << value << endl; + #ifdef VERBOSE_DEBUG + INFO_STREAM << "ProtocolManager::fillRow() name " + << name << " " << value << endl; + #endif Response::Metadata::Row::DtDouble* dtDouble = row->add_double_list(); dtDouble->set_key(name); @@ -480,7 +479,10 @@ void ProtocolManager::fillRow(Response::Metadata::Row* row) { int value = m_it->get<int>(i); - DEBUG_STREAM << "NAME: " << name << " VALUE: " << value << endl; + #ifdef VERBOSE_DEBUG + INFO_STREAM << "ProtocolManager::fillRow() name " + << name << " " << value << endl; + #endif Response::Metadata::Row::DtInteger* dtInteger = row->add_integer_list(); dtInteger->set_key(name); @@ -492,7 +494,10 @@ void ProtocolManager::fillRow(Response::Metadata::Row* row) { long long value = m_it->get<long long>(i); - DEBUG_STREAM << "NAME: " << name << " VALUE: " << value << endl; + #ifdef VERBOSE_DEBUG + INFO_STREAM << "ProtocolManager::fillRow() name " + << name << " " << value << endl; + #endif Response::Metadata::Row::DtLongLong* dtLongLong = row->add_long_long_list(); dtLongLong->set_key(name); @@ -504,7 +509,10 @@ void ProtocolManager::fillRow(Response::Metadata::Row* row) { unsigned long value = m_it->get<unsigned long>(i); - DEBUG_STREAM << "NAME: " << name << " VALUE: " << value << endl; + #ifdef VERBOSE_DEBUG + INFO_STREAM << "ProtocolManager::fillRow() name " + << name << " " << value << endl; + #endif Response::Metadata::Row::DtUnsignedLong* dtUnsignedLong = row->add_unsinged_long_list(); dtUnsignedLong->set_key(name); @@ -514,13 +522,17 @@ void ProtocolManager::fillRow(Response::Metadata::Row* row) } case soci::dt_date: { - std::tm value = m_it->get<std::tm>(i); + std::tm tmValue = m_it->get<std::tm>(i); + boost::posix_time::ptime ptValue = boost::posix_time::ptime_from_tm(tmValue); - DEBUG_STREAM << "NAME: " << name << " VALUE: " << asctime(&value) << endl; + #ifdef VERBOSE_DEBUG + INFO_STREAM << "ProtocolManager::fillRow() name " + << name << " " << boost::posix_time::to_simple_string(ptValue) << endl; + #endif Response::Metadata::Row::DtDate* dtDate = row->add_date_list(); dtDate->set_key(name); - dtDate->set_value(mktime(&value)); + dtDate->set_value(mktime(&tmValue)); break; } diff --git a/src/ProtocolManager.h b/src/ProtocolManager.h index bbf6f082eb0300ec32c5f4e8dbe0688d458d89d6..e75ee6669c6f2945db2c2be15f680c2f41811eb8 100644 --- a/src/ProtocolManager.h +++ b/src/ProtocolManager.h @@ -63,14 +63,11 @@ protected: //------------------------------------------------------------------------------ // [Protected] Request specific methods //------------------------------------------------------------------------------ - virtual ResponseSP prepareAuthroisation(RequestSP) - throw(std::runtime_error); + virtual ResponseSP prepareAuthroisation(RequestSP); - virtual ResponseSP prepareValidation(RequestSP) - throw(std::runtime_error); + virtual ResponseSP prepareValidation(RequestSP); - virtual ResponseSP prepareMetadata(RequestSP) - throw(std::runtime_error); + virtual ResponseSP prepareMetadata(RequestSP); //------------------------------------------------------------------------------ // [Protected] Columns validation method @@ -81,9 +78,11 @@ protected: //------------------------------------------------------------------------------ // [Protected] Metadata serialization method //------------------------------------------------------------------------------ - virtual void fillMetadata(Response::Metadata*) throw(std::runtime_error); + virtual void fillMetadata(Response::Metadata*) + throw(std::runtime_error, std::out_of_range); - virtual void fillRow(Response::Metadata::Row*) throw(std::runtime_error); + virtual void fillRow(Response::Metadata::Row*) + throw(std::runtime_error, std::out_of_range); //------------------------------------------------------------------------------ // [Protected] Class variables diff --git a/src/Server.cpp b/src/Server.cpp index 946e114a77194f6ca24531ef71660ea6c6dde01d..ea6c9569c6db873e7bc3d7989bebaaa1e99b79c4 100644 --- a/src/Server.cpp +++ b/src/Server.cpp @@ -45,7 +45,7 @@ Server::~Server() if(m_threadGroup_sp) { - //m_threadGroup_sp->interrupt_all(); + m_threadGroup_sp->interrupt_all(); m_threadGroup_sp->join_all(); } @@ -119,7 +119,7 @@ void Server::stop() throw(std::runtime_error) if(m_threadGroup_sp) { - //m_threadGroup_sp->interrupt_all(); + m_threadGroup_sp->interrupt_all(); m_threadGroup_sp->join_all(); }