Commit ee250651 authored by Marco De Marco's avatar Marco De Marco
Browse files

Query delay parameter added

parent 8f884ac9
Loading
Loading
Loading
Loading
+13 −8
Original line number Diff line number Diff line
@@ -33,16 +33,17 @@ protected:
        unsigned int localPort, unsigned int workerNumber,
        std::string databaseHost, unsigned int databasePort,
        std::string databaseUsername, std::string databasePassword,
        unsigned int databaseConnectionNumber, std::vector<std::string>& ignoreColumns,
        ExportedTablesMap& exportedTablesMap, AuthorisedUsersMap& authorisedUsersMap) :
        unsigned int databaseConnectionNumber, unsigned int queryDelay,
		std::vector<std::string>& ignoreColumns,ExportedTablesMap& exportedTablesMap,
		AuthorisedUsersMap& authorisedUsersMap) :
		m_certificateFile(certificateFile), m_privateKeyFile(privateKeyFile),
        m_dHTempFile(dHTempFile), 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_ignoreColumnList(ignoreColumns),m_exportedTablesMap(exportedTablesMap),
        m_authorisedUsersMap(authorisedUsersMap) {}
        m_queryDelay(queryDelay), m_ignoreColumnList(ignoreColumns),
		m_exportedTablesMap(exportedTablesMap), m_authorisedUsersMap(authorisedUsersMap) {}

	virtual ~Configuration() {}

@@ -63,13 +64,13 @@ public:
        unsigned int localPort, unsigned int workerNumber, std::string databaseHost,
        unsigned int databasePort, std::string databaseUsername,
        std::string databasePassword, unsigned int databaseConnectionNumber,
        std::vector<std::string>& ignoreColumns, ExportedTablesMap& exportedTablesMap,
        AuthorisedUsersMap& authorisedUsersMap)
        unsigned int queryDelay, std::vector<std::string>& ignoreColumns,
		ExportedTablesMap& exportedTablesMap, AuthorisedUsersMap& authorisedUsersMap)
	{
		Configuration::SP c_sp(new Configuration(certificateFile, privateKeyFile,
            dHTempFile, localHost, localPort, workerNumber, databaseHost,
            databasePort, databaseUsername, databasePassword,
            databaseConnectionNumber, ignoreColumns, exportedTablesMap,
            databaseConnectionNumber, queryDelay, ignoreColumns, exportedTablesMap,
            authorisedUsersMap), Configuration::Deleter());

		return c_sp;
@@ -89,6 +90,7 @@ public:
	std::string getDatabaseUsername() const { return m_databaseUsername; }
	std::string getDatabasePassword() const { return m_databasePassword; }
    unsigned int getDatabaseConnectionNumber() const { return m_databaseConnectionNumber; }
	unsigned int getQueryDelay() const { return m_queryDelay; }

//------------------------------------------------------------------------------
//	[Public] Utilities methods
@@ -169,6 +171,9 @@ protected:
    //Metadata database connections number
    const unsigned int m_databaseConnectionNumber;

	//Upper threshold on update_time column
	const unsigned int m_queryDelay;

    //Metadata ignored columns vector
    const std::vector<std::string> m_ignoreColumnList;

+18 −9
Original line number Diff line number Diff line
@@ -134,18 +134,27 @@ DBManager::RowsetSP DBManager::retrieveNewTuples(std::string schema,
    if(session.get_backend() == NULL)
        session.reconnect();

//    @workaround: this does not work: timestamp parameter not passed
//    RowsetSP rows(new soci::rowset<soci::row>((session.prepare << "select * from "
//        << schema << "." << table << " where update_time > :timestamp "
//        << "order by update_time asc", soci::use(update_time,"timestamp"))));
    unsigned int queryDelay = m_configuration_sp->getQueryDelay();

    boost::posix_time::ptime timestamp = boost::posix_time::ptime_from_tm(update_time);

    RowsetSP rows(new soci::rowset<soci::row>(session.prepare << "select * from "
    RowsetSP rows;

    if(queryDelay>0)
    {
        rows.reset(new soci::rowset<soci::row>(session.prepare << "select * from "
            << schema << "." << table << " where update_time>'"
            << boost::posix_time::to_iso_string(timestamp)
        << "' and update_time<=DATE_SUB(now(), INTERVAL 1 SECOND)"
        << " order by update_time asc"));
            << "' and update_time<=DATE_SUB(now(), INTERVAL "
            << queryDelay << " SECOND) order by update_time asc"));
    }
    else
    {
        rows.reset(new soci::rowset<soci::row>(session.prepare << "select * from "
            << schema << "." << table << " where update_time>'"
            << boost::posix_time::to_iso_string(timestamp)
            << "'  order by update_time asc"));
    }

    return rows;
}
+66 −41
Original line number Diff line number Diff line
@@ -217,10 +217,11 @@ void MetadataExporter::get_device_property()
	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("QueryDelay"));
	dev_prop.push_back(Tango::DbDatum("IgnoreColumns"));
	dev_prop.push_back(Tango::DbDatum("ExportedTables"));
	dev_prop.push_back(Tango::DbDatum("AuthorisedUsers"));
	dev_prop.push_back(Tango::DbDatum("AutoStart"));
	dev_prop.push_back(Tango::DbDatum("IgnoreColumns"));

	//	is there at least one property to be read ?
	if (dev_prop.size()>0)
