CMS 3D CMS Logo

/data/doxygen/doxygen-1.7.3/gen/CMSSW_4_2_8/src/CondCore/Utilities/src/Utilities.cc

Go to the documentation of this file.
00001 #include "FWCore/PluginManager/interface/PluginManager.h"
00002 #include "FWCore/PluginManager/interface/standard.h"
00003 #include "FWCore/ServiceRegistry/interface/ServiceRegistry.h"
00004 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00005 
00006 //local includes
00007 #include "CondCore/DBCommon/interface/DbConnection.h"
00008 #include "CondCore/DBCommon/interface/SQLReport.h"
00009 #include "CondCore/DBCommon/interface/FipProtocolParser.h"
00010 #include "CondCore/Utilities/interface/Utilities.h"
00011 #include "FWCore/PluginManager/interface/PluginManager.h"
00012 #include "FWCore/PluginManager/interface/standard.h"
00013 #include "FWCore/PluginManager/interface/SharedLibrary.h"
00014 #include "CondCore/DBCommon/interface/SharedLibraryName.h"
00015 #include <boost/foreach.hpp>                   
00016 #include <fstream>
00017 
00018 cond::UtilitiesError::UtilitiesError(const std::string& message ):Exception(message){
00019 }
00020 cond::UtilitiesError::~UtilitiesError() throw(){}
00021 
00035 cond::Utilities::Utilities( const std::string& commandName,
00036                             std::string positionalParameter):m_name(commandName),
00037                                                              m_options(std::string("Usage: ")+m_name+
00038                                                                        std::string(" [options] ")+positionalParameter
00039                                                                        +std::string(" \n")),
00040                                                              m_positionalOptions(),
00041                                                              m_values(),
00042                                                              m_dbConnection(0),
00043                                                              m_pluginMgrInitialized(false),
00044                                                              m_dbSessions(){
00045   m_options.add_options()
00046     ("debug","switch on debug mode")
00047     ("help,h", "help message")
00048     ;
00049   if(!positionalParameter.empty()) {
00050     m_positionalOptions.add( positionalParameter.c_str(), -1);
00051     addOption<std::string>(positionalParameter,"",positionalParameter);
00052   }
00053 }
00054 
00055 
00056 cond::Utilities::~Utilities(){
00057   if(m_dbConnection) delete m_dbConnection;
00058 }
00059 
00060 int cond::Utilities::execute(){
00061   return 0;
00062 }
00063 
00064 int cond::Utilities::run( int argc, char** argv ){
00065   int ret = 0;
00066   try{
00067     parseCommand( argc, argv );
00068     if (m_values.count("help")) {
00069       std::cout << m_options <<std::endl;;
00070       return 0;
00071     }
00072     if(m_options.find_nothrow("dictionary",false)&& m_values.count("dictionary")){
00073       std::vector<std::string> dictionaries =
00074         m_values["dictionary"].as<std::vector<std::string> >();
00075       if(!dictionaries.empty()){
00076         initializePluginManager();
00077         cond::SharedLibraryName libName;
00078         BOOST_FOREACH(std::string const & dict, dictionaries)
00079           edmplugin::SharedLibrary( libName(dict) );
00080       }
00081     }
00082     ret = execute();
00083     if(m_dbConnection){
00084       if(m_options.find_nothrow("sql",false) && m_values.count("sql")){
00085         cond::SQLReport report(*m_dbConnection);
00086         for(std::set<std::string>::const_iterator iSess = m_dbSessions.begin();
00087             iSess != m_dbSessions.end();
00088             iSess++) report.reportForConnection(*iSess);
00089         report.putOnFile();
00090       }
00091     }
00092     
00093   }catch( cond::Exception& err ){
00094     std::cout << err.what() << std::endl;
00095     ret = 1;
00096   }catch( const std::exception& exc ){
00097     std::cout << exc.what() << std::endl;
00098     ret = 1;
00099   }
00100   return ret;
00101 }
00102 
00103 void 
00104 cond::Utilities::addAuthenticationOptions(){
00105   addOption<std::string>("authPath","P","path to authentication xml(default .)");
00106   addOption<std::string>("user","u","user name (default \"\")");
00107   addOption<std::string>("pass","p","password (default \"\")");
00108 }
00109 
00110 void
00111 cond::Utilities::addConnectOption(){
00112   addOption<std::string>("connect","c","connection string(required)");
00113   m_dbSessions.insert("connect");
00114 }
00115 
00116 void
00117 cond::Utilities::addConnectOption(const std::string& connectionOptionName,
00118                                   const std::string& shortName,
00119                                   const std::string& helpEntry ){
00120   addOption<std::string>(connectionOptionName,shortName,helpEntry);
00121   m_dbSessions.insert(connectionOptionName);
00122 }
00123 
00124 
00125 void 
00126 cond::Utilities::addLogDBOption(){
00127   addConnectOption("logDB","l","logDB(optional");
00128 }
00129 
00130 void 
00131 cond::Utilities::addDictionaryOption(){
00132   addOption<std::vector<std::string> >("dictionary","D","data dictionaries (required if no plugin available)");
00133 }
00134 
00135 void 
00136 cond::Utilities::addConfigFileOption(){
00137   addOption<std::string>("configFile","f","configuration file(optional)");
00138 }
00139 
00140 void
00141 cond::Utilities::addSQLOutputOption(){
00142   addOption<bool>("sql","S","dump the sql output (optional)");  
00143 }
00144 
00145 void cond::Utilities::parseCommand( int argc, char** argv ){
00146   boost::program_options::store(boost::program_options::command_line_parser(argc, argv).options(m_options).positional(m_positionalOptions).run(), m_values);
00147   if(m_options.find_nothrow("configFile",false)){
00148     std::string configFileName = getValueIfExists("configFile");
00149     if (! configFileName.empty()){
00150       std::fstream configFile;
00151       configFile.open(configFileName.c_str(), std::fstream::in);
00152       boost::program_options::store(boost::program_options::parse_config_file(configFile,m_options), m_values);
00153       configFile.close();
00154     }
00155   }
00156   boost::program_options::notify(m_values);
00157 }
00158 
00159 std::string cond::Utilities::getAuthenticationPathValue(){
00160   return getOptionValue<std::string>("authPath");
00161 }
00162 
00163 std::string cond::Utilities::getUserValue(){
00164   return getOptionValue<std::string>("user");  
00165 }
00166 
00167 std::string cond::Utilities::getPasswordValue(){
00168   return getOptionValue<std::string>("pass");  
00169 }
00170 
00171 std::string cond::Utilities::getConnectValue(){
00172   return getOptionValue<std::string>("connect");  
00173 }
00174 
00175 std::string cond::Utilities::getLogDBValue(){
00176   return getOptionValue<std::string>("logDB");  
00177 }
00178 
00179 std::string cond::Utilities::getDictionaryValue(){
00180   return getOptionValue<std::string>("dictionary");
00181 }
00182 
00183 std::string cond::Utilities::getConfigFileValue(){
00184   return getOptionValue<std::string>("configFile");
00185 }
00186 
00187 
00188 bool cond::Utilities::hasOptionValue(const std::string& fullName){
00189   const void* found = m_options.find_nothrow(fullName, false);
00190   if(!found){
00191     std::stringstream message;
00192     message << "Utilities::hasOptionValue: option \"" << fullName << "\" is not known by the command.";
00193     sendException(message.str());
00194   }
00195   return m_values.count(fullName);
00196 }
00197 
00198 bool cond::Utilities::hasDebug(){
00199   return m_values.count("debug");  
00200 }
00201 
00202 void cond::Utilities::initializePluginManager(){
00203   if(!m_pluginMgrInitialized){
00204     edmplugin::PluginManager::Config config;
00205     edmplugin::PluginManager::configure(edmplugin::standard::config());
00206 
00207     std::vector<edm::ParameterSet> psets;
00208     edm::ParameterSet pSet;
00209     pSet.addParameter("@service_type",std::string("SiteLocalConfigService"));
00210     psets.push_back(pSet);
00211     static edm::ServiceToken services(edm::ServiceRegistry::createSet(psets));
00212     static edm::ServiceRegistry::Operate operate(services);
00213 
00214     m_pluginMgrInitialized = true;
00215   }
00216 }
00217 
00218 void cond::Utilities::initializeForDbConnection(){
00219   if(!m_dbConnection){
00220     initializePluginManager();
00221     m_dbConnection = new cond::DbConnection();
00222     if( hasDebug() ){
00223       m_dbConnection->configuration().setMessageLevel(coral::Debug);
00224     } else {
00225       m_dbConnection->configuration().setMessageLevel(coral::Error);
00226     }
00227     m_dbConnection->configuration().setPoolAutomaticCleanUp( false );
00228     m_dbConnection->configuration().setConnectionTimeOut(0);
00229 
00230     if(m_options.find_nothrow("authPath", false) &&
00231        m_options.find_nothrow("user",false) &&
00232        m_options.find_nothrow("pass",false)){
00233       std::string authPath = getValueIfExists("authPath");
00234       std::string user = getValueIfExists("user");
00235       std::string pass = getValueIfExists("pass");
00236       if( !authPath.empty() ){
00237         m_dbConnection->configuration().setAuthenticationPath(authPath);
00238       } else {
00239         if( !user.empty()  && !pass.empty() ){
00240           std::string userenv(std::string("CORAL_AUTH_USER=")+user);
00241           std::string passenv(std::string("CORAL_AUTH_PASSWORD=")+pass);
00242           ::putenv(const_cast<char*>(userenv.c_str()));
00243           ::putenv(const_cast<char*>(passenv.c_str()));
00244         }
00245       }
00246     }
00247     if(m_options.find_nothrow("sql",false)){
00248       if(m_values.count("sql")) m_dbConnection->configuration().setSQLMonitoring( true );
00249     }
00250     m_dbConnection->configure();
00251     
00252   }
00253   
00254 }
00255 
00256 cond::DbSession cond::Utilities::openDbSession( const std::string& connectionParameterName, bool readOnly ){
00257   initializeForDbConnection();
00258   std::string connectionString = getOptionValue<std::string>( connectionParameterName );
00259   cond::DbSession session = m_dbConnection->createSession();
00260   session.open( connectionString, readOnly );
00261   return session;
00262 }
00263 
00264 std::string cond::Utilities::getValueIfExists(const std::string& fullName){
00265   std::string val("");
00266   if(m_values.count(fullName)){
00267     val = m_values[fullName].as<std::string>();
00268   }
00269   return val;
00270 }
00271 
00272 void cond::Utilities::sendError( const std::string& message ){
00273   throw cond::UtilitiesError(message);
00274 }
00275 
00276 void cond::Utilities::sendException( const std::string& message ){
00277   throw cond::Exception(message);
00278 }
00279