Revert "Remove mysql and oracle resources for anna-ericsson project"
[anna.git] / source / dbms.mysql / InputBind.cpp
diff --git a/source/dbms.mysql/InputBind.cpp b/source/dbms.mysql/InputBind.cpp
new file mode 100644 (file)
index 0000000..edfb2d3
--- /dev/null
@@ -0,0 +1,110 @@
+// 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 //
+
+
+#include <time.h>
+
+#include <mysql/mysql.h>
+
+#include <anna/config/defines.hpp>
+#include <anna/core/functions.hpp>
+#include <anna/core/DataBlock.hpp>
+#include <anna/core/tracing/Logger.hpp>
+
+#include <anna/dbms/String.hpp>
+#include <anna/dbms/ShortBlock.hpp>
+#include <anna/dbms/Date.hpp>
+#include <anna/dbms/TimeStamp.hpp>
+#include <anna/dbms/LongBlock.hpp>
+
+#include <anna/dbms.mysql/mysql.hpp>
+
+using namespace std;
+using namespace anna;
+
+InputBind::InputBind(const char* name, dbms::Data&  data) :
+  dbms::InputBind(name, data),
+  BaseBind(data) {
+}
+
+InputBind::~InputBind() {
+}
+
+/*
+ * Completa la informacion establececida por el setupBind.
+ */
+void InputBind::prepare(anna::dbms::Statement* dbmsStmt, anna::dbms::Connection*, const int pos)
+throw(RuntimeException) {
+  st_mysql_bind* bind = static_cast <dbms::mysql::Statement*>(dbmsStmt)->getBindParams() + pos;
+  Data& data = anna::dbms::Bind::getData();
+  BaseBind::setupBind(*bind, data);
+
+  if(data.getType() == Data::Type::LongBlock) {
+    DataBlock& dataBlock = static_cast <dbms::LongBlock&>(data).getValue();
+    bind->buffer_type = MYSQL_TYPE_BLOB;
+    bind->buffer_length = dataBlock.getSize();
+    bind->buffer = (char*) dataBlock.getData();
+    bind->length = &a_length;
+  }
+}
+
+/*
+ * Se invoca desde anna::dbms::mysql::Statement::execute.
+ * Codificar� la informaci�n C++ de forma que encaje en las estructuras requeridas por el API de MySQL.
+ */
+void InputBind::code() const
+throw(RuntimeException) {
+  InputBind* _this = const_cast <InputBind*>(this);
+  Data& data = _this->getData();
+
+  if((_this->a_nullIndicator = data.isNull() ? true : false) == true)
+    return;
+
+  switch(data.getType()) {
+  case Data::Type::String:
+    _this->a_length = anna_strlen((char*)(static_cast <dbms::String&>(data).getBuffer()));
+    break;
+  case Data::Type::Date:
+  case Data::Type::TimeStamp:
+    _this->codeDate(data);
+    break;
+  case Data::Type::Integer:
+    throw RuntimeException("anna::dbms::mysql::InputBind::code not implemented for Data::Type::Integer", ANNA_FILE_LOCATION);
+    break;
+  case Data::Type::Float:
+    throw RuntimeException("anna::dbms::mysql::InputBind::code not implemented for Data::Type::Float", ANNA_FILE_LOCATION);
+    break;
+  case Data::Type::ShortBlock:
+    throw RuntimeException("anna::dbms::mysql::InputBind::code not implemented for Data::Type::ShortBlock", ANNA_FILE_LOCATION);
+    break;
+  case Data::Type::LongBlock:
+    throw RuntimeException("anna::dbms::mysql::InputBind::code not implemented for Data::Type::LongBlock", ANNA_FILE_LOCATION);
+    break;
+
+  }
+}
+
+/**
+ * El bind.buffer ha sido asociado a una estructura de tipo MYSQL_TIME (a_time), cuyos valores vamos
+ * a establecer en �ste m�todo.
+ */
+void InputBind::codeDate(dbms::Data& data)
+throw() {
+  dbms::Date& date = static_cast <dbms::Date&>(data);
+
+  if(data.getType() == Data::Type::TimeStamp) {
+    a_time->second_part = static_cast <dbms::TimeStamp&>(data).getFractionalSecond();
+  }
+
+  a_time->year = date.getYear();
+  a_time->month = date.getMonth();
+  a_time->day = date.getDay();
+  a_time->hour = date.getHour();
+  a_time->minute = date.getMinute();
+  a_time->second = date.getSecond();
+}
+