Revert "Remove mysql and oracle resources for anna-ericsson project"
[anna.git] / include / anna / dbms / ResultCode.hpp
diff --git a/include/anna/dbms/ResultCode.hpp b/include/anna/dbms/ResultCode.hpp
new file mode 100644 (file)
index 0000000..6489594
--- /dev/null
@@ -0,0 +1,172 @@
+// 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
+