Go to the documentation of this file.00001 #include "CondCore/ORA/interface/Exception.h"
00002 #include "MultiRecordSelectOperation.h"
00003 #include "RecordManip.h"
00004
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
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
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
00043 m_cache.clear();
00044
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
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
00088
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