ef23bf3e405cd32457b2c20b78b7cd7e4e01d5ec
[anna.git] / ResultCode.hpp
1 // ANNA - Anna is Not Nothingness Anymore                                                         //
2 //                                                                                                //
3 // (c) Copyright 2005-2015 Eduardo Ramos Testillano & Francisco Ruiz Rayo                         //
4 //                                                                                                //
5 // See project site at http://redmine.teslayout.com/projects/anna-suite                           //
6 // See accompanying file LICENSE or copy at http://www.teslayout.com/projects/public/anna.LICENSE //
7
8
9 #ifndef anna_dbms_ResultCode_hpp
10 #define anna_dbms_ResultCode_hpp
11
12 #include <string>
13
14 #include <string.h>
15
16 #include <stdlib.h>
17
18 #include <anna/config/defines.hpp>
19 #include <anna/core/RuntimeException.hpp>
20
21 namespace anna {
22
23 namespace dbms {
24
25 /**
26    Clase para acceder a la informacion devuelta por el gestor de base de datos
27    referente al ultimo comando realizado.
28  */
29 class ResultCode {
30 public:
31   /**
32      Constructor vacio.
33      \warning Antes de usarse debe asignarse a algun otro ResultCode obtenido mediante la invocacion
34      a anna::dbms::Connection::execute.
35   */
36   ResultCode() : a_errorText(NULL), a_errorDecoder(NULL), a_errorCode(0) {;}
37
38   /**
39      Constructor copia.
40      @param other Instancia de la que copiar los datos.
41   */
42   ResultCode(const ResultCode& other)  :
43     a_errorText(NULL),
44     a_errorDecoder(other.a_errorDecoder) {
45     set(other.a_errorCode, other.a_errorText);
46   }
47
48   /**
49      Destructor.
50   */
51   virtual ~ResultCode() { if(a_errorText != NULL) free(a_errorText); }
52
53   /**
54      Devuelve el codigo de error del ultimo comando ejecutado contra la base de datos.
55      @return El codigo de error del ultimo comando ejecutado contra la base de datos.
56   */
57   int getErrorCode() const { return a_errorCode; }
58
59   /**
60      Devuelve el texto del error del ultimo comando ejecutado contra la base de datos.
61      @return El texto del error del ultimo comando ejecutado contra la base de datos.
62   */
63   const char* getErrorText() const { return (a_errorText != NULL) ? a_errorText : ""; }
64
65   // Operadores
66   /**
67      Operador copia.
68      @param resultCode Instancia a copiar.
69      @return Una instancia de si mismo.
70   */
71   ResultCode& operator = (const ResultCode& resultCode)
72   {
73     if(this != &resultCode) {
74       a_errorDecoder = resultCode.a_errorDecoder;
75       set(resultCode.a_errorCode, resultCode.a_errorText);
76     }
77
78     return *this;
79   }
80
81   /**
82      Devuelve \em true si las condiciones de busqueda de la ultimo operacion
83      no han sido satisfechas por ningun registro o \em false en otro caso.
84      @return \em true si las condiciones de busqueda de la ultimo operacion
85      no han sido satisfechas por ningun registro o \em false en otro caso.
86   */
87   bool notFound() const noexcept(false);
88
89   /**
90      Devuelve \em true si la ultima operacion solicitada fue realizada correctamente
91      o \em false en otro caso.
92      @return \em true si la ultima operacion solicitada fue realizada correctamente
93      o \em false en otro caso.
94   */
95   bool successful() const noexcept(false);
96
97   /**
98      Devuelve \em true Si el registro obtenenido en una sentencia de seleccion con indicador
99      de modo exclusivo ha sido bloqueada previamente por otro proceso y/o contexto de base de
100      datos o \em false en otro caso.
101      @return \em true Si el registro obtenenido en una sentencia de seleccion con indicador
102      de modo exclusivo ha sido bloqueada previamente por otro proceso y/o contexto de base de
103      datos o \em false en otro caso.
104   */
105   bool locked() const noexcept(false);
106
107   /**
108      Devuelve \em true si se perdio la conexion la base de datos o \em false en otro caso.
109      @return \em true si se perdio la conexion la base de datos o \em false en otro caso.
110   */
111   bool lostConnection() const noexcept(false);
112
113   /**
114      Devuelve una cadena con la informacion sobre esta clase.
115      \return Una cadena con la informacion sobre esta clase.
116   */
117   std::string asString() const ;
118
119 protected:
120   static const int MaxErrorLen = 512;
121
122   /**
123      Decodificador del error devuelto por el RDBMS concreto que estemos usando.
124      \warning Exclusivamente uso interno.
125   */
126   class ErrorDecoder {
127   public:
128     virtual bool notFound(const int errorCode) const  = 0;
129     virtual bool successful(const int errorCode) const  = 0;
130     virtual bool locked(const int errorCode) const  = 0;
131     virtual bool lostConnection(const int errorCode) const  = 0;
132   };
133
134   /**
135      Constructor.
136
137      \param errorCode Codigo de error asociado a la ultima operacion realizada contra la base de datos.
138      \param errorText Texto asociado al error de ultima operacion realizada contra la base de datos. Puede ser
139      NULL si no hay ningun texto de error asociado al codigo recibido.
140      \param errorDecoder Decofidicador de errores.
141   */
142   ResultCode(const int errorCode, const char* errorText, const ErrorDecoder* errorDecoder) :
143     a_errorText(NULL),
144     a_errorDecoder(errorDecoder) {
145     set(errorCode, errorText);
146   }
147
148   /**
149      Establece el contenido de esta clase.
150
151      \param errorCode Codigo de error asociado a la ultima operacion realizada contra la base de datos.
152      \param errorText Texto asociado al error de ultima operacion realizada contra la base de datos.
153   */
154   void set(const int errorCode, const char* errorText)
155   {
156     a_errorCode = errorCode;
157     copy(errorText);
158   }
159
160 private:
161   int a_errorCode;
162   char* a_errorText;
163   const ErrorDecoder* a_errorDecoder;
164
165   void copy(const char* text) ;
166 };
167
168 }
169 }
170
171 #endif
172