Revert "Remove mysql and oracle resources for anna-ericsson project"
[anna.git] / include / anna / dbms / Sentence.hpp
diff --git a/include/anna/dbms/Sentence.hpp b/include/anna/dbms/Sentence.hpp
new file mode 100644 (file)
index 0000000..39d045e
--- /dev/null
@@ -0,0 +1,122 @@
+// 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_Sentence_hpp
+#define anna_dbms_Sentence_hpp
+
+#include <anna/core/mt/Mutex.hpp>
+
+#include <anna/dbms/ResultCode.hpp>
+
+namespace anna {
+
+namespace xml {
+class Node;
+}
+
+namespace dbms {
+
+class Database;
+class Connection;
+class Statement;
+
+/**
+   Clase que facilita la ejecucion de sentencias SQL compuestas y la comprobacion de errores ya que
+   solo devuelve excepciones de tipo anna::RuntimeException.
+*/
+class Sentence : public Mutex {
+public:
+  /**
+     Modos de actuar cuando se detecta un error en la ejecucion de las sentencias SQL.
+     \see Sentence
+  */
+  struct Mode { enum _v { ExceptionWhenNotFound, SilentWhenNotFound }; };
+
+  /**
+     Ejecuta la sentencia SQL asociada a este instancia. Antes de invocar a este metodo debemos
+     activar una seccion critica sobre esta instancia.
+     \param connection Conexion usada para ejecutar la sentencia. Debe tener activa una seccion critica.
+  */
+  virtual dbms::ResultCode execute(dbms::Connection& connection) throw(RuntimeException) {
+    return execute(connection, a_dbStatement);
+  }
+
+  /**
+     Devuelve el nombre de la sentencia SQL asociada a esta instancia.
+     \return El nombre de la sentencia SQL asociada a esta instancia.
+     \warning Si todavia no tiene nombre asociado devolvera una cadena vacia.
+  */
+  const std::string& getName() const throw();
+
+  /**
+     Inicializa el estado de esta instancia
+     \param database Instancia de la base de datos usada para definir las sentencias SQL que componen esta
+     instancia.
+  */
+  void initialize(dbms::Database& database) throw(RuntimeException);
+
+  /**
+     Transfiere un registro desde la base de datos a las variables del entorno C++.
+     \return \em false si no hay mas registros o \em true en caso contrario.
+  */
+  bool fetch() throw(RuntimeException);
+
+  /**
+     Transfiere un registro desde la base de datos a las variables del entorno C++.
+     \param resultCode Variable que contiene el resultado de invocar a anna::dbms::Sentence::execute
+     \return \em false si no hay mas registros o \em true en caso contrario.
+  */
+  bool fetch(const ResultCode& resultCode) throw(RuntimeException) {
+    return (resultCode.successful() == true) ? fetch() : false;
+  }
+
+  /**
+     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 dependerá la información referente a esta instancia.
+     \return un documento XML con la informacion referente a esta instancia.
+  */
+  virtual xml::Node* asXML(xml::Node* parent) const throw();
+
+protected:
+  /**
+     Constructor.
+     \param mode Modo de actuacion en caso de detectar errores.
+  */
+  Sentence(const Mode::_v mode = Mode::ExceptionWhenNotFound) :
+    a_mode(mode), a_dbStatement(NULL)
+  {;}
+
+  /**
+     Ejecuta la sentencia SQL asociada a este instancia.
+     \param connection Conexion usada para ejecutar la sentencia. Debe tener activa una seccion critica.
+     \param statement Sentencia a ejecutar.
+  */
+  dbms::ResultCode execute(dbms::Connection& connection, dbms::Statement* statement) throw(RuntimeException);
+
+  /**
+     Metodo que debe inicializar las sentencias asociadas a esta instancia (valores de entrada y salida).
+     \return Retorna la instancia de la sentencia asociada a esta instancia debidamente inicializada.
+  */
+  virtual dbms::Statement* do_initialize(dbms::Database&) throw(RuntimeException) = 0;
+
+private:
+  const Mode::_v a_mode;
+  dbms::Statement* a_dbStatement;
+};
+
+}
+}
+
+#endif
+