diff --git a/src/Configuration.h b/src/Configuration.h index 81ed392927a3fd7d55ac1f5019b6ad80ea7535b6..6267484974c490f9bbc25456fa56b6dec7b728e0 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 21221bd8c42f74a349b724a0d99e30939f7e347d..36fe2e5d799cfdbd95585b420a9023b06cd3a8af 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 d5b43a8929b9e1c3ad4bf0ac63293d34a9e8d488..08ac019b26d5ae1e077910631431684a8935f6ea 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 35f3d883379170ee666656984262ec3c79f3c490..cac1f4322df4bc9910ba1faaf824e78fcc3802bb 100644 --- a/src/DataImporter.xmi +++ b/src/DataImporter.xmi @@ -93,7 +93,7 @@ <type xsi:type="pogoDsl:StringType"/> <status abstract="false" inherited="false" concrete="true" concreteHere="true"/> </deviceProperties> - <deviceProperties name="RefreshTime" description="Remote database request period (seconds)"> + <deviceProperties name="RefreshTime" description="Local database request period (seconds)"> <type xsi:type="pogoDsl:UIntType"/> <status abstract="false" inherited="false" concrete="true" concreteHere="true"/> <DefaultPropValue>10</DefaultPropValue> @@ -103,6 +103,11 @@ <status abstract="false" inherited="false" concrete="true" concreteHere="true"/> <DefaultPropValue>60</DefaultPropValue> </deviceProperties> + <deviceProperties name="RecoveryTime" description="Time between failed file download attempt"> + <type xsi:type="pogoDsl:UIntType"/> + <status abstract="false" inherited="false" concrete="true" concreteHere="true"/> + <DefaultPropValue>60</DefaultPropValue> + </deviceProperties> <deviceProperties name="AutoStart" description="Exec On command after init if state is not fault"> <type xsi:type="pogoDsl:BooleanType"/> <status abstract="false" inherited="false" concrete="true" concreteHere="true"/> diff --git a/src/DataImporterClass.cpp b/src/DataImporterClass.cpp index 5169cdc6fbb12337983057cf59221307d6b2bf39..b34f8fe14386ecb7eda304683e8aebf565d94f57 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 ; i<devlist_ptr->length() ; 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<Tango::Attr *> &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 ; i<devlist_ptr->length() ; i++) - { + { Tango::DeviceImpl *dev_impl = tg->get_device_by_name(((string)(*devlist_ptr)[i]).c_str()); DataImporter *dev = static_cast<DataImporter *> (dev_impl); - + vector<Tango::Attribute *> &dev_att_list = dev->get_device_attr()->get_attribute_list(); vector<Tango::Attribute *>::iterator ite_att; for (ite_att=dev_att_list.begin() ; ite_att != dev_att_list.end() ; ++ite_att)