Go to the documentation of this file.00001 #ifndef INCLUDE_ORA_CONTAINER_H
00002 #define INCLUDE_ORA_CONTAINER_H
00003
00004 #include "Object.h"
00005 #include "Handle.h"
00006
00007 #include <typeinfo>
00008 #include <boost/shared_ptr.hpp>
00009
00010 namespace ora {
00011
00012 class IteratorBuffer;
00013 class DatabaseContainer;
00014
00015 class ContainerIterator {
00016
00017 public:
00018 ContainerIterator();
00019
00020 explicit ContainerIterator( Handle<IteratorBuffer>& iteratorBuffer );
00021
00022 ContainerIterator( const ContainerIterator& rhs );
00023
00024 virtual ~ContainerIterator();
00025
00026 ContainerIterator& operator=( const ContainerIterator& rhs );
00027
00028 Object getItem();
00029
00030 template <typename T> boost::shared_ptr<T> get();
00031
00032 int itemId();
00033
00034 bool next();
00035
00036 void reset();
00037
00038 private:
00039 boost::shared_ptr<void> getItemAsType( const std::type_info& asTypeInfo );
00040
00041 private:
00042 Handle<IteratorBuffer> m_buffer;
00043 };
00044
00045 class Container {
00046
00047 public:
00048 Container();
00049
00050 explicit Container( Handle<DatabaseContainer>& dbContainer );
00051
00052 Container( const Container& rhs );
00053
00054 virtual ~Container();
00055
00056 Container& operator=( const Container& rhs );
00057
00058 int id();
00059
00060 const std::string& name();
00061
00062 const std::string& className();
00063
00064 const std::string& mappingVersion();
00065
00066 size_t size();
00067
00068 void extendSchema( const std::type_info& typeInfo );
00069
00070 template <typename T> void extendSchema();
00071
00072 void setAccessPermission( const std::string& principal, bool forWrite );
00073
00074 ContainerIterator iterator();
00075
00076 Object fetchItem( int itemId );
00077
00078 template <typename T> boost::shared_ptr<T> fetch( int itemId );
00079
00080 bool lock();
00081
00082 bool isLocked();
00083
00084 int insertItem( const Object& data );
00085
00086 template <typename T> int insert( const T& data );
00087
00088 void updateItem( int itemId, const Object& data );
00089
00090 template <typename T> void update( int itemId, const T& data );
00091
00092 void erase( int itemId );
00093
00094 void flush();
00095
00096 void setItemName( const std::string& name, int itemId );
00097
00098 bool getNames( std::vector<std::string>& destination );
00099
00100 private:
00101 boost::shared_ptr<void> fetchItemAsType(int itemId, const std::type_info& asTypeInfo);
00102 int insertItem( const void* data, const std::type_info& typeInfo );
00103 void updateItem( int itemId, const void* data, const std::type_info& typeInfo );
00104
00105
00106
00107 private:
00108 Handle<DatabaseContainer> m_dbContainer;
00109 };
00110
00111 }
00112
00113 template <typename T>
00114 inline
00115 boost::shared_ptr<T> ora::ContainerIterator::get(){
00116 return boost::static_pointer_cast<T>( getItemAsType( typeid(T) ));
00117 }
00118
00119 template <typename T>
00120 inline
00121 void ora::Container::extendSchema(){
00122 extendSchema( typeid(T) );
00123 }
00124
00125 template <typename T>
00126 inline
00127 boost::shared_ptr<T> ora::Container::fetch( int itemId){
00128 return boost::static_pointer_cast<T>( fetchItemAsType( itemId, typeid(T) ));
00129 }
00130
00131 template <typename T>
00132 inline
00133 int ora::Container::insert( const T& data ){
00134 return insertItem( &data, typeid( data ) );
00135 }
00136
00137 template <typename T>
00138 inline
00139 void ora::Container::update( int itemId, const T& data ){
00140 return updateItem( itemId, &data, typeid( data ) );
00141 }
00142
00143 #endif