Commit 01111a8d authored by Marco De Marco's avatar Marco De Marco
Browse files

Database protocol added

parent 80f860db
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -30,4 +30,6 @@ message Request
		required int32 file_version = 2;
		required string file_name = 3;
	}

	optional Data data = 3;
}
+33 −37
Original line number Diff line number Diff line
@@ -31,19 +31,17 @@ protected:
	Configuration(std::string certificateFile, std::string privateKeyFile,
        std::string dHTempFile, ExportedTablesMap exportedTablesMap,
        AuthorisedUsersMap authorisedUsersMap, std::string storagePath,
        std::string localHost, unsigned int localPort, unsigned int workerNumber) :
//        std::string localHost, unsigned int localPort, unsigned int workerNumber,
//        std::string databaseHost, unsigned int databasePort,
//        std::string databaseUsername, std::string databasePassword,
//        unsigned int databaseConnectionNumber) :
        std::string localHost, unsigned int localPort, unsigned int workerNumber,
        std::string databaseHost, unsigned int databasePort,
        std::string databaseUsername, std::string databasePassword,
        unsigned int databaseConnectionNumber) :
        m_certificateFile(certificateFile), m_privateKeyFile(privateKeyFile),
        m_dHTempFile(dHTempFile), m_exportedTablesMap(exportedTablesMap),
        m_authorisedUsersMap(authorisedUsersMap), m_storagePath(storagePath),
        m_localHost(localHost), m_localPort(localPort), m_workerNumber(workerNumber) {}
//        m_localHost(localHost), m_localPort(localPort), m_workerNumber(workerNumber),
//        m_databaseHost(databaseHost), m_databasePort(databasePort),
//        m_databaseUsername(databaseUsername), m_databasePassword(databasePassword),
//        m_databaseConnectionNumber(databaseConnectionNumber) {}
        m_localHost(localHost), m_localPort(localPort), m_workerNumber(workerNumber),
        m_databaseHost(databaseHost), m_databasePort(databasePort),
        m_databaseUsername(databaseUsername), m_databasePassword(databasePassword),
        m_databaseConnectionNumber(databaseConnectionNumber) {}

	virtual ~Configuration() {}

@@ -63,17 +61,15 @@ public:
        std::string privateKeyFile, std::string dHTempFile,
        ExportedTablesMap exportedTablesMap, AuthorisedUsersMap authorisedUsersMap,
        std::string storagePath, std::string localHost,
        unsigned int localPort, unsigned int workerNumber)
//        unsigned int localPort, unsigned int workerNumber,
//        std::string databaseHost, unsigned int databasePort,
//        std::string databaseUsername, std::string databasePassword,
//        unsigned int databaseConnectionNumber)
        unsigned int localPort, unsigned int workerNumber,
        std::string databaseHost, unsigned int databasePort,
        std::string databaseUsername, std::string databasePassword,
        unsigned int databaseConnectionNumber)
	{
		Configuration::SP c_sp(new Configuration(certificateFile, privateKeyFile,
            dHTempFile, exportedTablesMap, authorisedUsersMap, storagePath,
            localHost, localPort, workerNumber),
//            localHost, localPort, workerNumber, databaseHost, databasePort,
//            databaseUsername, databasePassword, databaseConnectionNumber),
            localHost, localPort, workerNumber, databaseHost, databasePort,
            databaseUsername, databasePassword, databaseConnectionNumber),
            Configuration::Deleter());

		return c_sp;
@@ -91,11 +87,11 @@ public:
	std::string getLocalHost() const { return m_localHost; }
	unsigned int getLocalPort() const { return m_localPort; }
	unsigned int getWorkerNumber() const { return m_workerNumber; }
//	std::string getDatabaseHost() const { return m_databaseHost; }
//	unsigned int getDatabasePort() const { return m_databasePort; }
//	std::string getDatabaseUsername() const { return m_databaseUsername; }
//	std::string getDatabasePassword() const { return m_databasePassword; }
//    unsigned int getDatabaseConnectionNumber() const { return m_databaseConnectionNumber; }
	std::string getDatabaseHost() const { return m_databaseHost; }
	unsigned int getDatabasePort() const { return m_databasePort; }
	std::string getDatabaseUsername() const { return m_databaseUsername; }
	std::string getDatabasePassword() const { return m_databasePassword; }
    unsigned int getDatabaseConnectionNumber() const { return m_databaseConnectionNumber; }

