--- /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_dbms_Connection_hpp
+#define anna_dbms_Connection_hpp
+
+#include <anna/comm/Resource.hpp>
+
+#include <anna/dbms/DatabaseException.hpp>
+#include <anna/dbms/ResultCode.hpp>
+
+namespace anna {
+
+namespace xml {
+class Node;
+}
+
+namespace dbms {
+
+class Database;
+class Statement;
+
+/**
+ Clase que modela la conexion con la base de datos.
+
+ Para crear una nueva conexion hay que invocar al Metodo Database::createConnection de la base de datos
+ contra la que deseamos establecer la conexion.
+
+ Para obtener una conexion a una determinada base de datos habria que instanciar dicha base de datos
+ e invocar al Metodo Database::createConnection. Independientemente del tipo de conexion particular que la base
+ de datos retorne, debemos asignarlo a un puntero de tipo anna::dbms::Connection.
+*/
+class Connection : public comm::Resource {
+public:
+ /**
+ Devuelve la instancia de la base de datos asociada a esta conexion.
+ */
+ Database& getDatabase() const throw() { return a_database; }
+
+ /**
+ * Devuelve el usuario con el que fué realizada esta conexión.
+ * \return el usuario con el que fué realizada esta conexión.
+ */
+ const std::string& getUser() const throw() { return a_user; }
+
+ /**
+ * Devuelve el password del usuario con el que fué realizada esta conexión.
+ * \return el password del usuario con el que fué realizada esta conexión.
+ */
+ const std::string& getPassword() const throw() { return a_password; }
+
+ /**
+ * Establece el password del usuario de esta conexión
+ * \param password Codigo de acceso del usuario.
+ */
+ void setPassword(const char* password) throw() { a_password = password; }
+
+ /**
+ Establece el periodo de grabacion de esta conexion. Damos la posibilidad de que la conexion confirme
+ cambios realizados hasta el momento sin que termine la seccion critica que debemos establecer antes
+ de usar la conexion.
+ \param maxCommitPending Numero de transacciones que pueden estar pedientes de confirmacion antes
+ de invocar a #commit. Un valor 0, desactiva el periodo.
+ \return El periodo de grabacion que habia antes de invocar a este metodo.
+ \warning La invocacion a este metodo debera hacerse con una seccion critica activada sobre la
+ esta conexion.
+ */
+ int setMaxCommitPending(const int maxCommitPending) throw() {
+ const int result = a_maxCommitPending;
+ a_maxCommitPending = maxCommitPending;
+ return result;
+ }
+
+ /**
+ Desactiva el indicador de que la conexion requiere una invocacion a #rollback.
+ \warning La invocacion a este metodo debera hacerse con una seccion critica activada sobre la
+ esta conexion.
+ */
+ void resetRollbackPending() throw() { a_rollbackPending = false; }
+
+ /**
+ Activa de forma externa el indicador de que la conexion requiere una invocacion a #rollback.
+ \warning La invocacion a este metodo debera hacerse con una seccion critica activada sobre la
+ esta conexion.
+ */
+ void activateRollbackPending() throw() { a_rollbackPending = true; }
+
+ /**
+ Ejecuta la sentencia recibida como parametro. Si la sentencia no tiene variables de salida consideraria
+ que es un comando \em update, \em insert o \em delete, lo cual, implica la invocacion automatica a los
+ #commit o #rollback cuando termine la seccion critica de esta conexion.
+
+ \param statement Sentencia que vamos a ejecuta
+
+ \return La estructura con el resultado de la ejecucion de la sentencia.
+
+ \warning La invocacion a este metodo debera hacerse con una seccion critica activada sobre la
+ esta conexion, por ejemplo:
+ \code
+ Guard guard (connection);
+ connection.execute (someStatement);
+ \endcode
+ */
+ ResultCode execute(Statement* statement) throw(RuntimeException, DatabaseException);
+
+ /**
+ Devuelve una cadena con la informacion referente a esta instancia.
+ @return Una cadena con la informacion referente a esta instancia.
+ */
+ virtual std::string asString() const throw();
+
+ /**
+ Devuelve un documento XML con la informacion referente a esta instancia.
+ \param parent Nodo XML del que debe colgar la informacion.
+ @return un documento XML con la informacion referente a esta instancia.
+ */
+ virtual xml::Node* asXML(xml::Node* parent) const throw();
+
+protected:
+ /**
+ Instancia de la base de datos asociada a esta conexion.
+ Coincidiria con la indicada en el constructor.
+ */
+ Database& a_database;
+ std::string a_user; /**< Nombre del usuario */
+ std::string a_password; /**< Clave de acceso del usuario. */
+
+ /**
+ Contructor.
+
+ @param database Instancia de la base de datos asociada a esta conexion.
+ @param name Nombre logico de la conexion.
+ @param user Nombre del usuario con el que realizamos la conexion.
+ @param password Codigo de acceso del usuario.
+ */
+ Connection(Database& database, const std::string& name, const char* user, const char* password) :
+ comm::Resource(name),
+ a_database(database),
+ a_user(user),
+ a_password(password),
+ a_lockingCounter(0),
+ a_commitPending(0),
+ a_rollbackPending(false),
+ a_maxCommitPending(0) {}
+
+ /**
+ Metodo que fija los cambios realizados en la ejecucion de los comandos SQL.
+ */
+ void commit() throw(RuntimeException, DatabaseException);
+
+ /**
+ Metodo que debemos re-escribir para descartar los cambios realizados sobre las tablas mediante
+ esta conexion.
+ */
+ void rollback() throw();
+
+ /**
+ Metodo que debemos re-escribir para hacer efectiva esta conexion.
+ */
+ virtual void open() throw(DatabaseException) = 0;
+
+ /**
+ Metodo que debemos re-escribir para cerrar la conexion.
+ */
+ virtual void close() throw() = 0;
+
+private:
+ int a_commitPending; // Numero de sentencias a las que no se han fijado cambios.
+ bool a_rollbackPending;
+ int a_maxCommitPending;
+ int a_lockingCounter;
+
+ Connection(const Connection&);
+
+ void initialize() throw(RuntimeException, DatabaseException);
+ void lock() throw(RuntimeException);
+ void unlock() throw();
+
+ virtual bool do_beginTransaction() throw(RuntimeException, DatabaseException) { return false;}
+ virtual void do_commit() throw(RuntimeException, DatabaseException) = 0;
+ virtual void do_rollback() throw() = 0;
+
+ friend class Database;
+};
+
+}
+}
+
+#endif