@@ -367,6 +368,28 @@ void MetadataExporter::get_device_property()
		//	And try to extract DatabaseConnectionNumber value from database
		if (dev_prop[i].is_empty()==false)	dev_prop[i]  >>  databaseConnectionNumber;

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

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

		//	Try to initialize ExportedTables from class property
		cl_prop = ds_class->get_class_property(dev_prop[++i].name);
		if (cl_prop.is_empty()==false)	cl_prop  >>  exportedTables;
@@ -399,18 +422,6 @@ void MetadataExporter::get_device_property()
		}
		//	And try to extract AutoStart value from database
		if (dev_prop[i].is_empty()==false)	dev_prop[i]  >>  autoStart;

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

	}

	/*----- PROTECTED REGION ID(MetadataExporter::get_device_property_after) ENABLED START -----*/
@@ -459,6 +470,11 @@ void MetadataExporter::get_device_property()
        if(databaseConnectionNumber<1 || databaseConnectionNumber>MAX_DB_CONNECTION_NUMBER)
            throw(invalid_argument("DatabaseConnectionNumber property out of range or not defined"));

        if(queryDelay>MAX_QUERY_DELAY)
            throw(invalid_argument("QueryDelay property out of range or not defined"));

        checkIgnoreColumns(ignoreColumns);

        if(exportedTables.empty())
            throw(invalid_argument("ExportedTables property is empty or not defined"));

@@ -469,36 +485,10 @@ void MetadataExporter::get_device_property()

        importAuthorisedUsers(authorisedUsers, authorisedUsersMap);

        for(std::vector<std::string>::size_type i=0; i<ignoreColumns.size(); ++i)
        {
            std::string ignoreColumn = ignoreColumns.at(i);

            if(ignoreColumn.empty())
            {
                stringstream event_list_error;
                event_list_error << "IgnoreColumns property has an empty element"
                    << " at \"" << i << "\" position" << endl;
                throw(invalid_argument(event_list_error.str()));
            }

            if(ignoreColumn.compare("id")==0 ||
                ignoreColumn.compare("storage_path")==0 ||
                ignoreColumn.compare("file_path")==0 ||
                ignoreColumn.compare("file_version")==0 ||
                ignoreColumn.compare("file_name")==0 ||
                ignoreColumn.compare("update_time")==0)
            {
                stringstream event_list_error;
                event_list_error << "IgnoreColumns property has an invalid element"
                    << " at \"" << i << "\" position" << endl;
                throw(invalid_argument(event_list_error.str()));
            }
        }

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

    if(get_state() != Tango::FAULT)
@@ -734,6 +724,41 @@ void MetadataExporter::importAuthorisedUsers(std::vector<std::string>& authorise
    }
}

