+++ /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_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
-
-