CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_4_1_8_patch12/src/CondCore/ORA/src/ObjectStreamer.cc

Go to the documentation of this file.
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 // externals
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       // Ignore the transients and the statics (how to deal with non-const statics?)
00035       if ( dataMember.IsTransient() || dataMember.IsStatic() ) continue;
00036       // Get the member type and resolve possible typedef chains
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       // check if the member is from a class in the inheritance tree
00046       Reflex::Type declaringType = ClassUtils::resolvedType( dataMember.DeclaringType());
00047       std::string scope = declaringType.Name(Reflex::SCOPED|Reflex::FINAL);
00048       // Get the data member name
00049       std::string dataMemberName = MappingRules::scopedVariableName( dataMember.Name(), scope );
00050       // Retrieve the relevant mapping element
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     // Loop over the data members of the class.
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     // Ignore the transients and the statics (how to deal with non-const statics?)
00080     if ( dataMember.IsTransient() || dataMember.IsStatic() ) continue;
00081 
00082     // Get the member type and resolve possible typedef chains
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     // check if the member is from a class in the inheritance tree
00092     std::string scope("");
00093     // Get the data member name
00094     std::string dataMemberName = MappingRules::scopedVariableName( dataMember.Name(), scope );
00095     
00096     // Retrieve the relevant mapping element
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