//------------------------------------------------------------------------------
//	[Public] Utilities methods
@@ -159,20 +155,20 @@ protected:
	//Number of threads that call io service run methods
	const unsigned int m_workerNumber;

//	//Metadata database host
//	const std::string m_databaseHost;
//
//	//Metadata database port
//	const unsigned int m_databasePort;
//
//	//Metadata database login username
//	const std::string m_databaseUsername;
//
//	//Metadata database login password
//	const std::string m_databasePassword;
//
//    //Metadata database connections number
//    const unsigned int m_databaseConnectionNumber;
	//Metadata database host
	const std::string m_databaseHost;

	//Metadata database port
	const unsigned int m_databasePort;

	//Metadata database login username
	const std::string m_databaseUsername;

	//Metadata database login password
	const std::string m_databasePassword;

    //Metadata database connections number
    const unsigned int m_databaseConnectionNumber;
};

}   //End of namespace

src/DBManager.cpp

0 → 100644
+80 −0
Original line number Diff line number Diff line
#include <DBManager.h>

#include <boost/date_time.hpp>

#include <soci/mysql/soci-mysql.h>
#include <soci/use.h>

namespace DataExporter_ns
{

//==============================================================================
//      DBManager::DBManager()
//==============================================================================
DBManager::DBManager(Tango::DeviceImpl* deviceImpl_p,
    Configuration::SP configuration_sp) : Tango::LogAdapter(deviceImpl_p),
    m_configuration_sp(configuration_sp)
{
    DEBUG_STREAM << "DBManager::DBManager()" << endl;
}

//==============================================================================
//      DBManager::DBManager()
//==============================================================================
DBManager::~DBManager()
{
    DEBUG_STREAM << "DBManager::~DBManager()" << endl;
}

//==============================================================================
//      DBManager::DBManager()
//==============================================================================
DBManager::SP DBManager::create(Tango::DeviceImpl* deviceImpl_p,
    Configuration::SP configuration_sp)
{
    DBManager::SP d_sp(new DBManager(deviceImpl_p, configuration_sp),
        DBManager::Deleter());

    return d_sp;
}

//==============================================================================
//      DBManager::connect()
//==============================================================================
void DBManager::connect() throw(soci::soci_error)
{
    DEBUG_STREAM << "DBManager::connect()" << endl;

    boost::mutex::scoped_lock lock(m_connectionPoolMutex);

    unsigned int connectionNumber = m_configuration_sp->getDatabaseConnectionNumber();

    m_connectionPool_sp.reset(new soci::connection_pool(connectionNumber));

    std::stringstream connection;
    connection << " host=" << m_configuration_sp->getDatabaseHost();
    connection << " port=" << m_configuration_sp->getDatabasePort();
    connection << " user=" << m_configuration_sp->getDatabaseUsername();
    connection << " password=" << m_configuration_sp->getDatabasePassword();

    #ifdef VERBOSE_DEBUG
        INFO_STREAM << "DBManager::connect(): " << connection.str() << endl;
    #endif

    for(unsigned int i=0; i<connectionNumber; ++i)
        m_connectionPool_sp->at(i).open(soci::mysql, connection.str());
}

//==============================================================================
//      DBManager::disconnect()
//==============================================================================
void DBManager::disconnect()
{
    DEBUG_STREAM << "DBManager::disconnect()" << endl;

    boost::mutex::scoped_lock lock(m_connectionPoolMutex);

    m_connectionPool_sp.reset();
}

}   //namespace

src/DBManager.h

0 → 100644
+80 −0
Original line number Diff line number Diff line
#ifndef DBMANAGER_H
#define	DBMANAGER_H

#include <Configuration.h>

#include <tango.h>

#include <ctime>

#include <boost/tuple/tuple.hpp>
#include <boost/optional/optional.hpp>
#include <boost/scoped_ptr.hpp>
#include <boost/thread/mutex.hpp>

#include <soci/soci.h>
#include <soci/error.h>
#include <soci/row.h>
#include <soci/rowset.h>
#include <soci/boost-tuple.h>
#include <soci/boost-optional.h>
#include <soci/session.h>
#include <soci/connection-pool.h>

