CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
IOVSchema.cc
Go to the documentation of this file.
2 #include "IOVSchema.h"
3 //
4 #include <openssl/sha.h>
5 
6 namespace cond {
7 
8  namespace persistency {
9 
10  cond::Hash makeHash( const std::string& objectType, const cond::Binary& data ){
11  SHA_CTX ctx;
12  if( !SHA1_Init( &ctx ) ){
13  throwException( "SHA1 initialization error.","IOVSchema::makeHash");
14  }
15  if( !SHA1_Update( &ctx, objectType.c_str(), objectType.size() ) ){
16  throwException( "SHA1 processing error (1).","IOVSchema::makeHash");
17  }
18  if( !SHA1_Update( &ctx, data.data(), data.size() ) ){
19  throwException( "SHA1 processing error (2).","IOVSchema::makeHash");
20  }
21  unsigned char hash[SHA_DIGEST_LENGTH];
22  if( !SHA1_Final(hash, &ctx) ){
23  throwException( "SHA1 finalization error.","IOVSchema::makeHash");
24  }
25 
26  char tmp[SHA_DIGEST_LENGTH*2+1];
27  // re-write bytes in hex
28  for (unsigned int i = 0; i < 20; i++) {
29  ::sprintf(&tmp[i * 2], "%02x", hash[i]);
30  }
31  tmp[20*2] = 0;
32  return tmp;
33  }
34 
35  TAG::Table::Table( coral::ISchema& schema ):
36  m_schema( schema ){
37  }
38 
39  bool TAG::Table::Table::exists(){
40  return existsTable( m_schema, tname );
41  }
42 
44  if( exists() ){
45  throwException( "TAG table already exists in this schema.",
46  "TAG::Table::create");
47  }
49  descr.setPrimaryKey<NAME>();
50  createTable( m_schema, descr.get() );
51  }
52 
54  Query< NAME > q( m_schema );
55  q.addCondition<NAME>( name );
56  for ( auto row : q ) {}
57 
58  return q.retrievedRows();
59  }
60 
62  cond::TimeType& timeType,
63  std::string& objectType,
64  cond::SynchronizationType& synchronizationType,
65  cond::Time_t& endOfValidity,
67  cond::Time_t& lastValidatedTime ){
69  q.addCondition<NAME>( name );
70  for ( auto row : q ) std::tie( timeType, objectType, synchronizationType, endOfValidity, description, lastValidatedTime ) = row;
71 
72  return q.retrievedRows();
73  }
74 
77  boost::posix_time::ptime& insertionTime,
78  boost::posix_time::ptime& modificationTime ){
80  q.addCondition<NAME>( name );
81  for ( auto row : q ) std::tie( description, insertionTime, modificationTime ) = row;
82  return q.retrievedRows();
83  }
84 
86  cond::TimeType timeType,
87  const std::string& objectType,
88  cond::SynchronizationType synchronizationType,
89  cond::Time_t endOfValidity,
90  const std::string& description,
91  cond::Time_t lastValidatedTime,
92  const boost::posix_time::ptime& insertionTime ){
94  dataToInsert( std::tie( name, timeType, objectType, synchronizationType, endOfValidity, description, lastValidatedTime, insertionTime, insertionTime ) );
95  insertInTable( m_schema, tname, dataToInsert.get() );
96  }
97 
99  cond::SynchronizationType synchronizationType,
100  cond::Time_t& endOfValidity,
101  const std::string& description,
102  cond::Time_t lastValidatedTime,
103  const boost::posix_time::ptime& updateTime ){
104  UpdateBuffer buffer;
106  endOfValidity,
107  description,
108  lastValidatedTime,
109  updateTime ) );
110  buffer.addWhereCondition<NAME>( name );
111  updateTable( m_schema, tname, buffer );
112  }
113 
115  cond::Time_t lastValidatedTime,
116  const boost::posix_time::ptime& updateTime ){
117  UpdateBuffer buffer;
118  buffer.setColumnData< LAST_VALIDATED_TIME, MODIFICATION_TIME >( std::tie( lastValidatedTime, updateTime ) );
119  buffer.addWhereCondition<NAME>( name );
120  updateTable( m_schema, tname, buffer );
121  }
122 
123  IOV::Table::Table( coral::ISchema& schema ):
124  m_schema( schema ){
125  }
126 
128  return existsTable( m_schema, tname );
129  }
130 
132  if( exists()){
133  throwException( "IOV table already exists in this schema.",
134  "IOV::Schema::create");
135  }
136 
139  descr.setForeignKey< TAG_NAME, TAG::NAME >( "TAG_NAME_FK" );
140  descr.setForeignKey< PAYLOAD_HASH, PAYLOAD::HASH >( "PAYLOAD_HASH_FK" );
141  createTable( m_schema, descr.get() );
142  }
143 
144  size_t IOV::Table::selectGroups( const std::string& tag, std::vector<cond::Time_t>& groups ){
145  Query< SINCE_GROUP > q( m_schema, true );
146  q.addCondition<TAG_NAME>( tag );
149  for( auto row : q ){
150  groups.push_back(std::get<0>(row));
151  }
152  return q.retrievedRows();
153  }
154 
155  size_t IOV::Table::selectSnapshotGroups( const std::string& tag, const boost::posix_time::ptime& snapshotTime, std::vector<cond::Time_t>& groups ){
156  Query< SINCE_GROUP > q( m_schema, true );
157  q.addCondition<TAG_NAME>( tag );
158  q.addCondition<INSERTION_TIME>( snapshotTime,"<=" );
161  for( auto row : q ){
162  groups.push_back(std::get<0>(row));
163  }
164  return q.retrievedRows();
165  }
166 
167  size_t IOV::Table::selectLatestByGroup( const std::string& tag, cond::Time_t lowerSinceGroup, cond::Time_t upperSinceGroup ,
168  std::vector<std::tuple<cond::Time_t,cond::Hash> >& iovs ){
169  Query< SINCE, PAYLOAD_HASH > q( m_schema );
170  q.addCondition<TAG_NAME>( tag );
171  if( lowerSinceGroup > 0 ) q.addCondition<SINCE>( lowerSinceGroup, ">=" );
172  if( upperSinceGroup < cond::time::MAX_VAL ) q.addCondition<SINCE>( upperSinceGroup, "<" );
173  q.addOrderClause<SINCE>();
175  size_t initialSize = iovs.size();
176  for( auto row : q ){
177  // starting from the second iov in the array, skip the rows with older timestamp
178  if( iovs.size()-initialSize && std::get<0>(iovs.back()) == std::get<0>(row) ) continue;
179  iovs.push_back( row );
180  }
181  return iovs.size()-initialSize;
182  }
183 
184  size_t IOV::Table::selectSnapshotByGroup( const std::string& tag, cond::Time_t lowerSinceGroup, cond::Time_t upperSinceGroup,
185  const boost::posix_time::ptime& snapshotTime,
186  std::vector<std::tuple<cond::Time_t,cond::Hash> >& iovs ){
187  Query< SINCE, PAYLOAD_HASH > q( m_schema );
188  q.addCondition<TAG_NAME>( tag );
189  if( lowerSinceGroup > 0 ) q.addCondition<SINCE>( lowerSinceGroup, ">=" );
190  if( upperSinceGroup < cond::time::MAX_VAL ) q.addCondition<SINCE>( upperSinceGroup, "<" );
191  q.addCondition<INSERTION_TIME>( snapshotTime,"<=" );
192  q.addOrderClause<SINCE>();
194  size_t initialSize = iovs.size();
195  for ( auto row : q ) {
196  // starting from the second iov in the array, skip the rows with older timestamp
197  if( iovs.size()-initialSize && std::get<0>(iovs.back()) == std::get<0>(row) ) continue;
198  iovs.push_back( row );
199  }
200  return iovs.size()-initialSize;
201  }
202 
204  std::vector<std::tuple<cond::Time_t,cond::Hash> >& iovs ){
205  Query< SINCE, PAYLOAD_HASH > q( m_schema );
206  q.addCondition<TAG_NAME>( tag );
207  q.addOrderClause<SINCE>();
209  size_t initialSize = iovs.size();
210  for ( auto row : q ) {
211  // starting from the second iov in the array, skip the rows with older timestamp
212  if( iovs.size()-initialSize && std::get<0>(iovs.back()) == std::get<0>(row) ) continue;
213  iovs.push_back( row );
214  }
215  return iovs.size()-initialSize;
216  }
217 
219  const boost::posix_time::ptime& snapshotTime,
220  std::vector<std::tuple<cond::Time_t,cond::Hash> >& iovs){
221  Query< SINCE, PAYLOAD_HASH > q( m_schema );
222  q.addCondition<TAG_NAME>( tag );
223  q.addCondition<INSERTION_TIME>( snapshotTime,"<=" );
224  q.addOrderClause<SINCE>();
226  size_t initialSize = iovs.size();
227  for ( auto row : q ) {
228  // starting from the second iov in the array, skip the rows with older timestamp
229  if( iovs.size()-initialSize && std::get<0>(iovs.back()) == std::get<0>(row) ) continue;
230  iovs.push_back( row );
231  }
232  return iovs.size()-initialSize;
233  }
234 
236  Query< SINCE, PAYLOAD_HASH > q( m_schema );
237  q.addCondition<TAG_NAME>( tag );
238  q.addOrderClause<SINCE>( false );
240  for ( auto row : q ) {
241  since = std::get<0>(row);
242  hash = std::get<1>(row);
243  return true;
244  }
245  return false;
246  }
247 
248  bool IOV::Table::getSnapshotLastIov( const std::string& tag, const boost::posix_time::ptime& snapshotTime, cond::Time_t& since, cond::Hash& hash ){
249  Query< SINCE, PAYLOAD_HASH > q( m_schema );
250  q.addCondition<TAG_NAME>( tag );
251  q.addCondition<INSERTION_TIME>( snapshotTime,"<=" );
252  q.addOrderClause<SINCE>( false );
254  for ( auto row : q ) {
255  since = std::get<0>(row);
256  hash = std::get<1>(row);
257  return true;
258  }
259  return false;
260  }
261 
262  bool IOV::Table::getSize( const std::string& tag, size_t& size ){
263  Query< SEQUENCE_SIZE > q( m_schema );
264  q.addCondition<TAG_NAME>( tag );
265  for ( auto row : q ) {
266  size = std::get<0>(row);
267  return true;
268  }
269  return false;
270  }
271 
272  bool IOV::Table::getSnapshotSize( const std::string& tag, const boost::posix_time::ptime& snapshotTime, size_t& size ){
273  Query< SEQUENCE_SIZE > q( m_schema );
274  q.addCondition<TAG_NAME>( tag );
275  q.addCondition<INSERTION_TIME>( snapshotTime,"<=" );
276  for ( auto row : q ) {
277  size = std::get<0>(row);
278  return true;
279  }
280  return false;
281  }
282 
284  cond::Time_t since,
285  cond::Hash payloadHash,
286  const boost::posix_time::ptime& insertTimeStamp ){
287  RowBuffer< TAG_NAME, SINCE, PAYLOAD_HASH, INSERTION_TIME > dataToInsert( std::tie( tag, since, payloadHash, insertTimeStamp ) );
288  insertInTable( m_schema, tname, dataToInsert.get() );
289  }
290 
292  const std::vector<std::tuple<cond::Time_t,cond::Hash,boost::posix_time::ptime> >& iovs ){
294  for( auto row : iovs ) inserter.insert( std::tuple_cat( std::tie(tag),row ) );
295 
296  inserter.flush();
297  }
298 
300  DeleteBuffer buffer;
301  buffer.addWhereCondition<TAG_NAME>( tag );
302  deleteFromTable( m_schema, tname, buffer );
303  }
304 
305  TAG_LOG::Table::Table( coral::ISchema& schema ):
306  m_schema( schema ){
307  }
308 
310  return existsTable( m_schema, tname );
311  }
312 
314  if( exists() ){
315  throwException( "TAG_LOG table already exists in this schema.",
316  "TAG_LOG::create");
317  }
320  descr.setForeignKey< TAG_NAME, TAG::NAME >( "TAG_NAME_FK" );
321  createTable( m_schema, descr.get() );
322  }
323 
325  const boost::posix_time::ptime& eventTime,
326  const std::string& userName,
327  const std::string& hostName,
328  const std::string& command,
329  const std::string& action,
330  const std::string& userText){
332  dataToInsert( std::tie( tag, eventTime, userName, hostName, command, action, userText ) );
333  insertInTable( m_schema, tname, dataToInsert.get() );
334  }
335 
336  PAYLOAD::Table::Table( coral::ISchema& schema ):
337  m_schema( schema ){
338  }
339 
341  return existsTable( m_schema, tname );
342  }
343 
345  if( exists()){
346  throwException( "Payload table already exists in this schema.",
347  "PAYLOAD::Schema::create");
348  }
349 
351  descr.setPrimaryKey<HASH>();
352  createTable( m_schema, descr.get() );
353  }
354 
355  bool PAYLOAD::Table::select( const cond::Hash& payloadHash ){
356  Query< HASH > q( m_schema );
357  q.addCondition<HASH>( payloadHash );
358  for ( auto row : q ) {}
359 
360  return q.retrievedRows();
361  }
362 
363  bool PAYLOAD::Table::getType( const cond::Hash& payloadHash, std::string& objectType ){
364  Query< OBJECT_TYPE > q( m_schema );
365  q.addCondition<HASH>( payloadHash );
366  for ( auto row : q ) {
367  objectType = std::get<0>(row);
368  }
369 
370  return q.retrievedRows();
371  }
372 
373  bool PAYLOAD::Table::select( const cond::Hash& payloadHash,
374  std::string& objectType,
375  cond::Binary& payloadData,
376  cond::Binary& streamerInfoData ){
378  q.addCondition<HASH>( payloadHash );
379  for ( auto row : q ) {
380  std::tie( payloadData, streamerInfoData, objectType ) = row;
381  }
382  return q.retrievedRows();
383  }
384 
385  bool PAYLOAD::Table::insert( const cond::Hash& payloadHash,
386  const std::string& objectType,
387  const cond::Binary& payloadData,
388  const cond::Binary& streamerInfoData,
389  const boost::posix_time::ptime& insertionTime ){
390  std::string version("dummy");
391  cond::Binary sinfoData( streamerInfoData );
392  if( !sinfoData.size() ) sinfoData.copy( std::string("0") );
393  RowBuffer< HASH, OBJECT_TYPE, DATA, STREAMER_INFO, VERSION, INSERTION_TIME > dataToInsert( std::tie( payloadHash, objectType, payloadData, sinfoData, version, insertionTime ) );
394  bool failOnDuplicate = false;
395  return insertInTable( m_schema, tname, dataToInsert.get(), failOnDuplicate );
396  }
397 
399  const cond::Binary& payloadData,
400  const cond::Binary& streamerInfoData,
401  const boost::posix_time::ptime& insertionTime ){
402  cond::Hash payloadHash = makeHash( payloadObjectType, payloadData );
403  // the check on the hash existance is only required to avoid the error message printing in SQLite! once this is removed, this check is useless...
404  if( !select( payloadHash ) ){
405  insert( payloadHash, payloadObjectType, payloadData, streamerInfoData, insertionTime );
406  }
407  return payloadHash;
408  }
409 
410  IOVSchema::IOVSchema( coral::ISchema& schema ):
411  m_tagTable( schema ),
412  m_iovTable( schema ),
413  m_tagLogTable( schema ),
414  m_payloadTable( schema ){
415  }
416 
418  if( !m_tagTable.exists() ) return false;
419  if( !m_payloadTable.exists() ) return false;
420  if( !m_iovTable.exists() ) return false;
421  return true;
422  }
423 
425  bool created = false;
426  if( !exists() ){
427  m_tagTable.create();
429  m_iovTable.create();
431  created = true;
432  }
433  return created;
434  }
435 
437  return m_tagTable;
438  }
439 
441  return m_iovTable;
442  }
443 
445  return m_tagLogTable;
446  }
447 
449  return m_payloadTable;
450  }
451 
452  }
453 }
454 
int i
Definition: DBlmapReader.cc:9
bool getSnapshotLastIov(const std::string &tag, const boost::posix_time::ptime &snapshotTime, cond::Time_t &since, cond::Hash &hash)
Definition: IOVSchema.cc:248
bool getSnapshotSize(const std::string &tag, const boost::posix_time::ptime &snapshotTime, size_t &size)
Definition: IOVSchema.cc:272
static char const * tname
Definition: IOVSchema.h:138
static std::string group()
Definition: IOVSchema.h:93
ITagLogTable & tagLogTable()
Definition: IOVSchema.cc:444
tuple schema
Definition: dataDML.py:2334
bool getSize(const std::string &tag, size_t &size)
Definition: IOVSchema.cc:262
const coral::TableDescription & get()
Definition: DbCore.h:265
void updateValidity(const std::string &name, cond::Time_t lastValidatedTime, const boost::posix_time::ptime &updateTime)
Definition: IOVSchema.cc:114
void insert(const P &params)
Definition: DbCore.h:587
Table(coral::ISchema &schema)
Definition: IOVSchema.cc:305
size_t selectLatest(const std::string &tag, std::vector< std::tuple< cond::Time_t, cond::Hash > > &iovs)
Definition: IOVSchema.cc:203
void update(const std::string &name, cond::SynchronizationType synchronizationType, cond::Time_t &endOfValidity, const std::string &description, cond::Time_t lastValidatedTime, const boost::posix_time::ptime &updateTime)
Definition: IOVSchema.cc:98
bool getLastIov(const std::string &tag, cond::Time_t &since, cond::Hash &hash)
Definition: IOVSchema.cc:235
PAYLOAD::Table m_payloadTable
Definition: IOVSchema.h:175
TimeType
Definition: Time.h:21
size_t size() const
Definition: Binary.cc:54
void insertMany(const std::string &tag, const std::vector< std::tuple< cond::Time_t, cond::Hash, boost::posix_time::ptime > > &iovs)
Definition: IOVSchema.cc:291
size_t selectGroups(const std::string &tag, std::vector< cond::Time_t > &groups)
Definition: IOVSchema.cc:144
static char const * tname
Definition: IOVSchema.h:48
void setForeignKey(const std::string &name)
Definition: DbCore.h:260
bool select(const cond::Hash &payloadHash)
Definition: IOVSchema.cc:355
unsigned long long Time_t
Definition: Time.h:16
void addCondition(const T &value, const std::string condition="=")
Definition: DbCore.h:427
static char const * tname
Definition: IOVSchema.h:13
const coral::AttributeList & get() const
Definition: DbCore.h:170
void addOrderClause(bool ascending=true)
Definition: DbCore.h:438
std::string Hash
Definition: Types.h:45
void erase(const std::string &tag)
Definition: IOVSchema.cc:299
void copy(const std::string &source)
Definition: Binary.cc:40
IPayloadTable & payloadTable()
Definition: IOVSchema.cc:448
bool insert(Storage &iStorage, ItemType *iItem, const IdTag &iIdTag)
Definition: HCMethods.h:49
bool select(const std::string &name)
Definition: IOVSchema.cc:53
bool getType(const cond::Hash &payloadHash, std::string &objectType)
Definition: IOVSchema.cc:363
const void * data() const
Definition: Binary.cc:45
TAG_LOG::Table m_tagLogTable
Definition: IOVSchema.h:174
tuple description
Definition: idDealer.py:66
void setColumnData(const Params &params)
Definition: DbCore.h:511
void insert(const std::string &tag, const boost::posix_time::ptime &eventTime, const std::string &userName, const std::string &hostName, const std::string &command, const std::string &action, const std::string &userText)
Definition: IOVSchema.cc:324
Table(coral::ISchema &schema)
Definition: IOVSchema.cc:336
IOVSchema(coral::ISchema &schema)
Definition: IOVSchema.cc:410
cond::Hash insertIfNew(const std::string &objectType, const cond::Binary &payloadData, const cond::Binary &streamerInfoData, const boost::posix_time::ptime &insertionTime)
Definition: IOVSchema.cc:398
string command
Definition: mps_check.py:26
string action
Definition: mps_fire.py:28
size_t selectSnapshot(const std::string &tag, const boost::posix_time::ptime &snapshotTime, std::vector< std::tuple< cond::Time_t, cond::Hash > > &iovs)
Definition: IOVSchema.cc:218
std::vector< std::vector< double > > tmp
Definition: MVATrainer.cc:100
char data[epos_bytes_allocation]
Definition: EPOS_Wrapper.h:82
void groupBy(const std::string &expression)
Definition: DbCore.h:444
cond::Hash makeHash(const std::string &objectType, const cond::Binary &data)
Definition: IOVSchema.cc:10
SynchronizationType
Definition: Types.h:29
Table(coral::ISchema &schema)
Definition: IOVSchema.cc:35
size_t selectSnapshotByGroup(const std::string &tag, cond::Time_t lowerGroup, cond::Time_t upperGroup, const boost::posix_time::ptime &snapshotTime, std::vector< std::tuple< cond::Time_t, cond::Hash > > &iovs)
Definition: IOVSchema.cc:184
bool insert(const cond::Hash &payloadHash, const std::string &objectType, const cond::Binary &payloadData, const cond::Binary &streamerInfoData, const boost::posix_time::ptime &insertionTime)
Definition: IOVSchema.cc:385
volatile std::atomic< bool > shutdown_flag false
Table(coral::ISchema &schema)
Definition: IOVSchema.cc:123
static char const * tname
Definition: IOVSchema.h:79
void insert(const std::string &name, cond::TimeType timeType, const std::string &objectType, cond::SynchronizationType synchronizationType, cond::Time_t endOfValidity, const std::string &description, cond::Time_t lastValidatedTime, const boost::posix_time::ptime &insertionTime)
Definition: IOVSchema.cc:85
void addWhereCondition(const P &param, const std::string condition="=")
Definition: DbCore.h:520
bool getMetadata(const std::string &name, std::string &description, boost::posix_time::ptime &insertionTime, boost::posix_time::ptime &modificationTime)
Definition: IOVSchema.cc:75
const Time_t MAX_VAL(std::numeric_limits< Time_t >::max())
void insertOne(const std::string &tag, cond::Time_t since, cond::Hash payloadHash, const boost::posix_time::ptime &insertTime)
Definition: IOVSchema.cc:283
tuple size
Write out results.
void throwException(const std::string &message, const std::string &methodName)
Definition: Exception.cc:14
size_t selectSnapshotGroups(const std::string &tag, const boost::posix_time::ptime &snapshotTime, std::vector< cond::Time_t > &groups)
Definition: IOVSchema.cc:155
size_t selectLatestByGroup(const std::string &tag, cond::Time_t lowerGroup, cond::Time_t upperGroup, std::vector< std::tuple< cond::Time_t, cond::Hash > > &iovs)
Definition: IOVSchema.cc:167
void addWhereCondition(const P &param, const std::string condition="=")
Definition: DbCore.h:554