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
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