Revert "Remove mysql and oracle resources for anna-ericsson project"
[anna.git] / include / anna / dbos / Set.hpp
diff --git a/include/anna/dbos/Set.hpp b/include/anna/dbos/Set.hpp
new file mode 100644 (file)
index 0000000..a4325b9
--- /dev/null
@@ -0,0 +1,173 @@
+// 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_Set_hpp
+#define anna_dbos_Set_hpp
+
+#include <anna/core/mt/SafeRecycler.hpp>
+#include <anna/core/mt/Guard.hpp>
+#include <anna/core/Allocator.hpp>
+
+#include <anna/dbms/Statement.hpp>
+#include <anna/dbms/DatabaseException.hpp>
+
+#include <anna/dbos/Object.hpp>
+
+namespace anna {
+
+namespace dbos {
+
+/**
+   Template para acceder a los elementos de un conjunto de objetos inicializados a partir
+   de los datos contenidos en un medio fisico.
+
+   A continuacion presentamos un ejemplo de uso:
+
+   \code
+   Server::Set <Server>* servers (NULL);   // Server hereda de esta clase.
+   ServerLoader serverLoader;        // ServerLoader hereda de dbos::Loader.
+   Server* server;
+
+   try {
+      serverLoader.setKey (..........); // Establece los parametros de busqueda
+
+      servers = Server::instantiate (serverLoader);
+
+      if (servers->size () == 0) {
+         ....
+         .... Si fuera necesario Trataria  la condicion de no encontrar ningun registro
+         ....
+      }
+
+      Server::iterator ii, maxii;
+
+      for (ii = servers->begin (), maxii = servers->end (); ii != maxii; ii ++) {
+         server = *ii;
+
+         .... Trataria  cada uno de los Server encontrados ....
+      }
+
+      Server::release (servers);
+   }
+   catch (Exception& ex) {
+      Server::release (servers);
+
+      ...
+      ... Si fuera necesario Trataria  la condicion de error.
+   }
+   \endcode
+ */
+template <typename T> class Set : public Object {
+public:
+  /**
+     Sinonimo usado para definir la clase contenedora de objetos del conjunto.
+  */
+  typedef typename anna::SafeRecycler <T, anna::Allocator<T> > Container;
+
+  /**
+     Sinonimo usado para acceder a los elementos del conjunto atraves de un iterador
+     de objetos no modificables.
+  */
+  typedef typename Container::const_iterator const_iterator;
+
+  /**
+     Sinonimo usado para acceder a los elementos del conjunto atraves de un iterador
+     de objetos modificables.
+  */
+  typedef typename Container::iterator iterator;
+
+  /**
+     Devuelve el inicio del vector de objetos contenidos en el conjunto.
+     \return El inicio del vector de objetos contenidos en el conjunto.
+  */
+  const_iterator begin() const throw() { return a_objects.begin(); }
+
+  /**
+     Devuelve el inicio del vector de objetos contenidos en el conjunto.
+     \return El inicio del vector de objetos contenidos en el conjunto.
+  */
+  iterator begin() throw() { return a_objects.begin(); }
+
+  /**
+     Devuelve el final del vector de objetos contenidos en el conjunto.
+     \return El final del vector de objetos contenidos en el conjunto.
+  */
+  const_iterator end() const throw() { return a_objects.end(); }
+
+  /**
+     Devuelve el final del vector de objetos contenidos en el conjunto.
+     \return El final del vector de objetos contenidos en el conjunto.
+  */
+  iterator end() throw() { return a_objects.end(); }
+
+  /**
+     Crea un nuevo puntero de la clase T dentro de este conjunto.
+  */
+  T* append() throw(RuntimeException) { return a_objects.create(); }
+
+  /**
+     Saca de este conjunto la instancia recibida como parametro y libera su memoria asociada.
+     La operacion se ignoraria si el puntero recibido como parametro es nulo o no pertenece al conjunto.
+     \param t Instancia que del objeto a eliminar.
+  */
+  void remove(T*& t) throw(RuntimeException) { a_objects.release(t); t = NULL; }
+
+  /**
+     Devuelve el nmero de elementos contenidos en el conjunto.
+     \return El nmero de elementos contenidos en el conjunto.
+  */
+  int size() const throw() { return a_objects.size(); }
+
+  /**
+     Devuelve el puntero sobre el que esta posicionado el iterador recibido como parametro.
+     \return El puntero sobre el que esta posicionado el iterador recibido como parametro.
+  */
+  static T* data(iterator& ii) throw() { return Container::data(ii); }
+
+  /**
+     Devuelve el puntero sobre el que esta posicionado el iterador recibido como parametro.
+     \return El puntero sobre el que esta posicionado el iterador recibido como parametro.
+  */
+  static const T* data(const_iterator& ii) throw() { return Container::data(ii); }
+
+private:
+  Container a_objects;
+
+  void initialize(Loader& loader)
+  throw(RuntimeException, dbms::DatabaseException) {
+    T* object;
+    dbms::Statement* statement = loader.getStatement();
+
+    try {
+      do {
+        a_objects.create()->initialize(loader);
+      } while(statement->fetch() == true);
+    } catch(RuntimeException&) {
+      destroy();
+      throw;
+    } catch(dbms::DatabaseException&) {
+      destroy();
+      throw;
+    }
+  }
+
+  void destroy()
+  throw() {
+    for(iterator ii = begin(), maxii = end(); ii != maxii; ii ++)
+      data(ii)->destroy();
+
+    a_objects.clear();
+  }
+};
+
+}
+}
+
+#endif
+
+