namespace DataExporter_ns
{

class DBManager : public Tango::LogAdapter
{
public:
//------------------------------------------------------------------------------
//  [Public] Shared pointer typedef
//------------------------------------------------------------------------------
    typedef boost::shared_ptr<DBManager> SP;

protected:
//------------------------------------------------------------------------------
//  [Protected] Constructor destructor deleter
//------------------------------------------------------------------------------
    DBManager(Tango::DeviceImpl*, Configuration::SP);

    virtual ~DBManager();

    class Deleter;
    friend Deleter;
    class Deleter
    {
        public:
            void operator()(DBManager* d) { delete d; }
    };

public:
//------------------------------------------------------------------------------
//	[Public] Class creation method
//------------------------------------------------------------------------------
    static DBManager::SP create(Tango::DeviceImpl*, Configuration::SP);

//------------------------------------------------------------------------------
//  [Public] Connection management methods
//------------------------------------------------------------------------------
    virtual void connect() throw(soci::soci_error);

    virtual void disconnect();

protected:
//------------------------------------------------------------------------------
//  [Protected] Class variables
//------------------------------------------------------------------------------
    //Configuration shared pointer
    Configuration::SP m_configuration_sp;

    //Connection pool mutex
    boost::mutex m_connectionPoolMutex;

    //Database connection pool scoped pointer
    boost::scoped_ptr<soci::connection_pool> m_connectionPool_sp;
};

}   //End of namespace

#endif	/* DBMANAGER_H */
+82 −83
Original line number Diff line number Diff line
@@ -208,11 +208,11 @@ void DataExporter::get_device_property()
	dev_prop.push_back(Tango::DbDatum("LocalPort"));
	dev_prop.push_back(Tango::DbDatum("WorkerNumber"));
	dev_prop.push_back(Tango::DbDatum("EnableSSL"));
//	dev_prop.push_back(Tango::DbDatum("DatabaseHost"));
//	dev_prop.push_back(Tango::DbDatum("DatabasePort"));
//	dev_prop.push_back(Tango::DbDatum("DatabaseUsername"));
//	dev_prop.push_back(Tango::DbDatum("DatabasePassword"));
//	dev_prop.push_back(Tango::DbDatum("DatabaseConnectionNumber"));
	dev_prop.push_back(Tango::DbDatum("DatabaseHost"));
	dev_prop.push_back(Tango::DbDatum("DatabasePort"));
	dev_prop.push_back(Tango::DbDatum("DatabaseUsername"));
	dev_prop.push_back(Tango::DbDatum("DatabasePassword"));
	dev_prop.push_back(Tango::DbDatum("DatabaseConnectionNumber"));

	//	is there at least one property to be read ?
	if (dev_prop.size()>0)
@@ -337,60 +337,60 @@ void DataExporter::get_device_property()
		//	And try to extract EnableSSL value from database
		if (dev_prop[i].is_empty()==false)	dev_prop[i]  >>  enableSSL;

