Revert "Remove mysql and oracle resources for anna-ericsson project"
[anna.git] / include / anna / dbms / Delivery.hpp
diff --git a/include/anna/dbms/Delivery.hpp b/include/anna/dbms/Delivery.hpp
new file mode 100644 (file)
index 0000000..6cd4603
--- /dev/null
@@ -0,0 +1,79 @@
+// 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_Delivery_hpp
+#define anna_dbms_Delivery_hpp
+
+#include <anna/comm/Delivery.hpp>
+
+namespace anna {
+
+namespace dbms {
+
+class Connection;
+
+/**
+   Agrupacion logica de conexiones con la base de datos. Reparte la carga de las transacciones contra
+   la base de datos entre las distintas conexiones que contenga esta instancia. Ademas en caso de estar
+   en una ejecucion con soporte para multithread (ver anna::functions::supportMultithread) asegura
+   que cada uno de los threads siempre utiliza la misma conexion lo cual asegura el mantinimiento de la
+   integridad de cada una de las transacciones de los threads.
+*/
+class Delivery : comm::Delivery {
+public:
+  /**
+     Constructor.
+     @param name Nombre logico de este grupo de conexiones.
+  */
+  Delivery(const char *name) : comm::Delivery(name) {;}
+
+  /**
+     Crea automaticamente las conexiones a la base de datos recibida como parametro con el usuario/password
+     indicado.
+     \param database Instancia de la base de datos contra la que realizamos la conexion.
+     \param prefixName Prefijo del nombre logico de la conexiones que vamos a crear. El resto del nombre vendra
+     dado por el numero secuencial de la conexion.
+     \param user Nombre del usuario con el que realizamos la conexion.
+     \param password Codigo de acceso del usuario.
+     \param n Numero de conexion a crear.
+     \warning Recordar que el numero maximo de conexiones a una base de datos esta limitado por Database::maxConnection.
+  */
+  void createConnections(Database& database, const char* prefixName, const char* user, const char* password, const int n)
+  throw(RuntimeException, DatabaseException);
+
+  /**
+     Incorpora al conexion recibida como parametro a la agrupacion logica.
+     \param connection Conexion que vamos a incorporar a la agrupacion logica.
+  */
+  void addConnection(Connection* connection) throw(RuntimeException) {
+    this->add(connection);
+    a_iiConnection = this->begin();
+  }
+
+  /**
+     Devuelve la instancia de la conexion a base de datos con la que debemos trabajar.
+     @return la instancia de la conexion a base de datos con la que debemos trabajar.
+     \warning La conexion debe ser bloqueada por el Thread que la recibe (ver anna::Guard) para asegurar que
+     cualquier otro thread que intente acceder a ella queda bloqueado a la espera de que terminemos de
+     trabajar sobre ella.
+  */
+  Connection& getConnection() throw(RuntimeException);
+
+private:
+  iterator a_iiConnection;
+
+  void do_initialize() throw() { a_iiConnection = begin(); }
+  comm::Resource* do_apply() throw(RuntimeException);
+  static Connection* connection(iterator& ii) { return (Connection*) comm::Delivery::resource(ii); }
+
+};
+
+}
+}
+
+#endif