X-Git-Url: https://git.teslayout.com/public/public/public/?a=blobdiff_plain;f=include%2Fanna%2Fdbos%2FAccesor.hpp;fp=include%2Fanna%2Fdbos%2FAccesor.hpp;h=a719c51e9574d87b7c59d2b9cb3c223e5b964bf7;hb=78be86969d2f26a9084b0c4af6ce43d5fa4ed3fd;hp=0000000000000000000000000000000000000000;hpb=a3b95648bd76140ef55e0b5941d423eee6c3856f;p=anna.git diff --git a/include/anna/dbos/Accesor.hpp b/include/anna/dbos/Accesor.hpp new file mode 100644 index 0000000..a719c51 --- /dev/null +++ b/include/anna/dbos/Accesor.hpp @@ -0,0 +1,175 @@ +// ANNA - Anna is Not Nothingness Anymore // +// // +// (c) Copyright 2005-2015 Eduardo Ramos Testillano & Francisco Ruiz Rayo // +// // +// See project site at http://redmine.teslayout.com/projects/anna-suite // +// See accompanying file LICENSE or copy at http://www.teslayout.com/projects/public/anna.LICENSE // + + +#ifndef anna_dbos_Accesor_hpp +#define anna_dbos_Accesor_hpp + +#include +#include + +#include + +#include + +namespace anna { + +namespace dbms { +class Database; +class Connection; +class Statement; +} + +namespace dbos { + +class StorageArea; + +/** + Interfaz que deben cumplir los objetos encargados de acceder al objeto del medio fisico, + que normalmente sera alguna base de datos. +*/ +class Accesor : public Mutex { +public: + typedef short Id; /**< Permite identificar el tipo de accesor. */ + + /** + Destructor. + */ + virtual ~Accesor(); + + /** + Devuelve el identificador de este accesor. + \return El identificador de este accesor. + */ + Id getId() const throw() { return a_id; } + + /** + Devuelve la instancia de la sentencia \em statement asociada a este cargador. + \return La instancia de la sentencia \em statement asociada a este cargador. Puede ser NULL. + */ + dbms::Statement* getStatement() + throw(RuntimeException) { + return (a_statement == NULL && a_database != NULL) ? (a_statement = initialize(*a_database)) : a_statement; + } + + /** + * Devuelve \em true si el accesor fue inicializado con base de datos o \em false en otro caso. + * \return \em true si el accesor fue inicializado con base de datos o \em false en otro caso. + */ + bool hasDataBase() const throw() { return a_database != NULL; } + + /** + Devuelve la instancia de la base de datos asociada a este cargador. + \return La instancia de la base de datos asociada a este cargador. + + \warning Si el accesor fue inicializado sin base de datos lo resultados no están definidos. + */ + dbms::Database& getDatabase() throw() { return *a_database; } + + /** + Devuelve la conexion que esta usando actualmente este cargador. + \return la conexion que esta usando actualmente este cargador. + */ + dbms::Connection& getConnection() throw(RuntimeException) { + if(a_connection == NULL) { + std::string msg(asString()); + msg += " | No available database connection"; + throw RuntimeException(msg, ANNA_FILE_LOCATION); + } + + return *a_connection; + } + + /** + Devuelve la representacion en forma de cadena de la clave primaria establecida. + @return La representacion en forma de cadena de la clave primaria establecida. + */ + virtual std::string asString() const throw() = 0; + + /** + Metodo de debemos re-escribir para devolver el nombre completo del selector de recursos. + Para evitar ambigüedades este nombre deberia incluir la lista completa de \em namespaces + a la que pertenece la clase. + \return Una cadena con el nombre de este selector. + */ + virtual const char* getClassName() const throw() = 0; + +protected: + /** + Constructor. + \param database Base de datos asociada a este cargador y que deberia servir para + obtener los datos de un objeto. Debe tener la misma disponibilidad que este cargador. + \param id Identificador de este accesor. + */ + Accesor(dbms::Database& database, const Id id) : + a_database(&database), + a_id(id), + a_statement(NULL), + a_connection(NULL), + a_emodeIsNull(true) + {;} + + /** + Constructor. + \param database Base de datos asociada a este cargador y que deberia servir para + obtener los datos de un objeto. Debe tener la misma disponibilidad que este cargador. + \param id Identificador de este accesor. + \param emode Modo de actuar en caso de no encontrar el dato buscado. + */ + Accesor(dbms::Database& database, const Id id, const Exception::Mode::_v emode) : + a_database(&database), + a_id(id), + a_statement(NULL), + a_connection(NULL), + a_emodeIsNull(false), + a_exceptionMode(emode) + {;} + + /** + Constructor. + \param id Identificador de este accesor. + */ + Accesor(const Id id) : + a_database(NULL), + a_id(id), + a_statement(NULL), + a_connection(NULL), + a_emodeIsNull(true) + {;} + + /** + Metodo que deben implementar todos los accesores para definir la sentencia + SQL que los definira. + Se invocara automaticamente desde el nucleo de anna.dbos la primera vez que + se use este accesor, de forma que el programador solo debe preocuparse por + definir este metodo. + \param database Instancia de la base de datos indicada en el constructor. + */ + virtual dbms::Statement* initialize(dbms::Database& database) throw(RuntimeException) = 0; + +private: + dbms::Database* a_database; + const Id a_id; + dbms::Statement* a_statement; + dbms::Connection* a_connection; + bool a_emodeIsNull; + Exception::Mode::_v a_exceptionMode; + + void setStatement(dbms::Statement* statement) throw() { a_statement = statement; } + + virtual bool load(dbms::Connection*, const StorageArea*) throw(RuntimeException, dbms::DatabaseException); + + friend class StorageArea; +}; + +} +} + +#endif + + +