//		//	Try to initialize DatabaseHost from class property
//		cl_prop = ds_class->get_class_property(dev_prop[++i].name);
//		if (cl_prop.is_empty()==false)	cl_prop  >>  databaseHost;
//		else {
//			//	Try to initialize DatabaseHost from default device value
//			def_prop = ds_class->get_default_device_property(dev_prop[i].name);
//			if (def_prop.is_empty()==false)	def_prop  >>  databaseHost;
//		}
//		//	And try to extract DatabaseHost value from database
//		if (dev_prop[i].is_empty()==false)	dev_prop[i]  >>  databaseHost;
//
//		//	Try to initialize DatabasePort from class property
//		cl_prop = ds_class->get_class_property(dev_prop[++i].name);
//		if (cl_prop.is_empty()==false)	cl_prop  >>  databasePort;
//		else {
//			//	Try to initialize DatabasePort from default device value
//			def_prop = ds_class->get_default_device_property(dev_prop[i].name);
//			if (def_prop.is_empty()==false)	def_prop  >>  databasePort;
//		}
//		//	And try to extract DatabasePort value from database
//		if (dev_prop[i].is_empty()==false)	dev_prop[i]  >>  databasePort;
//
//		//	Try to initialize DatabaseUsername from class property
//		cl_prop = ds_class->get_class_property(dev_prop[++i].name);
//		if (cl_prop.is_empty()==false)	cl_prop  >>  databaseUsername;
//		else {
//			//	Try to initialize DatabaseUsername from default device value
//			def_prop = ds_class->get_default_device_property(dev_prop[i].name);
//			if (def_prop.is_empty()==false)	def_prop  >>  databaseUsername;
//		}
//		//	And try to extract DatabaseUsername value from database
//		if (dev_prop[i].is_empty()==false)	dev_prop[i]  >>  databaseUsername;
//
//		//	Try to initialize DatabasePassword from class property
//		cl_prop = ds_class->get_class_property(dev_prop[++i].name);
//		if (cl_prop.is_empty()==false)	cl_prop  >>  databasePassword;
//		else {
//			//	Try to initialize DatabasePassword from default device value
//			def_prop = ds_class->get_default_device_property(dev_prop[i].name);
//			if (def_prop.is_empty()==false)	def_prop  >>  databasePassword;
//		}
//		//	And try to extract DatabasePassword value from database
//		if (dev_prop[i].is_empty()==false)	dev_prop[i]  >>  databasePassword;
//
//		//	Try to initialize DatabaseConnectionNumber from class property
//		cl_prop = ds_class->get_class_property(dev_prop[++i].name);
//		if (cl_prop.is_empty()==false)	cl_prop  >>  databaseConnectionNumber;
//		else {
//			//	Try to initialize DatabaseConnectionNumber from default device value
//			def_prop = ds_class->get_default_device_property(dev_prop[i].name);
//			if (def_prop.is_empty()==false)	def_prop  >>  databaseConnectionNumber;
//		}
//		//	And try to extract DatabaseConnectionNumber value from database
//		if (dev_prop[i].is_empty()==false)	dev_prop[i]  >>  databaseConnectionNumber;
		//	Try to initialize DatabaseHost from class property
		cl_prop = ds_class->get_class_property(dev_prop[++i].name);
		if (cl_prop.is_empty()==false)	cl_prop  >>  databaseHost;
		else {
			//	Try to initialize DatabaseHost from default device value
			def_prop = ds_class->get_default_device_property(dev_prop[i].name);
			if (def_prop.is_empty()==false)	def_prop  >>  databaseHost;
		}
		//	And try to extract DatabaseHost value from database
		if (dev_prop[i].is_empty()==false)	dev_prop[i]  >>  databaseHost;

		//	Try to initialize DatabasePort from class property
		cl_prop = ds_class->get_class_property(dev_prop[++i].name);
		if (cl_prop.is_empty()==false)	cl_prop  >>  databasePort;
		else {
			//	Try to initialize DatabasePort from default device value
			def_prop = ds_class->get_default_device_property(dev_prop[i].name);
			if (def_prop.is_empty()==false)	def_prop  >>  databasePort;
		}
		//	And try to extract DatabasePort value from database
		if (dev_prop[i].is_empty()==false)	dev_prop[i]  >>  databasePort;

		//	Try to initialize DatabaseUsername from class property
		cl_prop = ds_class->get_class_property(dev_prop[++i].name);
		if (cl_prop.is_empty()==false)	cl_prop  >>  databaseUsername;
		else {
			//	Try to initialize DatabaseUsername from default device value
			def_prop = ds_class->get_default_device_property(dev_prop[i].name);
			if (def_prop.is_empty()==false)	def_prop  >>  databaseUsername;
		}
		//	And try to extract DatabaseUsername value from database
		if (dev_prop[i].is_empty()==false)	dev_prop[i]  >>  databaseUsername;

		//	Try to initialize DatabasePassword from class property
		cl_prop = ds_class->get_class_property(dev_prop[++i].name);
		if (cl_prop.is_empty()==false)	cl_prop  >>  databasePassword;
		else {
			//	Try to initialize DatabasePassword from default device value
			def_prop = ds_class->get_default_device_property(dev_prop[i].name);
			if (def_prop.is_empty()==false)	def_prop  >>  databasePassword;
		}
		//	And try to extract DatabasePassword value from database
		if (dev_prop[i].is_empty()==false)	dev_prop[i]  >>  databasePassword;

		//	Try to initialize DatabaseConnectionNumber from class property
		cl_prop = ds_class->get_class_property(dev_prop[++i].name);
		if (cl_prop.is_empty()==false)	cl_prop  >>  databaseConnectionNumber;
		else {
			//	Try to initialize DatabaseConnectionNumber from default device value
			def_prop = ds_class->get_default_device_property(dev_prop[i].name);
			if (def_prop.is_empty()==false)	def_prop  >>  databaseConnectionNumber;
		}
		//	And try to extract DatabaseConnectionNumber value from database
		if (dev_prop[i].is_empty()==false)	dev_prop[i]  >>  databaseConnectionNumber;

	}

