ANNA Suite  2020b
Multipurpose development suite for Telco applications
Public Member Functions | List of all members
anna::dbos::AutoObject< T > Class Template Reference

#include <AutoObject.hpp>

Public Member Functions

 AutoObject (T *t)
 
 AutoObject ()
 
 ~AutoObject ()
 
T * operator-> () const
 
T * operator= (T *t)
 
T * operator= (const AutoObject< T > &other) noexcept(false)
 
 operator T* () const
 

Detailed Description

template<typename T>
class anna::dbos::AutoObject< T >

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.

Parameters
TClase 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 instantiate debe ser liberada.

void Application::getServerSocketsData (vector <SocketData>& serverSocketsData) const
noexcept(false)
{
LOGMETHOD (TraceMethod ("anna::Application", "getServerSocketsData", ANNA_FILE_LOCATION));
Facility* facility (NULL);
FacilityLoader facilityLoader;
try {
facility = Facility::instantiate (facilityLoader.setKey (a_thisFacility)); // (1)
getSocketsData (getThisHostName (), facility->getName (), a_thisCell, a_thisInstance, serverSocketsData);
Facility::release (facility);
}
catch (dbos::DatabaseException& edbos) {
Facility::release (facility);
throw RuntimeException (edbos.getText (), ANNA_FILE_LOCATION);
}
catch (RuntimeException&) { // Tenemos que capturar esta excepcion para liberar el recurso.
Facility::release (facility);
throw;
}
}

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.

void Application::getServerSocketsData (vector <SocketData>& serverSocketsData) const
noexcept(false)
{
LOGMETHOD (TraceMethod ("anna::Application", "getServerSocketsData", ANNA_FILE_LOCATION));
AutoObject <Facility> facility;
FacilityLoader facilityLoader;
try {
facility = Facility::instantiate (facilityLoader.setKey (a_thisFacility)); // (1)
getSocketsData (getThisHostName (), facility->getName (), a_thisCell, a_thisInstance, serverSocketsData);
}
catch (dbos::DatabaseException& edbos) {
throw RuntimeException (edbos.getText (), ANNA_FILE_LOCATION);
}
}

Constructor & Destructor Documentation

◆ AutoObject() [1/2]

template<typename T>
anna::dbos::AutoObject< T >::AutoObject ( T *  t)
inlineexplicit

Constructor.

Parameters
tInstancia del objeto asociado a esta instancia.
Warning
La instancia deberia haber sido obtenida mediate la invocacion a T::instantiate de la clase persistente.
92 : a_t(t) {;}

◆ AutoObject() [2/2]

template<typename T>
anna::dbos::AutoObject< T >::AutoObject ( )
inline

Constructor.

97 : a_t(NULL) {;}

◆ ~AutoObject()

template<typename T>
anna::dbos::AutoObject< T >::~AutoObject ( )
inline

Destructor. Invoca al metodo T::release

102 { if(a_t != NULL) T::release(a_t); }

Member Function Documentation

◆ operator T*()

template<typename T>
anna::dbos::AutoObject< T >::operator T* ( ) const
inline

Operador de conversion.

Returns
La instancia de la clase T asociada a esta instancia.
138 { return a_t; }

◆ operator->()

template<typename T>
T* anna::dbos::AutoObject< T >::operator-> ( ) const
inline

Operador -> Permite invocar a metodos de la clase T.

Returns
La instancia de la clase T asociada a esta instancia.
109 { return a_t; }

◆ operator=() [1/2]

template<typename T>
T* anna::dbos::AutoObject< T >::operator= ( T *  t)
inline

Operador copia.

Parameters
tReferencia al objeto que vamos a tratar.
Returns
La instancia de la clase T asociada a esta instancia.
116  {
117  if(a_t != t) {
118  T::release(a_t);
119  a_t = t;
120  }
121 
122  return a_t;
123  }

◆ operator=() [2/2]

template<typename T>
T* anna::dbos::AutoObject< T >::operator= ( const AutoObject< T > &  other)
inlinenoexcept

Operador copia.

Parameters
otherReferencia al objeto que vamos a tratar.
Returns
La instancia de la clase T asociada a esta instancia.
130  {
131  return (this != &other) ? (*this = T::duplicate(other.a_t)) : a_t;
132  }

The documentation for this class was generated from the following file: