diff --git a/src/Configuration.h b/src/Configuration.h index 4817e540b351e7538705b99b117837adbb323782..fb323ebc373de4393a165f3b9dc24970d9e4f948 100644 --- a/src/Configuration.h +++ b/src/Configuration.h @@ -33,15 +33,16 @@ protected: unsigned int localPort, unsigned int workerNumber, std::string databaseHost, unsigned int databasePort, std::string databaseUsername, std::string databasePassword, - unsigned int databaseConnectionNumber, ExportedTablesMap exportedTablesMap, - AuthorisedUsersMap authorisedUsersMap) : + unsigned int databaseConnectionNumber, 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_exportedTablesMap(exportedTablesMap), m_authorisedUsersMap(authorisedUsersMap) {} + m_ignoreColumnList(ignoreColumns),m_exportedTablesMap(exportedTablesMap), + m_authorisedUsersMap(authorisedUsersMap) {} virtual ~Configuration() {} @@ -58,17 +59,18 @@ public: // [Public] Create class method //------------------------------------------------------------------------------ static Configuration::SP create(std::string certificateFile, - std::string privateKeyFile, std::string dHTempFile, - std::string localHost, unsigned int localPort, - unsigned int workerNumber, std::string databaseHost, + std::string privateKeyFile, std::string dHTempFile, std::string localHost, + unsigned int localPort, unsigned int workerNumber, std::string databaseHost, unsigned int databasePort, std::string databaseUsername, std::string databasePassword, unsigned int databaseConnectionNumber, - ExportedTablesMap exportedTablesMap, AuthorisedUsersMap authorisedUsersMap) + 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, - exportedTablesMap, authorisedUsersMap), Configuration::Deleter()); + databasePort, databaseUsername, databasePassword, + databaseConnectionNumber, ignoreColumns, exportedTablesMap, + authorisedUsersMap), Configuration::Deleter()); return c_sp; } @@ -87,9 +89,6 @@ public: std::string getDatabaseUsername() const { return m_databaseUsername; } std::string getDatabasePassword() const { return m_databasePassword; } unsigned int getDatabaseConnectionNumber() const { return m_databaseConnectionNumber; } - ExportedTablesMap& getExportedTablesMap() const { return m_exportedTablesMap; } - AuthorisedUsersMap& getAuthorisedUsersMap() const { return m_authorisedUsersMap; } - //------------------------------------------------------------------------------ // [Public] Utilities methods @@ -122,6 +121,17 @@ public: return false; } + bool isColumnIgnored(const std::string columnName) + { + std::vector<std::string>::const_iterator it; + + for(it=m_ignoreColumnList.begin(); it!=m_ignoreColumnList.end(); ++it) + if(it->compare(columnName)==0) + return true; + + return false; + } + protected: //------------------------------------------------------------------------------ // [Private] class variables @@ -159,6 +169,9 @@ protected: //Metadata database connections number const unsigned int m_databaseConnectionNumber; + //Metadata ignored columns vector + const std::vector<std::string> m_ignoreColumnList; + //Exported tables multi map [schema table] ExportedTablesMap m_exportedTablesMap; diff --git a/src/MetadataExporter.cpp b/src/MetadataExporter.cpp index 1d8deaa1208ef2805f9d3e071d80e021e7ebaa10..fcfd9c54edea2fc35983e0969088e15e810030c4 100644 --- a/src/MetadataExporter.cpp +++ b/src/MetadataExporter.cpp @@ -163,7 +163,7 @@ void MetadataExporter::init_device() //Start device if auto start enabled if(autoStart) { - INFO_STREAM << "FitsImporter::init_device() auto start enabled " << endl; + INFO_STREAM << "MetadataExporter::init_device() auto start enabled " << endl; on(); } } @@ -220,6 +220,7 @@ void MetadataExporter::get_device_property() 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) @@ -399,6 +400,17 @@ 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 -----*/ @@ -457,10 +469,36 @@ void MetadataExporter::get_device_property() importAuthorisedUsers(authorisedUsers, authorisedUsersMap); - m_configuration_sp = Configuration::create(certificateFile, - privateKeyFile, dHTempFile, localHost, localPort, workerNumber, - databaseHost, databasePort, databaseUsername, databasePassword, - databaseConnectionNumber, exportedTablesMap, 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); } catch(invalid_argument& ex) { @@ -481,7 +519,7 @@ void MetadataExporter::get_device_property() //-------------------------------------------------------- void MetadataExporter::always_executed_hook() { - DEBUG_STREAM << "MetadataExporter::always_executed_hook() " << device_name << endl; + INFO_STREAM << "MetadataExporter::always_executed_hook() " << device_name << endl; /*----- PROTECTED REGION ID(MetadataExporter::always_executed_hook) ENABLED START -----*/ if(get_state() != Tango::FAULT) diff --git a/src/MetadataExporter.h b/src/MetadataExporter.h index 859652c93e2b3b258a8cc2bba51e6cfefdeeb45e..7aa916bc5321fa6ca9b12b3fcb6b0e0024ef978f 100644 --- a/src/MetadataExporter.h +++ b/src/MetadataExporter.h @@ -123,6 +123,10 @@ 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 diff --git a/src/MetadataExporter.xmi b/src/MetadataExporter.xmi index 728e265dab9b38ea33f184054b1ece783214fce9..c95825fa86a700e56a7085fc9237dee2043325d6 100644 --- a/src/MetadataExporter.xmi +++ b/src/MetadataExporter.xmi @@ -89,6 +89,10 @@ <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.
Mandatory column are:
[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"/> diff --git a/src/MetadataExporterClass.cpp b/src/MetadataExporterClass.cpp index 923b000e2ab6deacbd10409109d424062b53f306..193ada25ccd83c548369a9cd3e64677b406c9ff5 100644 --- a/src/MetadataExporterClass.cpp +++ b/src/MetadataExporterClass.cpp @@ -620,6 +620,19 @@ void MetadataExporterClass::set_default_property() } else add_wiz_dev_prop(prop_name, prop_desc); + prop_name = "IgnoreColumns"; + prop_desc = "Array of metadata columns that will not be exported.\nMandatory column are:\n[id, storage_path, file_path, file_version, file_name, update_time]"; + prop_def = ""; + vect_data.clear(); + 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); } //-------------------------------------------------------- diff --git a/src/ProtocolManager.cpp b/src/ProtocolManager.cpp index f3c4d7225af594b15148a1a51f0b2a6c467c38d7..0a5b855b84d67ddf98f1a5b5cff22263aa5831c2 100644 --- a/src/ProtocolManager.cpp +++ b/src/ProtocolManager.cpp @@ -447,9 +447,10 @@ void ProtocolManager::fillRow(Response::Metadata::Row* row) std::string name = props.get_name(); - if(name.compare("id")==0 || - name.compare("storage_path")==0 || - name.compare("file_path")==0) + if(name.compare("id")==0 || + name.compare("storage_path")==0 || + name.compare("file_path")==0 || + m_configuration_sp->isColumnIgnored(name)) { #ifdef VERBOSE_DEBUG INFO_STREAM << "ProtocolManager::fillRow() skipping " << name << endl;