@@ -434,33 +434,32 @@ void DataExporter::get_device_property()
        if(localHost.empty())
            throw(invalid_argument("LocalHost property is empty or not defined"));

        if(localPort<1 || localPort>MAX_LOCAL_PORT)
        if(localPort<1 || localPort>MAX_PORT_NUMBER)
            throw(invalid_argument("LocalPort property out of range or not defined"));

        if(workerNumber<1 || workerNumber>MAX_WORKER_NUMBER)
            throw(invalid_argument("WorkerNumber property out of range or not defined"));

//        if(databaseHost.empty())
//            throw(invalid_argument("DatabaseHost property is empty or not defined"));
//
//        if(databasePort<1 || databasePort>MAX_DB_PORT)
//            throw(invalid_argument("DatabasePort property out of range or not defined"));
//
//        if(databaseUsername.empty())
//            throw(invalid_argument("DatabaseUsername property is empty or not defined"));
//
//        if(databasePassword.empty())
//            throw(invalid_argument("DatabasePassword property is empty or not defined"));
//
//        if(databaseConnectionNumber<1 || databaseConnectionNumber>MAX_DB_CONNECTION_NUMBER)
//            throw(invalid_argument("DatabaseConnectionNumber property out of range or not defined"));
        if(databaseHost.empty())
            throw(invalid_argument("DatabaseHost property is empty or not defined"));

        if(databasePort<1 || databasePort>MAX_PORT_NUMBER)
            throw(invalid_argument("DatabasePort property out of range or not defined"));

        if(databaseUsername.empty())
            throw(invalid_argument("DatabaseUsername property is empty or not defined"));

        if(databasePassword.empty())
            throw(invalid_argument("DatabasePassword property is empty or not defined"));

        if(databaseConnectionNumber<1 || databaseConnectionNumber>MAX_DB_CONNECTION_NUMBER)
            throw(invalid_argument("DatabaseConnectionNumber property out of range or not defined"));

        m_configuration_sp = Configuration::create(certificateFile,
            privateKeyFile, dHTempFile, exportedTablesMap, authorisedUsersMap,
            storagePath, localHost, localPort, workerNumber);
//            storagePath, localHost, localPort, workerNumber,
//            databaseHost, databasePort, databaseUsername, databasePassword,
//            databaseConnectionNumber);
            storagePath, localHost, localPort, workerNumber,
            databaseHost, databasePort, databaseUsername, databasePassword,
            databaseConnectionNumber);
    }
    catch(invalid_argument& ex)
    {
@@ -481,7 +480,7 @@ void DataExporter::get_device_property()
//--------------------------------------------------------
void DataExporter::always_executed_hook()
{
	INFO_STREAM << "DataExporter::always_executed_hook()  " << device_name << endl;
	DEBUG_STREAM << "DataExporter::always_executed_hook()  " << device_name << endl;
	/*----- PROTECTED REGION ID(DataExporter::always_executed_hook) ENABLED START -----*/

    if(get_state() != Tango::FAULT)
@@ -549,14 +548,14 @@ void DataExporter::on()
    }
    catch(std::exception& ex)
    {
        set_state(Tango::FAULT);
        set_state(Tango::ALARM);
        std::stringstream error_stream;
        error_stream << "DataExporter::On() " << ex.what() << std::endl;
        set_status(error_stream.str());
    }
    catch(...)
    {
        set_state(Tango::FAULT);
        set_state(Tango::ALARM);
        set_status("DataExporter::On() unknown error");
    }

@@ -581,14 +580,14 @@ void DataExporter::off()
    }
    catch(std::exception& ex)
    {
        set_state(Tango::FAULT);
        set_state(Tango::ALARM);
        std::stringstream error_stream;
        error_stream << "DataExporter::Off() " << ex.what() << std::endl;
        set_status(error_stream.str());
    }
    catch(...)
    {
        set_state(Tango::FAULT);
        set_state(Tango::ALARM);
        set_status("DataExporter::Off() unknown error");
    }

Loading