00001 #include "CondCore/ORA/interface/Exception.h"
00002 #include "ObjectStreamer.h"
00003 #include "DataElement.h"
00004 #include "MappingElement.h"
00005 #include "ClassUtils.h"
00006 #include "MappingRules.h"
00007
00008 #include "Reflex/Base.h"
00009 #include "Reflex/Member.h"
00010
00011 ora::ObjectStreamerBase::ObjectStreamerBase( const Reflex::Type& objectType,
00012 MappingElement& mapping,
00013 ContainerSchema& contSchema ):
00014 m_streamerFactory( contSchema ),
00015 m_objectType( objectType ),
00016 m_mapping( mapping ){
00017 }
00018
00019 ora::ObjectStreamerBase::~ObjectStreamerBase(){
00020 }
00021
00022 void ora::ObjectStreamerBase::buildBaseDataMembers( DataElement& dataElement,
00023 IRelationalData& relationalData,
00024 const Reflex::Type& objType,
00025 RelationalBuffer* operationBuffer ){
00026
00027 for ( unsigned int i=0;i<objType.BaseSize();i++){
00028 Reflex::Base base = objType.BaseAt(i);
00029 Reflex::Type baseType = ClassUtils::resolvedType( base.ToType() );
00030 buildBaseDataMembers( dataElement, relationalData, baseType, operationBuffer );
00031 for ( unsigned int j=0;j<baseType.DataMemberSize();j++){
00032 Reflex::Member dataMember = baseType.DataMemberAt(j);
00033 DataElement& dataMemberElement = dataElement.addChild( dataMember.Offset(), base.OffsetFP() );
00034
00035 if ( dataMember.IsTransient() || dataMember.IsStatic() ) continue;
00036
00037 Reflex::Type dataMemberType = ClassUtils::resolvedType( dataMember.TypeOf() );
00038 if ( ! dataMemberType ) {
00039 throwException( "Missing dictionary information for data member \"" +
00040 dataMember.Name() + "\" of class \"" +
00041 baseType.Name(Reflex::SCOPED|Reflex::FINAL) + "\"",
00042 "ObjectStreamerBase::buildBaseDataMembers" );
00043 }
00044
00045
00046 Reflex::Type declaringType = ClassUtils::resolvedType( dataMember.DeclaringType());
00047 std::string scope = declaringType.Name(Reflex::SCOPED|Reflex::FINAL);
00048
00049 std::string dataMemberName = MappingRules::scopedVariableName( dataMember.Name(), scope );
00050
00051 MappingElement::iterator iDataMemberMapping = m_mapping.find( dataMemberName );
00052 if ( iDataMemberMapping == m_mapping.end() ) {
00053 throwException( "Data member \"" + dataMemberName +
00054 "\" not found in the mapping element of variable \""+m_mapping.variableName()+"\".",
00055 "ObjectStreamerBase::buildBaseDataMembers" );
00056 }
00057 MappingElement& dataMemberMapping = iDataMemberMapping->second;
00058 processDataMember( dataMemberElement, relationalData, dataMemberType, dataMemberMapping, operationBuffer );
00059 }
00060 }
00061
00062 }
00063
00064 bool ora::ObjectStreamerBase::buildDataMembers( DataElement& dataElement,
00065 IRelationalData& relationalData,
00066 RelationalBuffer* operationBuffer ){
00067 buildBaseDataMembers( dataElement, relationalData, m_objectType, operationBuffer );
00068
00069 for ( unsigned int i=0;i<m_objectType.DataMemberSize();i++){
00070
00071 Reflex::Member dataMember = m_objectType.DataMemberAt(i);
00072 DataElement& dataMemberElement = dataElement.addChild( dataMember.Offset(), 0 );
00073
00074 Reflex::Type declaringType = ClassUtils::resolvedType( dataMember.DeclaringType());
00075 if( declaringType != m_objectType ){
00076 continue;
00077 }
00078
00079
00080 if ( dataMember.IsTransient() || dataMember.IsStatic() ) continue;
00081
00082
00083 Reflex::Type dataMemberType = ClassUtils::resolvedType( dataMember.TypeOf() );
00084 if ( ! dataMemberType ) {
00085 throwException( "Missing dictionary information for data member \"" +
00086 dataMember.Name() + "\" of class \"" +
00087 m_objectType.Name(Reflex::SCOPED|Reflex::FINAL) + "\"",
00088 "ObjectStreamerBase::buildDataMembers" );
00089 }
00090
00091
00092 std::string scope("");
00093
00094 std::string dataMemberName = MappingRules::scopedVariableName( dataMember.Name(), scope );
00095
00096
00097 MappingElement::iterator idataMemberMapping = m_mapping.find( dataMemberName );
00098 if ( idataMemberMapping == m_mapping.end() ) {
00099 throwException( "Data member \"" + dataMemberName +
00100 "\" not found in the mapping element of variable \""+m_mapping.variableName()+"\".",
00101 "ObjectStreamerBase::buildDataMembers" );
00102 }
00103 MappingElement& dataMemberMapping = idataMemberMapping->second;
00104 processDataMember( dataMemberElement, relationalData, dataMemberType, dataMemberMapping, operationBuffer );
00105 }
00106 return true;
00107 }
00108
00109 ora::ObjectWriter::ObjectWriter( const Reflex::Type& objectType,
00110 MappingElement& mapping,
00111 ContainerSchema& contSchema ):
00112 ObjectStreamerBase( objectType, mapping, contSchema ),
00113 m_writers(){
00114 }
00115
00116 ora::ObjectWriter::~ObjectWriter(){
00117 for( std::vector< IRelationalWriter* >::iterator iW = m_writers.begin();
00118 iW != m_writers.end(); ++iW ){
00119 delete *iW;
00120 }
00121 m_writers.clear();
00122 }
00123
00124 bool ora::ObjectWriter::build(DataElement& dataElement,
00125 IRelationalData& relationalData,
00126 RelationalBuffer& operationBuffer){
00127 return buildDataMembers( dataElement, relationalData, &operationBuffer );
00128 }
00129
00130 void ora::ObjectWriter::setRecordId( const std::vector<int>& identity ){
00131 for( std::vector< IRelationalWriter* >::iterator iW = m_writers.begin();
00132 iW != m_writers.end(); ++iW ){
00133 (*iW)->setRecordId( identity );
00134 }
00135 }
00136
00138 void ora::ObjectWriter::write( int oid,
00139 const void* data ){
00140 for( std::vector< IRelationalWriter* >::iterator iW = m_writers.begin();
00141 iW != m_writers.end(); ++iW ){
00142 (*iW)->write( oid, data );
00143 }
00144 }
00145
00146 void ora::ObjectWriter::processDataMember( DataElement& dataMemberElement,
00147 IRelationalData& relationalData,
00148 Reflex::Type& dataMemberType,
00149 MappingElement& dataMemberMapping,
00150 RelationalBuffer* operationBuffer ){
00151 IRelationalWriter* dataMemberWriter = m_streamerFactory.newWriter( dataMemberType, dataMemberMapping );
00152 m_writers.push_back( dataMemberWriter );
00153 dataMemberWriter->build( dataMemberElement, relationalData, *operationBuffer );
00154 }
00155
00156
00157 ora::ObjectUpdater::ObjectUpdater( const Reflex::Type& objectType,
00158 MappingElement& mapping,
00159 ContainerSchema& contSchema ):
00160 ObjectStreamerBase( objectType, mapping, contSchema ),
00161 m_updaters(){
00162 }
00163
00164 ora::ObjectUpdater::~ObjectUpdater(){
00165 for( std::vector< IRelationalUpdater* >::iterator iU = m_updaters.begin();
00166 iU != m_updaters.end(); ++iU ){
00167 delete *iU;
00168 }
00169 m_updaters.clear();
00170 }
00171
00172 bool ora::ObjectUpdater::build(DataElement& dataElement,
00173 IRelationalData& relationalData,
00174 RelationalBuffer& operationBuffer){
00175 return buildDataMembers( dataElement, relationalData, &operationBuffer );
00176 }
00177
00178 void ora::ObjectUpdater::setRecordId( const std::vector<int>& identity ){
00179 for( std::vector< IRelationalUpdater* >::iterator iU = m_updaters.begin();
00180 iU != m_updaters.end(); ++iU){
00181 (*iU)->setRecordId( identity );
00182 }
00183 }
00184
00186 void ora::ObjectUpdater::update( int oid,
00187 const void* data ){
00188 for( std::vector< IRelationalUpdater* >::iterator iU = m_updaters.begin();
00189 iU != m_updaters.end(); ++iU ){
00190 (*iU)->update( oid, data );
00191 }
00192 }
00193
00194 void ora::ObjectUpdater::processDataMember( DataElement& dataMemberElement,
00195 IRelationalData& relationalData,
00196 Reflex::Type& dataMemberType,
00197 MappingElement& dataMemberMapping,
00198 RelationalBuffer* operationBuffer ){
00199 IRelationalUpdater* dataMemberUpdater = m_streamerFactory.newUpdater( dataMemberType, dataMemberMapping );
00200 m_updaters.push_back( dataMemberUpdater );
00201 dataMemberUpdater->build( dataMemberElement, relationalData, *operationBuffer );
00202 }
00203
00204 ora::ObjectReader::ObjectReader( const Reflex::Type& objectType,
00205 MappingElement& mapping,
00206 ContainerSchema& contSchema ):
00207 ObjectStreamerBase( objectType, mapping, contSchema ),
00208 m_readers(){
00209 }
00210
00211 ora::ObjectReader::~ObjectReader(){
00212 for( std::vector< IRelationalReader* >::iterator iStr = m_readers.begin();
00213 iStr != m_readers.end(); ++iStr ){
00214 delete *iStr;
00215 }
00216 m_readers.clear();
00217 }
00218
00219 bool ora::ObjectReader::build( DataElement& dataElement,
00220 IRelationalData& relationalData){
00221 return buildDataMembers( dataElement, relationalData, 0 );
00222 }
00223
00224 void ora::ObjectReader::select( int oid ){
00225 for( std::vector< IRelationalReader* >::iterator iDepReader = m_readers.begin();
00226 iDepReader != m_readers.end(); ++iDepReader ){
00227 (*iDepReader)->select( oid );
00228 }
00229 }
00230
00231 void ora::ObjectReader::setRecordId( const std::vector<int>& identity ){
00232 for( std::vector< IRelationalReader* >::iterator iDepReader = m_readers.begin();
00233 iDepReader != m_readers.end(); ++iDepReader ){
00234 (*iDepReader)->setRecordId( identity );
00235 }
00236 }
00237
00239 void ora::ObjectReader::read( void* data ){
00240 for( std::vector< IRelationalReader* >::iterator iDepReader = m_readers.begin();
00241 iDepReader != m_readers.end(); ++iDepReader ){
00242 (*iDepReader)->read( data );
00243 }
00244 }
00245
00246 void ora::ObjectReader::clear(){
00247 for( std::vector< IRelationalReader* >::iterator iDepReader = m_readers.begin();
00248 iDepReader != m_readers.end(); ++iDepReader ){
00249 (*iDepReader)->clear();
00250 }
00251 }
00252
00253 void ora::ObjectReader::processDataMember( DataElement& dataMemberElement,
00254 IRelationalData& relationalData,
00255 Reflex::Type& dataMemberType,
00256 MappingElement& dataMemberMapping,
00257 RelationalBuffer*){
00258 IRelationalReader* dataMemberReader = m_streamerFactory.newReader( dataMemberType, dataMemberMapping );
00259 m_readers.push_back( dataMemberReader );
00260 dataMemberReader->build( dataMemberElement, relationalData );
00261 }
00262
00263
00264 ora::ObjectStreamer::ObjectStreamer( const Reflex::Type& objectType,
00265 MappingElement& mapping,
00266 ContainerSchema& contSchema ):
00267 m_objectType( objectType ),
00268 m_mapping( mapping ),
00269 m_schema( contSchema ){
00270 }
00271
00272 ora::ObjectStreamer::~ObjectStreamer(){
00273 }
00274
00275 ora::IRelationalWriter* ora::ObjectStreamer::newWriter(){
00276 return new ObjectWriter( m_objectType, m_mapping, m_schema );
00277 }
00278
00279 ora::IRelationalUpdater* ora::ObjectStreamer::newUpdater(){
00280 return new ObjectUpdater( m_objectType, m_mapping, m_schema );
00281 }
00282
00283 ora::IRelationalReader* ora::ObjectStreamer::newReader(){
00284 return new ObjectReader( m_objectType, m_mapping, m_schema );
00285 }
00286