--- /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 //
+
+
+#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();
+}
+