Skip to content
Snippets Groups Projects
Commit ee250651 authored by Marco De Marco's avatar Marco De Marco
Browse files

Query delay parameter added

parent 8f884ac9
No related branches found
No related tags found
No related merge requests found
...@@ -33,16 +33,17 @@ protected: ...@@ -33,16 +33,17 @@ protected:
unsigned int localPort, unsigned int workerNumber, unsigned int localPort, unsigned int workerNumber,
std::string databaseHost, unsigned int databasePort, std::string databaseHost, unsigned int databasePort,
std::string databaseUsername, std::string databasePassword, std::string databaseUsername, std::string databasePassword,
unsigned int databaseConnectionNumber, std::vector<std::string>& ignoreColumns, unsigned int databaseConnectionNumber, unsigned int queryDelay,
ExportedTablesMap& exportedTablesMap, AuthorisedUsersMap& authorisedUsersMap) : std::vector<std::string>& ignoreColumns,ExportedTablesMap& exportedTablesMap,
AuthorisedUsersMap& authorisedUsersMap) :
m_certificateFile(certificateFile), m_privateKeyFile(privateKeyFile), m_certificateFile(certificateFile), m_privateKeyFile(privateKeyFile),
m_dHTempFile(dHTempFile), m_localHost(localHost), m_dHTempFile(dHTempFile), m_localHost(localHost),
m_localPort(localPort), m_workerNumber(workerNumber), m_localPort(localPort), m_workerNumber(workerNumber),
m_databaseHost(databaseHost), m_databasePort(databasePort), m_databaseHost(databaseHost), m_databasePort(databasePort),
m_databaseUsername(databaseUsername), m_databasePassword(databasePassword), m_databaseUsername(databaseUsername), m_databasePassword(databasePassword),
m_databaseConnectionNumber(databaseConnectionNumber), m_databaseConnectionNumber(databaseConnectionNumber),
m_ignoreColumnList(ignoreColumns),m_exportedTablesMap(exportedTablesMap), m_queryDelay(queryDelay), m_ignoreColumnList(ignoreColumns),
m_authorisedUsersMap(authorisedUsersMap) {} m_exportedTablesMap(exportedTablesMap), m_authorisedUsersMap(authorisedUsersMap) {}
virtual ~Configuration() {} virtual ~Configuration() {}
...@@ -63,13 +64,13 @@ public: ...@@ -63,13 +64,13 @@ public:
unsigned int localPort, unsigned int workerNumber, std::string databaseHost, unsigned int localPort, unsigned int workerNumber, std::string databaseHost,
unsigned int databasePort, std::string databaseUsername, unsigned int databasePort, std::string databaseUsername,
std::string databasePassword, unsigned int databaseConnectionNumber, std::string databasePassword, unsigned int databaseConnectionNumber,
std::vector<std::string>& ignoreColumns, ExportedTablesMap& exportedTablesMap, unsigned int queryDelay, std::vector<std::string>& ignoreColumns,
AuthorisedUsersMap& authorisedUsersMap) ExportedTablesMap& exportedTablesMap, AuthorisedUsersMap& authorisedUsersMap)
{ {
Configuration::SP c_sp(new Configuration(certificateFile, privateKeyFile, Configuration::SP c_sp(new Configuration(certificateFile, privateKeyFile,
dHTempFile, localHost, localPort, workerNumber, databaseHost, dHTempFile, localHost, localPort, workerNumber, databaseHost,
databasePort, databaseUsername, databasePassword, databasePort, databaseUsername, databasePassword,
databaseConnectionNumber, ignoreColumns, exportedTablesMap, databaseConnectionNumber, queryDelay, ignoreColumns, exportedTablesMap,
authorisedUsersMap), Configuration::Deleter()); authorisedUsersMap), Configuration::Deleter());
return c_sp; return c_sp;
...@@ -89,6 +90,7 @@ public: ...@@ -89,6 +90,7 @@ public:
std::string getDatabaseUsername() const { return m_databaseUsername; } std::string getDatabaseUsername() const { return m_databaseUsername; }
std::string getDatabasePassword() const { return m_databasePassword; } std::string getDatabasePassword() const { return m_databasePassword; }
unsigned int getDatabaseConnectionNumber() const { return m_databaseConnectionNumber; } unsigned int getDatabaseConnectionNumber() const { return m_databaseConnectionNumber; }
unsigned int getQueryDelay() const { return m_queryDelay; }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
// [Public] Utilities methods // [Public] Utilities methods
...@@ -169,6 +171,9 @@ protected: ...@@ -169,6 +171,9 @@ protected:
//Metadata database connections number //Metadata database connections number
const unsigned int m_databaseConnectionNumber; const unsigned int m_databaseConnectionNumber;
//Upper threshold on update_time column
const unsigned int m_queryDelay;
//Metadata ignored columns vector //Metadata ignored columns vector
const std::vector<std::string> m_ignoreColumnList; const std::vector<std::string> m_ignoreColumnList;
......
...@@ -134,18 +134,27 @@ DBManager::RowsetSP DBManager::retrieveNewTuples(std::string schema, ...@@ -134,18 +134,27 @@ DBManager::RowsetSP DBManager::retrieveNewTuples(std::string schema,
if(session.get_backend() == NULL) if(session.get_backend() == NULL)
session.reconnect(); session.reconnect();
// @workaround: this does not work: timestamp parameter not passed unsigned int queryDelay = m_configuration_sp->getQueryDelay();
// 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"))));
boost::posix_time::ptime timestamp = boost::posix_time::ptime_from_tm(update_time); 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>'" << schema << "." << table << " where update_time>'"
<< boost::posix_time::to_iso_string(timestamp) << boost::posix_time::to_iso_string(timestamp)
<< "' and update_time<=DATE_SUB(now(), INTERVAL 1 SECOND)" << "' and update_time<=DATE_SUB(now(), INTERVAL "
<< " order by update_time asc")); << 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; return rows;
} }
......
...@@ -217,10 +217,11 @@ void MetadataExporter::get_device_property() ...@@ -217,10 +217,11 @@ void MetadataExporter::get_device_property()
dev_prop.push_back(Tango::DbDatum("DatabaseUsername")); dev_prop.push_back(Tango::DbDatum("DatabaseUsername"));
dev_prop.push_back(Tango::DbDatum("DatabasePassword")); dev_prop.push_back(Tango::DbDatum("DatabasePassword"));
dev_prop.push_back(Tango::DbDatum("DatabaseConnectionNumber")); 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("ExportedTables"));
dev_prop.push_back(Tango::DbDatum("AuthorisedUsers")); dev_prop.push_back(Tango::DbDatum("AuthorisedUsers"));
dev_prop.push_back(Tango::DbDatum("AutoStart")); dev_prop.push_back(Tango::DbDatum("AutoStart"));
dev_prop.push_back(Tango::DbDatum("IgnoreColumns"));
// is there at least one property to be read ? // is there at least one property to be read ?
if (dev_prop.size()>0) if (dev_prop.size()>0)
...@@ -367,6 +368,28 @@ void MetadataExporter::get_device_property() ...@@ -367,6 +368,28 @@ void MetadataExporter::get_device_property()
// And try to extract DatabaseConnectionNumber value from database // And try to extract DatabaseConnectionNumber value from database
if (dev_prop[i].is_empty()==false) dev_prop[i] >> databaseConnectionNumber; 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 // Try to initialize ExportedTables from class property
cl_prop = ds_class->get_class_property(dev_prop[++i].name); cl_prop = ds_class->get_class_property(dev_prop[++i].name);
if (cl_prop.is_empty()==false) cl_prop >> exportedTables; if (cl_prop.is_empty()==false) cl_prop >> exportedTables;
...@@ -399,18 +422,6 @@ void MetadataExporter::get_device_property() ...@@ -399,18 +422,6 @@ void MetadataExporter::get_device_property()
} }
// And try to extract AutoStart value from database // And try to extract AutoStart value from database
if (dev_prop[i].is_empty()==false) dev_prop[i] >> autoStart; 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 -----*/ /*----- PROTECTED REGION ID(MetadataExporter::get_device_property_after) ENABLED START -----*/
...@@ -459,6 +470,11 @@ void MetadataExporter::get_device_property() ...@@ -459,6 +470,11 @@ void MetadataExporter::get_device_property()
if(databaseConnectionNumber<1 || databaseConnectionNumber>MAX_DB_CONNECTION_NUMBER) if(databaseConnectionNumber<1 || databaseConnectionNumber>MAX_DB_CONNECTION_NUMBER)
throw(invalid_argument("DatabaseConnectionNumber property out of range or not defined")); 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()) if(exportedTables.empty())
throw(invalid_argument("ExportedTables property is empty or not defined")); throw(invalid_argument("ExportedTables property is empty or not defined"));
...@@ -469,36 +485,10 @@ void MetadataExporter::get_device_property() ...@@ -469,36 +485,10 @@ void MetadataExporter::get_device_property()
importAuthorisedUsers(authorisedUsers, authorisedUsersMap); 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, m_configuration_sp = Configuration::create(certificateFile, privateKeyFile,
dHTempFile, localHost, localPort, workerNumber, databaseHost, dHTempFile, localHost, localPort, workerNumber, databaseHost,
databasePort, databaseUsername, databasePassword, databaseConnectionNumber, databasePort, databaseUsername, databasePassword, databaseConnectionNumber,
ignoreColumns, exportedTablesMap, authorisedUsersMap); queryDelay, ignoreColumns, exportedTablesMap, authorisedUsersMap);
} }
catch(invalid_argument& ex) catch(invalid_argument& ex)
{ {
...@@ -519,7 +509,7 @@ void MetadataExporter::get_device_property() ...@@ -519,7 +509,7 @@ void MetadataExporter::get_device_property()
//-------------------------------------------------------- //--------------------------------------------------------
void MetadataExporter::always_executed_hook() 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 -----*/ /*----- PROTECTED REGION ID(MetadataExporter::always_executed_hook) ENABLED START -----*/
if(get_state() != Tango::FAULT) if(get_state() != Tango::FAULT)
...@@ -734,6 +724,41 @@ void MetadataExporter::importAuthorisedUsers(std::vector<std::string>& authorise ...@@ -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() // MetadataExporter::checkIfFileExists()
//============================================================================== //==============================================================================
......
...@@ -87,6 +87,9 @@ protected: ...@@ -87,6 +87,9 @@ protected:
//Max database port number allowed value //Max database port number allowed value
static const unsigned int MAX_DB_PORT = 65535; 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 /*----- PROTECTED REGION END -----*/ // MetadataExporter::Data Members
// Device property data members // Device property data members
...@@ -115,6 +118,12 @@ public: ...@@ -115,6 +118,12 @@ public:
string databasePassword; string databasePassword;
// DatabaseConnectionNumber: Number of database connection created // DatabaseConnectionNumber: Number of database connection created
Tango::DevUShort databaseConnectionNumber; 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 // ExportedTables: Tables exporter from database: one table per row
// [schema table] // [schema table]
vector<string> exportedTables; vector<string> exportedTables;
...@@ -123,10 +132,6 @@ public: ...@@ -123,10 +132,6 @@ public:
vector<string> authorisedUsers; vector<string> authorisedUsers;
// AutoStart: Exec On command after init if state is not fault // AutoStart: Exec On command after init if state is not fault
Tango::DevBoolean autoStart; 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 // Constructors and destructors
...@@ -232,6 +237,9 @@ protected: ...@@ -232,6 +237,9 @@ protected:
std::map<const std::string, const std::string>&) std::map<const std::string, const std::string>&)
throw(std::invalid_argument); throw(std::invalid_argument);
virtual void checkIgnoreColumns(std::vector<std::string>&)
throw(std::invalid_argument);
virtual void checkIfFileExists(std::string) virtual void checkIfFileExists(std::string)
throw(std::invalid_argument); throw(std::invalid_argument);
......
...@@ -76,6 +76,15 @@ ...@@ -76,6 +76,15 @@
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/> <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
<DefaultPropValue>2</DefaultPropValue> <DefaultPropValue>2</DefaultPropValue>
</deviceProperties> </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]"> <deviceProperties name="ExportedTables" description="Tables exporter from database: one table per row&#xA;[schema table]">
<type xsi:type="pogoDsl:StringVectorType"/> <type xsi:type="pogoDsl:StringVectorType"/>
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/> <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
...@@ -89,10 +98,6 @@ ...@@ -89,10 +98,6 @@
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/> <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
<DefaultPropValue>false</DefaultPropValue> <DefaultPropValue>false</DefaultPropValue>
</deviceProperties> </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"> <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"> <argin description="none">
<type xsi:type="pogoDsl:VoidType"/> <type xsi:type="pogoDsl:VoidType"/>
......
...@@ -580,10 +580,11 @@ void MetadataExporterClass::set_default_property() ...@@ -580,10 +580,11 @@ void MetadataExporterClass::set_default_property()
} }
else else
add_wiz_dev_prop(prop_name, prop_desc); add_wiz_dev_prop(prop_name, prop_desc);
prop_name = "ExportedTables"; prop_name = "QueryDelay";
prop_desc = "Tables exporter from database: one table per row\n[schema table]"; prop_desc = "Upper threshold on update_time column (seconds)";
prop_def = ""; prop_def = "0";
vect_data.clear(); vect_data.clear();
vect_data.push_back("0");
if (prop_def.length()>0) if (prop_def.length()>0)
{ {
Tango::DbDatum data(prop_name); Tango::DbDatum data(prop_name);
...@@ -593,8 +594,8 @@ void MetadataExporterClass::set_default_property() ...@@ -593,8 +594,8 @@ void MetadataExporterClass::set_default_property()
} }
else else
add_wiz_dev_prop(prop_name, prop_desc); add_wiz_dev_prop(prop_name, prop_desc);
prop_name = "AuthorisedUsers"; prop_name = "IgnoreColumns";
prop_desc = "Authorised user list: one user per row\n[username password]"; 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 = ""; prop_def = "";
vect_data.clear(); vect_data.clear();
if (prop_def.length()>0) if (prop_def.length()>0)
...@@ -606,11 +607,10 @@ void MetadataExporterClass::set_default_property() ...@@ -606,11 +607,10 @@ void MetadataExporterClass::set_default_property()
} }
else else
add_wiz_dev_prop(prop_name, prop_desc); add_wiz_dev_prop(prop_name, prop_desc);
prop_name = "AutoStart"; prop_name = "ExportedTables";
prop_desc = "Exec On command after init if state is not fault"; prop_desc = "Tables exporter from database: one table per row\n[schema table]";
prop_def = "false"; prop_def = "";
vect_data.clear(); vect_data.clear();
vect_data.push_back("false");
if (prop_def.length()>0) if (prop_def.length()>0)
{ {
Tango::DbDatum data(prop_name); Tango::DbDatum data(prop_name);
...@@ -620,8 +620,8 @@ void MetadataExporterClass::set_default_property() ...@@ -620,8 +620,8 @@ void MetadataExporterClass::set_default_property()
} }
else else
add_wiz_dev_prop(prop_name, prop_desc); add_wiz_dev_prop(prop_name, prop_desc);
prop_name = "IgnoreColumns"; prop_name = "AuthorisedUsers";
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_desc = "Authorised user list: one user per row\n[username password]";
prop_def = ""; prop_def = "";
vect_data.clear(); vect_data.clear();
if (prop_def.length()>0) if (prop_def.length()>0)
...@@ -633,6 +633,20 @@ void MetadataExporterClass::set_default_property() ...@@ -633,6 +633,20 @@ void MetadataExporterClass::set_default_property()
} }
else else
add_wiz_dev_prop(prop_name, prop_desc); add_wiz_dev_prop(prop_name, prop_desc);
prop_name = "AutoStart";
prop_desc = "Exec On command after init if state is not fault";
prop_def = "false";
vect_data.clear();
vect_data.push_back("false");
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);
} }
//-------------------------------------------------------- //--------------------------------------------------------
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment