CMS 3D CMS Logo

/data/doxygen/doxygen-1.7.3/gen/CMSSW_4_2_8/src/CondCore/ORA/src/MultiRecordSelectOperation.cc

Go to the documentation of this file.
00001 #include "CondCore/ORA/interface/Exception.h"
00002 #include "MultiRecordSelectOperation.h"
00003 #include "RecordManip.h"
00004 // externals 
00005 #include "CoralBase/Blob.h"
00006 
00007 ora::MultiRecordSelectOperation::MultiRecordSelectOperation( const std::string& tableName,
00008                                                               coral::ISchema& schema ):
00009   m_query( tableName, schema ),
00010   m_idCols(),
00011   m_cache(),
00012   m_spec(),
00013   m_row(){
00014   //m_row( 0 ){
00015 }
00016 
00017 ora::MultiRecordSelectOperation::~MultiRecordSelectOperation(){
00018 }
00019 
00020 void ora::MultiRecordSelectOperation::addOrderId(const std::string& columnName){
00021   m_query.addOrderId( columnName );
00022   m_idCols.push_back( columnName );
00023 }
00024 
00025 void ora::MultiRecordSelectOperation::selectRow( const std::vector<int>& selection ){
00026   if(!m_row.get())
00027     throwException( "No row available.",
00028                     "MultiRecordSelectOperation::selectRow" );
00029   //m_row = &m_cache.lookup( selection );
00030   Record rec; m_cache.lookupAndClear( selection,rec );
00031   newAttributeListFromRecord( *m_row, rec );
00032 }
00033 
00034 size_t ora::MultiRecordSelectOperation::selectionSize( const std::vector<int>& selection,
00035                                                         size_t numberOfIndexes ){
00036   if(m_cache.size()==0) return 0;
00037   return m_cache.branchSize(selection, numberOfIndexes);
00038 }
00039 
00040 void ora::MultiRecordSelectOperation::clear(){
00041   m_row.reset();
00042   //m_row = 0;
00043   m_cache.clear();
00044   //m_idCols.clear();
00045   m_query.clear();
00046 }
00047 
00048 void ora::MultiRecordSelectOperation::addId(const std::string& columnName){
00049   m_query.addId( columnName );
00050   m_spec.add( columnName, typeid(int) );
00051 }
00052 
00053 void ora::MultiRecordSelectOperation::addData(const std::string& columnName,
00054                                                const std::type_info& columnType ){
00055   m_query.addData( columnName, columnType );  
00056   m_spec.add( columnName, columnType );
00057 }
00058 
00059 void ora::MultiRecordSelectOperation::addBlobData(const std::string& columnName){
00060   m_query.addBlobData( columnName );  
00061   m_spec.add( columnName, typeid(coral::Blob) );
00062 }
00063 
00064 void ora::MultiRecordSelectOperation::addWhereId(const std::string& columnName){
00065   m_query.addWhereId( columnName );
00066   
00067 }
00068 
00069 coral::AttributeList& ora::MultiRecordSelectOperation::data(){
00070   //if(!m_row){
00071   if(!m_row.get()){
00072     throwException( "No record available.",
00073                     "MultiRecordSelectOperation::data" );
00074   }
00075   return *m_row;
00076 }
00077 
00078 coral::AttributeList& ora::MultiRecordSelectOperation::whereData(){
00079   return m_query.whereData();
00080 }
00081 
00082 std::string& ora::MultiRecordSelectOperation::whereClause(){
00083   return m_query.whereClause();
00084 }
00085 
00086 void ora::MultiRecordSelectOperation::execute(){
00087   //m_row = 0;
00088   //  m_row.reset();
00089   m_cache.clear();
00090   m_query.execute();
00091   while( m_query.nextCursorRow() ){
00092     std::vector<int> indexes;
00093     coral::AttributeList& row = m_query.data();
00094     for(size_t i=0;i<m_idCols.size();i++){
00095       indexes.push_back( row[m_idCols[i]].data<int>() );
00096     }
00097     Record rec(m_spec);
00098     newRecordFromAttributeList(rec, row );
00099     m_cache.push( indexes, rec );
00100   }
00101   m_row.reset(new coral::AttributeList(m_query.attributeListSpecification(), true ));
00102   m_query.clear();
00103 }
00104 
00105