CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_4_1_8_patch12/src/CondCore/ORA/src/QueryableVectorStreamer.h

Go to the documentation of this file.
00001 #ifndef INCLUDE_ORA_QUERYABLEVECTORSTREAMER_H
00002 #define INCLUDE_ORA_QUERYABLEVECTORSTREAMER_H
00003 
00004 #include "IRelationalStreamer.h"
00005 #include "DataElement.h"
00006 //
00007 #include <memory>
00008 #include <boost/shared_ptr.hpp>
00009 // externals
00010 #include "Reflex/Type.h"
00011 
00012 namespace ora {
00013 
00014   class MappingElement;
00015   class ContainerSchema;
00016   class IRelationalData;
00017   class IArrayHandler;
00018   class MultiRecordInsertOperation;
00019   class IVectorLoader;
00020   
00021   class QueryableVectorWriter: public IRelationalWriter {
00022     
00023     public:
00025       QueryableVectorWriter( const Reflex::Type& objectType, MappingElement& mapping, ContainerSchema& contSchema );
00026       virtual ~QueryableVectorWriter();
00027 
00028       bool build( DataElement& offset, IRelationalData& relationalData, RelationalBuffer& operationBuffer );
00029       void setRecordId( const std::vector<int>& identity );
00030       void write( int oid,const void* data );
00031     public:
00032       Reflex::Type& objectType();
00033       MappingElement& mapping();
00034       DataElement* dataElement();
00035       IArrayHandler* arrayHandler();
00036 
00037     private:
00038       Reflex::Type m_objectType;
00039       MappingElement& m_mappingElement;
00040       ContainerSchema& m_schema;
00041       std::vector<int> m_recordId;
00042       DataElement m_localElement;
00043 
00044     private:
00045       DataElement* m_offset;
00046       MultiRecordInsertOperation* m_insertOperation;
00047       std::auto_ptr<IArrayHandler> m_arrayHandler;
00048       std::auto_ptr<IRelationalWriter> m_dataWriter;
00049   };
00050   
00051   class QueryableVectorUpdater : public IRelationalUpdater {
00052 
00053     public:
00054 
00056     QueryableVectorUpdater(const Reflex::Type& objectType, MappingElement& mapping, ContainerSchema& contSchema );
00057     virtual ~QueryableVectorUpdater();
00058 
00059     bool build( DataElement& offset, IRelationalData& relationalData, RelationalBuffer& operationBuffer);
00060     void setRecordId( const std::vector<int>& identity );
00061     void update( int oid,const void* data );
00062 
00063     private:
00064     RelationalBuffer* m_buffer;
00065     QueryableVectorWriter m_writer;
00066   };
00067 
00068   class QueryableVectorReader : public IRelationalReader {
00069 
00070     public:
00071     
00073     QueryableVectorReader(const Reflex::Type& objectType, MappingElement& mapping, ContainerSchema& contSchema );
00074 
00075     virtual ~QueryableVectorReader();
00076     
00077     bool build( DataElement& offset, IRelationalData& relationalData );
00078     void select( int oid );
00079     void setRecordId( const std::vector<int>& identity );
00080     void read( void* address );
00081     void clear();
00082 
00083     private:
00084     Reflex::Type m_objectType;
00085     MappingElement& m_mapping;
00086     ContainerSchema& m_schema;
00087     DataElement* m_dataElement;
00088     std::vector<boost::shared_ptr<IVectorLoader> > m_loaders;
00089     std::vector<int> m_tmpIds;
00090   };
00091 
00092   class QueryableVectorStreamer : public IRelationalStreamer 
00093   {
00094     public:
00095     QueryableVectorStreamer( const Reflex::Type& objectType, MappingElement& mapping, ContainerSchema& contSchema );
00096 
00097     ~QueryableVectorStreamer();
00098 
00099     IRelationalWriter* newWriter();
00100 
00101     IRelationalUpdater* newUpdater();
00102 
00103     IRelationalReader* newReader();
00104     
00105     private:
00106     Reflex::Type m_objectType;
00107     MappingElement& m_mapping;
00108     ContainerSchema& m_schema;
00109   }; 
00110 
00111   
00112 }
00113 
00114 inline
00115 Reflex::Type&
00116 ora::QueryableVectorWriter::objectType(){
00117   return m_objectType;
00118 }
00119 
00120 inline
00121 ora::MappingElement&
00122 ora::QueryableVectorWriter::mapping(){
00123   return m_mappingElement;
00124 }
00125 
00126 inline
00127 ora::DataElement*
00128 ora::QueryableVectorWriter::dataElement(){
00129   return m_offset;
00130 }
00131 
00132 inline
00133 ora::IArrayHandler*
00134 ora::QueryableVectorWriter::arrayHandler(){
00135   return m_arrayHandler.get();
00136 }
00137 
00138 #endif
00139 
00140