Loading src/ConnectionManager.h +3 −0 Original line number Diff line number Diff line Loading @@ -84,6 +84,9 @@ protected: std::string m_user; }; //------------------------------------------------------------------------------ // [Protected] shared pointer typedef //------------------------------------------------------------------------------ typedef boost::shared_ptr< soci::connection_pool > PoolSP; //------------------------------------------------------------------------------ Loading src/DMDBImporter.h +5 −1 Original line number Diff line number Diff line Loading @@ -2,12 +2,16 @@ #define DMDB_IMPORTER_H #include <Instrument.h> #include <tango.h> #include <stdexcept> #include <boost/shared_ptr.hpp> #include <boost/optional/optional.hpp> #include <boost/tuple/tuple.hpp> #include <boost/optional/optional.hpp> #include <boost/scoped_ptr.hpp> #include <soci/error.h> #include <soci/session.h> Loading src/DMDBVerifier.cpp 0 → 100644 +157 −0 Original line number Diff line number Diff line #include <DMDBVerifier.h> #include <algorithm> #include <boost/bind.hpp> #include <soci.h> #include <soci/rowset.h> #include <soci/use.h> #include <soci/boost-optional.h> #include <soci/boost-tuple.h> namespace FitsImporter_ns { //============================================================================== // DMDBVerifier::DMDBVerifier() //============================================================================== DMDBVerifier::DMDBVerifier(Tango::DeviceImpl* deviceImpl_p, ConnectionManager::SP connectionManager_sp) : Tango::LogAdapter(deviceImpl_p), m_connectionManager_sp(connectionManager_sp) { DEBUG_STREAM << "DMDBVerifier::DMDBVerifier()" << endl; } //============================================================================== // DMDBVerifier::~DMDBVerifier() //============================================================================== DMDBVerifier::~DMDBVerifier() { DEBUG_STREAM << "DMDBVerifier::~DMDBVerifier()" << endl; } //============================================================================== // DMDBVerifier::create() //============================================================================== DMDBVerifier::SP DMDBVerifier::create(Tango::DeviceImpl* deviceImpl_p, ConnectionManager::SP connectionManager_sp) { DMDBVerifier::SP d_sp(new DMDBVerifier(deviceImpl_p, connectionManager_sp), DMDBVerifier::Deleter()); return d_sp; } //============================================================================== // DMDBVerifier::testInstrumentListMapping() //============================================================================== void DMDBVerifier::testInstrumentListMapping(Instrument::SPVector instrument_spvector) throw(soci::soci_error, std::runtime_error) { DEBUG_STREAM << "DMDBVerifier::testInstrumentListMapping()" << endl; Instrument::SPVector::iterator it; for(it=instrument_spvector.begin(); it!=instrument_spvector.end(); ++it) testInstrumentMapping(*it); } //============================================================================== // DMDBVerifier::testInstrumentMapping() //============================================================================== void DMDBVerifier::testInstrumentMapping(Instrument::SP instrument_sp) throw(soci::soci_error, std::runtime_error) { DEBUG_STREAM << "DMDBVerifier::testInstrumentMapping()" << endl; Destination::SP destination_sp = instrument_sp->getDestination(); Mapping::SPVector mapping_spvector = destination_sp->getMappingSPVector(); ConnectionManager::SessionSP session_sp = m_connectionManager_sp->getSession(destination_sp); soci::rowset< ColumnTuple > rows = (session_sp->prepare << "SELECT column_name, column_type from information_schema.columns where " "table_schema like :schema and table_name like :table", soci::use(destination_sp->getSchema(), "schema"), soci::use(destination_sp->getTable(), "table")); ColumnTupleVector columnTuple_vector; std::copy(rows.begin(), rows.end(), std::back_inserter(columnTuple_vector)); try { testColumnDefinition(columnTuple_vector, "id", "mediumint"); testColumnDefinition(columnTuple_vector,"file_path","varchar"); testColumnDefinition(columnTuple_vector,"file_version","smallint"); testColumnDefinition(columnTuple_vector,"file_name","varchar"); testColumnDefinition(columnTuple_vector,"update_time","timestamp"); Mapping::SPVector::iterator it; for(it=mapping_spvector.begin(); it!=mapping_spvector.end(); ++it) testColumnDefinition(columnTuple_vector, (*it)->getColumnName(), (*it)->getColumnType()); } catch(std::runtime_error& ex) { std::stringstream error_stream; error_stream << "DMDBVerifier::testInstrumentMapping() " << destination_sp->getHost() << ":" << destination_sp->getPort() << destination_sp->getSchema() << "." << destination_sp->getTable() << " " << ex.what(); throw std::runtime_error(error_stream.str()); } } //============================================================================== // DMDBVerifier::testColumnDefinition() //============================================================================== void DMDBVerifier::testColumnDefinition(ColumnTupleVector& columnTuple_vector, std::string columnName, std::string columnType) throw(std::runtime_error) { DEBUG_STREAM << "testColumnDefinition::testColumn()" << endl; ColumnTupleVector::iterator it; it = std::find_if(columnTuple_vector.begin(), columnTuple_vector.end(), boost::bind(&DMDBVerifier::isEqual, this, _1, columnName)); if(it == columnTuple_vector.end()) { std::stringstream error_stream; error_stream << "\"" << columnName << "\" column not exists"; throw std::runtime_error(error_stream.str()); } if(it->get<1>()) { std::stringstream error_stream; error_stream << "\"" << columnName << "\" empty column type " "retrieved from information schema"; throw std::runtime_error(error_stream.str()); } if(it->get<1>().get().find(columnType) == std::string::npos) { std::stringstream error_stream; error_stream << "\"" << columnName << "\" column with " << columnType << "\" type differs form information schema"; throw std::runtime_error(error_stream.str()); } } //============================================================================== // DMDBVerifier::isEqual() //============================================================================== bool DMDBVerifier::isEqual(ColumnTuple columnTuple, std::string columnName) throw(std::runtime_error) { DEBUG_STREAM << "DMDBVerifier::isEqual()" << endl; if(!columnTuple.get<0>()) return false; return columnTuple.get<0>().get().compare(columnName) == 0; } } //namespace No newline at end of file src/DMDBVerifier.h 0 → 100644 +82 −0 Original line number Diff line number Diff line #ifndef DMDB_VERIFIER_H #define DMDB_VERIFIER_H #include <ConnectionManager.h> #include <Instrument.h> #include <tango.h> #include <boost/shared_ptr.hpp> #include <boost/tuple/tuple.hpp> #include <boost/optional/optional.hpp> #include <soci/error.h> namespace FitsImporter_ns { class DMDBVerifier : public Tango::LogAdapter { public: //------------------------------------------------------------------------------ // [Public] Shared pointer typedef //------------------------------------------------------------------------------ typedef boost::shared_ptr<DMDBVerifier> SP; protected: //------------------------------------------------------------------------------ // [Protected] Constructor destructor deleter //------------------------------------------------------------------------------ DMDBVerifier(Tango::DeviceImpl*, ConnectionManager::SP); virtual ~DMDBVerifier(); class Deleter; friend class Deleter; class Deleter { public: void operator()(DMDBVerifier* d) { delete d; } }; public: //------------------------------------------------------------------------------ // [Public] Users methods //------------------------------------------------------------------------------ static DMDBVerifier::SP create(Tango::DeviceImpl*, ConnectionManager::SP); virtual void testInstrumentListMapping(Instrument::SPVector) throw(soci::soci_error, std::runtime_error); virtual void testInstrumentMapping(Instrument::SP) throw(soci::soci_error, std::runtime_error); protected: //------------------------------------------------------------------------------ // [Protected] Columns tuple typedef //------------------------------------------------------------------------------ typedef boost::tuple< boost::optional<std::string>, boost::optional<std::string> > ColumnTuple; typedef std::vector< ColumnTuple > ColumnTupleVector; //------------------------------------------------------------------------------ // [Protected] Utilities methods //------------------------------------------------------------------------------ virtual void testColumnDefinition(ColumnTupleVector&, std::string, std::string) throw(std::runtime_error); virtual bool isEqual(ColumnTuple, std::string) throw(std::runtime_error); //------------------------------------------------------------------------------ // [Protected] Class variables //------------------------------------------------------------------------------ //Connection manager shared pointer ConnectionManager::SP m_connectionManager_sp; }; } //End of namespace #endif /* DMDB_VERIFIER_H */ Loading
src/ConnectionManager.h +3 −0 Original line number Diff line number Diff line Loading @@ -84,6 +84,9 @@ protected: std::string m_user; }; //------------------------------------------------------------------------------ // [Protected] shared pointer typedef //------------------------------------------------------------------------------ typedef boost::shared_ptr< soci::connection_pool > PoolSP; //------------------------------------------------------------------------------ Loading
src/DMDBImporter.h +5 −1 Original line number Diff line number Diff line Loading @@ -2,12 +2,16 @@ #define DMDB_IMPORTER_H #include <Instrument.h> #include <tango.h> #include <stdexcept> #include <boost/shared_ptr.hpp> #include <boost/optional/optional.hpp> #include <boost/tuple/tuple.hpp> #include <boost/optional/optional.hpp> #include <boost/scoped_ptr.hpp> #include <soci/error.h> #include <soci/session.h> Loading
src/DMDBVerifier.cpp 0 → 100644 +157 −0 Original line number Diff line number Diff line #include <DMDBVerifier.h> #include <algorithm> #include <boost/bind.hpp> #include <soci.h> #include <soci/rowset.h> #include <soci/use.h> #include <soci/boost-optional.h> #include <soci/boost-tuple.h> namespace FitsImporter_ns { //============================================================================== // DMDBVerifier::DMDBVerifier() //============================================================================== DMDBVerifier::DMDBVerifier(Tango::DeviceImpl* deviceImpl_p, ConnectionManager::SP connectionManager_sp) : Tango::LogAdapter(deviceImpl_p), m_connectionManager_sp(connectionManager_sp) { DEBUG_STREAM << "DMDBVerifier::DMDBVerifier()" << endl; } //============================================================================== // DMDBVerifier::~DMDBVerifier() //============================================================================== DMDBVerifier::~DMDBVerifier() { DEBUG_STREAM << "DMDBVerifier::~DMDBVerifier()" << endl; } //============================================================================== // DMDBVerifier::create() //============================================================================== DMDBVerifier::SP DMDBVerifier::create(Tango::DeviceImpl* deviceImpl_p, ConnectionManager::SP connectionManager_sp) { DMDBVerifier::SP d_sp(new DMDBVerifier(deviceImpl_p, connectionManager_sp), DMDBVerifier::Deleter()); return d_sp; } //============================================================================== // DMDBVerifier::testInstrumentListMapping() //============================================================================== void DMDBVerifier::testInstrumentListMapping(Instrument::SPVector instrument_spvector) throw(soci::soci_error, std::runtime_error) { DEBUG_STREAM << "DMDBVerifier::testInstrumentListMapping()" << endl; Instrument::SPVector::iterator it; for(it=instrument_spvector.begin(); it!=instrument_spvector.end(); ++it) testInstrumentMapping(*it); } //============================================================================== // DMDBVerifier::testInstrumentMapping() //============================================================================== void DMDBVerifier::testInstrumentMapping(Instrument::SP instrument_sp) throw(soci::soci_error, std::runtime_error) { DEBUG_STREAM << "DMDBVerifier::testInstrumentMapping()" << endl; Destination::SP destination_sp = instrument_sp->getDestination(); Mapping::SPVector mapping_spvector = destination_sp->getMappingSPVector(); ConnectionManager::SessionSP session_sp = m_connectionManager_sp->getSession(destination_sp); soci::rowset< ColumnTuple > rows = (session_sp->prepare << "SELECT column_name, column_type from information_schema.columns where " "table_schema like :schema and table_name like :table", soci::use(destination_sp->getSchema(), "schema"), soci::use(destination_sp->getTable(), "table")); ColumnTupleVector columnTuple_vector; std::copy(rows.begin(), rows.end(), std::back_inserter(columnTuple_vector)); try { testColumnDefinition(columnTuple_vector, "id", "mediumint"); testColumnDefinition(columnTuple_vector,"file_path","varchar"); testColumnDefinition(columnTuple_vector,"file_version","smallint"); testColumnDefinition(columnTuple_vector,"file_name","varchar"); testColumnDefinition(columnTuple_vector,"update_time","timestamp"); Mapping::SPVector::iterator it; for(it=mapping_spvector.begin(); it!=mapping_spvector.end(); ++it) testColumnDefinition(columnTuple_vector, (*it)->getColumnName(), (*it)->getColumnType()); } catch(std::runtime_error& ex) { std::stringstream error_stream; error_stream << "DMDBVerifier::testInstrumentMapping() " << destination_sp->getHost() << ":" << destination_sp->getPort() << destination_sp->getSchema() << "." << destination_sp->getTable() << " " << ex.what(); throw std::runtime_error(error_stream.str()); } } //============================================================================== // DMDBVerifier::testColumnDefinition() //============================================================================== void DMDBVerifier::testColumnDefinition(ColumnTupleVector& columnTuple_vector, std::string columnName, std::string columnType) throw(std::runtime_error) { DEBUG_STREAM << "testColumnDefinition::testColumn()" << endl; ColumnTupleVector::iterator it; it = std::find_if(columnTuple_vector.begin(), columnTuple_vector.end(), boost::bind(&DMDBVerifier::isEqual, this, _1, columnName)); if(it == columnTuple_vector.end()) { std::stringstream error_stream; error_stream << "\"" << columnName << "\" column not exists"; throw std::runtime_error(error_stream.str()); } if(it->get<1>()) { std::stringstream error_stream; error_stream << "\"" << columnName << "\" empty column type " "retrieved from information schema"; throw std::runtime_error(error_stream.str()); } if(it->get<1>().get().find(columnType) == std::string::npos) { std::stringstream error_stream; error_stream << "\"" << columnName << "\" column with " << columnType << "\" type differs form information schema"; throw std::runtime_error(error_stream.str()); } } //============================================================================== // DMDBVerifier::isEqual() //============================================================================== bool DMDBVerifier::isEqual(ColumnTuple columnTuple, std::string columnName) throw(std::runtime_error) { DEBUG_STREAM << "DMDBVerifier::isEqual()" << endl; if(!columnTuple.get<0>()) return false; return columnTuple.get<0>().get().compare(columnName) == 0; } } //namespace No newline at end of file
src/DMDBVerifier.h 0 → 100644 +82 −0 Original line number Diff line number Diff line #ifndef DMDB_VERIFIER_H #define DMDB_VERIFIER_H #include <ConnectionManager.h> #include <Instrument.h> #include <tango.h> #include <boost/shared_ptr.hpp> #include <boost/tuple/tuple.hpp> #include <boost/optional/optional.hpp> #include <soci/error.h> namespace FitsImporter_ns { class DMDBVerifier : public Tango::LogAdapter { public: //------------------------------------------------------------------------------ // [Public] Shared pointer typedef //------------------------------------------------------------------------------ typedef boost::shared_ptr<DMDBVerifier> SP; protected: //------------------------------------------------------------------------------ // [Protected] Constructor destructor deleter //------------------------------------------------------------------------------ DMDBVerifier(Tango::DeviceImpl*, ConnectionManager::SP); virtual ~DMDBVerifier(); class Deleter; friend class Deleter; class Deleter { public: void operator()(DMDBVerifier* d) { delete d; } }; public: //------------------------------------------------------------------------------ // [Public] Users methods //------------------------------------------------------------------------------ static DMDBVerifier::SP create(Tango::DeviceImpl*, ConnectionManager::SP); virtual void testInstrumentListMapping(Instrument::SPVector) throw(soci::soci_error, std::runtime_error); virtual void testInstrumentMapping(Instrument::SP) throw(soci::soci_error, std::runtime_error); protected: //------------------------------------------------------------------------------ // [Protected] Columns tuple typedef //------------------------------------------------------------------------------ typedef boost::tuple< boost::optional<std::string>, boost::optional<std::string> > ColumnTuple; typedef std::vector< ColumnTuple > ColumnTupleVector; //------------------------------------------------------------------------------ // [Protected] Utilities methods //------------------------------------------------------------------------------ virtual void testColumnDefinition(ColumnTupleVector&, std::string, std::string) throw(std::runtime_error); virtual bool isEqual(ColumnTuple, std::string) throw(std::runtime_error); //------------------------------------------------------------------------------ // [Protected] Class variables //------------------------------------------------------------------------------ //Connection manager shared pointer ConnectionManager::SP m_connectionManager_sp; }; } //End of namespace #endif /* DMDB_VERIFIER_H */