Пример #1
0
bool cond::MigrateGTUtilities::getGTList( const std::string& gt, 
					   std::vector<std::tuple<std::string,std::string,std::string,std::string,std::string> >&tagList ){
  cond::DbSession gtSession =  openDbSession("sourceConnect",cond::Auth::COND_READER_ROLE,true);
  gtSession.transaction().start(true);
  coral::ISchema& schema = gtSession.nominalSchema();

  std::string gtTable("TAGTREE_TABLE_");
  gtTable += gt;
  if( !schema.existsTable( gtTable ) ){
    std::cout <<"ERROR: The specified Global Tag \"" << gt <<"\" has not been found in the database." <<std::endl;
    return false;
  }

  bool ret = false;
  GT::tname = gtTable;
  TAGINV::tname = "TAGINVENTORY_TABLE";

  persistency::Query< TAGINV::tagname, TAGINV::objectname, TAGINV::recordname, TAGINV::labelname, TAGINV::pfn > q( schema );
  q.addCondition<GT::tagid, TAGINV::tagid>();
  q.addOrderClause<TAGINV::tagname>();
  for ( auto row : q ) {
    tagList.push_back( row );
    ret = true;
  }
  
  gtSession.transaction().commit();
  return ret;
}
Пример #2
0
int cond::ListIOVUtilities::execute(){
  initializePluginManager();
  
  bool listAll = hasOptionValue("all");
  cond::DbSession session = openDbSession( "connect", true );
  if( listAll ){
    cond::MetaData metadata_svc(session);
    std::vector<std::string> alltags;
    cond::DbScopedTransaction transaction(session);
    transaction.start(true);
    metadata_svc.listAllTags(alltags);
    transaction.commit();
    std::copy (alltags.begin(),
               alltags.end(),
               std::ostream_iterator<std::string>(std::cout,"\n")
	       );
  }else{
    std::string tag = getOptionValue<std::string>("tag");
    cond::MetaData metadata_svc(session);
    std::string token;
    cond::DbScopedTransaction transaction(session);
    transaction.start(true);
    token=metadata_svc.getToken(tag);
    transaction.commit();
    {
      bool verbose = hasOptionValue("verbose");
      bool details = hasOptionValue("summary");
      TFile * xml=0;
      if (details) {
	xml =  TFile::Open(std::string(tag+".xml").c_str(),"recreate");
      } 
      cond::IOVProxy iov( session, token, !details, details);
      unsigned int counter=0;
      std::string payloadContainer=iov.payloadContainerName();
      std::cout<<"Tag "<<tag;
      if (verbose) std::cout << "\nStamp: " << iov.iov().comment()
                             << "; time " <<  cond::time::to_boost(iov.iov().timestamp())
                             << "; revision " << iov.iov().revision();
      std::cout <<"\nTimeType " << cond::timeTypeSpecs[iov.timetype()].name
                <<"\nPayloadContainerName "<<payloadContainer<<"\n"
                <<"since \t till \t payloadToken"<<std::endl;
      for (cond::IOVProxy::const_iterator ioviterator=iov.begin(); ioviterator!=iov.end(); ioviterator++) {
        std::cout<<ioviterator->since() << " \t "<<ioviterator->till() <<" \t "<<ioviterator->wrapperToken();
        if (details) {
	  ora::Object obj = session.getObject(ioviterator->wrapperToken());
	  std::ostringstream ss; ss << tag << '_' << ioviterator->since(); 
	  xml->WriteObjectAny(obj.address(),obj.typeName().c_str(), ss.str().c_str());
	  obj.destruct();
        }
        std::cout<<std::endl;
        ++counter;
      }
      if (xml) xml->Close();
      std::cout<<"Total # of payload objects: "<<counter<<std::endl;
    }
  }
  return 0;
}
Пример #3
0
 std::string getToken(cond::DbSession & s, std::string & tag) {
   s = openDbSession("connect", true);
   cond::MetaData metadata_svc(s);
   cond::DbScopedTransaction transaction(s);
   transaction.start(true);
   std::string token = metadata_svc.getToken(tag);
   transaction.commit();
   std::cout << "Source iov token: " << token << "\n";
   return token;
 }
