X-Git-Url: https://git.teslayout.com/public/public/public/?a=blobdiff_plain;f=source%2Fdbms.mysql%2FBaseBind.cpp;fp=source%2Fdbms.mysql%2FBaseBind.cpp;h=b91ca85bcc479549e8a30bc4c7fd58f72dbfd426;hb=78be86969d2f26a9084b0c4af6ce43d5fa4ed3fd;hp=0000000000000000000000000000000000000000;hpb=a3b95648bd76140ef55e0b5941d423eee6c3856f;p=anna.git diff --git a/source/dbms.mysql/BaseBind.cpp b/source/dbms.mysql/BaseBind.cpp new file mode 100644 index 0000000..b91ca85 --- /dev/null +++ b/source/dbms.mysql/BaseBind.cpp @@ -0,0 +1,107 @@ +// 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 + +#include + +#include +#include + +#include + +using namespace std; +using namespace anna; + +//---------------------------------------------------------------------------- +// (1) Reserva 2 Kbytes para trabajar con el LOB. +//---------------------------------------------------------------------------- +dbms::mysql::BaseBind::BaseBind(const dbms::Data& data) : + a_type(data.getType()), + a_time(NULL) { + switch(a_type) { + case Data::Type::ShortBlock: + case Data::Type::LongBlock: + break; + case Data::Type::Date: // (1) + case Data::Type::TimeStamp: + a_time = new MYSQL_TIME; + break; + default: break; + } +} + +dbms::mysql::BaseBind::~BaseBind() { + delete a_time; +} + +/** + * SegĂșn http://dev.mysql.com/doc/refman/4.1/en/c-api-prepared-statement-datatypes.html + * y el truco para recoger BLOB's http://dev.mysql.com/doc/refman/4.1/en/mysql-stmt-fetch.html. + */ +void dbms::mysql::BaseBind::setupBind(st_mysql_bind& bind, dbms::Data& data) +throw(RuntimeException) { + anna_memset(&bind, 0, sizeof(bind)); + bind.is_null = &a_nullIndicator; + a_length = 0; + + switch(a_type) { + case Data::Type::Integer: + bind.buffer_type = MYSQL_TYPE_LONG; + bind.buffer_length = data.getMaxSize(); + bind.length = &a_length; + bind.buffer = const_cast (data).getBuffer(); + bind.is_unsigned = false; + break; + case Data::Type::String: + bind.buffer_type = MYSQL_TYPE_STRING; + bind.buffer_length = data.getMaxSize(); + bind.length = &a_length; + bind.buffer = const_cast (data).getBuffer(); + break; + case Data::Type::Float: + bind.buffer_type = MYSQL_TYPE_FLOAT; + bind.buffer_length = data.getMaxSize(); + bind.length = &a_length; + bind.buffer = const_cast (data).getBuffer(); + break; + case Data::Type::Date: // (1) + bind.buffer_type = MYSQL_TYPE_DATE; + bind.buffer_length = sizeof(MYSQL_TIME); + bind.length = &a_length; + bind.buffer = (char*) a_time; + break; + case Data::Type::TimeStamp: + bind.buffer_type = MYSQL_TYPE_DATETIME; + bind.buffer_length = sizeof(MYSQL_TIME); + bind.length = &a_length; + bind.buffer = (char*) a_time; + break; + case Data::Type::ShortBlock: + + if((bind.buffer_length = data.getMaxSize()) < MaxBlobSize) { + bind.buffer_type = MYSQL_TYPE_BLOB; + bind.length = &a_length; + bind.buffer = const_cast (data).getBuffer(); + } else { + string msg(data.asString()); + msg += functions::asString(" | Over maximum size: %d/%d", data.getMaxSize(), MaxBlobSize); + throw RuntimeException(msg, ANNA_FILE_LOCATION); + } + + break; + case Data::Type::LongBlock: + /** + * El tratamiento particular se realiza en las clases InputBind y OutputBind. + */ + break; + default: + throw RuntimeException(functions::asString("Unsupported data type %d", (int) a_type), ANNA_FILE_LOCATION); + } +} +