1 // ANNA - Anna is Not Nothingness Anymore //
3 // (c) Copyright 2005-2015 Eduardo Ramos Testillano & Francisco Ruiz Rayo //
5 // See project site at http://redmine.teslayout.com/projects/anna-suite //
6 // See accompanying file LICENSE or copy at http://www.teslayout.com/projects/public/anna.LICENSE //
9 #ifndef anna_dbos_AutoSet_hpp
10 #define anna_dbos_AutoSet_hpp
12 #include <anna/dbos/Set.hpp>
20 Facilita el uso de los punteros a objectos obtenidos a partir de los datos guardados en un medio fisico.
22 La idea de esta clase es que el constructor y el destructor de esta clase cooperan para reservar y/o
23 liberar correctamente la instancia de T asociada a esta instancia.
25 \param T Clase que vamos a gestionar.
27 En el siguiente ejemplo podemos ver la forma habitual de trabajar con un objeto persistente tiene
28 el incoveniente de que tenemos que tener en cuenta cada una de las situaciones en las que la
29 referencia obtenida mediante el metodo \em instantiate debe ser liberada.
32 Server::Set <Server>* servers (NULL);
33 ServerLoader serverLoader; // ServerLoader hereda de anna::dbos::Loader.
37 serverLoader.setKey (..........); // Establece los parametros de busqueda
39 servers = Server::instantiate (serverLoader);
41 if (servers->size () == 0) {
43 .... Si fuera necesario trataria la condicion de no encontrar ningun registro
47 Server::iterator ii, maxii;
49 for (ii = servers->begin (), maxii = servers->end (); ii != maxii; ii ++) {
52 .... Trataria cada uno de los Server encontrados ....
55 Server::release (servers);
57 catch (Exception& ex) {
58 Server::release (servers);
61 ... Si fuera necesario trataria la condificion de error.
65 Como podemos ver a continuacion el siguiente metodo es mucho mas sencillo y aporta la gran ventaja de que
66 el sistema trabaja por nosotros para liberar correctamente los recursos.
69 AutoSet <Server> servers;
70 ServerLoader serverLoader; // ServerLoader hereda de anna::dbos::Loader.
74 serverLoader.setKey (..........); // Establece los parametros de busqueda
76 servers = Server::instantiate (serverLoader);
78 if (servers->size () == 0) {
80 .... Si fuera necesario trataria la condicion de no encontrar ningun registro
84 Server::iterator ii, maxii;
86 for (ii = servers->begin (), maxii = servers->end (); ii != maxii; ii ++) {
89 .... Trataria cada uno de los Server encontrados ....
92 catch (Exception& ex) {
94 ... Si fuera necesario trataria la condificion de error.
98 template <typename T> class AutoSet {
102 \param t Instancia del objeto asociado a esta instancia.
103 \warning La instancia deberia haber sido obtenida mediate la invocacion a \em T::instantiate de la
106 explicit AutoSet(Set <T>* t) : a_t(t) {;}
111 AutoSet() : a_t(NULL) {;}
114 Destructor. Invoca al metodo \em T::release
116 ~AutoSet() { if(a_t != NULL) T::release(a_t); }
120 Permite invocar a metodos de la clase T.
121 \return La instancia de la clase T asociada a esta instancia.
123 Set <T>* operator -> () const throw() { return a_t; }
127 \return La instancia de la clase T asociada a esta instancia.
129 Set <T>* operator = (Set<T>* t)
141 Operador de conversion.
142 \return La instancia de la clase T asociada a esta instancia.
144 operator Set <T>*() const throw() { return a_t; }