diff --git a/src/DBManager.cpp b/src/DBManager.cpp index ac0254dc8022512989ed27e9ba8e6afa8414553d..5d4ce13234bebcb64190c81395050e9d5f12ab13 100644 --- a/src/DBManager.cpp +++ b/src/DBManager.cpp @@ -103,6 +103,13 @@ 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; } diff --git a/src/PlainSession.cpp b/src/PlainSession.cpp index 71157c68be27cc8000522801d8b1e79267844a5e..9c9a6624782db2368c3fcbb9ec6fae9f66f87f33 100644 --- a/src/PlainSession.cpp +++ b/src/PlainSession.cpp @@ -1,8 +1,7 @@ #include <PlainSession.h> #include <boost/bind.hpp> - -#include <netinet/in.h> +#include <boost/lexical_cast.hpp> namespace MetadataExporter_ns { @@ -26,6 +25,9 @@ PlainSession::~PlainSession() { DEBUG_STREAM << "PlainSession::~PlainSession()" << endl; + INFO_STREAM << "PlainSession::~PlainSession() Disconnection from " + << remoteEndpoint << endl; + boost::system::error_code errorCode; m_plainSocket.shutdown(boost::asio::ip::tcp::socket::shutdown_both, errorCode); @@ -63,7 +65,11 @@ void PlainSession::start() { DEBUG_STREAM << "PlainSession::start()" << endl; - INFO_STREAM << m_plainSocket.remote_endpoint() << " CONNECTED" << endl; + remoteEndpoint = boost::lexical_cast<std::string>( + m_plainSocket.remote_endpoint()); + + INFO_STREAM << "PlainSession::start() Connection from " + << remoteEndpoint << endl; startReadRequestHeader(); } @@ -89,14 +95,16 @@ void PlainSession::startReadRequestBody(boost::uint32_t bodySize) { DEBUG_STREAM << "PlainSession::startReadRequestBody()" << endl; - INFO_STREAM << m_plainSocket.remote_endpoint() - << " >>>> " << bodySize << " BYTE" << endl; - m_readBuff.resize(HEADER_SIZE + bodySize); boost::asio::mutable_buffers_1 mutableBuffer = boost::asio::buffer(&m_readBuff[HEADER_SIZE], bodySize); + #ifdef VERBOSE_DEBUG + INFO_STREAM << "PlainSession::startReadRequestBody() " + << remoteEndpoint << " >>>> " << bodySize << " BYTE" << endl; + #endif + boost::asio::async_read(m_plainSocket, mutableBuffer, m_strand.wrap(boost::bind(&PlainSession::handleReadRequestBody, shared_from_this(), boost::asio::placeholders::error))); @@ -119,9 +127,6 @@ void PlainSession::startWriteResponse() boost::uint32_t bodySize = response_sp->ByteSize(); - INFO_STREAM << m_plainSocket.remote_endpoint() - << " <<<< " << bodySize << " BYTE" << endl; - std::vector<boost::uint8_t> writeBuff; writeBuff.resize(HEADER_SIZE + bodySize); @@ -129,17 +134,25 @@ void PlainSession::startWriteResponse() response_sp->SerializeToArray(&writeBuff[HEADER_SIZE], bodySize); + #ifdef VERBOSE_DEBUG + INFO_STREAM << "PlainSession::startWriteResponse() " + << remoteEndpoint << " <<<< " << bodySize << " byte" << endl; + #endif + boost::asio::async_write(m_plainSocket, boost::asio::buffer(writeBuff), m_strand.wrap(boost::bind(&PlainSession::handleWriteResponse, shared_from_this(), boost::asio::placeholders::error))); } catch(std::runtime_error& ec) { - ERROR_STREAM << "SSLSession::startWriteResponse() " << ec.what() << endl; + ERROR_STREAM << "SSLSession::startWriteResponse() " + << ec.what() << " from " << remoteEndpoint << endl; } catch(...) { - ERROR_STREAM << "SSLSession::startWriteResponse() unknown error" << endl; + ERROR_STREAM << "SSLSession::startWriteResponse() unknown error from " + << remoteEndpoint << endl; + } } diff --git a/src/ProtocolManager.cpp b/src/ProtocolManager.cpp index f1f27a6564e9762ef01c29b37baecd76730e0ae8..19dbb6a29e65240856d717bf2480a83dd43d08a6 100644 --- a/src/ProtocolManager.cpp +++ b/src/ProtocolManager.cpp @@ -150,39 +150,32 @@ ResponseSP ProtocolManager::prepareValidation(RequestSP request_sp) const std::string& schema = validationReq.schema(); const std::string& table = validationReq.table(); - DBManager::InformationList informationList = - m_dBManager_sp->retrieveInformation(schema, table); - - if(validationReq.columns_size() == (int)informationList.size()) + try { + DBManager::InformationList informationList = + m_dBManager_sp->retrieveInformation(schema, table); + + 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(); google::protobuf::RepeatedPtrField < Request::Validation::Column >::const_iterator it; - try - { - for(it=columns.begin(); it!=columns.end();++it) - { - validateColumn(*it, informationList); - } - - m_isValidated = true; - - validationRes->set_state(Response::Validation::ACCEPTED); - validationRes->set_status("Table validated"); - } - catch(std::runtime_error& ex) - { - validationRes->set_state(Response::Validation::REJECTED); - validationRes->set_status(ex.what()); - } + for(it=columns.begin(); it!=columns.end(); ++it) + validateColumn(*it, informationList); + + m_isValidated = true; + + validationRes->set_state(Response::Validation::ACCEPTED); + validationRes->set_status("Table validated"); } - else + catch(std::runtime_error& ex) { validationRes->set_state(Response::Validation::REJECTED); - validationRes->set_status("Columns number does not match"); + validationRes->set_status(ex.what()); } } else @@ -292,6 +285,13 @@ void ProtocolManager::validateColumn(const Request::Validation::Column& column, << "server " << isNullable << " client " << column.nullable(); throw std::runtime_error(errorStream.str()); } + + #ifdef VERBOSE_DEBUG + INFO_STREAM << "SERVER: " << columnName << " | " << columnType + << " | " << isNullable << endl; + INFO_STREAM << "SERVER: " << column.name() << " | " + << column.type() << " | " << column.nullable() << endl; + #endif } } diff --git a/src/SSLSession.cpp b/src/SSLSession.cpp index 7feffa5e4f105c423d75e293f2c8a049aeaa9b52..cb0394d2f29158a74252b336dd205092d1ead790 100644 --- a/src/SSLSession.cpp +++ b/src/SSLSession.cpp @@ -1,5 +1,7 @@ #include <SSLSession.h> + #include <boost/bind.hpp> +#include <boost/lexical_cast.hpp> namespace MetadataExporter_ns { @@ -24,6 +26,9 @@ SSLSession::~SSLSession() { DEBUG_STREAM << "SSLSession::~SSLSession()" << endl; + INFO_STREAM << "SSLSession::~SSLSession() Disconnection from " + << remoteEndpoint << endl; + boost::system::error_code errorCode; m_sslSocket.shutdown(errorCode); @@ -65,8 +70,10 @@ void SSLSession::start() { DEBUG_STREAM << "SSLSession::start()" << endl; - INFO_STREAM << m_sslSocket.lowest_layer().remote_endpoint() - << " CONNECTED" << endl; + remoteEndpoint = boost::lexical_cast<std::string>( + m_sslSocket.lowest_layer().remote_endpoint()); + + INFO_STREAM << "SSLSession::start() Connection from " << remoteEndpoint << endl; startHandShake(); } @@ -96,9 +103,8 @@ void SSLSession::handleHandShake(const boost::system::error_code& errorCode) } else { - WARN_STREAM << "SSLSession::handleHandShake() error " - << errorCode.message() << " from " - << m_sslSocket.lowest_layer().remote_endpoint() << endl; + ERROR_STREAM << "SSLSession::handleHandShake() error " + << errorCode.message() << " from " << remoteEndpoint << endl; } } @@ -128,8 +134,10 @@ void SSLSession::startReadRequestBody(boost::uint32_t bodySize) boost::asio::mutable_buffers_1 mutableBuffer = boost::asio::buffer(&m_readBuff[HEADER_SIZE], bodySize); - INFO_STREAM << m_sslSocket.lowest_layer().remote_endpoint() - << " >>>> " << bodySize << " BYTE" << endl; + #ifdef VERBOSE_DEBUG + INFO_STREAM << "SSLSession::startReadRequestBody() " + << remoteEndpoint << " >>>> " << bodySize << " byte" << endl; + #endif boost::asio::async_read(m_sslSocket, mutableBuffer, m_strand.wrap(boost::bind(&SSLSession::handleReadRequestBody, @@ -161,8 +169,10 @@ void SSLSession::startWriteResponse() response_sp->SerializeToArray(&writeBuff[HEADER_SIZE], bodySize); - INFO_STREAM << m_sslSocket.lowest_layer().remote_endpoint() - << " <<<< " << bodySize << " BYTE" << endl; + #ifdef VERBOSE_DEBUG + INFO_STREAM << "SSLSession::startWriteResponse() " + << remoteEndpoint << " <<<< " << bodySize << " byte" << endl; + #endif boost::asio::async_write(m_sslSocket, boost::asio::buffer(writeBuff), m_strand.wrap(boost::bind(&SSLSession::handleWriteResponse, @@ -170,11 +180,13 @@ void SSLSession::startWriteResponse() } catch(std::runtime_error& ec) { - ERROR_STREAM << "SSLSession::startWriteResponse() " << ec.what() << endl; + ERROR_STREAM << "SSLSession::startWriteResponse() " + << ec.what() << " from " << remoteEndpoint << endl; } catch(...) { - ERROR_STREAM << "SSLSession::startWriteResponse() unknown error" << endl; + ERROR_STREAM << "SSLSession::startWriteResponse() unknown error from " + << remoteEndpoint << endl; } } diff --git a/src/Server.cpp b/src/Server.cpp index a035dcd5ae98a44b47fc52502572d7940d26612c..0358a956d211161044904604742bb50b83ac9267 100644 --- a/src/Server.cpp +++ b/src/Server.cpp @@ -69,7 +69,13 @@ void Server::start() throw(std::runtime_error) std::string localHost = m_configuration_sp->getLocalHost(); unsigned int localPort = m_configuration_sp->getLocalPort(); - INFO_STREAM << "LISTENING ON " << localHost << ":" << localPort << endl; + std::stringstream infoStream; + infoStream << "Listening on " << localHost << ":" << localPort << endl; + + INFO_STREAM << "Server::start()" << infoStream.str() << endl; + + writeState(Tango::ON); + writeStatus(infoStream.str()); boost::asio::ip::tcp::resolver::query query(localHost, boost::lexical_cast<std::string>(localPort)); @@ -101,6 +107,9 @@ void Server::stop() throw(std::runtime_error) { DEBUG_STREAM << "Server::stop()" << endl; + writeState(Tango::OFF); + writeStatus("Disconnected"); + boost::system::error_code errorCode; m_acceptor_sp->close(errorCode); @@ -181,7 +190,7 @@ void Server::handleAccept(Session::SP session_sp, } else { - WARN_STREAM << "Server::handleAccept() " << ec.message() << endl; + ERROR_STREAM << "Server::handleAccept() " << ec.message() << endl; } startAccept(); diff --git a/src/Session.cpp b/src/Session.cpp index 33929976f80a730d42184fd18aaabcd2f2671f79..8fa49c54aa534929b7e72e4fb4754849221a6b10 100644 --- a/src/Session.cpp +++ b/src/Session.cpp @@ -40,11 +40,13 @@ void Session::handleReadRequestHeader(const boost::system::error_code& errorCode } else if(errorCode == boost::asio::error::eof) { - DEBUG_STREAM << "Session::handleReadRequestBody() end of file" << endl; + DEBUG_STREAM << "Session::handleReadRequestBody() end of file from " + << remoteEndpoint << endl; } else { - WARN_STREAM << "Session::handleReadRequestHeader() " << errorCode.message() << endl; + ERROR_STREAM << "Session::handleReadRequestHeader() " + << errorCode.message() << " from " << remoteEndpoint << endl; } } @@ -61,11 +63,13 @@ void Session::handleReadRequestBody(const boost::system::error_code& errorCode) } else if(errorCode == boost::asio::error::eof) { - DEBUG_STREAM << "Session::handleReadRequestBody() end of file" << endl; + DEBUG_STREAM << "Session::handleReadRequestBody() end of file from" + << remoteEndpoint << endl; } else { - WARN_STREAM << "Session::handleReadRequestBody() " << errorCode.message() << endl; + ERROR_STREAM << "Session::handleReadRequestBody() " + << errorCode.message() << " from " << remoteEndpoint << endl; } } @@ -82,11 +86,13 @@ void Session::handleWriteResponse(const boost::system::error_code& errorCode) } else if(errorCode == boost::asio::error::eof) { - DEBUG_STREAM << "Session::handleWriteResponse() end of file" << endl; + DEBUG_STREAM << "Session::handleWriteResponse() end of file from " + << remoteEndpoint << endl; } else { - WARN_STREAM << "Session::handleWriteResponse() " << errorCode.message() << endl; + ERROR_STREAM << "Session::handleWriteResponse() " + << errorCode.message() << " from " << remoteEndpoint << endl; } } diff --git a/src/Session.h b/src/Session.h index 65e7381f0a0b5867b2d15389cafebeea5125ab2b..a99332095dd374785dac756f7a4000fc8f4287b1 100644 --- a/src/Session.h +++ b/src/Session.h @@ -89,6 +89,9 @@ protected: //Binary buffer for read data std::vector<boost::uint8_t> m_readBuff; + + //Address and port of remote endpoint + std::string remoteEndpoint; }; } //End of namespace