11 #include "CoralBase/Attribute.h"
12 #include "Reflex/Member.h"
17 m_objectType( objectType ),
18 m_columns( mapping.columnNames() ),
23 m_relationalData( 0 ){
32 m_dataElement = &dataElement;
36 Reflex::OffsetFunction baseOffsetFunc = 0;
37 if( m_objectType != refType ){
40 throwException(
"Type \""+m_objectType.Name(Reflex::SCOPED)+
"\" is not an Ora Reference.",
41 "OraReferenceStreamerBase::buildDataElement");
44 Reflex::Member contIdMember = refType.DataMemberByName(
"m_containerId");
45 Reflex::Member itemIdMember = refType.DataMemberByName(
"m_itemId");
46 if( !contIdMember || !itemIdMember ){
48 "OraReferenceStreamerBase::buildDataElement");
50 m_dataElemOId0 = &dataElement.
addChild( contIdMember.Offset(), baseOffsetFunc );
51 m_dataElemOId1 = &dataElement.
addChild( itemIdMember.Offset(), baseOffsetFunc);
53 if( m_columns.size()<2 ){
54 throwException(
"Expected column names have not been found in the mapping.",
55 "OraReferenceStreamerBase::buildDataElement");
57 const std::type_info& attrType =
typeid(int);
58 for( std::vector<std::string>::const_iterator iCol = m_columns.begin();
59 iCol != m_columns.end(); ++iCol ){
60 relationalData.
addData( *iCol, attrType );
62 m_relationalData = &relationalData;
68 if(!m_relationalData){
70 "OraReferenceStreamerBase::bindDataForUpdate");
73 void* oid0Address = m_dataElemOId0->address( data );
74 coral::Attribute& oid0Attr = m_relationalData->data()[ m_columns[0] ];
75 oid0Attr.data<
int>()= *static_cast<int*>(oid0Address);
76 void* oid1Address = m_dataElemOId1->address( data );
77 coral::Attribute& oid1Attr = m_relationalData->data()[ m_columns[1] ];
78 oid1Attr.data<
int>()= *static_cast<int*>(oid1Address) ;
80 void* refPtr = m_dataElement->address( data );
81 if(refHandler) refHandler->
onSave( *static_cast<Reference*>( refPtr ) );
85 if(!m_relationalData){
87 "OraReferenceStreamerBase::bindDataForRead");
89 if( m_columns.size()<2 ){
90 throwException(
"Expected column names have not been found in the mapping.",
91 "OraReferenceStreamerBase::bindDataForRead");
93 void* oid0Address = m_dataElemOId0->address( data );
94 coral::Attribute& oid0Attr = m_relationalData->data()[ m_columns[0] ];
95 *
static_cast<int*
>(oid0Address) = oid0Attr.data<
int>();
96 void* oid1Address = m_dataElemOId1->address( data );
97 coral::Attribute& oid1Attr = m_relationalData->data()[ m_columns[1] ];
98 *
static_cast<int*
>( oid1Address ) = oid1Attr.data<
int>();
100 void* refPtr = m_dataElement->address( data );
101 if(refHandler) refHandler->
onLoad( *static_cast<Reference*>( refPtr ) );
116 return buildDataElement( dataElement, relationalData );
124 bindDataForUpdate( data );
139 return buildDataElement( dataElement, relationalData );
147 bindDataForUpdate( data );
161 return buildDataElement( dataElement, relationalData );
171 bindDataForRead( data );
181 m_objectType( objectType ),
182 m_mapping( mapping ),
bool build(DataElement &dataElement, IRelationalData &relationalData)
OraReferenceUpdater(const Reflex::Type &objectType, MappingElement &mapping, ContainerSchema &schema)
void write(int oid, const void *data)
Writes a data element.
virtual ~OraReferenceWriter()
virtual bool onLoad(ora::Reference &ref)=0
IRelationalWriter * newWriter()
DataElement & addChild(size_t declaringScopeOffset, Reflex::OffsetFunction offsetFunction)
bool findBaseType(Reflex::Type &type, Reflex::Type &baseType, Reflex::OffsetFunction &func)
OraReferenceStreamer(const Reflex::Type &objectType, MappingElement &mapping, ContainerSchema &schema)
bool build(DataElement &dataElement, IRelationalData &relationalData, RelationalBuffer &operationBuffer)
virtual ~OraReferenceReader()
void setRecordId(const std::vector< int > &identity)
OraReferenceStreamerBase(const Reflex::Type &objectType, MappingElement &mapping, ContainerSchema &schema)
virtual bool onSave(ora::Reference &ref)=0
bool buildDataElement(DataElement &dataElement, IRelationalData &relationalData)
bool build(DataElement &dataElement, IRelationalData &relationalData, RelationalBuffer &operationBuffer)
void read(void *data)
Reads a data element.
void setRecordId(const std::vector< int > &identity)
void update(int oid, const void *data)
Updates a data element.
OraReferenceReader(const Reflex::Type &objectType, MappingElement &mapping, ContainerSchema &schema)
void setRecordId(const std::vector< int > &identity)
virtual ~OraReferenceStreamerBase()
void bindDataForRead(void *data)
void bindDataForUpdate(const void *data)
void throwException(const std::string &message, const std::string &methodName)
OraReferenceWriter(const Reflex::Type &objectType, MappingElement &mapping, ContainerSchema &schema)
IRelationalUpdater * newUpdater()
virtual ~OraReferenceUpdater()
virtual void addData(const std::string &columnName, const std::type_info &columnType)=0
IRelationalReader * newReader()