00001 #include "otsdaq-core/ConfigurationInterface/ConfigurationInterface.h"
00002 #include "otsdaq-core/ConfigurationInterface/FileConfigurationInterface.h"
00003 #include "otsdaq-core/ConfigurationInterface/DatabaseConfigurationInterface.h"
00004
00005 #include "otsdaq-core/MessageFacility/MessageFacility.h"
00006 #include "otsdaq-core/Macros/CoutMacros.h"
00007
00008 #include <typeinfo>
00009 #include <iostream>
00010 #include <cassert>
00011 #include <dirent.h>
00012
00013 using namespace ots;
00014
00015
00016 #define DEBUG_CONFIGURATION true
00017
00018
00019 ConfigurationInterface* ConfigurationInterface::theInstance_ = 0;
00020 bool ConfigurationInterface::theMode_ = true;
00021 bool ConfigurationInterface::theVersionTrackingEnabled_ = true;
00022
00023 const std::string ConfigurationInterface::GROUP_METADATA_TABLE_NAME = "ConfigurationGroupMetadata";
00024
00025
00026 ConfigurationInterface::ConfigurationInterface()
00027 {}
00028
00029
00030 ConfigurationInterface* ConfigurationInterface::getInstance(bool mode)
00031 {
00032 if(mode == true)
00033 {
00034 if(theInstance_ != 0 && dynamic_cast<FileConfigurationInterface*>(theInstance_) == 0)
00035 {
00036 delete theInstance_;
00037 theInstance_ = 0;
00038 }
00039 if( theInstance_ == 0)
00040 theInstance_ = new FileConfigurationInterface();
00041 }
00042 else
00043 {
00044 if(theInstance_ != 0 && dynamic_cast<DatabaseConfigurationInterface*>(theInstance_) == 0)
00045 {
00046 delete theInstance_;
00047 theInstance_ = 0;
00048 }
00049 if( theInstance_ == 0)
00050 {
00051 theInstance_ = new DatabaseConfigurationInterface();
00052 }
00053 }
00054 theMode_ = mode;
00055 return theInstance_;
00056 }
00057
00058
00059 bool ConfigurationInterface::isVersionTrackingEnabled()
00060 {
00061 return ConfigurationInterface::theVersionTrackingEnabled_;
00062 }
00063
00064
00065 void ConfigurationInterface::setVersionTrackingEnabled(bool setValue)
00066 {
00067 ConfigurationInterface::theVersionTrackingEnabled_ = setValue;
00068 }
00069
00070
00071
00072
00073
00074
00075
00076 ConfigurationVersion ConfigurationInterface::saveNewVersion(ConfigurationBase* configuration,
00077 ConfigurationVersion temporaryVersion, ConfigurationVersion newVersion)
00078 {
00079 if(!temporaryVersion.isTemporaryVersion() ||
00080 !configuration->isStored(temporaryVersion))
00081 {
00082 std::cout << __COUT_HDR_FL__ << "Invalid temporary version number: " << temporaryVersion << std::endl;
00083 return ConfigurationVersion();
00084 }
00085
00086 if(!ConfigurationInterface::isVersionTrackingEnabled())
00087 newVersion = ConfigurationVersion::SCRATCH;
00088
00089 bool rewriteableExists = false;
00090
00091 std::set<ConfigurationVersion> versions = getVersions(configuration);
00092 if(newVersion == ConfigurationVersion::INVALID)
00093 {
00094 if(versions.size() &&
00095 *(versions.rbegin()) != ConfigurationVersion(ConfigurationVersion::SCRATCH))
00096 newVersion = ConfigurationVersion::getNextVersion(*(versions.rbegin()));
00097 else if(versions.size() > 1)
00098 newVersion = ConfigurationVersion::getNextVersion(*(--(versions.rbegin())));
00099 else newVersion = ConfigurationVersion::DEFAULT;
00100 std::cout << __COUT_HDR_FL__ << "Next available version number is " << newVersion << std::endl;
00101
00102
00103
00104
00105
00106
00107
00108
00109 }
00110 else if(versions.find(newVersion) != versions.end())
00111 {
00112 std::cout << __COUT_HDR_FL__ << "newVersion(" << newVersion << ") already exists!" << std::endl;
00113 rewriteableExists = newVersion == ConfigurationVersion::SCRATCH;
00114
00115
00116 if(!rewriteableExists || ConfigurationInterface::isVersionTrackingEnabled())
00117 {
00118 __SS__ << ("New version already exists!") << std::endl;
00119 std::cout << __COUT_HDR_FL__ << ss.str();
00120 throw std::runtime_error(ss.str());
00121 }
00122 }
00123
00124 std::cout << __COUT_HDR_FL__ << "Version number to save is " << newVersion << std::endl;
00125
00126
00127
00128 configuration->changeVersionAndActivateView(temporaryVersion,newVersion);
00129
00130
00131
00132
00133 saveActiveVersion(configuration,
00134 !ConfigurationInterface::isVersionTrackingEnabled() &&
00135 rewriteableExists);
00136
00137 return newVersion;
00138 }
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154