otsdaq  v1_01_02
 All Classes Namespaces Functions
DatabaseConfigurationInterface.cc
1 #include "otsdaq-core/ConfigurationInterface/DatabaseConfigurationInterface.h"
2 #include "otsdaq-core/ConfigurationDataFormats/ConfigurationBase.h"
3 #include "otsdaq-core/MessageFacility/MessageFacility.h"
4 #include "otsdaq-core/Macros/CoutHeaderMacros.h"
5 
6 
7 #include <iostream>
8 #include <string>
9 #include <algorithm>
10 #include <iterator>
11 
12 #include "artdaq-database/ConfigurationDB/configurationdbifc.h"
13 #include "artdaq-database/BasicTypes/basictypes.h"
14 
15 #include "artdaq-database/StorageProviders/FileSystemDB/provider_filedb.h"
16 #include "artdaq-database/StorageProviders/FileSystemDB/provider_filedb_index.h"
17 #include "artdaq-database/ConfigurationDB/configuration_common.h"
18 #include "artdaq-database/ConfigurationDB/dispatch_common.h"
19 #include "JSONConfigurationHandler.h.unused"
20 
21 
22 
23 using namespace ots;
24 
25 using artdaq::database::basictypes::FhiclData;
26 using artdaq::database::basictypes::JsonData;
27 
29 using config_version_map_t = ots::DatabaseConfigurationInterface::config_version_map_t;
30 
31 namespace db = artdaq::database::configuration;
32 using VersionInfoList_t = db::ConfigurationInterface::VersionInfoList_t;
33 
34 constexpr auto default_dbprovider = "filesystem";
35 constexpr auto default_entity = "OTSROOT";
36 
37 //==============================================================================
38 DatabaseConfigurationInterface::DatabaseConfigurationInterface()
39 {
40 #ifdef DEBUG_ENABLE
41  //to enable debugging
42  if(0)
43  {
44  artdaq::database::configuration::debug::ExportImport();
45  artdaq::database::configuration::debug::ManageAliases();
46  artdaq::database::configuration::debug::ManageConfigs();
47  artdaq::database::configuration::debug::ManageDocuments();
48  artdaq::database::configuration::debug::Metadata();
49 
50  artdaq::database::configuration::debug::detail::ExportImport();
51  artdaq::database::configuration::debug::detail::ManageAliases();
52  artdaq::database::configuration::debug::detail::ManageConfigs();
53  artdaq::database::configuration::debug::detail::ManageDocuments();
54  artdaq::database::configuration::debug::detail::Metadata();
55 
56  artdaq::database::configuration::debug::options::OperationBase();
57  artdaq::database::configuration::debug::options::BulkOperations();
58  artdaq::database::configuration::debug::options::ManageDocuments();
59  artdaq::database::configuration::debug::options::ManageConfigs();
60  artdaq::database::configuration::debug::options::ManageAliases();
61 
62  artdaq::database::configuration::debug::MongoDB();
63  artdaq::database::configuration::debug::UconDB();
64  artdaq::database::configuration::debug::FileSystemDB();
65 
66  artdaq::database::filesystem::index::debug::enable();
67 
68  artdaq::database::filesystem::debug::enable();
69  artdaq::database::mongo::debug::enable();
70 
71  artdaq::database::docrecord::debug::JSONDocumentBuilder();
72  artdaq::database::docrecord::debug::JSONDocument();
73 
74  //debug::registerUngracefullExitHandlers();
75  // artdaq::database::useFakeTime(true);
76 
77  }
78 #endif
79 
80 }
81 
82 //==============================================================================
83 // read configuration from database
84 // version = -1 means latest version
85 void DatabaseConfigurationInterface::fill(ConfigurationBase* configuration, ConfigurationVersion version) const
86 throw(std::runtime_error)
87 {
88  auto ifc = db::ConfigurationInterface{default_dbprovider};
89 
90  auto versionstring = version.toString();
91 
92  //configuration->getViewP()->setUniqueStorageIdentifier(storageUID);
93 
94  auto result =
95  ifc.template loadVersion<decltype(configuration), JsonData>(configuration, versionstring, default_entity);
96 
97  if (result.first)
98  {
99  //make sure version is set.. not clear it was happening in loadVersion
100  configuration->getViewP()->setVersion(version);
101  return;
102  }
103  __SS__ << "\n\nDBI Error while filling '" << configuration->getConfigurationName() <<
104  "' version '" << versionstring << "' - are you sure this version exists?" <<
105  "Here is the error:\n\n" << result.second << std::endl;
106  std::cout << __COUT_HDR_FL__ << ss.str();
107  throw std::runtime_error(ss.str());
108 }
109 
110 //==============================================================================
111 // write configuration to database
112 void DatabaseConfigurationInterface::saveActiveVersion(const ConfigurationBase*
113  configuration, bool overwrite) const
114 throw(std::runtime_error)
115 {
116  auto ifc = db::ConfigurationInterface{default_dbprovider};
117 
118  //configuration->getView().getUniqueStorageIdentifier()
119 
120  auto versionstring = configuration->getView().getVersion().toString();
121  //std::cout << __COUT_HDR_FL__ << "versionstring: " << versionstring << "\n";
122 
123  //auto result =
124  // ifc.template storeVersion<decltype(configuration), JsonData>(configuration, versionstring, default_entity);
125  auto result = overwrite ?
126  ifc.template overwriteVersion<decltype(configuration), JsonData>(configuration, versionstring, default_entity) :
127  ifc.template storeVersion<decltype(configuration), JsonData>(configuration, versionstring, default_entity);
128 
129  if (result.first)
130  return;
131 
132  __SS__ << "DBI Error:" << result.second << std::endl;
133  std::cout << __COUT_HDR_FL__ << ss.str();
134  throw std::runtime_error(ss.str());
135 }
136 
137 //==============================================================================
138 // find the latest configuration version by configuration type
139 ConfigurationVersion DatabaseConfigurationInterface::findLatestVersion(const ConfigurationBase* configuration) const
140 noexcept
141 {
142  auto versions = getVersions(configuration);
143 
144  std::cout << __COUT_HDR_FL__ << "Config Name: " << configuration->getConfigurationName() << std::endl;
145  std::cout << __COUT_HDR_FL__ << "All Versions: " ;
146  for(auto &v : versions)
147  std::cout << v << " ";
148  std::cout << std::endl;
149 
150  if (!versions.size()) return ConfigurationVersion(); //return INVALID
151 
152  return *(versions.rbegin());
153 }
154 
155 //==============================================================================
156 // find all configuration versions by configuration type
157 std::set<ConfigurationVersion> DatabaseConfigurationInterface::getVersions(const ConfigurationBase* configuration) const
158 noexcept
159 try
160 {
161  auto ifc = db::ConfigurationInterface{default_dbprovider};
162  auto result = ifc.template getVersions<decltype(configuration)>(configuration, default_entity);
163 
164  auto resultSet = std::set<ConfigurationVersion>{};
165  for(std::string const& version:result)
166  resultSet.insert(ConfigurationVersion(std::stol(version, 0, 10)));
167 
168  // auto to_set = [](auto const& inputList)
169  // {
170  // auto resultSet = std::set<ConfigurationVersion>{};
171  // std::for_each(inputList.begin(), inputList.end(),
172  // [&resultSet](std::string const& version)
173  // { resultSet.insert(std::stol(version, 0, 10)); });
174  // return resultSet;
175  // };
176 
177  //auto vs = to_set(result);
178  //for(auto &v:vs)
179  // std::cout << __COUT_HDR_FL__ << "\tversion " << v << std::endl;
180 
181  return resultSet;//to_set(result);
182 }
183 catch (std::exception const& e)
184 {
185  std::cout << __COUT_HDR_FL__ << "DBI Exception:" << e.what() << "\n";
186  return {};
187 }
188 
189 
190 //==============================================================================
191 // returns a list of all configuration names
192 std::set<std::string /*name*/> DatabaseConfigurationInterface::getAllConfigurationNames() const
193 throw(std::runtime_error)
194 try
195 {
196  auto ifc = db::ConfigurationInterface{default_dbprovider};
197 
198  auto collection_name_prefix=std::string{};
199 
200  return ifc.listCollections(collection_name_prefix);
201 }
202 catch (std::exception const& e)
203 {
204  std::cout << __COUT_HDR_FL__ << "DBI Exception:" << e.what() << "\n";
205  throw std::runtime_error(e.what());
206 }
207 catch (...)
208 {
209  std::cout << __COUT_HDR_FL__ << "DBI Unknown exception.\n";
210  throw std::runtime_error("DBI Unknown exception.");
211 }
212 
213 //==============================================================================
214 // find all configuration groups in database
215 std::set<std::string /*name*/> DatabaseConfigurationInterface::getAllConfigurationGroupNames(const std::string &filterString) const
216 throw(std::runtime_error) try
217 {
218  auto ifc = db::ConfigurationInterface{default_dbprovider};
219 
220  if(filterString == "")
221  return ifc.findGlobalConfigurations("*"); //GConfig will return all GConfig* with filesystem db.. for mongodb would require reg expr
222  else
223  return ifc.findGlobalConfigurations(filterString + "*"); //GConfig will return all GConfig* with filesystem db.. for mongodb would require reg expr
224 }
225 catch (std::exception const& e)
226 {
227  std::cout << __COUT_HDR_FL__ << "DBI Exception:" << e.what() << "\n";
228  throw std::runtime_error(e.what());
229 }
230 catch (...)
231 {
232  std::cout << __COUT_HDR_FL__ << "DBI Unknown exception.\n";
233  throw std::runtime_error("DBI Unknown exception.");
234 }
235 
236 
237 //==============================================================================
238 // find all configuration groups in database
239 std::set<ConfigurationGroupKey /*key*/> DatabaseConfigurationInterface::getKeys(const std::string &groupName) const
240 {
241  std::set<ConfigurationGroupKey> retSet;
242  std::set<std::string /*name*/> names = getAllConfigurationGroupNames();
243  for(auto &n : names)
244  if(n.find(groupName) == 0)
245  retSet.insert(ConfigurationGroupKey(n));
246  return retSet;
247 }
248 
249 //==============================================================================
250 // return the contents of a configuration group
251 config_version_map_t DatabaseConfigurationInterface::getConfigurationGroupMembers(
252  std::string const& configurationGroup, bool includeMetaDataTable) const
253 throw(std::runtime_error)
254 try
255 {
256  //std::cout << __COUT_HDR_FL__ << "configurationGroup:" << configurationGroup << "\n";
257  auto ifc = db::ConfigurationInterface{default_dbprovider};
258  auto result = ifc.loadGlobalConfiguration(configurationGroup);
259 
260  auto to_map = [](auto const& inputList, bool includeMetaDataTable) {
261  auto resultMap = config_version_map_t{};
262 
263  std::for_each(inputList.begin(), inputList.end(),
264  [&resultMap](auto const& info) { resultMap[info.configuration] = std::stol(info.version, 0, 10); });
265 
266  if(!includeMetaDataTable)
267  {
268  //remove special meta data table from member map
269  auto metaTable =
270  resultMap.find(GROUP_METADATA_TABLE_NAME);
271  if(metaTable != resultMap.end())
272  resultMap.erase(metaTable);
273  }
274  return resultMap;
275  };
276 
277  return to_map(result,includeMetaDataTable);
278 }
279 catch (std::exception const& e)
280 {
281  std::cout << __COUT_HDR_FL__ << "DBI Exception:" << e.what() << "\n";
282  throw std::runtime_error(e.what());
283 }
284 catch (...)
285 {
286  std::cout << __COUT_HDR_FL__ << "DBI Unknown exception.\n";
287  throw std::runtime_error("DBI Unknown exception.");
288 }
289 
290 //==============================================================================
291 // create a new configuration group from the contents map
292 void DatabaseConfigurationInterface::saveConfigurationGroup(config_version_map_t const& configurationMap,
293  std::string const& configurationGroup) const
294 throw(std::runtime_error)
295 try
296 {
297  auto ifc = db::ConfigurationInterface{default_dbprovider};
298 
299  auto to_list = [](auto const& inputMap) {
300  auto resultList = VersionInfoList_t{};
301  std::transform(inputMap.begin(), inputMap.end(), std::back_inserter(resultList), [](auto const& mapEntry) {
302  return VersionInfoList_t::value_type{mapEntry.first, mapEntry.second.toString(), default_entity};
303  });
304 
305  return resultList;
306  };
307 
308  auto result = ifc.storeGlobalConfiguration(to_list(configurationMap), configurationGroup);
309 
310  if (result.first) return;
311 
312  throw std::runtime_error(result.second);
313 }
314 catch (std::exception const& e)
315 {
316  std::cout << __COUT_HDR_FL__ << "DBI Exception:" << e.what() << "\n";
317  throw std::runtime_error(e.what());
318 }
319 catch (...)
320 {
321  std::cout << __COUT_HDR_FL__ << "DBI Unknown exception.\n";
322  throw std::runtime_error("DBI Unknown exception.");
323 }
324 
325