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_Accesor_hpp
10 #define anna_dbos_Accesor_hpp
12 #include <anna/core/RuntimeException.hpp>
13 #include <anna/core/mt/Mutex.hpp>
15 #include <anna/dbms/DatabaseException.hpp>
17 #include <anna/dbos/defines.hpp>
32 Interfaz que deben cumplir los objetos encargados de acceder al objeto del medio fisico,
33 que normalmente sera alguna base de datos.
35 class Accesor : public Mutex {
37 typedef short Id; /**< Permite identificar el tipo de accesor. */
45 Devuelve el identificador de este accesor.
46 \return El identificador de este accesor.
48 Id getId() const throw() { return a_id; }
51 Devuelve la instancia de la sentencia \em statement asociada a este cargador.
52 \return La instancia de la sentencia \em statement asociada a este cargador. Puede ser NULL.
54 dbms::Statement* getStatement()
55 throw(RuntimeException) {
56 return (a_statement == NULL && a_database != NULL) ? (a_statement = initialize(*a_database)) : a_statement;
60 * Devuelve \em true si el accesor fue inicializado con base de datos o \em false en otro caso.
61 * \return \em true si el accesor fue inicializado con base de datos o \em false en otro caso.
63 bool hasDataBase() const throw() { return a_database != NULL; }
66 Devuelve la instancia de la base de datos asociada a este cargador.
67 \return La instancia de la base de datos asociada a este cargador.
69 \warning Si el accesor fue inicializado sin base de datos lo resultados no están definidos.
71 dbms::Database& getDatabase() throw() { return *a_database; }
74 Devuelve la conexion que esta usando actualmente este cargador.
75 \return la conexion que esta usando actualmente este cargador.
77 dbms::Connection& getConnection() throw(RuntimeException) {
78 if(a_connection == NULL) {
79 std::string msg(asString());
80 msg += " | No available database connection";
81 throw RuntimeException(msg, ANNA_FILE_LOCATION);
88 Devuelve la representacion en forma de cadena de la clave primaria establecida.
89 @return La representacion en forma de cadena de la clave primaria establecida.
91 virtual std::string asString() const throw() = 0;
94 Metodo de debemos re-escribir para devolver el nombre completo del selector de recursos.
95 Para evitar ambigüedades este nombre deberia incluir la lista completa de \em namespaces
96 a la que pertenece la clase.
97 \return Una cadena con el nombre de este selector.
99 virtual const char* getClassName() const throw() = 0;
104 \param database Base de datos asociada a este cargador y que deberia servir para
105 obtener los datos de un objeto. Debe tener la misma disponibilidad que este cargador.
106 \param id Identificador de este accesor.
108 Accesor(dbms::Database& database, const Id id) :
109 a_database(&database),
118 \param database Base de datos asociada a este cargador y que deberia servir para
119 obtener los datos de un objeto. Debe tener la misma disponibilidad que este cargador.
120 \param id Identificador de este accesor.
121 \param emode Modo de actuar en caso de no encontrar el dato buscado.
123 Accesor(dbms::Database& database, const Id id, const Exception::Mode::_v emode) :
124 a_database(&database),
128 a_emodeIsNull(false),
129 a_exceptionMode(emode)
134 \param id Identificador de este accesor.
136 Accesor(const Id id) :
145 Metodo que deben implementar todos los accesores para definir la sentencia
146 SQL que los definira.
147 Se invocara automaticamente desde el nucleo de anna.dbos la primera vez que
148 se use este accesor, de forma que el programador solo debe preocuparse por
150 \param database Instancia de la base de datos indicada en el constructor.
152 virtual dbms::Statement* initialize(dbms::Database& database) throw(RuntimeException) = 0;
155 dbms::Database* a_database;
157 dbms::Statement* a_statement;
158 dbms::Connection* a_connection;
160 Exception::Mode::_v a_exceptionMode;
162 void setStatement(dbms::Statement* statement) throw() { a_statement = statement; }
164 virtual bool load(dbms::Connection*, const StorageArea*) throw(RuntimeException, dbms::DatabaseException);
166 friend class StorageArea;