CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
PoolDBOutputService.cc
Go to the documentation of this file.
13 
14 
17 
18 //#include <iostream>
19 #include <vector>
20 #include<memory>
21 
22 namespace {
23  std::string dsw("DataWrapper");
24 }
25 
27  return dsw.size();
28 }
29 
30 void
32  Record thisrecord;
33 
34  thisrecord.m_idName = pset.getParameter<std::string>("record");
35  thisrecord.m_tag = pset.getParameter<std::string>("tag");
36 
37  thisrecord.m_closeIOV =
38  pset.getUntrackedParameter<bool>("closeIOV", m_closeIOV);
39 
40  thisrecord.m_withWrapper =
41  pset.getUntrackedParameter<bool>("withWrapper", m_withWrapper);
42 
43  thisrecord.m_freeInsert =
44  pset.getUntrackedParameter<bool>("outOfOrder",m_freeInsert);
45 
46  thisrecord.m_timetype=cond::findSpecs(pset.getUntrackedParameter< std::string >("timetype",m_timetypestr)).type;
47 
48  m_callbacks.insert(std::make_pair(thisrecord.m_idName,thisrecord));
49 
50  if(m_logdbOn){
51  cond::UserLogInfo userloginfo;
52  m_logheaders.insert(std::make_pair(thisrecord.m_idName,userloginfo));
53  }
54 
55 
56 }
57 
58 
60  m_currentTime( 0 ),
61  m_connection(),
62  m_session(),
63  m_logSession(),
64  m_dbstarted( false ),
65  m_logdb( 0 ),
66  m_logdbOn( false ),
67  m_closeIOV(false),
68  m_freeInsert(false),
69  m_withWrapper(false)
70 {
71 
72  m_closeIOV=iConfig.getUntrackedParameter<bool>("closeIOV",m_closeIOV);
73 
74  if( iConfig.exists("outOfOrder") ){
75  m_freeInsert=iConfig.getUntrackedParameter<bool>("outOfOrder");
76  }
77 
78  m_timetypestr=iConfig.getUntrackedParameter< std::string >("timetype","runnumber");
80 
81  std::string connect=iConfig.getParameter<std::string>("connect");
82  std::string logconnect("");
83  if( iConfig.exists("logconnect") ){
84  logconnect=iConfig.getUntrackedParameter<std::string>("logconnect");
85  }
86 
87  edm::ParameterSet connectionPset = iConfig.getParameter<edm::ParameterSet>("DBParameters");
88  m_connection.configuration().setParameters( connectionPset );
90 
92 
93  m_session.open( connect );
94 
95  if( !logconnect.empty() ){
96  m_logdbOn=true;
98  m_logSession.open( logconnect );
99  }
100 
101  typedef std::vector< edm::ParameterSet > Parameters;
102  Parameters toPut=iConfig.getParameter<Parameters>("toPut");
103  for(Parameters::iterator itToPut = toPut.begin(); itToPut != toPut.end(); ++itToPut)
104  fillRecord( *itToPut);
105 
106 
112 }
113 
116  return m_session;
117 }
118 
119 std::string
121  return this->lookUpRecord(recordName).m_tag;
122 }
123 
124 bool
126  Record& myrecord=this->lookUpRecord(recordName);
127  if(!m_dbstarted) this->initDB();
128  return myrecord.m_isNewTag;
129 }
130 
131 
132 void
134 {
135  if(m_dbstarted) return;
136  try{
138  transaction.start(false);
139  IOVSchemaUtility ut(m_session);
140  ut.create();
141  cond::MetaData metadata(m_session);
142  for(std::map<std::string,Record>::iterator it=m_callbacks.begin(); it!=m_callbacks.end(); ++it){
143  //std::string iovtoken;
144  if( !metadata.hasTag(it->second.m_tag) ){
145  it->second.m_iovtoken="";
146  it->second.m_isNewTag=true;
147  }else{
148  it->second.m_iovtoken=metadata.getToken(it->second.m_tag);
149  it->second.m_isNewTag=false;
150  }
151  }
152  transaction.commit();
153  //init logdb if required
154  if(m_logdbOn){
155  m_logdb=new cond::Logger(m_logSession);
156  //m_logdb->getWriteLock();
157  m_logdb->createLogDBIfNonExist();
158  //m_logdb->releaseWriteLock();
159  }
160  }catch( const std::exception& er ){
161  throw cond::Exception( std::string(er.what()) + " from PoolDBOutputService::initDB" );
162  }
163  m_dbstarted=true;
164 }
165 
166 void
168 {
169  if(m_logdb){
170  delete m_logdb;
171  }
172 }
173 
174 void
176 {
177  if( m_timetype == cond::runnumber ){//runnumber
178  m_currentTime=iEvtid.run();
179  }else if( m_timetype == cond::timestamp ){ //timestamp
180  m_currentTime=iTime.value();
181  }
182 }
183 
184 void
186 }
187 
188 void
190  if( m_timetype == cond::lumiid ){
191  m_currentTime=iLumiid.value();
192  }
193 }
194 
195 void
197 }
198 
200 }
201 
202 
205  return timeTypeSpecs[m_timetype].endValue;
206 }
207 
210  return timeTypeSpecs[m_timetype].beginValue;
211 }
212 
215  return m_currentTime;
216 }
217 
218 void
219 cond::service::PoolDBOutputService::createNewIOV( GetToken const & payloadToken, cond::Time_t firstSinceTime, cond::Time_t firstTillTime,const std::string& recordName, bool withlogging){
220  Record& myrecord=this->lookUpRecord(recordName);
221  if (!m_dbstarted) this->initDB();
222  if(!myrecord.m_isNewTag) throw cond::Exception(myrecord.m_tag + " is not a new tag from PoolDBOutputService::createNewIOV");
223  std::string iovToken;
224  if(withlogging){
225  if(!m_logdb) throw cond::Exception("Log db was not set from PoolDBOutputService::createNewIOV");
226  m_logdb->getWriteLock();
227  }
228 
229  std::string objToken;
230  unsigned int payloadIdx=0;
231  try{
233  transaction.start(false);
234 
235  cond::IOVEditor editor(m_session);
236  editor.create(myrecord.m_timetype, firstTillTime);
237  objToken = payloadToken(m_session,myrecord.m_withWrapper);
238  unsigned int payloadIdx=editor.append(firstSinceTime, objToken);
239  iovToken=editor.token();
240  editor.stamp(cond::userInfo(),false);
241 
242  cond::MetaData metadata(m_session);
243 
244  /*
245  MetaDataEntry imetadata;
246  imetadata.tagname=myrecord.m_tag;
247  imetadata.iovtoken=iovToken;
248  imetadata.timetype=m_timetype;
249  imetadata.firstsince=firstSinceTime;
250  metadata.addMapping(imetadata);
251  */
252  metadata.addMapping(myrecord.m_tag,iovToken,myrecord.m_timetype);
253  transaction.commit();
254 
255  m_newtags.push_back( std::pair<std::string,std::string>(myrecord.m_tag,iovToken) );
256  myrecord.m_iovtoken=iovToken;
257  myrecord.m_isNewTag=false;
258  if(withlogging){
259  std::string destconnect=m_session.connectionString();
260  cond::UserLogInfo a=this->lookUpUserLogInfo(recordName);
261  m_logdb->logOperationNow(a,destconnect,objToken,myrecord.m_tag,myrecord.timetypestr(),payloadIdx,firstSinceTime);
262  }
263  }catch(const std::exception& er){
264  if(withlogging){
265  std::string destconnect=m_session.connectionString();
266  cond::UserLogInfo a=this->lookUpUserLogInfo(recordName);
267  m_logdb->logFailedOperationNow(a,destconnect,objToken,myrecord.m_tag,myrecord.timetypestr(),payloadIdx,firstSinceTime,std::string(er.what()));
268  m_logdb->releaseWriteLock();
269  }
270  throw cond::Exception(std::string(er.what()) + " from PoolDBOutputService::createNewIOV ");
271  }
272  if(withlogging){
273  m_logdb->releaseWriteLock();
274  }
275 }
276 
277 
278 void
281  const std::string& recordName,
282  bool withlogging) {
283  Record& myrecord=this->lookUpRecord(recordName);
284  if (!m_dbstarted) this->initDB();
285  if(withlogging){
286  if(!m_logdb) throw cond::Exception("Log db was not set from PoolDBOutputService::add");
287  m_logdb->getWriteLock();
288  }
289 
290  std::string objToken;
291  unsigned int payloadIdx=0;
292 
293  try{
295  transaction.start(false);
296  objToken = payloadToken(m_session,myrecord.m_withWrapper);
297  payloadIdx= appendIOV(m_session,myrecord,objToken,time);
298  transaction.commit();
299  if(withlogging){
300  std::string destconnect=m_session.connectionString();
301  cond::UserLogInfo a=this->lookUpUserLogInfo(recordName);
302  m_logdb->logOperationNow(a,destconnect,objToken,myrecord.m_tag,myrecord.timetypestr(),payloadIdx,time);
303  }
304  }catch(const std::exception& er){
305  if(withlogging){
306  std::string destconnect=m_session.connectionString();
307  cond::UserLogInfo a=this->lookUpUserLogInfo(recordName);
308  m_logdb->logFailedOperationNow(a,destconnect,objToken,myrecord.m_tag,myrecord.timetypestr(),payloadIdx,time,std::string(er.what()));
309  m_logdb->releaseWriteLock();
310  }
311  throw cond::Exception(std::string(er.what()) + " from PoolDBOutputService::add ");
312  }
313  if(withlogging){
314  m_logdb->releaseWriteLock();
315  }
316 }
317 
320  std::map<std::string,Record>::iterator it=m_callbacks.find(recordName);
321  if(it==m_callbacks.end()) throw cond::UnregisteredRecordException(recordName + " from PoolDBOutputService::lookUpRecord");
322  return it->second;
323 }
324 
327  std::map<std::string,cond::UserLogInfo>::iterator it=m_logheaders.find(recordName);
328  if(it==m_logheaders.end()) throw cond::Exception("Log db was not set for record " + recordName + " from PoolDBOutputService::lookUpUserLogInfo");
329  return it->second;
330 }
331 
332 
333 unsigned int
335  Record& record,
336  const std::string& payloadToken,
337  cond::Time_t sinceTime){
338  if( record.m_isNewTag ) {
339  throw cond::Exception(std::string("Cannot append to non-existing tag ") + record.m_tag + std::string(" from PoolDBOutputService::appendIOV"));
340  }
341 
342  cond::IOVEditor editor(pooldb,record.m_iovtoken);
343 
344  unsigned int payloadIdx = record.m_freeInsert ?
345  editor.freeInsert(sinceTime,payloadToken) :
346  editor.append(sinceTime,payloadToken);
347  if (record.m_closeIOV) editor.updateClosure(sinceTime);
348  editor.stamp(cond::userInfo(),false);
349  return payloadIdx;
350 }
351 
352 void
354  bool withlogging) {
355  // not fully working.. not be used for now...
356  Record & record = lookUpRecord(recordName);
357  if( record.m_isNewTag ) {
358  throw cond::Exception(std::string("Cannot close non-existing tag ") + record.m_tag + std::string(" from PoolDBOutputService::closeIOV"));
359  }
361  transaction.start(false);
362  cond::IOVEditor editor(m_session,record.m_iovtoken);
363  editor.updateClosure(lastTill);
364  editor.stamp(cond::userInfo(),false);
365  transaction.commit();
366 }
367 
368 
369 
370 void
371 cond::service::PoolDBOutputService::setLogHeaderForRecord(const std::string& recordName,const std::string& dataprovenance,const std::string& usertext)
372 {
373  cond::UserLogInfo& myloginfo=this->lookUpUserLogInfo(recordName);
374  myloginfo.provenance=dataprovenance;
375  myloginfo.usertext=usertext;
376 }
377 
378 
379 const cond::Logger&
381  if(!m_logdb) throw cond::Exception("Log database is not set from PoolDBOutputService::queryLog");
382  return *m_logdb;
383 }
384 
385 
386 void
388  if (!m_dbstarted) initDB();
389  Record& record = lookUpRecord(recordName);
390  result.name=record.m_tag;
391  result.token=record.m_iovtoken;
392  //use iovproxy to find out.
393  cond::IOVProxy iov(m_session, record.m_iovtoken, true, false);
394  result.size=iov.size();
395  if (result.size>0) {
396  // get last object
397  iov.tail(1);
399  result.lastInterval = cond::ValidityInterval(last.since(), last.till());
400  result.lastPayloadToken=last.token();
401  }
402 }
RunNumber_t run() const
Definition: EventID.h:42
const TimeTypeSpecs timeTypeSpecs[]
Definition: Time.cc:22
T getParameter(std::string const &) const
std::string usertext
Definition: UserLogInfo.h:8
T getUntrackedParameter(std::string const &, T const &) const
void closeIOV(Time_t lastTill, const std::string &recordName, bool withlogging=false)
void watchPostEndJob(PostEndJob::slot_type const &iSlot)
Time_t beginValue
Definition: Time.h:45
void open(const std::string &connectionString, bool readOnly=false)
Definition: DbSession.cc:119
JetCorrectorParameters::Record record
Definition: classes.h:11
void fillRecord(edm::ParameterSet &pset)
void watchPostModule(PostModule::slot_type const &iSlot)
void watchPreProcessEvent(PreProcessEvent::slot_type const &iSlot)
DbConnectionConfiguration & configuration()
Definition: DbConnection.cc:89
boost::uint64_t value() const
bool exists(std::string const &parameterName) const
checks if a parameter exists
static unsigned int sizeDSW()
std::pair< Time_t, Time_t > ValidityInterval
Definition: Time.h:19
void add(GetToken const &token, cond::Time_t time, const std::string &recordName, bool withlogging=false)
const_iterator begin() const
Definition: IOVProxy.h:86
const std::string getToken(const std::string &tagname) const
Definition: MetaData.cc:53
cond::Time_t till() const
Definition: IOVProxy.h:39
void preBeginLumi(const edm::LuminosityBlockID &, const edm::Timestamp &)
std::string lastPayloadToken
Definition: TagInfo.h:12
unsigned int freeInsert(cond::Time_t sinceTime, const std::string &payloadToken)
insert a payload with known since in any position
Definition: IOVEditor.cc:244
void watchPreModule(PreModule::slot_type const &iSlot)
void setParameters(const edm::ParameterSet &connectionPset)
std::string tag(const std::string &recordName)
void create(cond::TimeType timetype)
Definition: IOVEditor.cc:67
std::string name
Definition: TagInfo.h:9
unsigned long long Time_t
Definition: Time.h:16
bool addMapping(const std::string &name, const std::string &token, cond::TimeType timetype=cond::runnumber)
Definition: MetaData.cc:37
tuple iov
Definition: o2o.py:307
bool isNewTagRequest(const std::string &recordName)
Record & lookUpRecord(const std::string &recordName)
std::string const & token() const
Definition: IOVProxy.h:40
bool hasTag(const std::string &name) const
Definition: MetaData.cc:72
void create()
create iov tables if not existing
TimeType type
Definition: Time.h:41
tuple result
Definition: query.py:137
std::string provenance
Definition: UserLogInfo.h:7
vector< ParameterSet > Parameters
int start(bool readOnly=false)
start transaction
size_t size
Definition: TagInfo.h:13
void createNewIOV(T *firstPayloadObj, cond::Time_t firstSinceTime, cond::Time_t firstTillTime, const std::string &recordName, bool withlogging=false)
void setLogHeaderForRecord(const std::string &recordName, const std::string &provenance, const std::string &usertext)
void tagInfo(const std::string &recordName, cond::TagInfo &result)
void tail(int n) const
Definition: IOVProxy.cc:107
TimeValue_t value() const
Definition: Timestamp.cc:72
void postModule(const edm::ModuleDescription &desc)
int size() const
Definition: IOVProxy.cc:121
std::string token
Definition: TagInfo.h:10
tuple editor
Definition: idDealer.py:73
DbSession createSession() const
Definition: DbConnection.cc:72
void updateClosure(cond::Time_t newtillTime)
Update the closure of the iov sequence.
Definition: IOVEditor.cc:204
unsigned int append(cond::Time_t sinceTime, const std::string &payloadToken)
Append a payload with known since time. The previous last payload&#39;s till time will be adjusted to the...
Definition: IOVEditor.cc:212
void preModule(const edm::ModuleDescription &desc)
cond::Time_t since() const
Definition: IOVProxy.h:38
cond::ValidityInterval lastInterval
Definition: TagInfo.h:11
double a
Definition: hdecay.h:121
void stamp(std::string const &icomment, bool append=false)
Definition: IOVEditor.cc:196
void watchPreBeginLumi(PreBeginLumi::slot_type const &iSlot)
std::string userInfo()
Definition: IOVInfo.cc:9
const TimeTypeSpecs & findSpecs(std::string const &name)
Definition: Time.cc:33
std::string const & token() const
Returns the token of the iov sequence associated with this editor.
Definition: IOVEditor.h:81
Time_t endValue
Definition: Time.h:46
void preEventProcessing(const edm::EventID &evtID, const edm::Timestamp &iTime)
int commit()
commit transaction. Will disconnect from database if connection timeout==0 or connectted time close t...
cond::UserLogInfo & lookUpUserLogInfo(const std::string &recordName)
const cond::Logger & queryLog() const
PoolDBOutputService(const edm::ParameterSet &iConfig, edm::ActivityRegistry &iAR)
unsigned int appendIOV(cond::DbSession &, Record &record, const std::string &payloadToken, cond::Time_t sinceTime)