--- /dev/null
+// 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 <anna/core/RuntimeException.hpp>
+#include <anna/core/mt/Mutex.hpp>
+
+#include <anna/dbms/DatabaseException.hpp>
+
+#include <anna/dbos/defines.hpp>
+
+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
+
+
+