1 // ANNA - Anna is Not 'N' Anymore
3 // (c) Copyright 2005-2014 Eduardo Ramos Testillano & Francisco Ruiz Rayo
5 // https://bitbucket.org/testillano/anna
7 // Redistribution and use in source and binary forms, with or without
8 // modification, are permitted provided that the following conditions
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
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.
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.
33 // Authors: eduardo.ramos.testillano@gmail.com
34 // cisco.tierra@gmail.com
37 #ifndef anna_dbos_Repository_hpp
38 #define anna_dbos_Repository_hpp
42 #include <anna/core/mt/Mutex.hpp>
44 #include <anna/dbos/StorageArea.hpp>
45 #include <anna/dbos/defines.hpp>
65 Clase que modela la interaccion entre la base y nuestra aplicacion.
67 class Repository : public Mutex {
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 */
75 \param name Nombre logico del repositorio de areas de almacenamiento.
77 explicit Repository(const char* name);
81 \param name Nombre logico del repositorio de areas de almacenamiento.
83 explicit Repository(const std::string& name);
86 Crea una nueva area de almacenamiento para objetos cargados a partir de un medio fisico, normalmente
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.
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
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.
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.
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);
112 Devuelve la instancia del area de almacenamiento asociada al indice recibido.
114 \param index Indice del area de almacenamiento.
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.
119 StorageArea* findStorageArea(const StorageId index) throw();
122 Elimina todos los objetos cargados en las areas de almacenamiento definidas.
124 void clear() throw(RuntimeException);
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.
130 const_storage_iterator storage_begin() const throw() { return a_storageAreas.begin(); }
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.
136 const_storage_iterator storage_end() const throw() { return a_storageAreas.end(); }
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.
143 static const StorageArea* storageArea(const_storage_iterator& ii) throw() { return ii->second; }
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.
150 xml::Node* asXML(xml::Node* parent) const throw();
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.
157 storage_iterator storage_begin() throw() { return a_storageAreas.begin(); }
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.
163 storage_iterator storage_end() throw() { return a_storageAreas.end(); }
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.
170 static StorageArea* storageArea(storage_iterator& ii) throw() { return ii->second; }
174 container a_storageAreas;
176 Repository(const Repository&);