//==============================================================================
//      MetadataExporter::checkIfFileExists()
//==============================================================================
void MetadataExporter::checkIgnoreColumns(std::vector<std::string>& ignoreColumns)
    throw(std::invalid_argument)
{
    DEBUG_STREAM << "MetadataExporter::checkIgnoreColumns()  - " << device_name << endl;

    for(std::vector<std::string>::size_type i=0; i<ignoreColumns.size(); ++i)
    {
        std::string ignoreColumn = ignoreColumns.at(i);

        if(ignoreColumn.empty())
        {
            stringstream event_list_error;
            event_list_error << "IgnoreColumns property has an empty element"
                << " at \"" << i << "\" position" << endl;
            throw(invalid_argument(event_list_error.str()));
        }

        if(ignoreColumn.compare("id")==0 ||
            ignoreColumn.compare("storage_path")==0 ||
            ignoreColumn.compare("file_path")==0 ||
            ignoreColumn.compare("file_version")==0 ||
            ignoreColumn.compare("file_name")==0 ||
            ignoreColumn.compare("update_time")==0)
        {
            stringstream event_list_error;
            event_list_error << "IgnoreColumns property has an invalid element"
                << " at \"" << i << "\" position" << endl;
            throw(invalid_argument(event_list_error.str()));
        }
    }
}

//==============================================================================
//      MetadataExporter::checkIfFileExists()
//==============================================================================
+13 −5
Original line number Diff line number Diff line
@@ -87,6 +87,9 @@ protected:
    //Max database port number allowed value
    static const unsigned int MAX_DB_PORT = 65535;

    //Max query delay
    static const unsigned int MAX_QUERY_DELAY = 60;

/*----- PROTECTED REGION END -----*/	//	MetadataExporter::Data Members

//	Device property data members
@@ -115,6 +118,12 @@ public:
	string	databasePassword;
	//	DatabaseConnectionNumber:	Number of database connection created
	Tango::DevUShort	databaseConnectionNumber;
	//	QueryDelay:	Upper threshold on update_time column (seconds)
	Tango::DevUShort	queryDelay;
	//	IgnoreColumns:	Array of metadata columns that will not be exported.
	//  Mandatory column are:
	//  [id, storage_path, file_path, file_version, file_name, update_time]
	vector<string>	ignoreColumns;
	//	ExportedTables:	Tables exporter from database: one table per row
	//  [schema table]
	vector<string>	exportedTables;
@@ -123,10 +132,6 @@ public:
	vector<string>	authorisedUsers;
	//	AutoStart:	Exec On command after init if state is not fault
	Tango::DevBoolean	autoStart;
	//	IgnoreColumns:	Array of metadata columns that will not be exported.
	//  Mandatory column are:
	//  [id, storage_path, file_path, file_version, file_name, update_time]
	vector<string>	ignoreColumns;


//	Constructors and destructors
@@ -232,6 +237,9 @@ protected:
        std::map<const std::string, const std::string>&)
        throw(std::invalid_argument);

    virtual void checkIgnoreColumns(std::vector<std::string>&)
        throw(std::invalid_argument);

    virtual void checkIfFileExists(std::string)
        throw(std::invalid_argument);

+9 −4
Original line number Diff line number Diff line
@@ -76,6 +76,15 @@
      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
      <DefaultPropValue>2</DefaultPropValue>
    </deviceProperties>
    <deviceProperties name="QueryDelay" description="Upper threshold on update_time column (seconds)">
      <type xsi:type="pogoDsl:UShortType"/>
      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
      <DefaultPropValue>0</DefaultPropValue>
    </deviceProperties>
    <deviceProperties name="IgnoreColumns" description="Array of metadata columns that will not be exported.&#xA;Mandatory column are:&#xA;[id, storage_path, file_path, file_version, file_name, update_time]">
      <type xsi:type="pogoDsl:StringVectorType"/>
      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
    </deviceProperties>
    <deviceProperties name="ExportedTables" description="Tables exporter from database: one table per row&#xA;[schema table]">
      <type xsi:type="pogoDsl:StringVectorType"/>
      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
@@ -89,10 +98,6 @@
      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
      <DefaultPropValue>false</DefaultPropValue>
    </deviceProperties>
    <deviceProperties name="IgnoreColumns" description="Array of metadata columns that will not be exported.&#xA;Mandatory column are:&#xA;[id, storage_path, file_path, file_version, file_name, update_time]">
      <type xsi:type="pogoDsl:StringVectorType"/>
      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
    </deviceProperties>
    <commands name="State" description="This command gets the device state (stored in its device_state data member) and returns it to the caller." execMethod="dev_state" displayLevel="OPERATOR" polledPeriod="0">
      <argin description="none">
        <type xsi:type="pogoDsl:VoidType"/>
Loading