From 7d82abb283dcfc58e5051105d14008a66d8e6b1d Mon Sep 17 00:00:00 2001 From: Marco De Marco Date: Fri, 31 Jan 2014 09:45:23 +0100 Subject: [PATCH] Recovery time property added --- src/Configuration.h | 16 ++++++++------ src/DataImporter.cpp | 23 ++++++++++++++++---- src/DataImporter.h | 10 ++++++--- src/DataImporter.xmi | 7 ++++++- src/DataImporterClass.cpp | 44 ++++++++++++++++++++++++++------------- 5 files changed, 71 insertions(+), 29 deletions(-) diff --git a/src/Configuration.h b/src/Configuration.h index 81ed392..6267484 100644 --- a/src/Configuration.h +++ b/src/Configuration.h @@ -24,7 +24,7 @@ private: std::string databaseHost, unsigned int databasePort, std::string databaseUsername, std::string databasePassword, std::string databaseSchema, std::string databaseTable, - unsigned int refreshTime, unsigned int timeout, + unsigned int refreshTime, unsigned int timeout, unsigned int recoveryTime, std::string auxDatabaseHost, unsigned int auxDatabasePort, std::string auxDatabaseUsername, std::string auxDatabasePassword, std::string auxDatabaseSchema, std::string auxDatabaseTimestampTable, @@ -35,7 +35,7 @@ private: m_databaseHost(databaseHost), m_databasePort(databasePort), m_databaseUsername(databaseUsername), m_databasePassword(databasePassword), m_databaseSchema(databaseSchema), m_databaseTable(databaseTable), - m_refreshTime(refreshTime), m_timeout(timeout), + m_refreshTime(refreshTime), m_timeout(timeout), m_recoveryTime(recoveryTime), m_auxDatabaseHost(auxDatabaseHost), m_auxDatabasePort(auxDatabasePort), m_auxDatabaseUsername(auxDatabaseUsername), m_auxDatabasePassword(auxDatabasePassword), @@ -63,7 +63,7 @@ public: std::string databaseHost, unsigned int databasePort, std::string databaseUsername, std::string databasePassword, std::string databaseSchema, std::string databaseTable, - unsigned int refreshTime, unsigned int timeout, + unsigned int refreshTime, unsigned int timeout, unsigned int recoveryTime, std::string auxDatabaseHost, unsigned int auxDatabasePort, std::string auxDatabaseUsername, std::string auxDatabasePassword, std::string auxDatabaseSchema, std::string auxDatabaseTimestampTable, @@ -72,9 +72,9 @@ public: Configuration::SP c_sp(new Configuration(certificateFile, storagePath, remoteHost, remotePort, remoteUsername, remotePassword, databaseHost, databasePort, databaseUsername, databasePassword, databaseSchema, - databaseTable, refreshTime, timeout, auxDatabaseHost, auxDatabasePort, - auxDatabaseUsername, auxDatabasePassword, auxDatabaseSchema, - auxDatabaseTimestampTable, auxDatabaseFailedTable), + databaseTable, refreshTime, timeout, recoveryTime, auxDatabaseHost, + auxDatabasePort, auxDatabaseUsername, auxDatabasePassword, + auxDatabaseSchema, auxDatabaseTimestampTable, auxDatabaseFailedTable), Configuration::Deleter()); return c_sp; @@ -97,6 +97,7 @@ public: std::string getDatabaseTable() const { return m_databaseTable; } unsigned int getRefreshTime() const { return m_refreshTime; } unsigned int getTimeout() const { return m_timeout; } + unsigned int getRecoveryTime() const { return m_recoveryTime; } std::string getAuxDatabaseHost() const { return m_auxDatabaseHost; } unsigned int getAuxDatabasePort() const { return m_auxDatabasePort; } std::string getAuxDatabaseUsername() const { return m_auxDatabaseUsername; } @@ -151,6 +152,9 @@ private: //Connection timeout (seconds) const unsigned int m_timeout; + //Recovery time (seconds) + const unsigned int m_recoveryTime; + //Auxiliary database host const std::string m_auxDatabaseHost; diff --git a/src/DataImporter.cpp b/src/DataImporter.cpp index 21221bd..36fe2e5 100644 --- a/src/DataImporter.cpp +++ b/src/DataImporter.cpp @@ -216,6 +216,7 @@ void DataImporter::get_device_property() dev_prop.push_back(Tango::DbDatum("DatabaseTable")); dev_prop.push_back(Tango::DbDatum("RefreshTime")); dev_prop.push_back(Tango::DbDatum("Timeout")); + dev_prop.push_back(Tango::DbDatum("RecoveryTime")); dev_prop.push_back(Tango::DbDatum("AutoStart")); dev_prop.push_back(Tango::DbDatum("AuxDatabaseHost")); dev_prop.push_back(Tango::DbDatum("AuxDatabasePort")); @@ -403,6 +404,17 @@ void DataImporter::get_device_property() // And try to extract Timeout value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> timeout; + // Try to initialize RecoveryTime from class property + cl_prop = ds_class->get_class_property(dev_prop[++i].name); + if (cl_prop.is_empty()==false) cl_prop >> recoveryTime; + else { + // Try to initialize RecoveryTime from default device value + def_prop = ds_class->get_default_device_property(dev_prop[i].name); + if (def_prop.is_empty()==false) def_prop >> recoveryTime; + } + // And try to extract RecoveryTime value from database + if (dev_prop[i].is_empty()==false) dev_prop[i] >> recoveryTime; + // Try to initialize AutoStart from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> autoStart; @@ -546,6 +558,9 @@ void DataImporter::get_device_property() if(timeout<1 || timeout>MAX_TIMEOUT) throw(invalid_argument("Timeout property out of range or not defined")); + if(recoveryTime<1 || recoveryTime>MAX_RECOVERY_TIME) + throw(invalid_argument("RecoveryTime property out of range or not defined")); + if(auxDatabaseHost.empty()) throw(invalid_argument("AuxDatabaseHost property is empty or not defined")); @@ -570,9 +585,9 @@ void DataImporter::get_device_property() m_configuration_sp = Configuration::create(certificateFile, storagePath, remoteHost, remotePort, remoteUsername, remotePassword, databaseHost, databasePort, databaseUsername, databasePassword, databaseSchema, - databaseTable, refreshTime, timeout, auxDatabaseHost, auxDatabasePort, - auxDatabaseUsername, auxDatabasePassword, auxDatabaseSchema, - auxDatabaseTimestampTable, auxDatabaseFailedTable); + databaseTable, refreshTime, timeout, recoveryTime, auxDatabaseHost, + auxDatabasePort, auxDatabaseUsername, auxDatabasePassword, + auxDatabaseSchema, auxDatabaseTimestampTable, auxDatabaseFailedTable); } catch(invalid_argument& ex) { @@ -593,7 +608,7 @@ void DataImporter::get_device_property() //-------------------------------------------------------- void DataImporter::always_executed_hook() { - DEBUG_STREAM << "DataImporter::always_executed_hook() " << device_name << endl; + INFO_STREAM << "DataImporter::always_executed_hook() " << device_name << endl; /*----- PROTECTED REGION ID(DataImporter::always_executed_hook) ENABLED START -----*/ if(get_state() != Tango::FAULT) diff --git a/src/DataImporter.h b/src/DataImporter.h index d5b43a8..08ac019 100644 --- a/src/DataImporter.h +++ b/src/DataImporter.h @@ -48,7 +48,7 @@ /** * DataImporter class description: - * + * */ namespace DataImporter_ns @@ -82,6 +82,8 @@ class DataImporter : public TANGO_BASE_CLASS //Max time between remote server request and response static const unsigned int MAX_TIMEOUT = 60; + //Time between failed download attempt + static const unsigned int MAX_RECOVERY_TIME = 86400; /*----- PROTECTED REGION END -----*/ // DataImporter::Data Members @@ -113,10 +115,12 @@ public: string databaseSchema; // DatabaseTable: Metadata local database table string databaseTable; - // RefreshTime: Remote database request period (seconds) + // RefreshTime: Local database request period (seconds) Tango::DevULong refreshTime; // Timeout: Connection timeout (seconds) Tango::DevULong timeout; + // RecoveryTime: Time between failed file download attempt + Tango::DevULong recoveryTime; // AutoStart: Exec On command after init if state is not fault Tango::DevBoolean autoStart; // AuxDatabaseHost: File transfer auxiliary database host @@ -161,7 +165,7 @@ public: DataImporter(Tango::DeviceClass *cl,const char *s,const char *d); /** * The device object destructor. - */ + */ ~DataImporter() {delete_device();}; diff --git a/src/DataImporter.xmi b/src/DataImporter.xmi index 35f3d88..cac1f43 100644 --- a/src/DataImporter.xmi +++ b/src/DataImporter.xmi @@ -93,7 +93,7 @@ - + 10 @@ -103,6 +103,11 @@ 60 + + + + 60 + diff --git a/src/DataImporterClass.cpp b/src/DataImporterClass.cpp index 5169cdc..b34f8fe 100644 --- a/src/DataImporterClass.cpp +++ b/src/DataImporterClass.cpp @@ -131,8 +131,8 @@ DataImporterClass *DataImporterClass::init(const char *name) catch (bad_alloc &) { throw; - } - } + } + } return _instance; } @@ -266,7 +266,7 @@ void DataImporterClass::get_class_property() cl_prop.push_back(Tango::DbDatum("AuxDatabaseSchema")); cl_prop.push_back(Tango::DbDatum("AuxDatabaseTimestampTable")); cl_prop.push_back(Tango::DbDatum("AuxDatabaseFailedTable")); - + // Call database and extract values if (Tango::Util::instance()->_UseDb==true) get_db_class()->get_property(cl_prop); @@ -695,7 +695,7 @@ void DataImporterClass::set_default_property() else add_wiz_dev_prop(prop_name, prop_desc); prop_name = "RefreshTime"; - prop_desc = "Remote database request period (seconds)"; + prop_desc = "Local database request period (seconds)"; prop_def = "10"; vect_data.clear(); vect_data.push_back("10"); @@ -720,6 +720,20 @@ void DataImporterClass::set_default_property() dev_def_prop.push_back(data); add_wiz_dev_prop(prop_name, prop_desc, prop_def); } + else + add_wiz_dev_prop(prop_name, prop_desc); + prop_name = "RecoveryTime"; + prop_desc = "Time between failed file download attempt"; + prop_def = "60"; + vect_data.clear(); + vect_data.push_back("60"); + if (prop_def.length()>0) + { + Tango::DbDatum data(prop_name); + data << vect_data ; + dev_def_prop.push_back(data); + add_wiz_dev_prop(prop_name, prop_desc, prop_def); + } else add_wiz_dev_prop(prop_name, prop_desc); prop_name = "AutoStart"; @@ -899,7 +913,7 @@ void DataImporterClass::write_class_property() header = "$HeadURL: "; start = header.length(); string strloc = src_path.substr(start, (end-start)); - + Tango::DbDatum svn_loc("svn_location"); svn_loc << strloc; data.push_back(svn_loc); @@ -908,13 +922,13 @@ void DataImporterClass::write_class_property() } // Get CVS or SVN revision tag - + // CVS tag string tagname(TagName); header = "$Name: "; start = header.length(); string endstr(" $"); - + end = tagname.find(endstr); if (end!=string::npos && end>start) { @@ -923,17 +937,17 @@ void DataImporterClass::write_class_property() cvs_tag << strtag; data.push_back(cvs_tag); } - + // SVN tag string svnpath(SvnPath); header = "$HeadURL: "; start = header.length(); - + end = svnpath.find(endstr); if (end!=string::npos && end>start) { string strloc = svnpath.substr(start, end-start); - + string tagstr ("/tags/"); start = strloc.find(tagstr); if ( start!=string::npos ) @@ -941,7 +955,7 @@ void DataImporterClass::write_class_property() start = start + tagstr.length(); end = strloc.find(filename); string strtag = strloc.substr(start, end-start-1); - + Tango::DbDatum svn_tag("svn_tag"); svn_tag << strtag; data.push_back(svn_tag); @@ -991,7 +1005,7 @@ void DataImporterClass::device_factory(const Tango::DevVarStringArray *devlist_p for (unsigned long i=0 ; ilength() ; i++) { cout4 << "Device name : " << (*devlist_ptr)[i].in() << endl; - device_list.push_back(new DataImporter(this, (*devlist_ptr)[i])); + device_list.push_back(new DataImporter(this, (*devlist_ptr)[i])); } // Manage dynamic attributes if any @@ -1089,7 +1103,7 @@ void DataImporterClass::command_factory() * method : DataImporterClass::create_static_attribute_list * description : Create the a list of static attributes * - * @param att_list the ceated attribute list + * @param att_list the ceated attribute list */ //-------------------------------------------------------- void DataImporterClass::create_static_attribute_list(vector &att_list) @@ -1123,10 +1137,10 @@ void DataImporterClass::erase_dynamic_attributes(const Tango::DevVarStringArray Tango::Util *tg = Tango::Util::instance(); for (unsigned long i=0 ; ilength() ; i++) - { + { Tango::DeviceImpl *dev_impl = tg->get_device_by_name(((string)(*devlist_ptr)[i]).c_str()); DataImporter *dev = static_cast (dev_impl); - + vector &dev_att_list = dev->get_device_attr()->get_attribute_list(); vector::iterator ite_att; for (ite_att=dev_att_list.begin() ; ite_att != dev_att_list.end() ; ++ite_att) -- GitLab