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_Set_hpp
10 #define anna_dbos_Set_hpp
12 #include <anna/core/mt/SafeRecycler.hpp>
13 #include <anna/core/mt/Guard.hpp>
14 #include <anna/core/Allocator.hpp>
16 #include <anna/dbms/Statement.hpp>
17 #include <anna/dbms/DatabaseException.hpp>
19 #include <anna/dbos/Object.hpp>
26 Template para acceder a los elementos de un conjunto de objetos inicializados a partir
27 de los datos contenidos en un medio fisico.
29 A continuacion presentamos un ejemplo de uso:
32 Server::Set <Server>* servers (NULL); // Server hereda de esta clase.
33 ServerLoader serverLoader; // ServerLoader hereda de 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 condicion de error.
65 template <typename T> class Set : public Object {
68 Sinonimo usado para definir la clase contenedora de objetos del conjunto.
70 typedef typename anna::SafeRecycler <T, anna::Allocator<T> > Container;
73 Sinonimo usado para acceder a los elementos del conjunto atraves de un iterador
74 de objetos no modificables.
76 typedef typename Container::const_iterator const_iterator;
79 Sinonimo usado para acceder a los elementos del conjunto atraves de un iterador
80 de objetos modificables.
82 typedef typename Container::iterator iterator;
85 Devuelve el inicio del vector de objetos contenidos en el conjunto.
86 \return El inicio del vector de objetos contenidos en el conjunto.
88 const_iterator begin() const throw() { return a_objects.begin(); }
91 Devuelve el inicio del vector de objetos contenidos en el conjunto.
92 \return El inicio del vector de objetos contenidos en el conjunto.
94 iterator begin() throw() { return a_objects.begin(); }
97 Devuelve el final del vector de objetos contenidos en el conjunto.
98 \return El final del vector de objetos contenidos en el conjunto.
100 const_iterator end() const throw() { return a_objects.end(); }
103 Devuelve el final del vector de objetos contenidos en el conjunto.
104 \return El final del vector de objetos contenidos en el conjunto.
106 iterator end() throw() { return a_objects.end(); }
109 Crea un nuevo puntero de la clase T dentro de este conjunto.
111 T* append() throw(RuntimeException) { return a_objects.create(); }
114 Saca de este conjunto la instancia recibida como parametro y libera su memoria asociada.
115 La operacion se ignoraria si el puntero recibido como parametro es nulo o no pertenece al conjunto.
116 \param t Instancia que del objeto a eliminar.
118 void remove(T*& t) throw(RuntimeException) { a_objects.release(t); t = NULL; }
121 Devuelve el nmero de elementos contenidos en el conjunto.
122 \return El nmero de elementos contenidos en el conjunto.
124 int size() const throw() { return a_objects.size(); }
127 Devuelve el puntero sobre el que esta posicionado el iterador recibido como parametro.
128 \return El puntero sobre el que esta posicionado el iterador recibido como parametro.
130 static T* data(iterator& ii) throw() { return Container::data(ii); }
133 Devuelve el puntero sobre el que esta posicionado el iterador recibido como parametro.
134 \return El puntero sobre el que esta posicionado el iterador recibido como parametro.
136 static const T* data(const_iterator& ii) throw() { return Container::data(ii); }
141 void initialize(Loader& loader)
142 throw(RuntimeException, dbms::DatabaseException) {
144 dbms::Statement* statement = loader.getStatement();
148 a_objects.create()->initialize(loader);
149 } while(statement->fetch() == true);
150 } catch(RuntimeException&) {
153 } catch(dbms::DatabaseException&) {
161 for(iterator ii = begin(), maxii = end(); ii != maxii; ii ++)