CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
List of all members | Public Member Functions | Private Attributes
ora::UniqueRefWriter Class Reference

#include <UniqueRefStreamer.h>

Inheritance diagram for ora::UniqueRefWriter:
ora::IRelationalWriter

Public Member Functions

bool build (DataElement &dataElement, IRelationalData &relationalData, RelationalBuffer &operationBuffer)
 
void setRecordId (const std::vector< int > &identity)
 
 UniqueRefWriter (const Reflex::Type &objectType, MappingElement &mapping, ContainerSchema &contSchema)
 
void write (int oid, const void *data)
 Writes a data element. More...
 
virtual ~UniqueRefWriter ()
 
- Public Member Functions inherited from ora::IRelationalWriter
virtual ~IRelationalWriter ()
 Destructor. More...
 

Private Attributes

DataElementm_dataElement
 
MappingElementm_mappingElement
 
Reflex::Type m_objectType
 
RelationalBufferm_operationBuffer
 
IRelationalDatam_relationalData
 
ContainerSchemam_schema
 

Detailed Description

Definition at line 23 of file UniqueRefStreamer.h.

Constructor & Destructor Documentation

ora::UniqueRefWriter::UniqueRefWriter ( const Reflex::Type &  objectType,
MappingElement mapping,
ContainerSchema contSchema 
)

Definition at line 170 of file UniqueRefStreamer.cc.

172  :
173  m_objectType( objectType ),
174  m_mappingElement( mapping ),
175  m_schema( contSchema ),
176  m_dataElement( 0 ),
177  m_relationalData( 0 ),
178  m_operationBuffer( 0 ){
179 }
RelationalBuffer * m_operationBuffer
DataElement * m_dataElement
IRelationalData * m_relationalData
ContainerSchema & m_schema
MappingElement & m_mappingElement
ora::UniqueRefWriter::~UniqueRefWriter ( )
virtual

Definition at line 186 of file UniqueRefStreamer.cc.

186  {
187 }

Member Function Documentation

bool ora::UniqueRefWriter::build ( DataElement dataElement,
IRelationalData relationalData,
RelationalBuffer operationBuffer 
)
virtual

Implements ora::IRelationalWriter.

Definition at line 189 of file UniqueRefStreamer.cc.

References ora::IRelationalData::addData().

191  {
192  m_dataElement = &dataElement;
193 
194  const std::vector<std::string>& columns = m_mappingElement.columnNames();
195  // booking for ref metadata
196  relationalData.addData( columns[0],typeid(std::string) );
197  // booking for ref id
198  relationalData.addData( columns[1],typeid(int) );
199  m_relationalData = &relationalData;
200  m_operationBuffer = &buffer;
201  return true;
202 }
RelationalBuffer * m_operationBuffer
DataElement * m_dataElement
IRelationalData * m_relationalData
const std::vector< std::string > & columnNames() const
MappingElement & m_mappingElement
void ora::UniqueRefWriter::setRecordId ( const std::vector< int > &  identity)
virtual

Implements ora::IRelationalWriter.

Definition at line 204 of file UniqueRefStreamer.cc.

204  {
205 }
void ora::UniqueRefWriter::write ( int  oid,
const void *  data 
)
virtual

Writes a data element.

Implements ora::IRelationalWriter.

Definition at line 208 of file UniqueRefStreamer.cc.

References ora::DependentClassWriter::build(), className(), ora::ClassUtils::lookupDictionary(), ora::MappingRules::sequenceNameForDependentClass(), ora::throwException(), ora::uniqueRefNullLabel(), and ora::DependentClassWriter::write().

209  {
210 
211  if(!m_dataElement){
212  throwException("The streamer has not been built.",
213  "UniqueRefWriter::write");
214  }
215 
216  void* refAddress = m_dataElement->address( data );
217 
218  Reflex::Object refObj( m_objectType, const_cast<void*>(refAddress));
219 
220  bool isNull;
221  refObj.Invoke("operator!",isNull);
222 
223  int refId = 0;
224  std::string className = uniqueRefNullLabel();
225 
226  if(!isNull){
227  // resolving the ref type
228  std::type_info* refTypeInfo = 0;
229  refObj.Invoke("typeInfo",refTypeInfo);
230  Reflex::Type refType = ClassUtils::lookupDictionary(*refTypeInfo);
231  className = refType.Name(Reflex::SCOPED);
232 
233  // getting a new valid ref id
235 
236  // building the dependent buffer
237  MappingElement& depMapping = m_schema.mappingForDependentClass( refType, true );
238 
239  DependentClassWriter writer;
240  writer.build( refType, depMapping, m_schema, m_operationBuffer->addVolatileBuffer() );
241  void* refData;
242  refObj.Invoke("operator*",refData);
243  writer.write( oid, refId, refData );
244 
245  }
246  // writing in the parent table
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;
250 }
Sequences & containerSequences()
RelationalBuffer * m_operationBuffer
void * address(const void *topLevelAddress) const
Definition: DataElement.cc:48
DataElement * m_dataElement
RelationalBuffer & addVolatileBuffer()
MappingElement & mappingForDependentClass(const Reflex::Type &dependentClass, bool writeEnabled=false)
IRelationalData * m_relationalData
ContainerSchema & m_schema
const std::vector< std::string > & columnNames() const
virtual coral::AttributeList & data()=0
int getNextId(const std::string &sequenceName, bool sinchronize=false)
Definition: Sequences.cc:12
const std::string & containerName()
void throwException(const std::string &message, const std::string &methodName)
Definition: Exception.cc:10
static std::string sequenceNameForDependentClass(const std::string &containerName, const std::string &className)
Definition: MappingRules.cc:20
Reflex::Type lookupDictionary(const std::type_info &typeInfo, bool throwFlag=true)
Definition: ClassUtils.cc:84
std::string className(const T &t)
Definition: ClassName.h:30
MappingElement & m_mappingElement
std::string uniqueRefNullLabel()

Member Data Documentation

DataElement* ora::UniqueRefWriter::m_dataElement
private

Definition at line 43 of file UniqueRefStreamer.h.

MappingElement& ora::UniqueRefWriter::m_mappingElement
private

Definition at line 41 of file UniqueRefStreamer.h.

Reflex::Type ora::UniqueRefWriter::m_objectType
private

Definition at line 40 of file UniqueRefStreamer.h.

RelationalBuffer* ora::UniqueRefWriter::m_operationBuffer
private

Definition at line 45 of file UniqueRefStreamer.h.

IRelationalData* ora::UniqueRefWriter::m_relationalData
private

Definition at line 44 of file UniqueRefStreamer.h.

ContainerSchema& ora::UniqueRefWriter::m_schema
private

Definition at line 42 of file UniqueRefStreamer.h.