Revert "Remove mysql and oracle resources for anna-ericsson project"
[anna.git] / include / anna / dbos / AutoSet.hpp
diff --git a/include/anna/dbos/AutoSet.hpp b/include/anna/dbos/AutoSet.hpp
new file mode 100644 (file)
index 0000000..5882bb1
--- /dev/null
@@ -0,0 +1,158 @@
+// 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_AutoSet_hpp
+#define anna_dbos_AutoSet_hpp
+
+#include <anna/dbos/Set.hpp>
+
+namespace anna {
+
+namespace dbos {
+
+
+/**
+   Facilita el uso de los punteros a objectos obtenidos a partir de los datos guardados en un medio fisico.
+
+   La idea de esta clase es que el constructor y el destructor de esta clase cooperan para reservar y/o
+   liberar correctamente la instancia de T asociada a esta instancia.
+
+   \param T Clase que vamos a gestionar.
+
+   En el siguiente ejemplo podemos ver la forma habitual de trabajar con un objeto persistente tiene
+   el incoveniente de que tenemos que tener en cuenta cada una de las situaciones en las que la
+   referencia obtenida mediante el metodo \em instantiate debe ser liberada.
+
+   \code
+   Server::Set <Server>* servers (NULL);
+   ServerLoader serverLoader;        // ServerLoader hereda de anna::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 condificion de error.
+   }
+   \endcode
+
+   Como podemos ver a continuacion el siguiente metodo es mucho mas sencillo y aporta la gran ventaja de que
+   el sistema trabaja por nosotros para liberar correctamente los recursos.
+
+   \code
+   AutoSet <Server> servers;
+   ServerLoader serverLoader;        // ServerLoader hereda de anna::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 ....
+      }
+   }
+   catch (Exception& ex) {
+      ...
+      ... Si fuera necesario trataria la condificion de error.
+   }
+   \endcode
+*/
+template <typename T> class AutoSet {
+public:
+  /**
+     Constructor.
+     \param t Instancia del objeto asociado a esta instancia.
+     \warning La instancia deberia haber sido obtenida mediate la invocacion a \em T::instantiate de la
+     clase persistente.
+  */
+  explicit AutoSet(Set <T>* t) : a_t(t) {;}
+
+  /**
+     Constructor.
+  */
+  AutoSet() : a_t(NULL) {;}
+
+  /**
+     Destructor. Invoca al metodo \em T::release
+  */
+  ~AutoSet() { if(a_t != NULL) T::release(a_t); }
+
+  /**
+     Operador ->
+     Permite invocar a metodos de la clase T.
+     \return La instancia de la clase T asociada a esta instancia.
+  */
+  Set <T>* operator -> () const throw() { return a_t; }
+
+  /**
+     Operador copia.
+     \return La instancia de la clase T asociada a esta instancia.
+  */
+  Set <T>* operator = (Set<T>* t)
+  throw() {
+    if(a_t == t)
+      return t;
+
+    if(a_t != NULL)
+      T::release(a_t);
+
+    return a_t = t;
+  }
+
+  /**
+     Operador de conversion.
+     \return La instancia de la clase T asociada a esta instancia.
+  */
+  operator Set <T>*() const throw() { return a_t; }
+
+private:
+  Set <T>* a_t;
+};
+
+
+}
+}
+
+
+
+#endif
+
+