CMS 3D CMS Logo

/data/git/CMSSW_5_3_11_patch5/src/CondCore/ORA/interface/Container.h

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