--- /dev/null
+// ANNA - Anna is Not Nothingness Anymore //
+// //
+// (c) Copyright 2005-2015 Eduardo Ramos Testillano & Francisco Ruiz Rayo //
+// //
+// See project site at http://redmine.teslayout.com/projects/anna-suite //
+// See accompanying file LICENSE or copy at http://www.teslayout.com/projects/public/anna.LICENSE //
+
+
+#ifndef anna_dbos_Repository_hpp
+#define anna_dbos_Repository_hpp
+
+#include <vector>
+
+#include <anna/core/mt/Mutex.hpp>
+
+#include <anna/dbos/StorageArea.hpp>
+#include <anna/dbos/defines.hpp>
+
+namespace anna {
+
+namespace xml {
+class Node;
+}
+
+namespace comm {
+class INetAddress;
+class Delivery;
+}
+
+namespace dbms {
+class Connection;
+}
+
+namespace dbos {
+
+/**
+ Clase que modela la interaccion entre la base y nuestra aplicacion.
+*/
+class Repository : public Mutex {
+public:
+ typedef std::map <StorageId, StorageArea*> container;
+ typedef container::const_iterator const_storage_iterator; /**<Iterador para acceder a las areas de almacenamiento de esta base de datos */
+ typedef container::iterator storage_iterator; /**<Iterador para acceder a las areas de almacenamiento de esta base de datos */
+
+ /**
+ Constructor.
+ \param name Nombre logico del repositorio de areas de almacenamiento.
+ */
+ explicit Repository(const char* name);
+
+ /**
+ Constructor.
+ \param name Nombre logico del repositorio de areas de almacenamiento.
+ */
+ explicit Repository(const std::string& name);
+
+ /**
+ Crea una nueva area de almacenamiento para objetos cargados a partir de un medio fisico, normalmente
+ la base de datos.
+
+ El tipo de dato de esta nueva area vendria definida implicitamente por el tipo de factoria empleadas
+ para instanciar y/o liberar los objetos y sus respectivos registros.
+
+ \param index Clave que seria usada para localizar el area de almacenamiento.
+ \param name Nombre logico de la nueva area de almacenamiento.
+ \param maxSize Limita el numero maximo de objetos que pueden estar cargados simultanemante en memoria.
+ Si se alcanza este limite pero no hay ningun objeto susceptible de ser sacado de la memoria de almacenamiento
+ se ampliaria automaticamente la reserva de memoria necesaria para cargar nuevos objetos, en tanto en cuanto
+ no se libere alguno de los objetos cargados. Ver StorageArea::StandardSize.
+ \param objectAllocator actoria de objetos usada para crear las nuevas instancias en este area de
+ almacenamiento.
+ \param errorCode Cdigo de error asociado a la excepcin lanzada por el metodo StorageArea::instantiate
+ en caso de que no se encuentre el objeto buscado. Si vale StorageArea::NoExceptionWhenNotFound en
+ caso de no encontrar el objeto no se devolveriaexcepcin y el valor retornado seria NULL.
+ \param aamm Modo de acceso de este area de almacenamiento.
+
+ \warning Las dos actorias deben estar disponibles desde el momento de invocar a este metodo hasta la
+ finalizacin de esta instancia de base de datos.
+ */
+ StorageArea* createStorageArea(const StorageId index, const char* name, const Size maxSize, ObjectAllocator objectAllocator, const int errorCode, const StorageArea::AccessMode::_v aamm = StorageArea::AccessMode::ReadOnly)
+ throw(RuntimeException);
+
+ /**
+ Devuelve la instancia del area de almacenamiento asociada al indice recibido.
+
+ \param index Indice del area de almacenamiento.
+
+ \return La instancia del area de almacenamiento asociada al indice recibido. Puede ser NULL si el
+ indice no fue usado para crear un area mediate #createStorageArea.
+ */
+ StorageArea* findStorageArea(const StorageId index) throw();
+
+ /**
+ Elimina todos los objetos cargados en las areas de almacenamiento definidas.
+ */
+ void clear() throw(RuntimeException);
+
+ /**
+ Devuelve un iterator al comienzo de la lista de areas de almacenamiento de esta base de datos.
+ \return Un iterator al comienzo de la lista de areas de almacenamiento de esta base de datos.
+ */
+ const_storage_iterator storage_begin() const throw() { return a_storageAreas.begin(); }
+
+ /**
+ Devuelve un iterator al final de la lista de areas de almacenamiento de esta base de datos.
+ \return Un iterator al final de la lista de areas de almacenamiento de esta base de datos.
+ */
+ const_storage_iterator storage_end() const throw() { return a_storageAreas.end(); }
+
+ /**
+ Devuelve el objeto sobre el que esta posicionado el iterator recibido como parametro.
+ \param ii Iterator que deberia estar comprendido entre #const_storage_begin y #const_storage_end.
+ \return El objeto sobre el que esta posicionado el iterator recibido como parametro.
+ */
+ static const StorageArea* storageArea(const_storage_iterator& ii) throw() { return ii->second; }
+
+ /**
+ Devuelve un documento XML con la informacion referente a esta instancia.
+ \param parent Nodo XML del que dependende la informacion.
+ @return un documento XML con la informacion referente a esta instancia.
+ */
+ xml::Node* asXML(xml::Node* parent) const throw();
+
+protected:
+ /**
+ Devuelve un iterator al comienzo de la lista de areas de almacenamiento de esta base de datos.
+ \return Un iterator al comienzo de la lista de areas de almacenamiento de esta base de datos.
+ */
+ storage_iterator storage_begin() throw() { return a_storageAreas.begin(); }
+
+ /**
+ Devuelve un iterator al final de la lista de areas de almacenamiento de esta base de datos.
+ \return Un iterator al final de la lista de areas de almacenamiento de esta base de datos.
+ */
+ storage_iterator storage_end() throw() { return a_storageAreas.end(); }
+
+ /**
+ Devuelve el objeto sobre el que esta posicionado el iterator recibido como parametro.
+ \param ii Iterator que deberia estar comprendido entre #const_storage_begin y #const_storage_end.
+ \return El objeto sobre el que esta posicionado el iterator recibido como parametro.
+ */
+ static StorageArea* storageArea(storage_iterator& ii) throw() { return ii->second; }
+
+private:
+ std::string a_name;
+ container a_storageAreas;
+
+ Repository(const Repository&);
+};
+
+}
+}
+
+#endif