1 #include "otsdaq-core/ConfigurationInterface/DatabaseConfigurationInterface.h"
2 #include "otsdaq-core/Macros/CoutMacros.h"
3 #include "otsdaq-core/MessageFacility/MessageFacility.h"
10 #include "artdaq-database/BasicTypes/basictypes.h"
11 #include "artdaq-database/ConfigurationDB/configurationdbifc.h"
12 #include "otsdaq-core/TableCore/TableBase.h"
14 #include "artdaq-database/ConfigurationDB/configuration_common.h"
15 #include "artdaq-database/ConfigurationDB/dispatch_common.h"
16 #include "artdaq-database/StorageProviders/FileSystemDB/provider_filedb.h"
17 #include "artdaq-database/StorageProviders/FileSystemDB/provider_filedb_index.h"
21 using artdaq::database::basictypes::FhiclData;
22 using artdaq::database::basictypes::JsonData;
25 using config_version_map_t = ots::DatabaseConfigurationInterface::config_version_map_t;
27 namespace db = artdaq::database::configuration;
28 using VersionInfoList_t = db::ConfigurationInterface::VersionInfoList_t;
30 constexpr
auto default_dbprovider =
"filesystem";
31 constexpr
auto default_entity =
"OTSROOT";
34 DatabaseConfigurationInterface::DatabaseConfigurationInterface()
40 artdaq::database::configuration::debug::ExportImport();
41 artdaq::database::configuration::debug::ManageAliases();
42 artdaq::database::configuration::debug::ManageConfigs();
43 artdaq::database::configuration::debug::ManageDocuments();
44 artdaq::database::configuration::debug::Metadata();
46 artdaq::database::configuration::debug::detail::ExportImport();
47 artdaq::database::configuration::debug::detail::ManageAliases();
48 artdaq::database::configuration::debug::detail::ManageConfigs();
49 artdaq::database::configuration::debug::detail::ManageDocuments();
50 artdaq::database::configuration::debug::detail::Metadata();
52 artdaq::database::configuration::debug::options::OperationBase();
53 artdaq::database::configuration::debug::options::BulkOperations();
54 artdaq::database::configuration::debug::options::ManageDocuments();
55 artdaq::database::configuration::debug::options::ManageConfigs();
56 artdaq::database::configuration::debug::options::ManageAliases();
58 artdaq::database::configuration::debug::MongoDB();
59 artdaq::database::configuration::debug::UconDB();
60 artdaq::database::configuration::debug::FileSystemDB();
62 artdaq::database::filesystem::index::debug::enable();
64 artdaq::database::filesystem::debug::enable();
65 artdaq::database::mongo::debug::enable();
67 artdaq::database::docrecord::debug::JSONDocumentBuilder();
68 artdaq::database::docrecord::debug::JSONDocument();
79 void DatabaseConfigurationInterface::fill(
TableBase* configuration,
83 auto ifc = db::ConfigurationInterface{default_dbprovider};
85 auto versionstring = version.toString();
90 auto result = ifc.template loadVersion<decltype(configuration), JsonData>(
91 configuration, versionstring, default_entity);
96 configuration->getViewP()->setVersion(version);
99 __SS__ <<
"\n\nDBI Error while filling '" << configuration->getTableName()
100 <<
"' version '" << versionstring <<
"' - are you sure this version exists?\n"
101 <<
"Here is the error:\n\n"
102 << result.second << __E__;
108 void DatabaseConfigurationInterface::saveActiveVersion(
const TableBase* configuration,
109 bool overwrite)
const
112 auto ifc = db::ConfigurationInterface{default_dbprovider};
116 auto versionstring = configuration->getView().getVersion().toString();
122 auto result = overwrite
123 ? ifc.template overwriteVersion<decltype(configuration), JsonData>(
124 configuration, versionstring, default_entity)
125 : ifc.template storeVersion<decltype(configuration), JsonData>(
126 configuration, versionstring, default_entity);
131 __SS__ <<
"DBI Error:" << result.second << __E__;
132 __COUT__ <<
"\n" << ss.str();
138 TableVersion DatabaseConfigurationInterface::findLatestVersion(
141 auto versions = getVersions(table);
143 __COUT__ <<
"Config Name: " << table->getTableName() << __E__;
144 __COUT__ <<
"All Versions: ";
145 for(
auto& v : versions)
146 std::cout << v <<
" ";
152 return *(versions.rbegin());
157 std::set<TableVersion> DatabaseConfigurationInterface::getVersions(
158 const TableBase* table)
const noexcept
try
160 auto ifc = db::ConfigurationInterface{default_dbprovider};
161 auto result = ifc.template getVersions<decltype(table)>(table, default_entity);
163 auto resultSet = std::set<TableVersion>{};
164 for(std::string
const& version : result)
165 resultSet.insert(
TableVersion(std::stol(version, 0, 10)));
182 catch(std::exception
const& e)
184 __COUT__ <<
"DBI Exception:" << e.what() <<
"\n";
190 std::set<std::string > DatabaseConfigurationInterface::getAllTableNames() const
193 auto ifc = db::ConfigurationInterface{default_dbprovider};
195 auto collection_name_prefix = std::string{};
197 return ifc.listCollections(collection_name_prefix);
199 catch(std::exception
const& e)
201 __SS__ <<
"DBI Exception:" << e.what() <<
"\n";
206 __SS__ <<
"DBI Unknown exception.\n";
212 std::set<std::string > DatabaseConfigurationInterface::getAllTableGroupNames(
213 const std::string& filterString)
const try
215 auto ifc = db::ConfigurationInterface{default_dbprovider};
217 if(filterString ==
"")
218 return ifc.findGlobalConfigurations(
"*");
222 return ifc.findGlobalConfigurations(filterString +
"*");
228 catch(std::exception
const& e)
230 __SS__ <<
"Filter string '" << filterString <<
"' yielded DBI Exception:" << e.what()
232 __COUT_ERR__ << ss.str();
237 __SS__ <<
"Filter string '" << filterString <<
"' yielded DBI Unknown exception.\n";
238 __COUT_ERR__ << ss.str();
245 TableGroupKey DatabaseConfigurationInterface::findLatestGroupKey(
246 const std::string& groupName)
const noexcept
248 std::set<TableGroupKey> keys = DatabaseConfigurationInterface::getKeys(groupName);
250 return *(keys.crbegin());
258 std::set<
TableGroupKey > DatabaseConfigurationInterface::getKeys(
259 const std::string& groupName)
const
261 std::set<TableGroupKey> retSet;
262 std::set<std::string > names = getAllTableGroupNames();
264 if(n.find(groupName) == 0)
271 config_version_map_t DatabaseConfigurationInterface::getTableGroupMembers(
272 std::string
const& tableGroup,
bool includeMetaDataTable)
const try
274 auto ifc = db::ConfigurationInterface{default_dbprovider};
275 auto result = ifc.loadGlobalConfiguration(tableGroup);
281 auto to_map = [](
auto const& inputList,
bool includeMetaDataTable) {
282 auto resultMap = config_version_map_t{};
284 std::for_each(inputList.begin(), inputList.end(), [&resultMap](
auto const& info) {
285 resultMap[info.configuration] = std::stol(info.version, 0, 10);
288 if(!includeMetaDataTable)
291 auto metaTable = resultMap.find(GROUP_METADATA_TABLE_NAME);
292 if(metaTable != resultMap.end())
293 resultMap.erase(metaTable);
298 return to_map(result, includeMetaDataTable);
300 catch(std::exception
const& e)
302 __SS__ <<
"DBI Exception getting Group's member tables for '" << tableGroup
305 __COUT_ERR__ << ss.str();
310 __SS__ <<
"DBI Unknown exception getting Group's member tables for '" << tableGroup
312 __COUT_ERR__ << ss.str();
318 void DatabaseConfigurationInterface::saveTableGroup(
319 config_version_map_t
const& configurationMap,
320 std::string
const& configurationGroup)
const try
322 auto ifc = db::ConfigurationInterface{default_dbprovider};
324 auto to_list = [](
auto const& inputMap) {
325 auto resultList = VersionInfoList_t{};
329 std::back_inserter(resultList),
330 [](
auto const& mapEntry) {
331 return VersionInfoList_t::value_type{
332 mapEntry.first, mapEntry.second.toString(), default_entity};
339 ifc.storeGlobalConfiguration(to_list(configurationMap), configurationGroup);
344 __THROW__(result.second);
346 catch(std::exception
const& e)
348 __SS__ <<
"DBI Exception:" << e.what() <<
"\n";
349 __COUT_ERR__ << ss.str();
354 __SS__ <<
"DBI Unknown exception.\n";
355 __COUT_ERR__ << ss.str();