--- /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_ResultCode_hpp
+#define anna_dbms_ResultCode_hpp
+
+#include <string>
+
+#include <string.h>
+
+#include <stdlib.h>
+
+#include <anna/config/defines.hpp>
+#include <anna/core/RuntimeException.hpp>
+
+namespace anna {
+
+namespace dbms {
+
+/**
+ Clase para acceder a la informacion devuelta por el gestor de base de datos
+ referente al ultimo comando realizado.
+ */
+class ResultCode {
+public:
+ /**
+ Constructor vacio.
+ \warning Antes de usarse debe asignarse a algun otro ResultCode obtenido mediante la invocacion
+ a anna::dbms::Connection::execute.
+ */
+ ResultCode() : a_errorText(NULL), a_errorDecoder(NULL), a_errorCode(0) {;}
+
+ /**
+ Constructor copia.
+ @param other Instancia de la que copiar los datos.
+ */
+ ResultCode(const ResultCode& other) :
+ a_errorText(NULL),
+ a_errorDecoder(other.a_errorDecoder) {
+ set(other.a_errorCode, other.a_errorText);
+ }
+
+ /**
+ Destructor.
+ */
+ virtual ~ResultCode() { if(a_errorText != NULL) free(a_errorText); }
+
+ /**
+ Devuelve el codigo de error del ultimo comando ejecutado contra la base de datos.
+ @return El codigo de error del ultimo comando ejecutado contra la base de datos.
+ */
+ int getErrorCode() const throw() { return a_errorCode; }
+
+ /**
+ Devuelve el texto del error del ultimo comando ejecutado contra la base de datos.
+ @return El texto del error del ultimo comando ejecutado contra la base de datos.
+ */
+ const char* getErrorText() const throw() { return (a_errorText != NULL) ? a_errorText : ""; }
+
+ // Operadores
+ /**
+ Operador copia.
+ @param resultCode Instancia a copiar.
+ @return Una instancia de si mismo.
+ */
+ ResultCode& operator = (const ResultCode& resultCode)
+ throw() {
+ if(this != &resultCode) {
+ a_errorDecoder = resultCode.a_errorDecoder;
+ set(resultCode.a_errorCode, resultCode.a_errorText);
+ }
+
+ return *this;
+ }
+
+ /**
+ Devuelve \em true si las condiciones de busqueda de la ultimo operacion
+ no han sido satisfechas por ningun registro o \em false en otro caso.
+ @return \em true si las condiciones de busqueda de la ultimo operacion
+ no han sido satisfechas por ningun registro o \em false en otro caso.
+ */
+ bool notFound() const throw(anna::RuntimeException);
+
+ /**
+ Devuelve \em true si la ultima operacion solicitada fue realizada correctamente
+ o \em false en otro caso.
+ @return \em true si la ultima operacion solicitada fue realizada correctamente
+ o \em false en otro caso.
+ */
+ bool successful() const throw(anna::RuntimeException);
+
+ /**
+ Devuelve \em true Si el registro obtenenido en una sentencia de seleccion con indicador
+ de modo exclusivo ha sido bloqueada previamente por otro proceso y/o contexto de base de
+ datos o \em false en otro caso.
+ @return \em true Si el registro obtenenido en una sentencia de seleccion con indicador
+ de modo exclusivo ha sido bloqueada previamente por otro proceso y/o contexto de base de
+ datos o \em false en otro caso.
+ */
+ bool locked() const throw(anna::RuntimeException);
+
+ /**
+ Devuelve \em true si se perdio la conexion la base de datos o \em false en otro caso.
+ @return \em true si se perdio la conexion la base de datos o \em false en otro caso.
+ */
+ bool lostConnection() const throw(anna::RuntimeException);
+
+ /**
+ Devuelve una cadena con la informacion sobre esta clase.
+ \return Una cadena con la informacion sobre esta clase.
+ */
+ std::string asString() const throw();
+
+protected:
+ static const int MaxErrorLen = 512;
+
+ /**
+ Decodificador del error devuelto por el RDBMS concreto que estemos usando.
+ \warning Exclusivamente uso interno.
+ */
+ class ErrorDecoder {
+ public:
+ virtual bool notFound(const int errorCode) const throw() = 0;
+ virtual bool successful(const int errorCode) const throw() = 0;
+ virtual bool locked(const int errorCode) const throw() = 0;
+ virtual bool lostConnection(const int errorCode) const throw() = 0;
+ };
+
+ /**
+ Constructor.
+
+ \param errorCode Codigo de error asociado a la ultima operacion realizada contra la base de datos.
+ \param errorText Texto asociado al error de ultima operacion realizada contra la base de datos. Puede ser
+ NULL si no hay ningun texto de error asociado al codigo recibido.
+ \param errorDecoder Decofidicador de errores.
+ */
+ ResultCode(const int errorCode, const char* errorText, const ErrorDecoder* errorDecoder) :
+ a_errorText(NULL),
+ a_errorDecoder(errorDecoder) {
+ set(errorCode, errorText);
+ }
+
+ /**
+ Establece el contenido de esta clase.
+
+ \param errorCode Codigo de error asociado a la ultima operacion realizada contra la base de datos.
+ \param errorText Texto asociado al error de ultima operacion realizada contra la base de datos.
+ */
+ void set(const int errorCode, const char* errorText)
+ throw() {
+ a_errorCode = errorCode;
+ copy(errorText);
+ }
+
+private:
+ int a_errorCode;
+ char* a_errorText;
+ const ErrorDecoder* a_errorDecoder;
+
+ void copy(const char* text) throw();
+};
+
+}
+}
+
+#endif
+