--- /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_functions_hpp
+#define anna_dbms_functions_hpp
+
+#include <anna/core/RuntimeException.hpp>
+
+namespace anna {
+namespace dbms {
+class Connection;
+}
+}
+
+namespace anna {
+namespace dbms {
+
+using namespace anna;
+
+
+/**
+ Métodos usados habitualmente para trabajar contra la base de datos.
+*/
+struct functions {
+public:
+ /**
+ * Este metodo asegura la integridad entre el esquema de tablas instalado y el esperado por los procesos de un proyecto.
+ * Para ello cada uno de los proyectos debe invocar a este método indicado los parámetro requeridos. Es imprescindible
+ * que la versión esperada del esquema de base de datos esté definida en una única variable centralizada.
+ *
+ * La idea es que cada vez que hagamos un cambio en la estructura de tablas de una cierta entidad cambiemos la versión
+ * del esquema, y ese cambio deberá reflejarse en la invocación a este nuevo método.
+ *
+ * Este método lanzará una excepción si el último parche instalado en el esquema de base de datos no coincide
+ * con el valor de la variable \em requiredPatch.
+ *
+ * Cada proceso debe invocar la comprobación de esquema en cuanto la base de datos tenga una conexión disponible, de forma
+ * que si el esquema de base de datos no coincide con el esperado el proceso mostrará un error indicado el esquema de base
+ * de datos esperado y el esquema de base datos instalado.
+ *
+ * Para usar este método el esquema de base de nuestro proyecto debe disponer de una tabla que debe contener, al menos,
+ * la siguiente estructura:
+ *
+ * \code
+ * -- Ejemplo de creación para Oracle(tm)
+ * create table axe_dataScheme (
+ * id varchar(8) not null,
+ * installation_date date default sysdate not null
+ * );
+ *
+ * alter table axe_dataScheme add constraint axe_dataScheme_pk primary key (id);
+ *
+ * \endcode
+ *
+ * \code
+ * -- Ejemplo de creación para PostgreSQL
+ * create table data_scheme (
+ * id varchar(8) not null,
+ * installation_date timestamp default now (),
+ * primary key (id)
+ * );
+ * \endcode
+ *
+ * El nombre de la tabla y los campos de las columnas podrían ser distintos ya que este método los recibe como parámetros.
+ *
+ * Un ejemplo de implementación podría ser:
+ *
+ * \code
+ * //static
+ * void axe::storage::functions::verifyDataScheme (dbms::Connection& connection)
+ * throw (RuntimeException)
+ * {
+ * anna::dbms::functions::verifyDataScheme (connection, "axe_dataScheme", "v1.3");
+ * }
+ * \endcode
+ *
+ * \param connection Conexión usada para acceder a los datos.
+ * \param tableName Nombre de la tabla que contiene las versiones instaladas.
+ * \param requiredPatch Identificador de parche de base de base de datos requerido por los procesos de nuestro proyecto.
+ * Este indicador debería estar definido en un único punto para todo nuestro proyecto.
+ * \param columnID Nombre de la columna que contiene el identificador de cada uno de los parches instalados.
+ * \param columnDate Nombre de la columna que contiene la fecha de instalación de cada parche.
+ */
+ static void verifyDataScheme(dbms::Connection& connection, const char* tableName, const char* requiredPatch, const char* columnID = "id", const char* columnDate = "installation_date")
+ throw(RuntimeException);
+};
+
+}
+}
+
+#endif