CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_4_1_8_patch13/src/CondCore/DBCommon/src/DbSession.cc

Go to the documentation of this file.
00001 //local includes
00002 #include "CondCore/DBCommon/interface/DbSession.h"
00003 #include "CondCore/DBCommon/interface/DbConnection.h"
00004 #include "CondCore/DBCommon/interface/DbTransaction.h"
00005 #include "CondCore/DBCommon/interface/Exception.h"
00006 #include "CondCore/DBCommon/interface/BlobStreamerPluginFactory.h"
00007 // CMSSW includes
00008 #include "FWCore/PluginManager/interface/PluginFactory.h"
00009 #include "CondCore/DBCommon/interface/TechnologyProxyFactory.h"
00010 #include "CondCore/ORA/interface/ConnectionPool.h"
00011 // coral includes
00012 #include "RelationalAccess/ISessionProxy.h"
00013 
00014 namespace cond {
00015   
00016   inline std::auto_ptr<cond::TechnologyProxy> buildTechnologyProxy(const std::string&userconnect, 
00017                                                                    const DbConnection& connection){
00018     std::string protocol;
00019     std::size_t pos=userconnect.find_first_of(':');
00020     if( pos!=std::string::npos ){
00021       protocol=userconnect.substr(0,pos);
00022       std::size_t p=protocol.find_first_of('_');
00023       if(p!=std::string::npos){
00024         protocol=protocol.substr(0,p);
00025       }
00026     }else{
00027       throw cond::Exception(userconnect +":connection string format error");
00028     }
00029     //std::cout<<"userconnect "<<userconnect<<std::endl;
00030     //std::cout<<"protocol "<<protocol<<std::endl;  
00031     std::auto_ptr<cond::TechnologyProxy> ptr(cond::TechnologyProxyFactory::get()->create(protocol));
00032     (*ptr).initialize(userconnect,connection);
00033     return ptr;
00034   }
00035   
00036   class SessionImpl {
00037     public:
00038       SessionImpl():
00039         connection(),
00040         blobStreamingService( "COND/Services/BlobStreamingService" ),
00041         database(),
00042         transaction(),
00043         isOpen(false){
00044       }
00045 
00046       explicit SessionImpl( const DbConnection& connection ):
00047         connection(new DbConnection(connection)),
00048         blobStreamingService( "COND/Services/BlobStreamingService" ),
00049         database(),
00050         transaction(),
00051         isOpen(false){
00052       }
00053       
00054     
00055       virtual ~SessionImpl(){
00056         close();
00057       }
00058     
00059       void open( const std::string& connectionString,
00060                  bool readOnly ){
00061         close();
00062         if( connection.get() ){
00063           if(!connection->isOpen()){
00064             throw cond::Exception("DbSession::open: cannot open session. Underlying connection is closed.");
00065           }
00066           boost::shared_ptr<ora::ConnectionPool> connPool = connection->connectionPool();
00067           database.reset( new ora::Database( connPool ) );
00068  
00069           ora::IBlobStreamingService* blobStreamer = cond::BlobStreamerPluginFactory::get()->create(  blobStreamingService );
00070           if(!blobStreamer) throw cond::Exception("DbSession::open: cannot find required plugin. No instance of ora::IBlobStreamingService has been loaded..");
00071           database->configuration().setBlobStreamingService( blobStreamer );
00072           database->configuration().properties().setFlag( ora::Configuration::automaticDatabaseCreation() );
00073           // open the db connection
00074           technologyProxy = buildTechnologyProxy(connectionString, *connection);
00075           std::string connStr = (*technologyProxy).getRealConnectString();
00076           database->connect( connStr, readOnly );
00077           transaction.reset( new cond::DbTransaction( database->transaction() ) );
00078           isOpen = true;
00079         }
00080       }
00081 
00082       void close(){
00083         transaction.reset();
00084         database.reset();
00085         isOpen = false;
00086       }
00087 
00088       std::auto_ptr<DbConnection> connection;
00089       std::auto_ptr<cond::TechnologyProxy> technologyProxy;
00090       std::string const blobStreamingService;
00091       std::auto_ptr<ora::Database> database;
00092       std::auto_ptr<DbTransaction> transaction;
00093       bool isOpen;
00094   };
00095 
00096 }
00097 
00098 
00099 cond::DbSession::DbSession():
00100   m_implementation( new SessionImpl ){ 
00101 }
00102 
00103 cond::DbSession::DbSession( const DbConnection& connection ):
00104   m_implementation( new SessionImpl ( connection ) ){
00105 }
00106 
00107 cond::DbSession::DbSession( const DbSession& rhs ):
00108   m_implementation( rhs.m_implementation ){ 
00109 }
00110 
00111 cond::DbSession::~DbSession(){
00112 }
00113 
00114 cond::DbSession& cond::DbSession::operator=( const cond::DbSession& rhs ){
00115   if(this!=&rhs) m_implementation = rhs.m_implementation;
00116   return *this;
00117 }
00118 
00119 void cond::DbSession::open( const std::string& connectionString, bool readOnly )
00120 {
00121   m_implementation->open( connectionString, readOnly );
00122 }
00123 
00124 void cond::DbSession::close()
00125 {
00126   m_implementation->close();
00127 }
00128 
00129 bool cond::DbSession::isOpen() const {
00130   return m_implementation->isOpen;
00131 }
00132 
00133 const std::string& cond::DbSession::connectionString() const {
00134   if(!m_implementation->database.get())
00135     throw cond::Exception("DbSession::connectionString: cannot get connection string. Session has not been open.");
00136   return m_implementation->database->connectionString();
00137 }
00138 
00139 cond::DbConnection const & cond::DbSession::connection() const {
00140   return *(m_implementation->connection);
00141 }
00142 
00143 
00144 bool cond::DbSession::isTransactional() const {
00145   return m_implementation->technologyProxy->isTransactional();
00146 }
00147 
00148 const std::string& cond::DbSession::blobStreamingService() const 
00149 {
00150   return m_implementation->blobStreamingService;
00151 }
00152 
00153 cond::DbTransaction& cond::DbSession::transaction()
00154 {
00155   if(!m_implementation->connection.get() || !m_implementation->connection->isOpen())
00156     throw cond::Exception("DbSession::transaction: cannot open transaction. Underlying connection is closed.");
00157   if(!m_implementation->transaction.get())
00158     throw cond::Exception("DbSession::transaction: cannot get transaction. Session has not been open.");
00159   return *m_implementation->transaction;
00160 }
00161 
00162 ora::Database& cond::DbSession::storage(){
00163   if(!m_implementation->connection.get() || !m_implementation->connection->isOpen())
00164     throw cond::Exception("DbSession::storage: cannot access the storage. Underlying connection is closed.");
00165   if(!m_implementation->database.get())
00166     throw cond::Exception("DbSession::storage: cannot access the database. Session has not been open.");
00167   return *m_implementation->database;
00168 }
00169 
00170 coral::ISchema& cond::DbSession::schema( const std::string& schemaName )
00171 {
00172   return storage().storageAccessSession().get().schema( schemaName );
00173 }
00174 
00175 coral::ISchema& cond::DbSession::nominalSchema()
00176 {
00177   return storage().storageAccessSession().get().nominalSchema(); 
00178 }
00179 
00180 bool cond::DbSession::deleteMapping( const std::string& mappingVersion ){
00181   ora::DatabaseUtility utility = storage().utility();
00182   utility.eraseMapping( mappingVersion );
00183   return true;
00184 }
00185 
00186 bool cond::DbSession::importMapping( const std::string& sourceConnectionString,
00187                                      const std::string& contName ){ 
00188   ora::DatabaseUtility utility = storage().utility();
00189   std::auto_ptr<cond::TechnologyProxy> technologyProxy = buildTechnologyProxy(sourceConnectionString, *(m_implementation->connection));
00190   utility.importContainerSchema( (*technologyProxy).getRealConnectString(), contName );
00191   return true;
00192 }
00193 
00194 std::string cond::DbSession::storeObject( const ora::Object& object, const std::string& containerName  ){
00195   ora::OId oid = storage().insertItem( containerName, object );
00196   storage().flush();
00197   int oid0 = oid.containerId(); // no clue why in POOL contId does not start from 0...
00198   return writeToken( containerName, oid0, oid.itemId(), object.typeName() );
00199 }
00200 
00201 ora::Object  cond::DbSession::getObject( const std::string& objectId ){
00202   std::pair<std::string,int> oidData = parseToken( objectId );
00203   ora::Container cont = storage().containerHandle(  oidData.first );
00204   return cont.fetchItem( oidData.second );
00205 }
00206 
00207 bool cond::DbSession::deleteObject( const std::string& objectId ){
00208   std::pair<std::string,int> oidData = parseToken( objectId );
00209   ora::Container cont = storage().containerHandle(  oidData.first );
00210   cont.erase( oidData.second );
00211   cont.flush();
00212   return true;
00213 }
00214 
00215 std::string cond::DbSession::importObject( cond::DbSession& fromDatabase, const std::string& objectId ){
00216   std::pair<std::string,int> oidData = parseToken( objectId );
00217   ora::Object data = fromDatabase.getObject( objectId );
00218   std::string tok = storeObject( data, oidData.first );
00219   data.destruct();
00220   return tok;
00221 }
00222 
00223 void cond::DbSession::flush(){
00224   storage().flush();
00225 }
00226