data housekeeping

- removed naked pointers from Data interfaces
- fixed GH #82: name conflict in Data::Keywords::bind
- fixed GH #157: MySQL: cannot bind to 'long' data type on
Windows/Visual C++
- fixed GH #158: MySQL: MYSQL_BIND 'is_unsigned' member is not set
This commit is contained in:
Aleksandar Fabijanic
2013-04-28 12:34:07 -05:00
parent c6207985d8
commit a50823c5a8
34 changed files with 669 additions and 597 deletions

View File

@@ -49,11 +49,11 @@ Binder::Binder()
Binder::~Binder()
{
for (std::vector<MYSQL_TIME*>::iterator it = _dates.begin(); it != _dates.end(); ++it)
{
delete *it;
*it = 0;
}
for (std::vector<MYSQL_TIME*>::iterator it = _dates.begin(); it != _dates.end(); ++it)
{
delete *it;
*it = 0;
}
}
@@ -67,7 +67,7 @@ void Binder::bind(std::size_t pos, const Poco::Int8& val, Direction dir)
void Binder::bind(std::size_t pos, const Poco::UInt8& val, Direction dir)
{
poco_assert(dir == PD_IN);
realBind(pos, MYSQL_TYPE_TINY, &val, 0);
realBind(pos, MYSQL_TYPE_TINY, &val, 0, true);
}
@@ -81,7 +81,7 @@ void Binder::bind(std::size_t pos, const Poco::Int16& val, Direction dir)
void Binder::bind(std::size_t pos, const Poco::UInt16& val, Direction dir)
{
poco_assert(dir == PD_IN);
realBind(pos, MYSQL_TYPE_SHORT, &val, 0);
realBind(pos, MYSQL_TYPE_SHORT, &val, 0, true);
}
@@ -95,7 +95,7 @@ void Binder::bind(std::size_t pos, const Poco::Int32& val, Direction dir)
void Binder::bind(std::size_t pos, const Poco::UInt32& val, Direction dir)
{
poco_assert(dir == PD_IN);
realBind(pos, MYSQL_TYPE_LONG, &val, 0);
realBind(pos, MYSQL_TYPE_LONG, &val, 0, true);
}
@@ -109,24 +109,30 @@ void Binder::bind(std::size_t pos, const Poco::Int64& val, Direction dir)
void Binder::bind(std::size_t pos, const Poco::UInt64& val, Direction dir)
{
poco_assert(dir == PD_IN);
realBind(pos, MYSQL_TYPE_LONGLONG, &val, 0);
realBind(pos, MYSQL_TYPE_LONGLONG, &val, 0, true);
}
#ifndef POCO_LONG_IS_64_BIT
void Binder::bind(std::size_t pos, const long& val, Direction dir)
{
poco_assert(dir == PD_IN);
#ifdef POCO_LONG_IS_64_BIT
realBind(pos, MYSQL_TYPE_LONGLONG, &val, 0);
#else
realBind(pos, MYSQL_TYPE_LONG, &val, 0);
#endif
}
void Binder::bind(std::size_t pos, const unsigned long& val, Direction dir)
{
poco_assert(dir == PD_IN);
realBind(pos, MYSQL_TYPE_LONGLONG, &val, 0);
}
#ifdef POCO_LONG_IS_64_BIT
realBind(pos, MYSQL_TYPE_LONGLONG, &val, 0, true);
#else
realBind(pos, MYSQL_TYPE_LONG, &val, 0, true);
#endif
}
void Binder::bind(std::size_t pos, const bool& val, Direction dir)
@@ -290,7 +296,7 @@ MYSQL_BIND* Binder::getBindArray() const
//
////////////////////
void Binder::realBind(std::size_t pos, enum_field_types type, const void* buffer, int length)
void Binder::realBind(std::size_t pos, enum_field_types type, const void* buffer, int length, bool isUnsigned)
{
if (pos >= _bindArray.size())
{
@@ -303,8 +309,9 @@ void Binder::realBind(std::size_t pos, enum_field_types type, const void* buffer
MYSQL_BIND b = {0};
b.buffer_type = type;
b.buffer = const_cast<void*>(buffer);
b.buffer = const_cast<void*>(buffer);
b.buffer_length = length;
b.is_unsigned = isUnsigned;
_bindArray[pos] = b;
}

View File

@@ -44,7 +44,8 @@ namespace MySQL {
MySQLStatementImpl::MySQLStatementImpl(SessionImpl& h) :
Poco::Data::StatementImpl(h),
_stmt(h.handle()),
_extractor(_stmt, _metadata),
_pBinder(new Binder),
_pExtractor(new Extractor(_stmt, _metadata)),
_hasNext(NEXT_DONTKNOW)
{
}
@@ -160,21 +161,21 @@ void MySQLStatementImpl::bindImpl()
pos += (*it)->numOfColumnsHandled();
}
_stmt.bindParams(_binder.getBindArray(), _binder.size());
_stmt.bindParams(_pBinder->getBindArray(), _pBinder->size());
_stmt.execute();
_hasNext = NEXT_DONTKNOW;
}
AbstractExtractor& MySQLStatementImpl::extractor()
Poco::Data::AbstractExtractor::Ptr MySQLStatementImpl::extractor()
{
return _extractor;
return _pExtractor;
}
AbstractBinder& MySQLStatementImpl::binder()
Poco::Data::AbstractBinder::Ptr MySQLStatementImpl::binder()
{
return _binder;
return _pBinder;
}