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
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