--- /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_Data_hpp
+#define anna_dbms_Data_hpp
+
+#include <string>
+
+#include <anna/config/defines.hpp>
+#include <anna/core/functions.hpp>
+#include <anna/core/RuntimeException.hpp>
+
+namespace anna {
+
+namespace dbms {
+
+class Bind;
+
+/**
+ Clase base para las variables de entrada/salida asociadas a las sentencias SQL.
+*/
+class Data {
+public:
+ struct Type {
+ enum _v {
+ Integer, /**< Numeros enteros */
+ String, /**< Cadenas de caracteres */
+ Float, /**< Número en coma flotante */
+ ShortBlock, /**< Tipos de dato RAW */
+ LongBlock, /**< Tipo de datos CLOB */
+ Date, /** Tipo de fecha (dependiendo del gestor de base de datos puede contener tambien la hora) */
+ TimeStamp /** Tipo para contener simultáneamente la fecha y la hora */
+ };
+ };
+
+ /**
+ Devuelve el tamano maximo de este dato que coincidiria con el indicado en el constructor.
+ \return El tamano maximo de este dato que coincidiria con el indicado en el constructor.
+ */
+ int getMaxSize() const throw() { return a_maxSize; }
+
+ /**
+ Devuelve el tipo de dato.
+ \return El tipo de datos.
+ */
+ Type::_v getType() const throw() { return a_type; }
+
+ /**
+ Devuelve el area de memoria asociada a esta variable.
+ */
+ void* getBuffer() throw() { return a_buffer; }
+
+ /**
+ Devuelve el indicador de nulo de esta instancia.
+ \return El indicador de nulo de esta instancia.
+ */
+ bool isNull() const throw() { return a_isNull; }
+
+ /**
+ Devuelve el valor que indica si este dato puede tomar valores nulos.
+ \return El valor que indica si este dato puede tomar valores nulos.
+ */
+ bool isNulleable() const throw() { return a_isNulleable; }
+
+ /**
+ Establece el indicador de nulo de esta instancia.
+ \param isNull Indicador de nulo de esta instancia.
+ \warning Slo tendr�efecto en caso de haber indicado en el constructor que
+ el dato puede tomar valores nulos.
+ */
+ void setNull(const bool isNull) throw() { if(a_isNulleable == true) a_isNull = isNull; }
+
+ /**
+ Incorpora el método clear para todos tipos de datos con lo que podemos obtener información
+ del medio físico.
+
+ Si el dato está definido como "nuleable" activará el indicador que indica que el dato está vacío,
+ en otro caso se asignará un valor adecuado dependiendo del tipo del dato, cero para los números,
+ "" para las cadenas, etc.
+ */
+ void clear() throw() {
+ setNull(true);
+ do_clear();
+ }
+
+ /**
+ 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();
+
+protected:
+ /**
+ Constructor.
+ \param type Tipo de dato de esta instancia.
+ \param maxSize Tamao maximo que puede tener este dato. Deberia coincidir con el indicado
+ por la columna con la que vaya a corresponder en la sentencia.
+ \param isNulleable Indica si el dato puede tomar valores nulos.
+
+ \warning los tipos de datos complejos deberia reimplementar los metodos #code and #decode.
+ */
+ explicit Data(const Type::_v type, const int maxSize, const bool isNulleable) :
+ a_type(type),
+ a_maxSize(maxSize),
+ a_isNulleable(isNulleable),
+ a_isNull(isNulleable),
+ a_buffer(NULL)
+ {;}
+
+ /**
+ Constructor copia.
+ \param other Instancia de la que copiar.
+ */
+ Data(const Data& other) :
+ a_type(other.a_type),
+ a_maxSize(other.a_maxSize),
+ a_isNulleable(other.a_isNulleable),
+ a_isNull(other.a_isNull),
+ a_buffer(other.a_buffer)
+ {;}
+
+ /**
+ Establece el area de memoria asociada a esta variable.
+ \param buffer Direccion de memoria donde comienza el contenido esta variable.
+ */
+ void setBuffer(void* buffer) throw() { a_buffer = buffer; }
+
+private:
+ const Type::_v a_type;
+ const int a_maxSize;
+ const bool a_isNulleable;
+ void* a_buffer;
+ bool a_isNull;
+
+ virtual void do_clear() throw() = 0;
+};
+
+}
+}
+
+#endif
+