9ddafed4b9b8d6d73d9e818f46ab8137d2622868
[anna.git] / include / anna / dbms / Data.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_Data_hpp
10 #define anna_dbms_Data_hpp
11
12 #include <string>
13
14 #include <anna/config/defines.hpp>
15 #include <anna/core/functions.hpp>
16 #include <anna/core/RuntimeException.hpp>
17
18 namespace anna {
19
20 namespace dbms {
21
22 class Bind;
23
24 /**
25    Clase base para las variables de entrada/salida asociadas a las sentencias SQL.
26 */
27 class Data  {
28 public:
29   struct Type {
30     enum _v {
31       Integer, /**< Numeros enteros */
32       String,  /**< Cadenas de caracteres */
33       Float, /**< Número en coma flotante */
34       ShortBlock,  /**< Tipos de dato RAW */
35       LongBlock,  /**< Tipo de datos CLOB */
36       Date, /** Tipo de fecha (dependiendo del gestor de base de datos puede contener tambien la hora) */
37       TimeStamp /** Tipo para contener simultáneamente la fecha y la hora */
38     };
39   };
40
41   /**
42      Devuelve el tamano maximo de este dato que coincidiria con el indicado en el constructor.
43      \return El tamano maximo de este dato que coincidiria con el indicado en el constructor.
44   */
45   int getMaxSize() const { return a_maxSize; }
46
47   /**
48      Devuelve el tipo de dato.
49      \return El tipo de datos.
50   */
51   Type::_v getType() const { return a_type; }
52
53   /**
54      Devuelve el area de memoria asociada a esta variable.
55   */
56   void* getBuffer() { return a_buffer; }
57
58   /**
59      Devuelve el indicador de nulo de esta instancia.
60      \return El indicador de nulo de esta instancia.
61   */
62   bool isNull() const { return a_isNull; }
63
64   /**
65      Devuelve el valor que indica si este dato puede tomar valores nulos.
66      \return El valor que indica si este dato puede tomar valores nulos.
67   */
68   bool isNulleable() const { return a_isNulleable; }
69
70   /**
71      Establece el indicador de nulo de esta instancia.
72      \param isNull Indicador de nulo de esta instancia.
73      \warning Slo tendr�efecto en caso de haber indicado en el constructor que
74      el dato puede tomar valores nulos.
75   */
76   void setNull(const bool isNull) { if(a_isNulleable == true) a_isNull = isNull; }
77
78   /**
79      Incorpora el método clear para todos tipos de datos con lo que podemos obtener información
80      del medio físico.
81
82      Si el dato está definido como "nuleable" activará el indicador que indica que el dato está vacío,
83      en otro caso se asignará un valor adecuado dependiendo del tipo del dato, cero para los números,
84      "" para las cadenas, etc.
85   */
86   void clear() {
87     setNull(true);
88     do_clear();
89   }
90
91   /**
92      Devuelve una cadena con la informacion referente a esta instancia.
93      @return Una cadena con la informacion referente a esta instancia.
94   */
95   virtual std::string asString() const ;
96
97 protected:
98   /**
99      Constructor.
100      \param type Tipo de dato de esta instancia.
101      \param maxSize Tamao maximo que puede tener este dato. Deberia coincidir con el indicado
102      por la columna con la que vaya a corresponder en la sentencia.
103      \param isNulleable Indica si el dato puede tomar valores nulos.
104
105      \warning los tipos de datos complejos deberia reimplementar los metodos #code and #decode.
106   */
107   explicit Data(const Type::_v type, const int maxSize, const bool isNulleable) :
108     a_type(type),
109     a_maxSize(maxSize),
110     a_isNulleable(isNulleable),
111     a_isNull(isNulleable),
112     a_buffer(NULL)
113   {;}
114
115   /**
116      Constructor copia.
117      \param other Instancia de la que copiar.
118   */
119   Data(const Data& other) :
120     a_type(other.a_type),
121     a_maxSize(other.a_maxSize),
122     a_isNulleable(other.a_isNulleable),
123     a_isNull(other.a_isNull),
124     a_buffer(other.a_buffer)
125   {;}
126
127   /**
128      Establece el area de memoria asociada a esta variable.
129      \param buffer Direccion de memoria donde comienza el contenido esta variable.
130   */
131   void setBuffer(void* buffer) { a_buffer = buffer; }
132
133 private:
134   const Type::_v a_type;
135   const int a_maxSize;
136   const bool a_isNulleable;
137   void* a_buffer;
138   bool a_isNull;
139
140   virtual void do_clear()  = 0;
141 };
142
143 }
144 }
145
146 #endif
147