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_ObjectFacade_hpp
10 #define anna_dbos_ObjectFacade_hpp
12 #include <anna/core/RuntimeException.hpp>
14 #include <anna/dbms/DatabaseException.hpp>
16 #include <anna/dbos/StorageArea.hpp>
17 #include <anna/dbos/Creator.hpp>
18 #include <anna/dbos/Loader.hpp>
19 #include <anna/dbos/Recorder.hpp>
20 #include <anna/dbos/Eraser.hpp>
33 Clase que facilita el acceso y uso de las clases encargadas de la instanciacion de objetos a partir de los datos
34 contenidos en un medio fisico, que normalmente seria la tabla de una base de datos.
36 \param T clase debe ser heredada de anna::dbos::Object.
38 Ejemplo de definicion de una clase usando esta interfaz:
40 \include dbos_demo.p/oodb.d/hdrs/dbos_demo.oodb.Table01.h
42 Ejemplo de implementacion de la clase correspondiente a la definicion:
44 \include dbos_demo.p/oodb.d/oodb.Table01.cc
46 \see dbos_declare_object
47 \see dbos_prepare_object
49 template <typename T> class ObjectFacade {
52 Devuelve un numerico que puede ser usado en la definicion del area de almacenamiento.
54 \return Un numerico que puede ser usado en la definicion del area de almacenamiento.
55 \see Database::createStorageArea
57 static StorageId getStorageAreaId() throw() { return (StorageId) anna_ptrnumber_cast(&st_storageArea); }
60 Devuelve el area de almacenamiento asociado a esta clase.
61 \return Devuelve el area de almacenamiento asociado a esta clase.
63 static StorageArea* getStorageArea() throw() { return st_storageArea; }
66 Establece el area de almacenamiento asociado a esta clase, que deberiaser creado mediante la invocacin al metodo
67 Database::createStorageArea.
69 \param storageArea area de almacenamiento asociada esta clase.
71 \warning El area de almacenamiento debe establecerse antes de invocar a cualquier otro metodo de esta clase.
73 static void setStorageArea(StorageArea* storageArea) throw() {
74 (st_storageArea = storageArea)->setSizeof(sizeof(T));
78 Carga la informacion de un objeto contenida en un medio fisico y la interpreta para adecuarla a
81 Este cargador deberia tener todos los datos necesarios para localizar la informacion del objeto que
82 debe cargar. Por ejemplo, en caso de tener que obtener el objeto a partir de los datos contenidos
83 en una tabla de una base de datos deberia conocer la clave primaria del objeto a cargar, o alguna
84 otra combinacion de columnas que lo identifiquen univocamente.
86 \param connection Conexion usada si fuera necesario extraer los datos del medio fisico.
87 \param loader Cargador de clase encargado de localizar y obtener la informacion referente al objeto
88 que deseamos cargar en memoria.
90 \return Una instancia que cumple el patron establecido por el cargador. Puede ser NULL en caso de
91 que al inicializar el area de almacenamiento asociado a esta clase se halla indicado un \em errorCode
92 igual a -1 en otro caso si no encuentra el objeto que cumpla el patron devolveria una
95 \warning Cada llamada a este metodo deberia tener su correspondiente liberacion invocando a #release
96 cuando dejemos de usar la instancia.
98 static T* instance(dbms::Connection& connection, Loader& loader)
99 throw(RuntimeException, dbms::DatabaseException) {
100 if(st_storageArea == NULL) {
101 std::string msg(loader.asString());
102 msg += " | ObjectFacade uninitialized ";
103 throw RuntimeException(msg, ANNA_FILE_LOCATION);
106 return static_cast <T*>(st_storageArea->instance(connection, loader));
110 Carga la informacion de un objeto contenida en un medio fisico y la interpreta para adecuarla a
113 Este cargador deberia tener todos los datos necesarios para localizar la informacion del objeto que
116 \param loader Cargador de clase encargado de localizar y obtener la informacion referente al objeto
117 que deseamos cargar en memoria.
119 \return Una instancia que cumple el patron establecido por el cargador. Puede ser NULL en caso de
120 que al inicializar el area de almacenamiento asociado a esta clase se halla indicado un \em errorCode
121 igual a -1 en otro caso si no encuentra el objeto que cumpla el patron devolveria una
124 \warning Cada llamada a este metodo deberia tener su correspondiente liberacion invocando a #release
125 cuando dejemos de usar la instancia.
127 static T* instance(Loader& loader)
128 throw(RuntimeException, dbms::DatabaseException) {
129 if(st_storageArea == NULL) {
130 std::string msg(loader.asString());
131 msg += " | ObjectFacade uninitialized ";
132 throw RuntimeException(msg, ANNA_FILE_LOCATION);
135 return static_cast <T*>(st_storageArea->instance(loader));
139 Carga la informacion de un objeto contenida en un medio fisico y la interpreta para adecuarla a
142 Este cargador deberia tener todos los datos necesarios para localizar la informacion del objeto que
143 debe cargar. Por ejemplo, en caso de tener que obtener el objeto a partir de los datos contenidos
144 en una tabla de una base de datos deberia conocer la clave primaria del objeto a cargar, o alguna
145 otra combinacion de columnas que lo identifiquen univocamente.
147 \param connection Conexion usada si fuera necesario extraer los datos del medio fisico.
148 \param crossedLoader Cargador encargado de encontrar la clave principal a aplicar con el #Loader
149 recibido como parámetro en base a una clave alternativa contenida en el mismo.
150 \param loader Cargador de clase encargado de localizar y obtener la informacion referente al objeto
151 que deseamos cargar en memoria.
153 \return Una instancia que cumple el patron establecido por el cargador. Puede ser NULL en caso de
154 que al inicializar esta clase \em errorCode se halla indicado un #NoExceptionWhenNotFound en otro
155 caso si no encuentra el objeto que cumpla el patron devolveria una excepcion de ejecucion.
157 \warning Cada llamada a este método deberia tener su correspondiente liberacion invocando a #release
158 cuando dejemos de usar la instancia.
160 static T* instance(dbms::Connection& connection, CrossedLoader& crossedLoader, Loader& loader)
161 throw(RuntimeException, dbms::DatabaseException) {
162 if(st_storageArea == NULL) {
163 std::string msg(loader.asString());
164 msg += " | ObjectFacade uninitialized ";
165 throw RuntimeException(msg, ANNA_FILE_LOCATION);
168 return static_cast <T*>(st_storageArea->instance(connection, crossedLoader, loader));
172 Crea un objeto en el area de almacenamiento un y lo prepara para ser transferido al medio fisico
175 Este cargador deberia tener todos los datos necesarios para localizar la informacion del objeto que
176 debe cargar. Por ejemplo, en caso de tener que obtener el objeto a partir de los datos contenidos
177 en una tabla de una base de datos deberia conocer la clave primaria del objeto a cargar, o alguna
178 otra combinacion de columnas que lo identifiquen univocamente.
180 \param connection Conexion usada si fuera necesario acceder al medio fisico.
181 \param creator Creador encargado de generar el objeto de forma que sea facil de localizar posteriormente
182 en el area de almacenamiento.
184 \return La nueva instancia que cumple el patron establecido por el creador.
186 \warning Cada llamada a este metodo deberia tener su correspondiente liberacion invocando a #release
187 cuando dejemos de usar la instancia.
189 static T* create(dbms::Connection& connection, Creator& creator)
190 throw(RuntimeException, dbms::DatabaseException) {
191 if(st_storageArea == NULL) {
192 std::string msg(creator.asString());
193 msg += " | ObjectFacade uninitialized ";
194 throw RuntimeException(msg, ANNA_FILE_LOCATION);
197 return static_cast <T*>(st_storageArea->create(connection, creator));
201 Devuelve la informacion de un objeto cargado desde el medio fisico.
203 Este cargador deberia tener todos los datos necesarios para localizar la informacion del objeto que
204 debe buscar. Por ejemplo, en caso de tener que obtener el objeto a partir de los datos contenidos
205 en una tabla de una base de datos deberia conocer la clave primaria del objeto a cargar, o alguna
206 otra combinacion de columnas que lo identifiquen univocamente.
208 \param loader Cargador de clase encargado de localizar la informacion referente al objeto buscado.
210 \return Una instancia que cumple el patron establecido por el cargador. Puede ser NULL si el
211 objeto no fue cargado en el area de almacenamiento.
213 \warning Cada llamada a este metodo deberia tener su correspondiente liberacion invocando a #release
214 cuando dejemos de usar la instancia.
216 static T* find(Loader& loader)
217 throw(RuntimeException) {
218 if(st_storageArea == NULL) {
219 std::string msg(loader.asString());
220 msg += " | ObjectFacade uninitialized ";
221 throw RuntimeException(msg, ANNA_FILE_LOCATION);
224 return static_cast <T*>(st_storageArea->find(loader));
228 Habilita la reutilizacion del espacio de memoria ocupado por un objeto alojado en el area de almacenamiento.
230 Este metodo no saca al objeto de la memoria de almacenamiento, sino que marca su espacio de memoria
231 como subceptible de ser reutilizado. De esta forma, si el numero de objetos cargados en memoria se
232 acerca al tamao maximo indicado en la inicializacion, se intentara reusar espacios libres en vez
233 de continuar ampliando la memoria reservada.
235 \param t Instancia del tipo T que vamos a liberar.
237 \warning Si el objeto recibido como parametro no fue reservado mediate alguno de los metodos de reserva de
238 objetos ofrecidos por esta clase no tendra ningun efecto.
240 static void release(T*& t)
242 if(st_storageArea == NULL)
246 st_storageArea->release(reinterpret_cast <Object**>(&t));
247 } catch(RuntimeException& ex) {
253 Descarga todos los objetos contenidos en el area de almacenamiento.
256 throw(RuntimeException) {
257 if(st_storageArea == NULL)
258 throw RuntimeException("ObjectFacade uninitialized ", ANNA_FILE_LOCATION);
260 st_storageArea->clear();
264 Devuelve de una copia del objeto recibido como parametro e incrementa la cuenta de utilizacion
265 asociada a la instancia.
267 \param t Instancia del tipo T obtenida mediate el metodo #instance.
269 \return Una copia del objeto recibido como parametro. Si el parametro recibido es NULL devolveria NULL.
271 \warning Cada llamada a este metodo deberia tener su correspondiente liberacion invocando a #release
272 cuando dejemos de usar la instancia.
274 static T* duplicate(const T* t)
275 throw(RuntimeException) {
276 if(st_storageArea == NULL)
277 throw RuntimeException("ObjectFacade uninitialized ", ANNA_FILE_LOCATION);
279 return static_cast <T*>(st_storageArea->duplicate(t));
283 Permite conocer si un determinado objeto esta alojado en el area de almacenamiento.
285 \param loader Cargador de clase encargado de localizar la informacion referente al objeto buscado.
287 \return \em true Si el objeto identificado por el Loader esta en el area de almacenamiento o
288 \em false en otro caso.
290 static bool isLoaded(const Loader& loader)
291 throw(RuntimeException) {
292 if(st_storageArea == NULL)
293 throw RuntimeException("ObjectFacade uninitialized ", ANNA_FILE_LOCATION);
295 return st_storageArea->isLoaded(loader);
299 Transfiere la informacion del objeto recibido como parametro al medio fisico usando el Recorder
300 recibido como parametro.
302 \param connection Conexion usada si fuera necesario extraer los datos del medio fisico.
303 \param recorder Grabador usado para transferir los datos al medio fisico.
305 static void apply(dbms::Connection& connection, Recorder& recorder)
306 throw(RuntimeException, dbms::DatabaseException) {
307 if(st_storageArea == NULL) {
308 std::string msg(recorder.asString());
309 msg += " | ObjectFacade uninitialized";
310 throw RuntimeException(msg, ANNA_FILE_LOCATION);
313 st_storageArea->apply(connection, recorder);
317 Elimina la informacion del objeto recibido como parametro del medio fisico usando el Eraser
318 recibido como parametro.
320 \param connection Conexion usada si fuera necesario extraer los datos del medio fisico.
321 \param eraser Objecto usado para eliminar los datos al medio fisico.
323 \warning Si la cuanta de utilizacion de T es 1 se liberaria en otro caso se devolveria una excepcion.
325 static void apply(dbms::Connection& connection, Eraser& eraser)
326 throw(RuntimeException, dbms::DatabaseException) {
327 if(st_storageArea == NULL) {
328 std::string msg(eraser.asString());
329 msg += " | ObjectFacade uninitialized";
330 throw RuntimeException(msg, ANNA_FILE_LOCATION);
333 st_storageArea->apply(connection, eraser);
337 Elimina toda la informacion referente al objeto recibido como parametro, siempre y cuando
338 solo tenga un unica referencia activa. Descarga el objeto de la memoria de almacenamiento,
340 \param t Instancia del tipo T que vamos a descargar de la memoria de almacenamiento.
342 \warning \li Si el objeto recibido como parametro no fue reservado mediate #instance no tiene
343 ningun efecto. \li La instancia a liberar solo puede tener 1 en su cuenta de utilizacion.
344 \li La memoria asignada a la instancia recibida es liberada, por lo que podemos evitar la invocacion
345 al metodo #release para esta instancia.
347 static void erase(T*& t)
348 throw(RuntimeException) {
349 if(st_storageArea == NULL)
352 st_storageArea->erase(reinterpret_cast <Object**>(&t));
356 Devuelve el puntero sobre el que estaria posicionado el iterador recibido como parametro.
357 \return El puntero sobre el que estaria posicionado el iterador recibido como parametro.
359 static T* data(StorageArea::iterator& ii) throw() { return static_cast <T*>(StorageArea::data(ii)); }
362 Devuelve el puntero sobre el que estaria posicionado el iterador recibido como parametro.
363 \return El puntero sobre el que estaria posicionado el iterador recibido como parametro.
365 static const T* data(StorageArea::const_iterator& ii) throw() { return static_cast <const T*>(StorageArea::data(ii)); }
368 Metodo creador de nuevas instancias de la clase T.
369 \return Una nueva instancia del tipo de objeto T.
370 \warning Solo deberia ser llamado desde anna::comm::StorageArea cuando sea preciso crear
371 nuevas instancias de objetos.
373 static Object* allocator() throw() { return new T; }
376 static StorageArea* st_storageArea;
388 Definicion a la que hay que invocar en la implementacion de la clase que hereda
389 de anna::dbos::ObjectFacade.
391 \param T Nombre de la clase que vamos a tratar en el ambito de C++.
393 #define dbos_prepare_object(T) \
394 template <> anna::dbos::StorageArea* anna::dbos::ObjectFacade< T >::st_storageArea = NULL
397 Definicion a la que hay que invocar dentro de la definicion de la clase que hereda
398 de anna::dbos::ObjectFacade.
400 \param T Nombre de la clase que vamos a tratar en el ambito de C++.
402 #define dbos_declare_object(T) \
403 friend class anna::dbos::ObjectFacade <T>