Updated license
[anna.git] / include / anna / dbos / Repository.hpp
1 // ANNA - Anna is Not Nothingness Anymore
2 //
3 // (c) Copyright 2005-2014 Eduardo Ramos Testillano & Francisco Ruiz Rayo
4 //
5 // https://bitbucket.org/testillano/anna
6 //
7 // Redistribution and use in source and binary forms, with or without
8 // modification, are permitted provided that the following conditions
9 // are met:
10 //
11 //     * Redistributions of source code must retain the above copyright
12 // notice, this list of conditions and the following disclaimer.
13 //     * Redistributions in binary form must reproduce the above
14 // copyright notice, this list of conditions and the following disclaimer
15 // in the documentation and/or other materials provided with the
16 // distribution.
17 //     * Neither the name of Google Inc. nor the names of its
18 // contributors may be used to endorse or promote products derived from
19 // this software without specific prior written permission.
20 //
21 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 //
33 // Authors: eduardo.ramos.testillano@gmail.com
34 //          cisco.tierra@gmail.com
35
36
37 #ifndef anna_dbos_Repository_hpp
38 #define anna_dbos_Repository_hpp
39
40 #include <vector>
41
42 #include <anna/core/mt/Mutex.hpp>
43
44 #include <anna/dbos/StorageArea.hpp>
45 #include <anna/dbos/defines.hpp>
46
47 namespace anna {
48
49 namespace xml {
50 class Node;
51 }
52
53 namespace comm {
54 class INetAddress;
55 class Delivery;
56 }
57
58 namespace dbms {
59 class Connection;
60 }
61
62 namespace dbos {
63
64 /**
65    Clase que modela la interaccion entre la base y nuestra aplicacion.
66 */
67 class Repository : public Mutex {
68 public:
69   typedef std::map <StorageId, StorageArea*> container;
70   typedef container::const_iterator const_storage_iterator; /**<Iterador para acceder a  las areas de almacenamiento de esta base de datos */
71   typedef container::iterator storage_iterator; /**<Iterador para acceder a  las areas de almacenamiento de esta base de datos */
72
73   /**
74      Constructor.
75      \param name Nombre logico del repositorio de areas de almacenamiento.
76   */
77   explicit Repository(const char* name);
78
79   /**
80      Constructor.
81      \param name Nombre logico del repositorio de areas de almacenamiento.
82   */
83   explicit Repository(const std::string& name);
84
85   /**
86      Crea una nueva area de almacenamiento para objetos cargados a partir de un medio fisico, normalmente
87      la base de datos.
88
89      El tipo de dato de esta nueva area vendria definida implicitamente por el tipo de factoria empleadas
90      para instanciar y/o liberar los objetos y sus respectivos registros.
91
92      \param index Clave que seria usada para localizar el area de almacenamiento.
93      \param name Nombre logico de la nueva area de almacenamiento.
94      \param maxSize Limita el numero maximo de objetos que pueden estar cargados simultanemante en memoria.
95      Si se alcanza este limite pero no hay ningun objeto susceptible de ser sacado de la memoria de almacenamiento
96      se ampliaria automaticamente la reserva de memoria necesaria para cargar nuevos objetos, en tanto en cuanto
97      no se libere alguno de los objetos cargados. Ver StorageArea::StandardSize.
98      \param objectAllocator actoria de objetos usada para crear las nuevas instancias en este area de
99      almacenamiento.
100      \param errorCode Cdigo de error asociado a la excepcin lanzada por el metodo StorageArea::instantiate
101      en caso de que no se encuentre el objeto buscado. Si vale StorageArea::NoExceptionWhenNotFound en
102      caso de no encontrar el objeto no se devolveriaexcepcin y el valor retornado seria NULL.
103      \param aamm Modo de acceso de este area de almacenamiento.
104
105      \warning Las dos actorias deben estar disponibles desde el momento de invocar a este metodo hasta la
106      finalizacin de esta instancia de base de datos.
107   */
108   StorageArea* createStorageArea(const StorageId index, const char* name, const Size maxSize, ObjectAllocator objectAllocator, const int errorCode, const StorageArea::AccessMode::_v aamm = StorageArea::AccessMode::ReadOnly)
109   throw(RuntimeException);
110
111   /**
112      Devuelve la instancia del area de almacenamiento asociada al indice recibido.
113
114      \param index Indice del area de almacenamiento.
115
116      \return La instancia del area de almacenamiento asociada al indice recibido. Puede ser NULL si el
117      indice no fue usado para crear un area mediate #createStorageArea.
118   */
119   StorageArea* findStorageArea(const StorageId index) throw();
120
121   /**
122      Elimina todos los objetos cargados en las areas de almacenamiento definidas.
123   */
124   void clear() throw(RuntimeException);
125
126   /**
127      Devuelve un iterator al comienzo de la lista de areas de almacenamiento de esta base de datos.
128      \return Un iterator al comienzo de la lista de areas de almacenamiento de esta base de datos.
129   */
130   const_storage_iterator storage_begin() const throw() { return a_storageAreas.begin(); }
131
132   /**
133      Devuelve un iterator al final de la lista de areas de almacenamiento de esta base de datos.
134      \return Un iterator al final de la lista de areas de almacenamiento de esta base de datos.
135   */
136   const_storage_iterator storage_end() const throw() { return a_storageAreas.end(); }
137
138   /**
139      Devuelve el objeto sobre el que esta posicionado el iterator recibido como parametro.
140      \param ii Iterator que deberia estar comprendido entre #const_storage_begin y #const_storage_end.
141      \return El objeto sobre el que esta posicionado el iterator recibido como parametro.
142   */
143   static const StorageArea* storageArea(const_storage_iterator& ii) throw() { return ii->second; }
144
145   /**
146      Devuelve un documento XML con la informacion referente a esta instancia.
147      \param parent Nodo XML del que dependende la informacion.
148      @return un documento XML con la informacion referente a esta instancia.
149   */
150   xml::Node* asXML(xml::Node* parent) const throw();
151
152 protected:
153   /**
154      Devuelve un iterator al comienzo de la lista de areas de almacenamiento de esta base de datos.
155      \return Un iterator al comienzo de la lista de areas de almacenamiento de esta base de datos.
156   */
157   storage_iterator storage_begin() throw() { return a_storageAreas.begin(); }
158
159   /**
160      Devuelve un iterator al final de la lista de areas de almacenamiento de esta base de datos.
161      \return Un iterator al final de la lista de areas de almacenamiento de esta base de datos.
162   */
163   storage_iterator storage_end() throw() { return a_storageAreas.end(); }
164
165   /**
166      Devuelve el objeto sobre el que esta posicionado el iterator recibido como parametro.
167      \param ii Iterator que deberia estar comprendido entre #const_storage_begin y #const_storage_end.
168      \return El objeto sobre el que esta posicionado el iterator recibido como parametro.
169   */
170   static StorageArea* storageArea(storage_iterator& ii) throw() { return ii->second; }
171
172 private:
173   std::string a_name;
174   container a_storageAreas;
175
176   Repository(const Repository&);
177 };
178
179 }
180 }
181
182 #endif