1 #ifndef CondCore_ConditionDatabase_DbCore_h 2 #define CondCore_ConditionDatabase_DbCore_h 21 #include "CoralBase/AttributeList.h" 22 #include "CoralBase/Attribute.h" 23 #include "CoralBase/AttributeSpecification.h" 24 #include "CoralBase/Blob.h" 25 #include "CoralBase/TimeStamp.h" 26 #include "RelationalAccess/ICursor.h" 27 #include "RelationalAccess/ISchema.h" 28 #include "RelationalAccess/ISessionProxy.h" 29 #include "RelationalAccess/IQuery.h" 30 #include "RelationalAccess/TableDescription.h" 31 #include "RelationalAccess/ITable.h" 32 #include "RelationalAccess/ITableDataEditor.h" 33 #include "RelationalAccess/IBulkOperation.h" 34 #include "RelationalAccess/IBulkOperation.h" 35 #include "RelationalAccess/SchemaException.h" 43 #include <boost/date_time/posix_time/posix_time.hpp> 48 #define conddb_table( NAME ) namespace NAME {\ 49 static constexpr char const* tname = #NAME ;\ 56 #define FIXSIZE_COLUMN( NAME, TYPE, SIZE ) struct NAME {\ 57 static constexpr char const* name = #NAME; \ 59 static constexpr size_t size = SIZE;\ 60 static std::string tableName(){ return std::string(tname); }\ 61 static std::string fullyQualifiedName(){ return std::string(tname)+"."+name; }\ 65 #define VARSIZE_COLUMN( NAME, TYPE ) FIXSIZE_COLUMN( NAME, TYPE, 0 ) 68 #define GET_4TH_ARG(arg1, arg2, arg3, arg4, ... ) arg4 69 #define WRONG_PAR_NUMBER_ERROR( ... ) static_assert( false, "\"column\" macro accepts exactly 2 or 3 parameters" ) 70 #define SELECT_COLUMN_MACRO(...) GET_4TH_ARG(__VA_ARGS__, FIXSIZE_COLUMN, VARSIZE_COLUMN, WRONG_PAR_NUMBER_ERROR ) 73 #define conddb_column( ... ) SELECT_COLUMN_MACRO(__VA_ARGS__)(__VA_ARGS__) 77 namespace persistency {
80 template <
typename T,
typename P>
87 if(
init) data.extend<
T>( attributeName );
88 data[ attributeName ].data<
T>() = param;
92 if(init) data.extend<coral::Blob>( attributeName );
93 data[ attributeName ].bind( param.
get() );
97 if(init) data.extend<coral::TimeStamp>( attributeName );
98 data[ attributeName ].data<coral::TimeStamp>() = coral::TimeStamp(param);
102 if(init) data.extend<
std::string>( attributeName );
107 if(init) data.extend<
std::string>( attributeName );
113 static_assert_is_same_decayed<typename Column::type,P>();
119 static_assert_is_same_decayed<typename Column::type,P>();
120 std::stringstream varId;
121 unsigned int id = data.size();
123 if( !whereClause.empty() ) whereClause +=
" AND ";
124 whereClause += Column::fullyQualifiedName() +
" " + condition +
" :" + varId.str() +
" ";
130 if( !whereClause.empty() ) whereClause +=
" AND ";
131 whereClause += C1::fullyQualifiedName() +
" " + condition +
" " + C2::fullyQualifiedName() +
" ";
139 template<
typename Params,
int n,
typename T1,
typename... Ts>
141 f_add_column_data<T1>(
m_data, std::get<n>( params ),
init );
142 _set<Params, n+1, Ts...>(params,
init);
145 template<
typename Params,
int n>
146 void _set(
const Params &,
bool) {
157 _set<
P, 0, Columns...>(params);
161 void set(
const P & params ){
167 const coral::AttributeList&
get()
const {
177 return coral::AttributeSpecification::typeNameForType<T>();
182 return coral::AttributeSpecification::typeNameForType<coral::Blob>();
187 return coral::AttributeSpecification::typeNameForType<coral::TimeStamp>();
192 return coral::AttributeSpecification::typeNameForType<std::string>();
197 return coral::AttributeSpecification::typeNameForType<std::string>();
203 if( notNull ) table.setNotNullConstraint( columnName );
211 return is_same_any<T, Arg1>() || is_same_any<T, Arg2, Args...>();
214 template<
typename...
Types>
218 template<
int n>
void addColumn( coral::TableDescription& ) {}
220 template<
int n,
typename Arg1,
typename... Args>
void addColumn( coral::TableDescription& tableDescription ){
222 f_add_column_description<typename Arg1::type>( m_description, columnName,
Arg1::size );
223 addColumn<n+1, Args...>( m_description );
227 static_assert(is_same_any<Col1,Types...>(),
"Specified Column has not been found in the table.");
228 checkColumns<0,Cols...>();
236 m_description(
"ConditionDatabase" ){
237 m_description.setName( name );
238 addColumn<0,
Types...>( m_description );
243 checkColumns<0,ColumnTypes...>();
244 m_description.setPrimaryKey( makeList<ColumnTypes...>() );
248 checkColumns<0,ColumnTypes...>();
249 m_description.setUniqueConstraint( makeList<ColumnTypes...>(), name );
253 checkColumns<0,ColumnTypes...>();
254 m_description.createIndex( name, makeList<ColumnTypes...>() );
258 checkColumns<0,Column>();
262 const coral::TableDescription&
get() {
263 return m_description;
267 template<
int n>
void _makeList( std::vector<std::string>& ) {}
269 template<
int n,
typename Arg1,
typename... Args>
void _makeList( std::vector<std::string>& columnNames ) {
271 _makeList<n+1, Args...>( columnNames );
274 template<
typename... ColumnTypes> std::vector<std::string>
makeList(){
275 std::vector<std::string> columnList;
276 _makeList<0,ColumnTypes...>( columnList );
285 return row[ fullyQualifiedName ].data<
T>();
288 return cond::Binary(row[ fullyQualifiedName ].data<coral::Blob>());
291 return row[ fullyQualifiedName ].data<coral::TimeStamp>().
time();
301 if( val.size() !=
n )
throwException(
"Retrieved string size does not match with the expected string size.",
"getFromRow");
302 std::array<char,n> ret;
303 ::memcpy(ret.data(),val.c_str(),
n);
309 template<
typename...
Types>
class QueryIterator:
public std::iterator<std::input_iterator_tag,std::tuple<Types...> > {
316 m_query( rhs.m_query ),
317 m_currentRow( rhs.m_currentRow ){
330 template <
typename T>
typename T::type get()
const {
334 auto operator*() -> decltype( std::make_tuple( this->get<Types>()... ) ) {
335 return std::make_tuple( get<Types>()... );
339 m_currentRow = m_query->next() ? &m_query->currentRow() :
nullptr;
350 if (rhs.
m_query ==
nullptr && m_query ==
nullptr)
364 const coral::AttributeList* m_currentRow=
nullptr;
368 query.addToOutputList( fullyQualifiedName );
369 query.defineOutputType( fullyQualifiedName, coral::AttributeSpecification::typeNameForType<T>() );
372 query.addToOutputList( fullyQualifiedName );
373 query.defineOutputType( fullyQualifiedName, coral::AttributeSpecification::typeNameForType<coral::Blob>() );
376 query.addToOutputList( fullyQualifiedName );
377 query.defineOutputType( fullyQualifiedName, coral::AttributeSpecification::typeNameForType<coral::TimeStamp>() );
380 query.addToOutputList( fullyQualifiedName );
381 query.defineOutputType( fullyQualifiedName, coral::AttributeSpecification::typeNameForType<std::string>() );
384 query.addToOutputList( fullyQualifiedName );
385 query.defineOutputType( fullyQualifiedName, coral::AttributeSpecification::typeNameForType<std::string>() );
388 query.addToOutputList( fullyQualifiedName );
389 query.defineOutputType( fullyQualifiedName, coral::AttributeSpecification::typeNameForType<std::string>() );
396 m_coralQuery( schema.newQuery() ),
400 _Query<0,
Types...>();
401 if(
distinct ) m_coralQuery->setDistinct();
408 if( m_tables.find( Col::tableName() )==m_tables.end() ){
409 m_coralQuery->addToTableList( Col::tableName() );
410 m_tables.insert( Col::tableName() );
418 template<
int n,
typename Arg1,
typename... Args>
422 _Query<n+1, Args...>();
427 f_add_condition_data<C>( m_whereData, m_whereClause,
value, condition );
434 f_add_condition<C1,C2>( m_whereClause, condition );
439 std::string orderClause( C::fullyQualifiedName() );
440 if(!ascending) orderClause +=
" DESC";
441 m_coralQuery->addToOrderList( orderClause );
446 m_coralQuery->
groupBy( expression );
456 if(!m_cursor)
throwException(
"The query has not been executed.",
"Query::currentRow");
457 bool ret = m_cursor->next();
458 if( ret ) m_retrievedRows++;
463 if(!m_cursor)
throwException(
"The query has not been executed.",
"Query::currentRow");
464 return m_cursor->currentRow();
468 m_coralQuery->setCondition( m_whereClause, m_whereData );
469 m_cursor = &m_coralQuery->execute();
480 return m_retrievedRows;
485 coral::ICursor* m_cursor =
nullptr;
486 size_t m_retrievedRows = 0;
494 template<
typename Params,
int n,
typename C1,
typename... Cs>
495 void _set(
const Params & params) {
496 f_add_column_data<C1>(
m_data, std::get<n>( params ) );
497 if( !m_setClause.empty() ) m_setClause +=
", ";
499 _set<Params, n+1, Cs...>(params);
502 template<
typename Params,
int n>
514 template <
typename... Columns,
typename Params>
void setColumnData(
const Params& params ){
515 _set<Params,0,Columns...>( params );
519 if( !m_setClause.empty() ) m_setClause +=
", ";
524 f_add_condition_data<Column>(
m_data, m_whereClause, param, condition );
528 f_add_condition<Column1,Column2>( m_whereClause, condition );
531 const coral::AttributeList&
get()
const {
540 return m_whereClause;
558 f_add_condition_data<Column>(
m_data, m_whereClause, param, condition );
562 f_add_condition<Column1,Column2>( m_whereClause, condition );
565 const coral::AttributeList&
get()
const {
570 return m_whereClause;
583 m_tableName( tableName ),
590 template <
typename P>
void insert(
const P& params ){
591 m_buffer.set( params );
592 if( !m_coralInserter.get() ) m_coralInserter.reset( m_schema.tableHandle( m_tableName ).dataEditor().bulkInsert( m_buffer.get(), cacheSize ) );
593 m_coralInserter->processNextIteration();
597 if( m_coralInserter.get() ) m_coralInserter->flush();
611 inline bool existsTable( coral::ISchema&
schema,
const char* tableName ){
612 return schema.existsTable(
std::string( tableName ) );
615 inline void createTable( coral::ISchema& schema,
const coral::TableDescription& descr ){
616 schema.createTable( descr );
619 inline bool insertInTable( coral::ISchema& schema,
const char* tableName,
const coral::AttributeList& row,
bool failOnDuplicate=
true ){
622 schema.tableHandle(
std::string(tableName ) ).dataEditor().insertRow( row );
624 }
catch (
const coral::DuplicateEntryInUniqueKeyException& ){
625 if( failOnDuplicate )
throw;
630 inline void updateTable( coral::ISchema& schema,
const char* tableName,
const UpdateBuffer&
data ){
634 inline void deleteFromTable( coral::ISchema& schema,
const char* tableName,
const DeleteBuffer& data ){
void addColumn(coral::TableDescription &)
std::vector< std::string > makeList()
void createIndex(const std::string &name)
void static_assert_is_same_decayed()
Query< Types... > * m_query
QueryIterator(Query< Types... > *parent)
void _set(const Params ¶ms, bool init=true)
T operator()(const coral::AttributeList &row, const std::string &fullyQualifiedName)
coral::AttributeList m_data
std::string synchronizationTypeNames(SynchronizationType type)
QueryIterator & operator=(const QueryIterator &rhs)
RowBuffer< Types... > m_buffer
void f_add_condition_data(coral::AttributeList &data, std::string &whereClause, const P &value, const std::string condition="=")
void insert(const P ¶ms)
const coral::AttributeList * m_currentRow
RowBuffer(const P ¶ms)
std::string operator()(const coral::AttributeList &row, const std::string &fullyQualifiedName)
void addWhereCondition(const std::string condition="=")
size_t retrievedRows() const
static void make(coral::IQuery &query, const std::string &fullyQualifiedName)
bool distinct(EventRange const &lh, EventRange const &rh)
Query(const coral::ISchema &schema, bool distinct=false)
void _set(const Params ¶ms)
const std::string & setClause() const
void setForeignKey(const std::string &name)
std::string m_whereClause
void _makeList(std::vector< std::string > &columnNames)
void f_add_column_data(coral::AttributeList &data, const P ¶m, bool init=true)
TimeType timeTypeFromName(const std::string &name)
Query & groupBy(const std::string &expression)
SynchronizationType synchronizationTypeFromName(const std::string &name)
static void make(coral::IQuery &query, const std::string &fullyQualifiedName)
void f_add_column_description(coral::TableDescription &table, const std::string &columnName, size_t size=0, bool notNull=true)
void f_add_attribute(coral::AttributeList &data, const std::string &attributeName, const T ¶m, bool init=true)
void setUniqueConstraint(const std::string &name)
static void make(coral::IQuery &query, const std::string &fullyQualifiedName)
bool operator==(const QGLikelihoodParameters &lhs, const QGLikelihoodCategory &rhs)
Test if parameters are compatible with category.
const coral::AttributeList & currentRow() const
Query & addCondition(const T &value, const std::string condition="=")
std::string m_whereClause
void f_add_condition(std::string &whereClause, const std::string condition="=")
coral::AttributeList m_whereData
bool operator==(const QueryIterator &rhs) const
cond::TimeType operator()(const coral::AttributeList &row, const std::string &fullyQualifiedName)
const QueryIterator< Types... > end()
Query & addOrderClause(bool ascending=true)
static void make(coral::IQuery &query, const std::string &fullyQualifiedName)
std::unique_ptr< coral::IQuery > m_coralQuery
const std::string & whereClause() const
std::string m_whereClause
QueryIterator operator++(int)
const coral::AttributeList & get() const
void setColumnData(const Params ¶ms)
Query & addCondition(const std::string condition="=")
QueryIterator & operator++()
void _set(const Params &, bool)
std::pair< OmniClusterRef, TrackingParticleRef > P
const coral::AttributeList & get() const
auto operator*() -> decltype(std::make_tuple(this->get< Types >()...))
static void make(coral::IQuery &query, const std::string &fullyQualifiedName)
cond::SynchronizationType operator()(const coral::AttributeList &row, const std::string &fullyQualifiedName)
BulkInserter(coral::ISchema &schema, const char *tableName)
const QueryIterator< Types... > begin()
std::vector< std::vector< double > > tmp
void _makeList(std::vector< std::string > &)
coral::TableDescription m_description
char data[epos_bytes_allocation]
const coral::Blob & get() const
void addColumn(coral::TableDescription &tableDescription)
bool operator!=(const QueryIterator &rhs) const
static void make(coral::IQuery &query, const std::string &fullyQualifiedName)
coral::ISchema & m_schema
std::unique_ptr< coral::IBulkOperation > m_coralInserter
cond::Binary operator()(const coral::AttributeList &row, const std::string &fullyQualifiedName)
coral::AttributeList m_data
std::set< std::string > m_tables
const std::string & whereClause() const
void addWhereCondition(const std::string condition="=")
std::string timeTypeName(TimeType type)
TableDescription(const char *name)
QueryIterator(const QueryIterator &rhs)
void addWhereCondition(const P ¶m, const std::string condition="=")
void throwException(const std::string &message, const std::string &methodName)
void _set(const Params &)
boost::posix_time::ptime operator()(const coral::AttributeList &row, const std::string &fullyQualifiedName)
coral::AttributeList m_data
void addWhereCondition(const P ¶m, const std::string condition="=")