Пример #4
0
int cond::SchemaManager::execute(){

  bool drop= hasOptionValue("drop");
  bool dropAll= hasOptionValue("dropAll");
  bool create= hasOptionValue("create");
  std::string payloadName("");
  if( hasOptionValue("payload") ) payloadName = getOptionValue<std::string>("payload");
  std::string typeName("");
  if( hasOptionValue("type") ) typeName = getOptionValue<std::string>("type");

  cond::DbSession session = openDbSession("connect", Auth::COND_ADMIN_ROLE);

  cond::IOVSchemaUtility util( session, std::cout );

  cond::DbScopedTransaction trans( session );

  if( dropAll ){
    trans.start(false);
    util.dropAll();
    trans.commit();
    return 0;
  }

  if( drop || create ){
    trans.start(false);
    if( drop ){
      if(payloadName.empty()){
	throw cond::Exception("Payload name not provided.");
      }
      util.dropPayloadContainer( payloadName );
    }
    if( create ){
      util.createIOVContainer();
      if(!payloadName.empty()) util.createPayloadContainer( payloadName, typeName );
    }
    trans.commit();
    return 0;
  }
  
  throw cond::Exception("Option create or drop not provided.");
}
Пример #5
0
int cond::SchemaIOVUtilities::execute(){

  bool dropSchema= hasOptionValue("drop");
  bool createSchema= hasOptionValue("create");
  
  cond::DbSession session = openDbSession("connect", Auth::COND_ADMIN_ROLE );

  cond::IOVSchemaUtility util( session, std::cout );

  cond::DbScopedTransaction trans( session );
  if( dropSchema || createSchema ){
    trans.start(false);
    if( dropSchema ){
      util.dropIOVContainer();
    }
    if( createSchema ){
      util.createIOVContainer();
    }
    trans.commit();
    return 0;
  } 

  throw cond::Exception("Option create or drop not provided.");
}
Пример #6
0
int cond::ValidateUtilities::execute(){

  initializeForDbConnection();
  std::string tag("");
  if( hasOptionValue("tag") ) tag = getOptionValue<std::string>("tag");
  std::string dir("");
  if( hasOptionValue("dir") ) dir = getOptionValue<std::string>("dir");

  bool debug = hasDebug();

  std::string refConnect = getOptionValue<std::string>("reference");
  std::string candidate = getOptionValue<std::string>("candidate" );

  std::tuple<std::string,std::string,std::string> connPars = persistency::parseConnectionString( refConnect );
  if( std::get<0>( connPars ) == "frontier" ) throwException("Cannot validate data from FronTier cache.","ValidateUtilities::execute");
     
  std::string refDbName = std::get<1>( connPars )+"_"+std::get<2>( connPars );
  
  if(debug){
    std::cout << "tag " << tag << std::endl;
  }  
  
  
  std::vector<std::string> tagToProcess;
  if( !tag.empty() ){
    tagToProcess.push_back( tag );
  } else {
    cond::DbSession refdb = openDbSession( "reference", cond::Auth::COND_READER_ROLE, true );
    refdb.transaction().start( true );
    cond::MetaData  metadata(refdb);
    metadata.listAllTags( tagToProcess );
    refdb.transaction().commit();
  }

  persistency::ConnectionPool connPool;
  std::cout <<"# Opening session on reference database..."<<std::endl;
  persistency::Session session0 = connPool.createSession( refConnect );
  std::cout <<"# Opening session on candidates database..."<<std::endl;
  persistency::Session session1 = connPool.createSession( candidate );
  session1.transaction().start();
  if( !session1.existsDatabase() ) throwException( "Candidate DB \""+candidate+" does not exist.",
						   "MigrateUtilities::execute" );

  std::cout <<"# "<<tagToProcess.size()<<" tag(s) to process."<<std::endl;
  std::cout <<std::endl;
  size_t nt = 0;
  size_t tid = 0;
  for( auto t : tagToProcess ){
    tid++;
    std::cout <<"--> Processing tag["<<tid<<"]: "<<t<<std::endl;
    std::string refFileName("");
    std::string candFileName("");
    try{      
      std::cout <<"    Writing reference db"<<std::endl;
      refFileName = writeTag( t, "ref", session0, dir );
      std::string destTag("");
      cond::MigrationStatus status;
      if( !session1.checkMigrationLog( refConnect, t, destTag, status ) ) {
	std::cout << "    ERROR: Tag "<< t <<" has not been migrated in database " << candidate <<std::endl;
	boost::filesystem::remove( boost::filesystem::path(refFileName) );
      } else {
	std::cout <<"    Writing candidate db"<<std::endl;
	candFileName = writeTag( destTag, "cand", session1, dir ); 
	bool cmp = compareFiles( refFileName, candFileName ); 
	if(!cmp){
	  std::cout <<"    ERROR: Comparison found differences."<<std::endl;
	  flushFile( refDbName, t, refFileName );
	  flushFile( refDbName, t, candFileName  );
	} else {
	  std::cout <<"    Comparison OK."<<std::endl;
	}
	nt++;
      }
    } catch ( const std::exception& e ){
      std::cout <<"    ERROR:"<<e.what()<<std::endl;
      std::cout <<"    Tag "<<t<<" will be skipped."<<std::endl;
    }
    cleanUp( refFileName );
    cleanUp( candFileName );
  }

  std::cout <<std::endl<<"# "<<nt<<" tag(s) checked for validation."<<std::endl;

  return 0;
}
Пример #7
0
int cond::MigrateUtilities::execute(){

  std::string newTag("");
  std::string tag("");
  if( hasOptionValue("tag")) {
    tag = getOptionValue<std::string>("tag");
    if( hasOptionValue("newTag")) newTag = getOptionValue<std::string>("newTag");
  }
  bool debug = hasDebug();
  std::string destConnect = getOptionValue<std::string>("destConnect" );

  std::string sourceConnect = getOptionValue<std::string>("sourceConnect");
  std::tuple<std::string,std::string,std::string> connPars = parseConnectionString( sourceConnect );
  if( std::get<0>( connPars ) == "frontier" ) throwException("Cannot migrate data from FronTier cache.","MigrateUtilities::execute");

  std::cout <<"# Connecting to source database on "<<sourceConnect<<std::endl;
  cond::DbSession sourcedb = openDbSession( "sourceConnect", cond::Auth::COND_READER_ROLE, true );
     
  if(debug){
    std::cout << "tag " << tag << std::endl;
  }  
  
  sourcedb.transaction().start( true );
  cond::MetaData  metadata(sourcedb);
  
  std::vector<std::string> tagToProcess;
  if( !tag.empty() ){
    tagToProcess.push_back( tag );
  } else {
    metadata.listAllTags( tagToProcess );
  }

  persistency::ConnectionPool connPool;
  std::cout <<"# Opening session on destination database..."<<std::endl;
  persistency::Session session = connPool.createSession( destConnect, true );
    
  session.transaction().start( false );
  if( !session.existsDatabase() ) session.createDatabase();
  session.transaction().commit();

  std::cout <<"# "<<tagToProcess.size()<<" tag(s) to process."<<std::endl;
  std::cout <<std::endl;
  size_t nt = 0;
  size_t tid = 0;
  for( auto t : tagToProcess ){
    tid++;
    std::cout <<"--> Processing tag["<<tid<<"]: "<<t<<std::endl;
    session.transaction().start( false );

    std::string destTag("");
    if( session.checkMigrationLog( sourceConnect, t, destTag ) ){
      std::cout <<"    Tag already migrated." << std::endl;
      session.transaction().rollback();
      continue;
    }
    destTag = t;
    if( !newTag.empty() ){
      destTag = newTag;
    } else {
      if( session.existsIov( destTag ) ){
	destTag = destTag+"["+std::get<1>( connPars )+"/"+std::get<2>( connPars )+"]";
	std::cout <<"    Tag "<<t<<" already existing, renamed to "<<destTag<<std::endl;
      }
    }
    if( session.existsIov( destTag ) ){
      session.transaction().rollback();
      throwException("Tag \""+destTag+"\" already exists.","MigrateUtilities::execute");
    }

    std::cout <<"    Resolving source tag oid..."<<std::endl;
    std::string iovTok = metadata.getToken(t); 
    if(iovTok.empty()){
      session.transaction().rollback();
      throw std::runtime_error(std::string("tag ")+t+std::string(" not found") );
    }
    std::map<std::string,Hash> tokenToHash;
    size_t niovs = 0;
    std::set<Hash> pids;
    persistency::IOVEditor editor;
    std::cout <<"    Loading source tag..."<<std::endl;
    try{
      cond::IOVProxy sourceIov(sourcedb, iovTok);
      int tt = (int) sourceIov.timetype();
      if( sourceIov.size() == 0 ) {
	std::cout <<"    No iov found. Skipping tag."<<std::endl;
	session.transaction().rollback();
	continue;
      }
      std::string payloadType("");
      if( sourceIov.payloadClasses().size() > 0 ) { 
	payloadType = *(sourceIov.payloadClasses().begin());
      } else {
	std::string tk = sourceIov.begin()->token();
	payloadType = sourcedb.classNameForItem( tk );
      }
      std::cout <<"    Importing tag. Size:"<<sourceIov.size()<<" timeType:"<<cond::timeTypeNames(tt)<<" payloadObjectType=\""<<payloadType<<"\""<<std::endl;
      editor = session.createIov( payloadType, destTag, (cond::TimeType)tt );
      editor.setDescription( "Tag "+t+" migrated from "+sourceConnect  );
      for(  auto iov : sourceIov ){
	Time_t s = iov.since();
	std::string tok = iov.token();
	Hash pid("");
	auto f = tokenToHash.find( tok );
	if( f == tokenToHash.end() ){
	  if(hasDebug() ) std::cout <<"Debug: fetching object for iov ["<<niovs+1<<"] oid: \""<<t<<"\" from source database"<<std::endl;
	  ora::Object obj = sourcedb.getObject( tok );
	  if(hasDebug() ) std::cout <<"Debug: importing object into destination database"<<std::endl;
	  pid = import( obj.typeName(), obj.address(), session );  
	  tokenToHash.insert( std::make_pair( tok, pid ) );
	  obj.destruct();
	} else {
	  pid= f->second;
	}
	pids.insert( pid );
	editor.insert( s, pid );
	niovs++;
	if( niovs && (niovs%1000==0) ) std::cout <<"    Total of iov inserted: "<<niovs<<std::endl;
      } 
      std::cout <<"    Total of iov inserted: "<<niovs<<std::endl;
      std::cout <<"    Flushing changes..."<<std::endl;
      editor.flush();
      session.addToMigrationLog( sourceConnect, t, destTag );
      session.transaction().commit();
      std::cout <<"    Tag \""<<t<<"\" imported. Payloads:"<<pids.size()<<" IOVs:"<<niovs<<std::endl;
      nt++;
    } catch ( const std::exception& e ){
      std::cout <<"    ERROR:"<<e.what()<<std::endl;
      std::cout <<"    Tag "<<t<<" will be skipped."<<std::endl;
      session.transaction().rollback();
      continue;
    }
  }

  std::cout <<"# "<<nt<<" tag(s) migrated."<<std::endl;

  sourcedb.transaction().commit();

  return 0;
}
Пример #8
0
int cond::DuplicateIOVUtilities::execute(){

  std::string sourceTag = getOptionValue<std::string>("tag");
  std::string destTag(sourceTag);
  if(hasOptionValue("destTag")) destTag = getOptionValue<std::string>("destTag");
  cond::Time_t from = getOptionValue<cond::Time_t>("fromTime");
  cond::Time_t since = getOptionValue<cond::Time_t>("sinceTime");
  bool doLog = hasOptionValue("logDB");
  bool debug = hasDebug();
  std::string destConnect = getOptionValue<std::string>("connect" );

  std::string usertext("no user comments");
  if( hasOptionValue("usertext")) usertext = getOptionValue<std::string>("usertext");
  
  cond::DbSession destDb = openDbSession( "connect", Auth::COND_WRITER_ROLE );

  std::string iovToken("");
  std::string destIovToken("");
  cond::TimeType iovType;
  std::string timetypestr("");
   
  if(debug){
    std::cout << "source tag " << sourceTag << std::endl;
    std::cout << "dest   tag  " << destTag << std::endl;
  }  
    
  cond::IOVProxy sourceIov(destDb);
  cond::IOVEditor destIov(destDb);
  // find tag
  cond::DbScopedTransaction transaction(destDb);
  transaction.start(false);
  destDb.storage().lockContainer(  IOVNames::container() );
  cond::MetaData  metadata(destDb);
  iovToken = metadata.getToken(sourceTag);
  if(iovToken.empty()) 
    throw std::runtime_error(std::string("tag ")+sourceTag+std::string(" not found") );
  sourceIov.load( iovToken );
  iovType=sourceIov.timetype();
  timetypestr = cond::timeTypeSpecs[iovType].name;
  if( metadata.hasTag(destTag) ){
    destIovToken=metadata.getToken(destTag);
    destIov.load( destIovToken );
    if (iovType!=destIov.proxy().timetype()) {
      throw std::runtime_error("iov type in source and dest differs");
    }
  } else {
    destIovToken = destIov.create( iovType );
    metadata.addMapping(destTag,destIovToken,iovType);
  }
  if(debug){
    std::cout<<"source iov token "<< iovToken<<std::endl;
    std::cout<<"dest   iov token "<< destIovToken<<std::endl;
    std::cout<<"iov type "<<  timetypestr<<std::endl;
  }
  cond::IOVProxy::const_iterator iElem = sourceIov.find( from );
  if( iElem == sourceIov.end() ){
    std::cerr <<"[Error] no payload found for time " << from << std::endl;
    return 1;    
  }
  std::string payload = iElem->token();
  std::string payloadClass = destDb.classNameForItem( payload );

  destIov.append(since,payload);
  destIov.stamp(cond::userInfo(),false);

  transaction.commit();

  ::sleep(1);
  
  // setup logDB and write on it...
  if (doLog){
    std::auto_ptr<cond::Logger> logdb;
    cond::DbSession logSession = openDbSession( "logDB", Auth::COND_WRITER_ROLE );
    logdb.reset(new cond::Logger( logSession ));
    logdb->createLogDBIfNonExist();

    cond::UserLogInfo a;
    a.provenance=destConnect+"/"+destTag;
    a.usertext="duplicateIOV V1.0;";
    std::ostringstream ss;
    ss << "From="<< from <<"; Since="<< since <<"; " << usertext;
    a.usertext +=ss.str();

    logdb->logOperationNow(a,destConnect,payloadClass,payload,destTag,timetypestr,0,since);
  }

  return 0;
}