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