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