Commit 1d1369db authored by Marco De Marco's avatar Marco De Marco
Browse files

Data model verifier class added

parent 1c48823d
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -84,6 +84,9 @@ protected:
		std::string m_user;	
	};

//------------------------------------------------------------------------------
//	[Protected] shared pointer typedef	
//------------------------------------------------------------------------------    
	typedef boost::shared_ptr< soci::connection_pool > PoolSP;
    
//------------------------------------------------------------------------------
+5 −1
Original line number Diff line number Diff line
@@ -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>

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 */