1 #include <DatabaseUtils/DAQConfig/ConfigDataTree.h> 2 #include <DatabaseUtils/DAQConfig/DBColumnParams.h> 3 #include <DatabaseUtils/DAQConfig/DBColumnUtils.h> 4 #include <DatabaseUtils/DAQConfig/NamedConfigUtils.h> 5 #include <NovaDAQUtilities/EnvVarCache.h> 6 #include <boost/algorithm/string.hpp> 26 #define LINE_NUMBER_DEBUG if ((debugFlag & 0x08) != 0) { \ 27 std::cout << "ConfigDataTree line=" << __LINE__ << std::endl;} 31 int leftInt = boost::lexical_cast<
int>(leftString);
32 int rightInt = boost::lexical_cast<
int>(rightString);
33 return (leftInt < rightInt);
36 return (leftString < rightString);
46 const std::vector<int64_t>& subsystemConfigIdList,
48 std::vector<std::string> dataColumnNameList)
58 if (debugString.length() > 0) {
59 try {debugFlag = boost::lexical_cast<
int>(debugString);}
66 boost::shared_ptr<NOVADB::Table> dbTablePtr;
67 dbTablePtr.reset(
new NOVADB::Table(tableDefinitionFilename.c_str()));
70 dbTablePtr->SetDetector(detName);
75 if (dbUser.length() > 0) {
77 dbTablePtr->SetUser(dbUser);
80 if (! dbTablePtr->GetConnection()) {
return;}
82 if (! dbTablePtr->ExistsInDB()) {
return;}
89 selector, dataColumnNameList, debugFlag);
102 const std::vector<int64_t>& subsystemConfigIdList)
112 if (debugString.length() > 0) {
113 try {debugFlag = boost::lexical_cast<
int>(debugString);}
120 boost::shared_ptr<NOVADB::Table> dbTablePtr;
121 dbTablePtr.reset(
new NOVADB::Table(tableDefinitionFilename.c_str()));
124 dbTablePtr->SetDetector(detName);
129 if (dbUser.length() > 0) {
131 dbTablePtr->SetUser(dbUser);
134 if (! dbTablePtr->GetConnection()) {
return;}
136 if (! dbTablePtr->ExistsInDB()) {
return;}
140 std::vector<std::string> colNames = dbTablePtr->GetColNames();
143 std::vector<std::string> tmpSelectionList;
144 uint32_t indexForStartOfNormalHierarchy = 0;
146 for (uint32_t
idx = 0;
idx < colNames.size(); ++
idx) {
153 std::vector<std::string>::iterator iter = tmpSelectionList.begin();
155 if (tmpSelectionList.size() > indexForStartOfNormalHierarchy) {
156 tmpSelectionList.insert(iter+indexForStartOfNormalHierarchy,
160 tmpSelectionList.push_back(colName);
164 if (tmpSelectionList.size() > indexForStartOfNormalHierarchy+1) {
165 tmpSelectionList.insert(iter+indexForStartOfNormalHierarchy+1,
169 tmpSelectionList.push_back(colName);
173 if (tmpSelectionList.size() > indexForStartOfNormalHierarchy+2) {
174 tmpSelectionList.insert(iter+indexForStartOfNormalHierarchy+2,
178 tmpSelectionList.push_back(colName);
182 if (tmpSelectionList.size() > indexForStartOfNormalHierarchy) {
183 tmpSelectionList.insert(iter+indexForStartOfNormalHierarchy,
187 tmpSelectionList.push_back(colName);
190 else if (colName ==
"coolingstate") {
191 if (tmpSelectionList.size() > 0) {
192 tmpSelectionList.insert(iter, colName);
195 tmpSelectionList.push_back(colName);
197 ++indexForStartOfNormalHierarchy;
199 else if (colName ==
"pvname") {
200 if (tmpSelectionList.size() > 0) {
201 tmpSelectionList.insert(iter, colName);
204 tmpSelectionList.push_back(colName);
206 ++indexForStartOfNormalHierarchy;
215 for (uint32_t
idx = 0;
idx < tmpSelectionList.size(); ++
idx) {
227 saveValues(
const std::vector<dbutils::SimpleParameterSet>& newDataList)
const 233 if (debugString.length() > 0) {
234 try {debugFlag = boost::lexical_cast<
int>(debugString);}
238 boost::shared_ptr<NOVADB::Table> dbTablePtr;
242 dbTablePtr->SetDetector(detName);
247 if (dbUser.length() > 0) {
249 dbTablePtr->SetUser(dbUser);
252 if (! dbTablePtr->GetConnection()) {
return false;}
254 if (! dbTablePtr->ExistsInDB()) {
return false;}
257 if ((debugFlag & 0x20) != 0) {
258 dbTablePtr->SetVerbosity(1);
261 if ((debugFlag & 0x04) != 0) {
262 std::cout <<
"*** ConfigDataTree for " << dbTablePtr->Name()
266 for (
int idx = 0;
idx < (
int) newDataList.size(); ++
idx) {
270 if ((debugFlag & 0x04) != 0) {
274 boost::shared_ptr<NOVADB::Row> newRow(dbTablePtr->NewRow());
275 if (newRow.get() == 0) {
return false;}
278 std::vector<std::string> keyList = paramSet.
keys();
279 for (
int jdx = 0; jdx < (
int) keyList.size(); ++jdx) {
283 if (paramSet.
get(key, value)) {
284 newRow->Set(key, value);
289 dbTablePtr->AddRow(newRow.get());
294 if (! dbTablePtr->WriteToDB()) {
return false;}
305 const std::vector<int64_t>& subsystemConfigIdList,
307 std::vector<std::string> dataColumnNameList,
321 columnKeyToGetDefaultValue(selectorName, keyForDefault)) {
332 keyForSystemWideDefault.append(keyForDefault);
345 for (uint32_t cfgIdx = 0; cfgIdx < subsystemConfigIdList.size(); ++cfgIdx) {
361 if (! dbTablePtr->SetValidityRange(
"subsysCfgId",
362 subsystemConfigIdList[cfgIdx])) {
368 if ((debugFlag & 0x10) != 0) {
369 dbTablePtr->SetVerbosity(1);
371 if (! dbTablePtr->LoadFromDB()) {
387 if (! dbTablePtr->LoadFromDB()) {
398 for (int32_t
idx = 0;
idx < dbTablePtr->NRow(); ++
idx) {
406 std::vector<std::string> keyElements;
407 bool thisKeyIsForADefault =
false;
412 colPtr = rowPtr->
Col(selectorName);
413 if (! colPtr->
Get(valueString)) {
421 key.append(valueString);
423 keyElements.push_back(valueString);
426 thisKeyIsForADefault =
true;
430 ConfigValueListMap::const_iterator iter1 =
434 valueListPtr->push_back(valueString);
439 ConfigValueList::const_iterator iter2 =
440 std::find(valueListPtr->begin(),
441 valueListPtr->end(), valueString);
442 if (iter2 == valueListPtr->end()) {
443 valueListPtr->push_back(valueString);
453 ConfigDataContainer::const_iterator iter1 =
_resultSet.find(key);
457 bool foundDefault =
false;
458 for (uint32_t testIdx = keyElements.size(); testIdx > 0; --testIdx) {
460 for (uint32_t sdx = 0; sdx < keyElements.size(); ++sdx) {
462 if (sdx >= (testIdx - 1)) {
469 tmpKey.append(keyFragment);
478 if (foundDefault) {
continue;}
485 for (uint32_t ndx = 0; ndx < dataColumnNameList.size(); ++ndx) {
487 colPtr = rowPtr->
Col(columnName);
490 (*mapPtr)[columnName] =
"";
493 if (! colPtr->
Get(valueString)) {
497 (*mapPtr)[columnName] = valueString;
503 if (thisKeyIsForADefault) {
504 tmpContainerForDefaults[
key] = mapPtr;
514 ConfigDataContainer::const_iterator iter2;
515 ConfigDataContainer::const_iterator iter2End =
516 tmpContainerForDefaults.end();
517 for (iter2 = tmpContainerForDefaults.begin();
518 iter2 != iter2End; ++iter2) {
524 ConfigDataContainer::const_iterator iter3 =
531 ConfigValueListMap::const_iterator iter;
532 ConfigValueListMap::const_iterator iterEnd =
536 std::sort(valueListPtr->begin(), valueListPtr->end(),
sortingFunction);
540 if ((debugFlag & 0x01) != 0) {
541 std::cout <<
"*** ConfigDataTree for " << dbTablePtr->Name()
543 ConfigDataContainer::const_iterator resIterEnd =
_resultSet.end();
544 ConfigDataContainer::const_iterator resIter;
545 for (resIter =
_resultSet.begin(); resIter != resIterEnd; ++resIter) {
548 if (mapPtr.get() != 0) {
549 ConfigValueMap::const_iterator mapIterEnd = mapPtr->end();
550 ConfigValueMap::const_iterator mapIter;
551 for (mapIter = mapPtr->begin(); mapIter != mapIterEnd; ++mapIter) {
552 std::cout <<
", " << mapIter->first <<
"=" << mapIter->second;
560 if ((debugFlag & 0x02) != 0) {
561 std::cout <<
"*** ConfigDataTree for " << dbTablePtr->Name()
564 for (uint32_t
idx = 0;
idx < selectorColumnNames.size(); ++
idx) {
567 std::vector<std::string> distinctValues =
569 std::cout <<
" Selector = \"" << columnName <<
"\", default = \"" 572 for (uint32_t jdx = 0; jdx < distinctValues.size(); ++jdx) {
std::vector< std::string > _keyElementsForDefaults
ConfigDataContainer _resultSet
void addSelectionColumn(std::string columnName)
std::vector< std::string > keys() const
std::vector< bool > _noKeyElementForDefaults
std::vector< std::string > _dataColumnNameList
ConfigValueMap _selectorDefaultValueMap
bool hasSelectionValues(uint32_t selectionIndex) const
static EnvVarCache & getInstance()
ConfigDataSelector _configSelector
std::vector< std::string > _dataColumnTypeList
std::vector< std::string > getDistinctSelectorColumnValues(const std::string &columnName) const
#define LINE_NUMBER_DEBUG
ConfigValueListMap _distinctSelectorValueMap
std::string toString() const
std::string _tableDefinitionFilename
std::string getSelectionLowValue(uint32_t selectionIndex) const
std::map< std::string, std::string > ConfigValueMap
boost::shared_ptr< ConfigValueMap > ConfigValueMapPtr
bool get(const std::string &key, T &resultValue) const
const XML_Char int const XML_Char * value
bool saveValues(const std::vector< dbutils::SimpleParameterSet > &newDataList) const
void _initialize(boost::shared_ptr< nova::database::Table > dbTablePtr, const std::vector< int64_t > &subsystemConfigIdList, const ConfigDataSelector &selector, std::vector< std::string > dataColumnNameList, int debugFlag)
static const std::string HOSTNAME_COLUMN_NAME
std::string getSelectionHighValue(uint32_t selectionIndex) const
std::string getSelectorValueForDefault(std::string columnName) const
static const std::string PIXELID_COLUMN_NAME
std::vector< std::string > getSelectorColumnNames() const
static const std::string NO_DEFAULT_KEY_STRING
bool sortingFunction(std::string leftString, std::string rightString)
static bool isSubsystemConfigReferenceColumn(const std::string &columnName)
static const std::string KEY_FOR_SYSTEM_WIDE_PARAM
ConfigDataTree(const std::string &tableDefinitionFilename, const std::vector< int64_t > &subsystemConfigIdList, const ConfigDataSelector &selector, std::vector< std::string > dataColumnNameList)
uint32_t getSelectionCount() const
static DBColumnParams & getInstance()
static const std::string DCMNAME_COLUMN_NAME
std::map< std::string, ConfigValueMapPtr > ConfigDataContainer
std::string getEnvVar(std::string name)
static const std::string FEBID_COLUMN_NAME
static bool isInfrastructureColumn(const std::string &columnName)
std::string getSelectionColumn(uint32_t selectionIndex) const
static const std::string KEY_SEPARATOR_STRING
std::vector< std::string > ConfigValueList
boost::shared_ptr< ConfigValueList > ConfigValueListPtr