Revert "Remove mysql and oracle resources for anna-ericsson project"
[anna.git] / include / anna / dbos / Repository.hpp
diff --git a/include/anna/dbos/Repository.hpp b/include/anna/dbos/Repository.hpp
new file mode 100644 (file)
index 0000000..57a90ea
--- /dev/null
@@ -0,0 +1,154 @@
+// 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