tdaq-develop-2025-02-12
File_configInterface.cc
1 #include "otsdaq/ConfigurationInterface/File_configInterface.h"
2 #include <dirent.h>
3 #include <errno.h>
4 #include <iostream>
5 #include <set>
6 
7 #include "otsdaq/ConfigurationInterface/ConfigurationHandler.h"
8 #include "otsdaq/Macros/ConfigurationInterfacePluginMacros.h"
9 #include "otsdaq/Macros/CoutMacros.h"
10 #include "otsdaq/MessageFacility/MessageFacility.h"
11 #include "otsdaq/TableCore/TableBase.h"
12 
13 using namespace ots;
14 
15 //==============================================================================
17  TableVersion version) const
18 {
19  ConfigurationHandler::readXML(configuration, version);
20 }
21 
22 //==============================================================================
26  const TableBase* configuration) const
27 {
28  auto versions = getVersions(configuration);
29  if(!versions.size())
30  return TableVersion(); // return INVALID
31  return *(versions.rbegin());
32 }
33 
34 //==============================================================================
37  bool /*overwrite*/) const
38 {
39  ConfigurationHandler::writeXML(configuration);
40 }
41 
42 //==============================================================================
44  const TableBase* configuration) const
45 {
46  std::string configDir = ConfigurationHandler::getXMLDir(configuration);
47  std::cout << __COUT_HDR_FL__ << "ConfigurationDir: " << configDir << std::endl;
48  DIR* dp;
49 
50  struct dirent* dirp;
51 
52  if((dp = opendir(configDir.c_str())) == 0)
53  {
54  __SS__ << "ERROR:(" << errno << "). Can't open directory: " << configDir
55  << std::endl;
56  __COUT_ERR__ << ss.str();
57  __SS_THROW__;
58  }
59 
60  const unsigned char isDir = 0x4;
61  // const std::string pDir = ".";
62  // const std::string ppDir = "..";
63  // int dirVersion;
64  std::string::const_iterator it;
65  std::string dirName;
66  std::set<TableVersion> dirNumbers;
67 
68  while((dirp = readdir(dp)) != 0)
69  {
70  if(dirp->d_type == isDir && dirp->d_name[0] != '.')
71  {
72  dirName = dirp->d_name;
73  // Check if there are non numeric directories
74  it = dirName.begin();
75 
76  while(it != dirName.end() && std::isdigit(*it))
77  ++it;
78 
79  if(dirName.empty() || it != dirName.end())
80  {
81  std::cout << __COUT_HDR_FL__
82  << "WARNING: there is a non numeric directory in " << configDir
83  << " called " << dirName
84  << " please remove it from there since only numeric "
85  "directories are considered."
86  << std::endl;
87  continue;
88  }
89 
90  dirNumbers.insert(TableVersion(strtol(dirp->d_name, 0, 10)));
91  }
92  }
93  closedir(dp);
94  return dirNumbers;
95 }
96 
97 DEFINE_OTS_CONFIGURATION_INTERFACE(FileConfigurationInterface)
static std::string writeXML(const TableBase &configuration)
returns the file name
static std::string getXMLDir(const TableBase *configuration)
void fill(TableBase *, TableVersion) const
read configuration from database
std::set< TableVersion > getVersions(const TableBase *) const
find all configuration versions by configuration type
TableVersion findLatestVersion(const TableBase *) const
find the latest configuration version by configuration type
void saveActiveVersion(const TableBase *, bool overwrite=false) const
write configuration to database