--- /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_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
+