CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
IOVEditor.cc
Go to the documentation of this file.
2 #include "SessionImpl.h"
3 //
4 
5 namespace cond {
6 
7  namespace persistency {
8 
9  // implementation details. holds only data.
10  class IOVEditorData {
11  public:
12  explicit IOVEditorData():
13  tag( "" ),
14  timeType( cond::invalid ),
15  payloadType(""),
17  description(""),
18  iovBuffer(){
19  }
27  boost::posix_time::ptime creationTime;
28  bool change = false;
29  bool exists = false;
30  // buffer for the iov sequence
31  std::vector<std::tuple<cond::Time_t,cond::Hash,boost::posix_time::ptime> > iovBuffer;
32  bool validationMode = false;
33  };
34 
36  m_data(),
37  m_session(){
38  }
39 
40  IOVEditor::IOVEditor( const std::shared_ptr<SessionImpl>& session ):
41  m_data( new IOVEditorData ),
42  m_session( session ){
43  }
44 
45  IOVEditor::IOVEditor( const std::shared_ptr<SessionImpl>& session,
46  const std::string& tag,
47  cond::TimeType timeType,
48  const std::string& payloadObjectType,
49  cond::SynchronizationType synchronizationType,
50  const boost::posix_time::ptime& creationTime ):
51  m_data( new IOVEditorData ),
52  m_session( session ){
53  m_data->tag = tag;
54  m_data->timeType = timeType;
55  m_data->payloadType = payloadObjectType;
56  m_data->synchronizationType = synchronizationType;
57  m_data->creationTime = creationTime;
58  m_data->change = true;
59  }
60 
62  m_data( rhs.m_data ),
63  m_session( rhs.m_session ){
64  }
65 
67  m_data = rhs.m_data;
68  m_session = rhs.m_session;
69  return *this;
70  }
71 
73  checkTransaction( "IOVEditor::load" );
74  // loads the current header data in memory
75  if( !m_session->iovSchema().tagTable().select( tag, m_data->timeType, m_data->payloadType, m_data->synchronizationType,
76  m_data->endOfValidity, m_data->description, m_data->lastValidatedTime ) ){
77  cond::throwException( "Tag \""+tag+"\" has not been found in the database.","IOVEditor::load");
78  }
79  m_data->tag = tag;
80  m_data->exists = true;
81  m_data->change = false;
82  }
83 
85  return m_data.get()? m_data->tag : "" ;
86  }
87 
88 
90  return m_data.get() ? m_data->timeType : cond::invalid;
91  }
92 
94  return m_data.get() ? m_data->payloadType : "";
95  }
96 
98  return m_data.get()? m_data->synchronizationType : cond::SYNCH_ANY ;
99  }
100 
102  return m_data.get() ? m_data->endOfValidity : cond::time::MIN_VAL;
103  }
104 
106  if( m_data.get() ) {
107  m_data->endOfValidity = time;
108  m_data->change = true;
109  }
110  }
111 
113  return m_data.get() ? m_data->description : "";
114  }
115 
117  if( m_data.get() ) {
118  m_data->description = description;
119  m_data->change = true;
120  }
121  }
122 
124  return m_data.get() ? m_data->lastValidatedTime : cond::time::MIN_VAL;
125  }
126 
128  if( m_data.get() ) {
129  m_data->lastValidatedTime = time;
130  m_data->change = true;
131  }
132  }
133 
135  if( m_data.get() ) m_data->validationMode = true;
136  }
137 
138  void IOVEditor::insert( cond::Time_t since, const cond::Hash& payloadHash, bool checkType ){
139  boost::posix_time::ptime now = boost::posix_time::microsec_clock::universal_time();
140  insert( since, payloadHash, now, checkType );
141  }
142 
143  void IOVEditor::insert( cond::Time_t since, const cond::Hash& payloadHash, const boost::posix_time::ptime& insertionTime, bool ){
144  if( m_data.get() ){
145  // here the type check could be added
146  m_data->iovBuffer.push_back( std::tie( since, payloadHash, insertionTime ) );
147  }
148  }
149 
150  bool iovSorter( const std::tuple<cond::Time_t,cond::Hash,boost::posix_time::ptime>& f, const std::tuple<cond::Time_t,cond::Hash,boost::posix_time::ptime>& s ){
151  return std::get<0>(f) < std::get<0>(s);
152  }
153 
154  bool IOVEditor::flush( const boost::posix_time::ptime& operationTime ){
155  bool ret = false;
156  checkTransaction( "IOVEditor::flush" );
157  if( m_data->change ){
158  if( m_data->description.empty() ) throwException( "A non-empty description string is mandatory.","IOVEditor::flush" );
159  if( m_data->validationMode ) m_session->iovSchema().tagTable().setValidationMode();
160  if( !m_data->exists ){
161  m_session->iovSchema().tagTable().insert( m_data->tag, m_data->timeType, m_data->payloadType,
162  m_data->synchronizationType, m_data->endOfValidity,
163  m_data->description, m_data->lastValidatedTime, m_data->creationTime );
164  m_data->exists = true;
165  ret = true;
166  } else {
167  m_session->iovSchema().tagTable().update( m_data->tag, m_data->endOfValidity, m_data->description,
168  m_data->lastValidatedTime, operationTime );
169  ret = true;
170  }
171  m_data->change = false;
172  }
173  if( m_data->iovBuffer.size() ) {
174 
175  std::sort(m_data->iovBuffer.begin(),m_data->iovBuffer.end(),iovSorter);
176  cond::Time_t l = std::get<0>(m_data->iovBuffer.front());
177  if( m_data->synchronizationType != cond::SYNCH_ANY && m_data->synchronizationType != cond::SYNCH_VALIDATION ){
178  // retrieve the last since
179  cond::Time_t last = 0;
180  cond::Hash h;
181  m_session->iovSchema().iovTable().getLastIov( m_data->tag, last, h );
182  // check if the min iov is greater then the last since
183  if( l <= last ){
184  std::stringstream msg;
185  msg << "Can't insert iov since "<<l<<" on the tag "<< m_data->tag<<": last since is "<<last<<
186  " and synchronization is \""<<cond::synchronizationTypeNames( m_data->synchronizationType )<<"\"";
187  throwException( msg.str(),"IOVEditor::flush");
188  }
189  }
190 
191  // insert the new iovs
192  m_session->iovSchema().iovTable().insertMany( m_data->tag, m_data->iovBuffer );
193  m_data->iovBuffer.clear();
194  ret = true;
195  }
196  return ret;
197  }
198 
200  return flush( boost::posix_time::microsec_clock::universal_time() );
201  }
202 
204  if( !m_session.get() ) throwException("The session is not active.",ctx );
205  if( !m_session->isTransactionActive( false ) ) throwException("The transaction is not active.",ctx );
206  }
207 
208  }
209 }
std::string synchronizationTypeNames(SynchronizationType type)
Definition: Types.cc:46
void checkTransaction(const std::string &ctx)
Definition: IOVEditor.cc:203
const Time_t MIN_VAL(0)
void load(const std::string &tag)
Definition: IOVEditor.cc:72
void setDescription(const std::string &description)
Definition: IOVEditor.cc:116
void setLastValidatedTime(cond::Time_t time)
Definition: IOVEditor.cc:127
std::shared_ptr< SessionImpl > m_session
Definition: IOVEditor.h:85
TimeType
Definition: Time.h:21
std::string description() const
Definition: IOVEditor.cc:112
unsigned long long Time_t
Definition: Time.h:16
std::string Hash
Definition: Types.h:47
double f[11][100]
The Signals That Services Can Subscribe To This is based on ActivityRegistry h
Helper function to determine trigger accepts.
Definition: Activities.doc:4
IOVEditor & operator=(const IOVEditor &rhs)
Definition: IOVEditor.cc:66
cond::SynchronizationType synchronizationType() const
Definition: IOVEditor.cc:97
cond::Time_t endOfValidity() const
Definition: IOVEditor.cc:101
tuple description
Definition: idDealer.py:66
void insert(cond::Time_t since, const cond::Hash &payloadHash, bool checkType=false)
Definition: IOVEditor.cc:138
void throwException(std::string const &message, std::string const &methodName)
Definition: Exception.cc:17
std::shared_ptr< IOVEditorData > m_data
Definition: IOVEditor.h:84
bool iovSorter(const std::tuple< cond::Time_t, cond::Hash, boost::posix_time::ptime > &f, const std::tuple< cond::Time_t, cond::Hash, boost::posix_time::ptime > &s)
Definition: IOVEditor.cc:150
cond::TimeType timeType() const
Definition: IOVEditor.cc:89
boost::posix_time::ptime creationTime
Definition: IOVEditor.cc:27
cond::Time_t lastValidatedTime() const
Definition: IOVEditor.cc:123
cond::SynchronizationType synchronizationType
Definition: IOVEditor.cc:23
SynchronizationType
Definition: Types.h:31
std::vector< std::tuple< cond::Time_t, cond::Hash, boost::posix_time::ptime > > iovBuffer
Definition: IOVEditor.cc:31
void setEndOfValidity(cond::Time_t validity)
Definition: IOVEditor.cc:105
std::string tag() const
Definition: IOVEditor.cc:84
std::string payloadType() const
Definition: IOVEditor.cc:93
const Time_t MAX_VAL(std::numeric_limits< Time_t >::max())
void throwException(const std::string &message, const std::string &methodName)
Definition: Exception.cc:11