00001 #ifndef INCLUDE_ORA_CONTAINERSCHEMA_H 00002 #define INCLUDE_ORA_CONTAINERSCHEMA_H 00003 00004 #include "MappingTree.h" 00005 #include "Sequences.h" 00006 // externals 00007 #include "Reflex/Type.h" 00008 00009 namespace coral { 00010 class ISchema; 00011 } 00012 00013 namespace ora { 00014 00015 class DatabaseSession; 00016 class IBlobStreamingService; 00017 class IReferenceHandler; 00018 00019 class ContainerSchema { 00020 public: 00021 00022 ContainerSchema( int containerId, 00023 const std::string& containerName, 00024 const Reflex::Type& containerType, 00025 DatabaseSession& session ); 00026 00027 ContainerSchema( int containerId, 00028 const std::string& containerName, 00029 const std::string& className, 00030 DatabaseSession& session ); 00031 00032 ~ContainerSchema(); 00033 00034 void create(); 00035 00036 void drop(); 00037 00038 void evolve(); 00039 00040 void create( const Reflex::Type& dependentClass ); 00041 00042 void evolve( const Reflex::Type& dependentClass, MappingTree& baseMapping ); 00043 00044 const Reflex::Type& type(); 00045 00046 MappingTree& mapping( bool writeEnabled=false); 00047 00048 bool extendIfRequired( const Reflex::Type& dependentClass ); 00049 00050 MappingElement& mappingForDependentClass( const Reflex::Type& dependentClass, bool writeEnabled=false ); 00051 00052 bool mappingForDependentClasses( std::vector<MappingElement>& destination ); 00053 00054 Sequences& containerSequences(); 00055 00056 IBlobStreamingService* blobStreamingService(); 00057 00058 IReferenceHandler* referenceHandler(); 00059 00060 int containerId(); 00061 00062 const std::string& containerName(); 00063 00064 const std::string& className(); 00065 00066 const std::string& mappingVersion(); 00067 00068 coral::ISchema& storageSchema(); 00069 00070 DatabaseSession& dbSession(); 00071 00072 private: 00073 void initClassDict(); 00074 bool loadMappingForDependentClass( const Reflex::Type& dependentClass ); 00075 void extend( const Reflex::Type& dependentClass ); 00076 private: 00077 00078 int m_containerId; 00079 std::string m_containerName; 00080 std::string m_className; 00081 Reflex::Type m_classDict; 00082 DatabaseSession& m_session; 00083 bool m_loaded; 00084 Sequences m_containerSchemaSequences; 00085 MappingTree m_mapping; 00086 std::map<std::string,MappingTree*> m_dependentMappings; 00087 00088 }; 00089 } 00090 00091 #endif