CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
NamedRefStreamer.cc
Go to the documentation of this file.
3 #include "NamedRefStreamer.h"
4 #include "RelationalOperation.h"
5 #include "MappingElement.h"
6 #include "ContainerSchema.h"
7 #include "DatabaseSession.h"
8 #include "ClassUtils.h"
10 // externals
11 #include "CoralBase/Attribute.h"
12 #include "Reflex/Member.h"
13 
14 std::string ora::namedRefNullLabel(){
15  static std::string nullLabel("ora::NamedRef::Null");
16  return nullLabel;
17 }
18 
20  MappingElement& mapping,
22  m_objectType( objectType ),
23  m_columns( mapping.columnNames() ),
24  m_schema( schema ),
25  m_dataElement( 0 ),
26  m_refNameDataElement( 0 ),
27  m_ptrDataElement( 0 ),
28  m_flagDataElement( 0 ),
29  m_relationalData( 0 ){
30 }
31 
33 }
34 
35 
37  IRelationalData& relationalData){
38  m_dataElement = &dataElement;
39  m_objectType.UpdateMembers();
40  Reflex::Member nameMember = m_objectType.DataMemberByName("m_name");
41  if( !nameMember ){
42  throwException("Data member \"m_name\" not found in class \""+m_objectType.Name()+"\".",
43  "NamedReferenceStreamerBase::buildDataElement");
44  }
45  m_refNameDataElement = &dataElement.addChild( nameMember.Offset(), 0 );
46  Reflex::Member ptrMember = m_objectType.DataMemberByName("m_ptr");
47  if( !ptrMember ){
48  throwException("Data member \"m_ptr\" not found in class \""+m_objectType.Name()+"\".",
49  "NamedReferenceStreamerBase::buildDataElement");
50  }
51  m_ptrDataElement = &dataElement.addChild( ptrMember.Offset(), 0 );
52  Reflex::Member flagMember = m_objectType.DataMemberByName("m_isPersistent");
53  if( !flagMember ){
54  throwException("Data member \"m_isPersistent\" not found in class \""+m_objectType.Name()+"\".",
55  "NamedReferenceStreamerBase::buildDataElement");
56  }
57  m_flagDataElement = &dataElement.addChild( flagMember.Offset(), 0 );
58  // then book the column in the data attribute...
59  if( m_columns.size()==0 ){
60  throwException("No columns found in the mapping element",
61  "NamedReferenceStreamerBase::buildDataElement");
62  }
63  relationalData.addData( m_columns[0], typeid(std::string) );
64  m_relationalData = &relationalData;
65  return true;
66 }
67 
69  if(!m_relationalData){
70  throwException("The streamer has not been built.",
71  "NamedReferenceStreamerBase::bindDataForUpdate");
72  }
73 
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);
77  if( name.empty() ) name = namedRefNullLabel();
78  refNameAttr.data<std::string>()= name;
79 }
80 
82  if(!m_relationalData){
83  throwException("The streamer has not been built.",
84  "NamedReferenceStreamerBase::bindDataForRead");
85  }
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>();
91  if( name == namedRefNullLabel() ){
92  name = std::string("");
93  }
94  if(!name.empty()){
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;
99  }
100  *static_cast<std::string*>(refNameAddress) = name;
101 }
102 
104  MappingElement& mapping,
105  ContainerSchema& contSchema ):
106  NamedReferenceStreamerBase( objectType, mapping, contSchema ){
107 }
108 
110 }
111 
113  IRelationalData& relationalData,
114  RelationalBuffer& operationBuffer){
115  return buildDataElement( dataElement, relationalData );
116 }
117 
118 void ora::NamedRefWriter::setRecordId( const std::vector<int>& identity ){
119 }
120 
123  const void* data ){
124  bindDataForUpdate( data );
125 }
126 
128  MappingElement& mapping,
129  ContainerSchema& contSchema ):
130  NamedReferenceStreamerBase( objectType, mapping, contSchema ){
131 }
132 
134 }
135 
137  IRelationalData& relationalData,
138  RelationalBuffer& operationBuffer){
139  return buildDataElement( dataElement, relationalData );
140 }
141 
142 void ora::NamedRefUpdater::setRecordId( const std::vector<int>& identity ){
143 }
144 
147  const void* data ){
148  bindDataForUpdate( data );
149 }
150 
152  MappingElement& mapping,
153  ContainerSchema& contSchema ):
154  NamedReferenceStreamerBase( objectType, mapping, contSchema ){
155 }
156 
158 }
159 
161  IRelationalData& relationalData ){
162  return buildDataElement( dataElement, relationalData );
163 }
164 
166 }
167 
168 void ora::NamedRefReader::setRecordId( const std::vector<int>& identity ){
169 }
170 
173  bindDataForRead( data );
174 }
175 
177 }
178 
179 
181  MappingElement& mapping,
182  ContainerSchema& contSchema ):
183  m_objectType( objectType ),
184  m_mapping( mapping ),
185  m_schema( contSchema ){
186 }
187 
189 }
190 
192  return new NamedRefWriter( m_objectType, m_mapping, m_schema );
193 }
194 
196  return new NamedRefUpdater( m_objectType, m_mapping, m_schema );
197 }
198 
200  return new NamedRefReader( m_objectType, m_mapping, m_schema );
201 }
202 
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)
Definition: DataElement.cc:26
NamedRefWriter(const Reflex::Type &objectType, MappingElement &mapping, ContainerSchema &contSchema)
bool build(DataElement &offset, IRelationalData &relationalData)
bool build(DataElement &dataElement, IRelationalData &relationalData, RelationalBuffer &operationBuffer)
NamedRefStreamer(const Reflex::Type &objectType, MappingElement &mapping, ContainerSchema &contSchema)
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)
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)
Definition: Exception.cc:10
void setRecordId(const std::vector< int > &identity)
virtual void addData(const std::string &columnName, const std::type_info &columnType)=0