11 #include "CoralBase/Attribute.h"
12 #include "Reflex/Member.h"
15 static std::string nullLabel(
"ora::NamedRef::Null");
22 m_objectType( objectType ),
23 m_columns( mapping.columnNames() ),
26 m_refNameDataElement( 0 ),
27 m_ptrDataElement( 0 ),
28 m_flagDataElement( 0 ),
29 m_relationalData( 0 ){
38 m_dataElement = &dataElement;
39 m_objectType.UpdateMembers();
40 Reflex::Member nameMember = m_objectType.DataMemberByName(
"m_name");
42 throwException(
"Data member \"m_name\" not found in class \""+m_objectType.Name()+
"\".",
43 "NamedReferenceStreamerBase::buildDataElement");
45 m_refNameDataElement = &dataElement.
addChild( nameMember.Offset(), 0 );
46 Reflex::Member ptrMember = m_objectType.DataMemberByName(
"m_ptr");
48 throwException(
"Data member \"m_ptr\" not found in class \""+m_objectType.Name()+
"\".",
49 "NamedReferenceStreamerBase::buildDataElement");
51 m_ptrDataElement = &dataElement.
addChild( ptrMember.Offset(), 0 );
52 Reflex::Member flagMember = m_objectType.DataMemberByName(
"m_isPersistent");
54 throwException(
"Data member \"m_isPersistent\" not found in class \""+m_objectType.Name()+
"\".",
55 "NamedReferenceStreamerBase::buildDataElement");
57 m_flagDataElement = &dataElement.
addChild( flagMember.Offset(), 0 );
59 if( m_columns.size()==0 ){
61 "NamedReferenceStreamerBase::buildDataElement");
63 relationalData.
addData( m_columns[0],
typeid(std::string) );
64 m_relationalData = &relationalData;
69 if(!m_relationalData){
71 "NamedReferenceStreamerBase::bindDataForUpdate");
74 void* refNameAddress = m_refNameDataElement->address( data );
75 coral::Attribute& refNameAttr = m_relationalData->data()[ m_columns[0] ];
76 std::string
name = *
static_cast<std::string*
>(refNameAddress);
78 refNameAttr.data<std::string>()= name;
82 if(!m_relationalData){
84 "NamedReferenceStreamerBase::bindDataForRead");
86 void* refNameAddress = m_refNameDataElement->address( data );
87 void* ptrAddress = m_ptrDataElement->address( data );
88 void* flagAddress = m_flagDataElement->address( data );
89 coral::Attribute& refNameAttr = m_relationalData->data()[ m_columns[0] ];
90 std::string
name = refNameAttr.data<std::string>();
92 name = std::string(
"");
95 Reflex::Type namedRefType = m_objectType.TemplateArgumentAt(0);
96 boost::shared_ptr<void> ptr = m_schema.dbSession().fetchTypedObjectByName( name, namedRefType );
97 *
static_cast<boost::shared_ptr<void>*
>(ptrAddress) = ptr;
98 *
static_cast<bool*
>(flagAddress) =
true;
100 *
static_cast<std::string*
>(refNameAddress) = name;
115 return buildDataElement( dataElement, relationalData );
124 bindDataForUpdate( data );
139 return buildDataElement( dataElement, relationalData );
148 bindDataForUpdate( data );
162 return buildDataElement( dataElement, relationalData );
173 bindDataForRead( data );
183 m_objectType( objectType ),
184 m_mapping( mapping ),
185 m_schema( contSchema ){
void update(int oid, const void *data)
Updates a data element.
std::string namedRefNullLabel()
void read(void *destination)
Reads a data element.
void bindDataForUpdate(const void *data)
void setRecordId(const std::vector< int > &identity)
bool build(DataElement &dataElement, IRelationalData &relationalData, RelationalBuffer &operationBuffer)
IRelationalUpdater * newUpdater()
DataElement & addChild(size_t declaringScopeOffset, Reflex::OffsetFunction offsetFunction)
void bindDataForRead(void *data)
NamedRefWriter(const Reflex::Type &objectType, MappingElement &mapping, ContainerSchema &contSchema)
bool build(DataElement &offset, IRelationalData &relationalData)
bool build(DataElement &dataElement, IRelationalData &relationalData, RelationalBuffer &operationBuffer)
virtual ~NamedRefWriter()
NamedRefStreamer(const Reflex::Type &objectType, MappingElement &mapping, ContainerSchema &contSchema)
virtual ~NamedRefReader()
NamedReferenceStreamerBase(const Reflex::Type &objectType, MappingElement &mapping, ContainerSchema &schema)
IRelationalWriter * newWriter()
void write(int oid, const void *data)
Writes a data element.
IRelationalReader * newReader()
bool buildDataElement(DataElement &dataElement, IRelationalData &relationalData)
virtual ~NamedRefUpdater()
void setRecordId(const std::vector< int > &identity)
NamedRefUpdater(const Reflex::Type &objectType, MappingElement &mapping, ContainerSchema &contSchema)
NamedRefReader(const Reflex::Type &objectType, MappingElement &mapping, ContainerSchema &contSchema)
void throwException(const std::string &message, const std::string &methodName)
void setRecordId(const std::vector< int > &identity)
virtual ~NamedReferenceStreamerBase()
virtual void addData(const std::string &columnName, const std::type_info &columnType)=0