9#include "RelationalAccess/ISessionProxy.h"
10#include "RelationalAccess/ITransaction.h"
11#include "RelationalAccess/ISchema.h"
12#include "RelationalAccess/ITable.h"
13#include "RelationalAccess/ITableDescription.h"
14#include "RelationalAccess/ITableDataEditor.h"
15#include "RelationalAccess/IBulkOperation.h"
16#include "RelationalAccess/IColumn.h"
17#include "RelationalAccess/IQuery.h"
18#include "RelationalAccess/ICursor.h"
19#include "RelationalAccess/SchemaException.h"
20#include "CoralBase/Attribute.h"
21#include "CoralBase/Exception.h"
22#include "CoolKernel/ValidityKey.h"
23#include "CoolKernel/IDatabase.h"
24#include "CoolKernel/IFolder.h"
25#include "CoolKernel/IObject.h"
26#include "CoolKernel/Record.h"
27#include "CoolKernel/StorageType.h"
41 coral::ISessionProxy*
proxy, cool::IDatabasePtr cooldb,
53 m_log << coral::Debug <<
"Initialize CoraCoolFolder " << coolfolder <<
54 " in database instance " <<
m_dbname << coral::MessageStream::endmsg;
56 std::string folderdesc;
61 catch (cool::Exception& e) {
64 m_log << coral::Debug <<
"COOL Folder description is: " << folderdesc
65 << coral::MessageStream::endmsg;
70 m_pkey=(m_keycolcoral!=m_pkeycolcoral);
72 throw CoraCoolException(
"incorrect <coracool> description string ",
73 "CoraCoolFolder::CoraCoolFolder");
78 m_proxy->transaction().start(true);
79 coral::ISchema& schema=m_proxy->nominalSchema();
80 m_table=&schema.tableHandle(m_tablename);
81 m_tabledesc=&(m_table->description());
84 if (!decodeAttrSpec()) throw CoraCoolException(
85 "Problem extracting attribute specification",
86 "CoraCoolFolder::CoraCoolFolder");
87 m_proxy->transaction().commit();
89 catch (coral::SessionException& e) {
91 "CoraCoolFolder::CoraCoolFolder");
105 static const std::string
empty;
113const cool::RecordSpecification
117 cool::RecordSpecification atrspec;
125 coral::AttributeList atrlist;
127 atrlist.extend(itr->first,
128 cool::StorageType::storageType(
nameToCoolType(itr->second)).cppType());
133 const cool::ValidityKey until,
136 const cool::ChannelId& channelId,
137 const std::string& tagName,
138 const bool userTagOnly) {
152 m_log << coral::Debug <<
"Storing " << nrow <<
" rows in CoraCool folder "
154 coral::MessageStream::endmsg;
159 m_proxy->transaction().start(
false);
164 pkey=seqfk.
fetch(nrow);
169 m_proxy->transaction().commit();
171 catch (coral::Exception& e) {
177 m_proxy->transaction().start(
false);
178 coral::ISchema& schema=
m_proxy->nominalSchema();
180 coral::ITableDataEditor& editor=
m_table->dataEditor();
181 coral::AttributeList
data=*begin;
182 coral::IBulkOperation* bulki=editor.bulkInsert(
data,
WB_SIZE);
186 data.fastCopyData(*payitr);
191 bulki->processNextIteration();
194 m_proxy->transaction().commit();
196 catch (coral::Exception& e) {
203 cool::Record coolfk(
m_coolfolder->payloadSpecification());
206 m_coolfolder->storeObject(since,until,coolfk,channelId,tagName,
209 catch (cool::Exception &e) {
230 m_proxy->transaction().start(
false);
231 coral::ISchema& schema=
m_proxy->nominalSchema();
233 coral::ITableDataEditor& editor=
m_table->dataEditor();
259 m_proxy->transaction().commit();
261 catch (coral::Exception& e) {
269 const cool::ValidityKey& until,
270 const coral::Attribute& fkey,
271 const cool::ChannelId& channelId,
272 const std::string& tagName,
273 const bool userTagOnly) {
277 cool::Record fkeylist(
m_coolfolder->payloadSpecification());
279 m_coolfolder->storeObject(since,until,fkeylist,channelId,tagName,
283 "CoraCool::Folder::referenceObject");
288 const cool::ValidityKey& until,
290 const cool::ChannelId& channelId,
291 const std::string& tagName,
292 const bool userTagOnly) {
294 cool::Record fkeylist(
m_coolfolder->payloadSpecification());
296 m_coolfolder->storeObject(since,until,fkeylist,channelId,tagName,
306 "CoralCoolFolder::addPayload");
314 m_log << coral::Debug <<
"Adding " << nrow <<
" into CoraCool folder "
319 m_proxy->transaction().start(
false);
321 pkey=seqfk.
fetch(nrow);
323 m_proxy->transaction().commit();
325 catch (coral::Exception& e) {
330 m_proxy->transaction().start(
false);
331 coral::ISchema& schema=
m_proxy->nominalSchema();
333 coral::ITableDataEditor& editor=
m_table->dataEditor();
337 coral::AttributeList
data=*payitr;
339 editor.insertRow(
data);
341 m_proxy->transaction().commit();
343 catch (coral::Exception& e) {
352 const std::string typen=attr.specification().typeName();
354 attr.data<
int>()=keyval;
355 }
else if (typen==
"unsigned int") {
356 attr.data<
unsigned int>()=keyval;
357 }
else if (typen==
"long long") {
358 attr.data<
long long>()=keyval;
359 }
else if (typen==
"unsigned long long") {
360 attr.data<
unsigned long long>()=keyval;
363 m_log << coral::Error <<
"Unrecognised key type " << typen <<
364 " in CoraCoolFolder::setAttrKey" << coral::MessageStream::endmsg;
373 const cool::StorageType& typen=attr.specification().storageType();
374 if (typen==cool::StorageType::Int32) {
375 attr.setValue<
int>(keyval);
376 }
else if (typen==cool::StorageType::UInt32) {
377 attr.setValue<
unsigned int>(keyval);
378 }
else if (typen==cool::StorageType::Int64) {
379 attr.setValue<
long long>(keyval);
380 }
else if (typen==cool::StorageType::UInt63) {
381 attr.setValue<
unsigned long long>(keyval);
384 m_log << coral::Error <<
"Unrecognised key type " << typen.name() <<
385 " in CoraCoolFolder::setFieldKey" << coral::MessageStream::endmsg;
392 const coral::Attribute& keyval) {
394 const cool::StorageType& typen=attr.specification().storageType();
395 if (typen==cool::StorageType::Int32) {
396 attr.setValue<
int>(keyval.data<
int>());
397 }
else if (typen==cool::StorageType::UInt32) {
398 attr.setValue<
unsigned int>(keyval.data<
unsigned int>());
399 }
else if (typen==cool::StorageType::Int64) {
400 attr.setValue<
long long>(keyval.data<
long long>());
401 }
else if (typen==cool::StorageType::UInt63) {
402 attr.setValue<
unsigned long long>(keyval.data<
unsigned long long>());
405 m_log << coral::Error <<
"Unrecognised key type " << typen.name() <<
406 " in CoraCoolFolder::setFieldAttr" << coral::MessageStream::endmsg;
414 const std::string typen=attr.specification().typeName();
416 return attr.data<
int>();
417 }
else if (typen==
"unsigned int") {
418 return static_cast<int>(attr.data<
unsigned int>());
419 }
else if (typen==
"long long") {
420 return static_cast<int>(attr.data<
long long>());
421 }
else if (typen==
"unsigned long long") {
422 return static_cast<int>(attr.data<
unsigned long long>());
424 m_log << coral::Error <<
"Unrecognised key type " << typen <<
425 " in CoraCoolFolder::getAttrKey" << coral::MessageStream::endmsg;
433 coral::IQuery*
query=0;
435 coral::ITable&
table=
m_proxy->nominalSchema().tableHandle(
438 coral::AttributeList bindvar;
439 bindvar.extend<std::string>(
"SNAME");
441 query->setCondition(
"NAME=:SNAME",bindvar);
442 query->setRowCacheSize(1);
443 query->defineOutputType(
"NAME",
"string");
444 coral::ICursor& cursor=
query->execute();
446 const coral::AttributeList&
res=cursor.currentRow();
447 std::string spec=
res[
"ATTRSPEC"].data<std::string>();
449 std::string::size_type iofs1,iofs2,iofs3;
453 iofs2=spec.find(
':',iofs1);
454 iofs3=spec.find(
',',iofs2);
455 if (iofs3==std::string::npos) {
459 m_attrvec.emplace_back(spec.substr(iofs1,iofs2-iofs1),spec.substr(iofs2+1,iofs3-iofs2-1));
460 if (!last) iofs1=iofs3+1;
464 m_log << coral::Error <<
"No data obtained for CORACOOLATTR" <<
465 coral::MessageStream::endmsg;
468 catch (coral::Exception &e) {
469 m_log << coral::Error <<
"Exception reading CORACOOLATTR table: "
470 << e.what() << coral::MessageStream::endmsg;
477 const std::string& coolName)
const {
478 if (coolName==
"Int16")
return cool::StorageType::Int16;
479 if (coolName==
"UInt16")
return cool::StorageType::UInt16;
480 if (coolName==
"Int32")
return cool::StorageType::Int32;
481 if (coolName==
"UInt32")
return cool::StorageType::UInt32;
482 if (coolName==
"UInt63")
return cool::StorageType::UInt63;
483 if (coolName==
"Int64")
return cool::StorageType::Int64;
484 if (coolName==
"Float")
return cool::StorageType::Float;
485 if (coolName==
"Double")
return cool::StorageType::Double;
486 if (coolName==
"String255")
return cool::StorageType::String255;
487 if (coolName==
"String4k")
return cool::StorageType::String4k;
488 if (coolName==
"String64k")
return cool::StorageType::String64k;
489 if (coolName==
"String16M")
return cool::StorageType::String16M;
490 if (coolName==
"Blob64k")
return cool::StorageType::Blob64k;
493 "CoraCoolFolder::nameToCoolType");
498 query->defineOutputType(itr->first,
499 coral::AttributeSpecification::typeNameForId(
500 cool::StorageType::storageType(
nameToCoolType(itr->second)).cppType()));
504 const int fkey,
bool updatefk) {
518 m_bulki->processNextIteration();
521 catch (coral::Exception& e) {
527 const cool::ValidityKey& pointInTime,
const cool::ChannelId& channelId,
528 const std::string& tagName) {
530 m_log << coral::Debug <<
"CoraCoolFolder query time " << pointInTime <<
531 " channel " << channelId <<
" tag " << tagName << coral::MessageStream::endmsg;
532 cool::IObjectPtr obj=
m_coolfolder->findObject(pointInTime,channelId,tagName);
538 m_proxy->transaction().start(
true);
541 const coral::AttributeList& fkeybind=obj->payload().attributeList();
542 query->setCondition(where,fkeybind);
543 coral::ICursor& cursor=
query->execute();
544 while (cursor.next()) {
545 const coral::AttributeList&
res=cursor.currentRow();
549 m_proxy->transaction().commit();
551 catch (coral::Exception& e) {
558 const cool::ValidityKey& pointInTime,
559 const cool::ChannelSelection& channels,
560 const std::string& tagName) {
561 return browseObjects(pointInTime,pointInTime,channels,tagName);
565 const cool::ValidityKey& since,
566 const cool::ValidityKey& until,
567 const cool::ChannelSelection& channels,
568 const std::string& tagName)
571 cool::IObjectIteratorPtr coolitr=
m_coolfolder->browseObjects(since,until,
boost::shared_ptr< CoraCoolObject > CoraCoolObjectPtr
boost::shared_ptr< CoraCoolObjectIter > CoraCoolObjectIterPtr
char data[hepevt_bytes_allocation_ATLAS]
std::pair< std::vector< unsigned int >, bool > res
static const Attributes_t empty
Define macros for attributes used to control the static checker.
bool setupStorageBuffer()
const cool::RecordSpecification payloadSpecification() const
cool::StorageType::TypeId nameToCoolType(const std::string &coolName) const
CoraCoolFolder(const std::string &coolfolder, coral::ISessionProxy *proxy, cool::IDatabasePtr cooldb, CoraCoolDatabase *coradb, coral::MessageStream &log)
cool::IFolderPtr m_coolfolder
void addPayload(const_iterator begin, const_iterator end)
coral::IBulkOperation * m_bulki
void referenceObject(const cool::ValidityKey &since, const cool::ValidityKey &until, const coral::Attribute &fkey, const cool::ChannelId &channelId=0, const std::string &tagName=defaultTagName(), const bool userTagOnly=false)
coral::ISessionProxy * proxy()
AttrVec::const_iterator AttrItr
std::string m_keycolcoral
void flushStorageBuffer()
coral::MessageStream & m_log
CoraCoolSequence * m_seqfk
std::vector< coral::AttributeList >::const_iterator const_iterator
coral::AttributeList emptyAttrList() const
CoraCoolSequence * m_seqpk
coral::ISessionProxy * m_proxy
void setOutputSpec(coral::IQuery *query)
coral::AttributeList * m_payloadbuf
int storeObject(const cool::ValidityKey &since, const cool::ValidityKey until, const_iterator begin, const_iterator end, const cool::ChannelId &channelId=0, const std::string &tagName=defaultTagName(), const bool userTagOnly=false)
cool::IDatabasePtr m_cooldb
CoraCoolObjectIterPtr browseObjects(const cool::ValidityKey &pointInTime, const cool::ChannelSelection &channels, const std::string &tagName=defaultTagName())
CoraCoolObjectPtr findObject(const cool::ValidityKey &pointInTime, const cool::ChannelId &channelId=0, const std::string &tagName=defaultTagName())
friend class CoraCoolObjectIter
bool setFieldKey(cool::IField &attr, const int keyval)
int getAttrKey(const coral::Attribute &attr)
const cool::IRecordSpecification & fkSpecification() const
CoraCoolDatabase * m_coradb
bool setAttrKey(coral::Attribute &attr, const int keyval)
std::string m_pkeycolcoral
static const std::string & defaultTagName()
void setPrefetchAll(const bool prefetchAll)
bool setFieldAttr(cool::IField &attr, const coral::Attribute &keyval)
void bulkInsert(const_iterator begin, const_iterator end, const int fkey, bool updatefk)
int fetch(const int inc=1)