11 #include "CoralBase/Attribute.h"
12 #include "Reflex/Object.h"
13 #include "Reflex/Member.h"
30 const std::vector<std::string> columns = mapping.
columnNames();
31 for( std::vector<std::string>::const_iterator iC = columns.begin();
32 iC != columns.end(); ++iC){
38 if( iMe == mapping.
end()){
40 objectType.Name(Reflex::SCOPED)+
"\"",
41 "DependentClassWriter::write");
54 "DependentClassWriter::write");
58 coral::AttributeList::iterator iData = dataBuff.begin();
59 iData->data<
int>()= oId;
61 iData->data<
int>()= refId;
63 std::vector<int> recordId(1,refId);
90 if( iMap == depMapping.
end()){
92 m_type.Name(Reflex::SCOPED)+
"\"",
93 "DependentClassReadBuffer::ReadBuffer");
107 "DependentClassReader::read");
109 coral::AttributeList& whereData =
m_depQuery->whereData();
110 coral::AttributeList::iterator iWData = whereData.begin();
111 iWData->data<
int>() = refId;
114 void* destination = 0;
150 "RelationalRefLoader::load");
173 m_objectType( objectType ),
174 m_mappingElement( mapping ),
175 m_schema( contSchema ),
177 m_relationalData( 0 ),
178 m_operationBuffer( 0 ){
182 static std::string nullLabel(
"ora::UniqueRef::Null");
192 m_dataElement = &dataElement;
194 const std::vector<std::string>& columns = m_mappingElement.columnNames();
196 relationalData.
addData( columns[0],
typeid(std::string) );
198 relationalData.
addData( columns[1],
typeid(
int) );
199 m_relationalData = &relationalData;
200 m_operationBuffer = &buffer;
213 "UniqueRefWriter::write");
216 void* refAddress = m_dataElement->address( data );
218 Reflex::Object refObj( m_objectType, const_cast<void*>(refAddress));
221 refObj.Invoke(
"operator!",isNull);
228 std::type_info* refTypeInfo = 0;
229 refObj.Invoke(
"typeInfo",refTypeInfo);
231 className = refType.Name(Reflex::SCOPED);
237 MappingElement& depMapping = m_schema.mappingForDependentClass( refType,
true );
240 writer.
build( refType, depMapping, m_schema, m_operationBuffer->addVolatileBuffer() );
242 refObj.Invoke(
"operator*",refData);
243 writer.
write( oid, refId, refData );
247 coral::AttributeList& parentData = m_relationalData->data();
248 parentData[m_mappingElement.columnNames()[0]].data<std::string>()=className;
249 parentData[m_mappingElement.columnNames()[1]].data<
int>()=refId;
255 m_writer( objectType, mapping, contSchema ){
264 return m_writer.build( dataElement, relationalData, operationBuffer );
268 m_writer.setRecordId( identity );
274 m_writer.write( oid, data );
280 m_objectType( objectType ),
281 m_mappingElement( mapping ),
282 m_schema( contSchema ),
284 m_relationalData( 0 ),
289 for(std::vector<boost::shared_ptr<RelationalRefLoader> >::const_iterator iL = m_loaders.begin();
290 iL != m_loaders.end(); ++iL ){
297 m_dataElement = &dataElement;
298 const std::vector<std::string>& columns = m_mappingElement.columnNames();
300 relationalData.
addData( columns[0],
typeid(std::string) );
302 relationalData.
addData( columns[1],
typeid(
int) );
303 m_relationalData = &relationalData;
317 "UniqueRefReader::read");
319 coral::AttributeList& row = m_relationalData->data();
320 std::string
className = row[m_mappingElement.columnNames()[0]].data<std::string>();
321 int refId = row[m_mappingElement.columnNames()[1]].data<
int>();
326 MappingElement& depMapping = m_schema.mappingForDependentClass( refType );
329 Reflex::Member loaderMember = m_objectType.MemberByName(
"m_loader");
331 void* loaderAddress = loaderElement.
address( data );
332 boost::shared_ptr<IPtrLoader>* loaderPtr =
static_cast<boost::shared_ptr<IPtrLoader>*
>( loaderAddress );
335 newLoader->build( refType, depMapping, m_schema );
336 m_loaders.push_back( newLoader );
338 boost::shared_ptr<IPtrLoader>
tmp( newLoader );
348 m_objectType( objectType ),
349 m_mapping( mapping ),
350 m_schema( contSchema ){
IRelationalReader * newReader()
UniqueRefUpdater(const Reflex::Type &objectType, MappingElement &mapping, ContainerSchema &contSchema)
IRelationalReader * newReader(const Reflex::Type &dataType, MappingElement &dataMapping)
void * constructObject(const Reflex::Type &typ)
void * address(const void *topLevelAddress) const
void write(int oid, const void *data)
Writes a data element.
virtual ~UniqueRefReader()
bool build(DataElement &offset, IRelationalData &relationalData)
std::auto_ptr< IRelationalWriter > m_writer
IRelationalUpdater * newUpdater()
DataElement & addChild(size_t declaringScopeOffset, Reflex::OffsetFunction offsetFunction)
void setRecordId(const std::vector< int > &identity)
void write(int oId, int refId, const void *data)
virtual ~UniqueRefUpdater()
bool build(DataElement &dataElement, IRelationalData &relationalData, RelationalBuffer &operationBuffer)
InsertOperation & newInsert(const std::string &tableName)
DataElement m_dataElement
void read(void *destination)
Reads a data element.
virtual ~UniqueRefWriter()
UniqueRefStreamer(const Reflex::Type &objectType, MappingElement &mapping, ContainerSchema &contSchema)
InsertOperation * m_depInsert
DataElement m_dataElement
void setRecordId(const std::vector< int > &identity)
UniqueRefWriter(const Reflex::Type &objectType, MappingElement &mapping, ContainerSchema &contSchema)
void update(int oid, const void *data)
Updates a data element.
virtual ~RelationalRefLoader()
DependentClassReader m_reader
iterator find(const std::string &key)
Retrieves a sub-element.
std::map< std::string, MappingElement >::iterator iterator
Iterator definition.
const std::vector< std::string > & columnNames() const
IRelationalWriter * newWriter(const Reflex::Type &dataType, MappingElement &dataMapping)
void build(const Reflex::Type &objectType, MappingElement &mapping, ContainerSchema &contSchema, RelationalBuffer &operationBuffer)
UniqueRefReader(const Reflex::Type &objectType, MappingElement &mapping, ContainerSchema &contSchema)
coral::ISchema & storageSchema()
void setRecordId(const std::vector< int > &identity)
iterator end()
Returns an iterator in the end of the sequence.
std::vector< std::vector< double > > tmp
std::auto_ptr< IRelationalReader > m_reader
void build(const Reflex::Type &objectType, MappingElement &depMapping, ContainerSchema &contSchema)
std::auto_ptr< SelectOperation > m_depQuery
const std::string & tableName() const
RelationalRefLoader(int refId)
void throwException(const std::string &message, const std::string &methodName)
static std::string sequenceNameForDependentClass(const std::string &containerName, const std::string &className)
Reflex::Type lookupDictionary(const std::type_info &typeInfo, bool throwFlag=true)
void build(const Reflex::Type &objectType, MappingElement &mapping, ContainerSchema &contSchema)
std::string className(const T &t)
IRelationalWriter * newWriter()
virtual void addData(const std::string &columnName, const std::type_info &columnType)=0
bool build(DataElement &dataElement, IRelationalData &relationalData, RelationalBuffer &operationBuffer)
std::string uniqueRefNullLabel()