Go to the documentation of this file.00001 #include "CondCore/DBCommon/interface/DbSession.h"
00002 #include "CondCore/DBCommon/interface/DbConnection.h"
00003 #include "CondCore/DBCommon/interface/Exception.h"
00004 #include "RelationalAccess/IWebCacheControl.h"
00005 #include "FWCore/Catalog/interface/SiteLocalConfig.h"
00006 #include "FWCore/ServiceRegistry/interface/Service.h"
00007
00008 #include "CondCore/IOVService/interface/IOVNames.h"
00009
00010 #include "CondCore/DBCommon/interface/TechnologyProxy.h"
00011 #include <string>
00012 #include <vector>
00013
00014 namespace cond{
00015 class FrontierProxy: public TechnologyProxy{
00016 public:
00017 FrontierProxy();
00018 ~FrontierProxy();
00019 void initialize( const DbConnection& connection);
00020 std::string getRealConnectString( const std::string&userconnect ) const;
00021 std::string getRealConnectString( const std::string&userconnect, const std::string& transactionId ) const;
00022 bool isTransactional() const { return false;}
00023
00024 private:
00025
00026 std::string makeRealConnectString( const std::string& initialConnection, const std::string& transactionId ) const ;
00027 private:
00028 const DbConnection* m_dbConnection;
00029 std::vector<std::string> m_refreshtablelist;
00030 };
00031 }
00032
00033
00034 cond::FrontierProxy::FrontierProxy():
00035 m_dbConnection(0),
00036 m_refreshtablelist(){
00037 m_refreshtablelist.reserve(10);
00038
00039 m_refreshtablelist.push_back(cond::IOVNames::iovTableName());
00040 m_refreshtablelist.push_back(cond::IOVNames::iovDataTableName());
00041
00042
00043 m_refreshtablelist.push_back("ORA_C_COND_IOVSEQUENCE");
00044 m_refreshtablelist.push_back("ORA_C_COND_IOVSEQU_A0");
00045 m_refreshtablelist.push_back("ORA_C_COND_IOVSEQU_A1");
00046
00047
00048 }
00049
00050 cond::FrontierProxy::~FrontierProxy(){
00051 m_refreshtablelist.clear();
00052 }
00053
00054 namespace cond {
00055
00056 unsigned int
00057 countslash(const std::string& input) {
00058 unsigned int count=0;
00059 std::string::size_type slashpos( 0 );
00060 while( slashpos!=std::string::npos){
00061 slashpos = input.find('/', slashpos );
00062 if ( slashpos != std::string::npos ){
00063 ++count;
00064
00065 slashpos += 1;
00066 }
00067 }
00068 return count;
00069 }
00070
00071 std::string
00072 cond::FrontierProxy::makeRealConnectString( const std::string& initialConnection,
00073 const std::string& transactionId ) const {
00074 std::string realConn = initialConnection;
00075
00076
00077 std::string proto("frontier://");
00078 std::string::size_type fpos=initialConnection.find(proto);
00079 unsigned int nslash=countslash(initialConnection.substr(proto.size(),initialConnection.size()-fpos));
00080 if(nslash==1){
00081 edm::Service<edm::SiteLocalConfig> localconfservice;
00082 if( !localconfservice.isAvailable() ){
00083 throw cms::Exception("edm::SiteLocalConfigService is not available");
00084 }
00085 realConn=localconfservice->lookupCalibConnect(initialConnection);
00086
00087 }
00088 if (!transactionId.empty()) {
00089 size_t l = realConn.rfind('/');
00090 realConn.insert(l,"(freshkey="+transactionId+')');
00091
00092
00093 }
00094
00095 std::string refreshConnect;
00096 std::string::size_type startRefresh = realConn.find("://");
00097 if (startRefresh != std::string::npos){
00098 startRefresh += 3;
00099 }
00100 std::string::size_type endRefresh=realConn.rfind("/", std::string::npos);
00101 if (endRefresh == std::string::npos){
00102 refreshConnect = realConn;
00103 }else{
00104 refreshConnect = realConn.substr(startRefresh, endRefresh-startRefresh);
00105 if(refreshConnect.substr(0,1) != "("){
00106
00107
00108 refreshConnect.insert(0, "https://");
00109 }
00110 }
00111 std::vector<std::string>::const_iterator ibeg=m_refreshtablelist.begin();
00112 std::vector<std::string>::const_iterator iend=m_refreshtablelist.end();
00113 for(std::vector<std::string>::const_iterator it=ibeg; it!=iend; ++it){
00114 m_dbConnection->webCacheControl().refreshTable(refreshConnect,*it );
00115 }
00116
00117
00118
00119 return realConn;
00120 }
00121
00122 }
00123
00124 std::string
00125 cond::FrontierProxy::getRealConnectString( const std::string&userconnect ) const {
00126 if( ! m_dbConnection ){
00127 throwException("The Technology Proxy has not been initialized.","FrontierProxy::getRealConnectString");
00128 }
00129 return makeRealConnectString( userconnect, m_dbConnection->configuration().transactionId() );
00130 }
00131
00132 std::string
00133 cond::FrontierProxy::getRealConnectString( const std::string&userconnect, const std::string& transId ) const{
00134 if( ! m_dbConnection ){
00135 throwException("The Technology Proxy has not been initialized.","FrontierProxy::getRealConnectString");
00136 }
00137 const std::string* tId = &transId;
00138 if( transId.empty() ) tId = &m_dbConnection->configuration().transactionId();
00139 return makeRealConnectString( userconnect, *tId );
00140 }
00141
00142 void
00143 cond::FrontierProxy::initialize( const DbConnection& connection ) {
00144 m_dbConnection = &connection;
00145 }
00146
00147 #include "CondCore/DBCommon/interface/TechnologyProxyFactory.h"
00148 DEFINE_EDM_PLUGIN(cond::TechnologyProxyFactory,cond::FrontierProxy,"frontier");