Remove operation help.
[anna.git] / include / anna / dbos / Repository.hpp
1 // ANNA - Anna is Not Nothingness Anymore                                                         //
2 //                                                                                                //
3 // (c) Copyright 2005-2015 Eduardo Ramos Testillano & Francisco Ruiz Rayo                         //
4 //                                                                                                //
5 // See project site at http://redmine.teslayout.com/projects/anna-suite                           //
6 // See accompanying file LICENSE or copy at http://www.teslayout.com/projects/public/anna.LICENSE //
7
8
9 #ifndef anna_dbos_Repository_hpp
10 #define anna_dbos_Repository_hpp
11
12 #include <vector>
13
14 #include <anna/core/mt/Mutex.hpp>
15
16 #include <anna/dbos/StorageArea.hpp>
17 #include <anna/dbos/defines.hpp>
18
19 namespace anna {
20
21 namespace xml {
22 class Node;
23 }
24
25 namespace comm {
26 class INetAddress;
27 class Delivery;
28 }
29
30 namespace dbms {
31 class Connection;
32 }
33
34 namespace dbos {
35
36 /**
37    Clase que modela la interaccion entre la base y nuestra aplicacion.
38 */
39 class Repository : public Mutex {
40 public:
41   typedef std::map <StorageId, StorageArea*> container;
42   typedef container::const_iterator const_storage_iterator; /**<Iterador para acceder a  las areas de almacenamiento de esta base de datos */
43   typedef container::iterator storage_iterator; /**<Iterador para acceder a  las areas de almacenamiento de esta base de datos */
44
45   /**
46      Constructor.
47      \param name Nombre logico del repositorio de areas de almacenamiento.
48   */
49   explicit Repository(const char* name);
50
51   /**
52      Constructor.
53      \param name Nombre logico del repositorio de areas de almacenamiento.
54   */
55   explicit Repository(const std::string& name);
56
57   /**
58      Crea una nueva area de almacenamiento para objetos cargados a partir de un medio fisico, normalmente
59      la base de datos.
60
61      El tipo de dato de esta nueva area vendria definida implicitamente por el tipo de factoria empleadas
62      para instanciar y/o liberar los objetos y sus respectivos registros.
63
64      \param index Clave que seria usada para localizar el area de almacenamiento.
65      \param name Nombre logico de la nueva area de almacenamiento.
66      \param maxSize Limita el numero maximo de objetos que pueden estar cargados simultanemante en memoria.
67      Si se alcanza este limite pero no hay ningun objeto susceptible de ser sacado de la memoria de almacenamiento
68      se ampliaria automaticamente la reserva de memoria necesaria para cargar nuevos objetos, en tanto en cuanto
69      no se libere alguno de los objetos cargados. Ver StorageArea::StandardSize.
70      \param objectAllocator actoria de objetos usada para crear las nuevas instancias en este area de
71      almacenamiento.
72      \param errorCode Cdigo de error asociado a la excepcin lanzada por el metodo StorageArea::instantiate
73      en caso de que no se encuentre el objeto buscado. Si vale StorageArea::NoExceptionWhenNotFound en
74      caso de no encontrar el objeto no se devolveriaexcepcin y el valor retornado seria NULL.
75      \param aamm Modo de acceso de este area de almacenamiento.
76
77      \warning Las dos actorias deben estar disponibles desde el momento de invocar a este metodo hasta la
78      finalizacin de esta instancia de base de datos.
79   */
80   StorageArea* createStorageArea(const StorageId index, const char* name, const Size maxSize, ObjectAllocator objectAllocator, const int errorCode, const StorageArea::AccessMode::_v aamm = StorageArea::AccessMode::ReadOnly)
81   throw(RuntimeException);
82
83   /**
84      Devuelve la instancia del area de almacenamiento asociada al indice recibido.
85
86      \param index Indice del area de almacenamiento.
87
88      \return La instancia del area de almacenamiento asociada al indice recibido. Puede ser NULL si el
89      indice no fue usado para crear un area mediate #createStorageArea.
90   */
91   StorageArea* findStorageArea(const StorageId index) throw();
92
93   /**
94      Elimina todos los objetos cargados en las areas de almacenamiento definidas.
95   */
96   void clear() throw(RuntimeException);
97
98   /**
99      Devuelve un iterator al comienzo de la lista de areas de almacenamiento de esta base de datos.
100      \return Un iterator al comienzo de la lista de areas de almacenamiento de esta base de datos.
101   */
102   const_storage_iterator storage_begin() const throw() { return a_storageAreas.begin(); }
103
104   /**
105      Devuelve un iterator al final de la lista de areas de almacenamiento de esta base de datos.
106      \return Un iterator al final de la lista de areas de almacenamiento de esta base de datos.
107   */
108   const_storage_iterator storage_end() const throw() { return a_storageAreas.end(); }
109
110   /**
111      Devuelve el objeto sobre el que esta posicionado el iterator recibido como parametro.
112      \param ii Iterator que deberia estar comprendido entre #const_storage_begin y #const_storage_end.
113      \return El objeto sobre el que esta posicionado el iterator recibido como parametro.
114   */
115   static const StorageArea* storageArea(const_storage_iterator& ii) throw() { return ii->second; }
116
117   /**
118      Devuelve un documento XML con la informacion referente a esta instancia.
119      \param parent Nodo XML del que dependende la informacion.
120      @return un documento XML con la informacion referente a esta instancia.
121   */
122   xml::Node* asXML(xml::Node* parent) const throw();
123
124 protected:
125   /**
126      Devuelve un iterator al comienzo de la lista de areas de almacenamiento de esta base de datos.
127      \return Un iterator al comienzo de la lista de areas de almacenamiento de esta base de datos.
128   */
129   storage_iterator storage_begin() throw() { return a_storageAreas.begin(); }
130
131   /**
132      Devuelve un iterator al final de la lista de areas de almacenamiento de esta base de datos.
133      \return Un iterator al final de la lista de areas de almacenamiento de esta base de datos.
134   */
135   storage_iterator storage_end() throw() { return a_storageAreas.end(); }
136
137   /**
138      Devuelve el objeto sobre el que esta posicionado el iterator recibido como parametro.
139      \param ii Iterator que deberia estar comprendido entre #const_storage_begin y #const_storage_end.
140      \return El objeto sobre el que esta posicionado el iterator recibido como parametro.
141   */
142   static StorageArea* storageArea(storage_iterator& ii) throw() { return ii->second; }
143
144 private:
145   std::string a_name;
146   container a_storageAreas;
147
148   Repository(const Repository&);
149 };
150
151 }
152 }
153
154 #endif