2017-09-30 23:51:01 +02:00
|
|
|
#include "PreparedStatement.h"
|
|
|
|
#include "DbConnection.h"
|
|
|
|
|
|
|
|
#include <MySqlConnector.h>
|
|
|
|
|
2017-10-02 11:11:43 +02:00
|
|
|
#include <string.h>
|
2017-09-30 23:51:01 +02:00
|
|
|
#include <sstream>
|
|
|
|
|
|
|
|
Core::Db::PreparedStatement::PreparedStatement( uint32_t index ) :
|
|
|
|
m_stmt( nullptr ),
|
|
|
|
m_index( index ) { }
|
|
|
|
|
|
|
|
Core::Db::PreparedStatement::~PreparedStatement() { }
|
|
|
|
|
|
|
|
void Core::Db::PreparedStatement::bindParameters()
|
|
|
|
{
|
|
|
|
assert( m_stmt );
|
|
|
|
|
|
|
|
uint8_t i = 1;
|
|
|
|
for( ; i < m_statementData.size(); i++ )
|
|
|
|
{
|
|
|
|
switch( m_statementData[i].type)
|
|
|
|
{
|
|
|
|
case TYPE_BOOL:
|
|
|
|
m_stmt->setBoolean( i, m_statementData[i].data.boolean );
|
|
|
|
break;
|
|
|
|
case TYPE_UI:
|
|
|
|
m_stmt->setUInt( i, m_statementData[i].data.ui32 );
|
|
|
|
break;
|
|
|
|
case TYPE_I:
|
|
|
|
m_stmt->setInt( i, m_statementData[i].data.i32 );
|
|
|
|
break;
|
|
|
|
case TYPE_UI64:
|
|
|
|
m_stmt->setUInt64( i, m_statementData[i].data.ui64 );
|
|
|
|
break;
|
|
|
|
case TYPE_I64:
|
|
|
|
m_stmt->setInt64( i, m_statementData[i].data.i64 );
|
|
|
|
break;
|
|
|
|
case TYPE_DOUBLE:
|
|
|
|
m_stmt->setDouble( i, m_statementData[i].data.d );
|
|
|
|
break;
|
|
|
|
case TYPE_STRING:
|
|
|
|
m_stmt->setString( i, std::string( reinterpret_cast< char* >( m_statementData[i].binary.data() ) ) );
|
|
|
|
break;
|
|
|
|
case TYPE_BINARY:
|
|
|
|
{
|
2017-10-07 23:10:13 +02:00
|
|
|
std::stringstream *is = new std::stringstream;
|
|
|
|
|
|
|
|
for( auto entry : m_statementData[i].binary )
|
|
|
|
is->rdbuf()->sputc( static_cast< char > ( entry ) );
|
|
|
|
|
|
|
|
m_stmt->setBlob( i, is );
|
2017-09-30 23:51:01 +02:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
case TYPE_NULL:
|
|
|
|
m_stmt->setNull( i, 0 );
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//- Bind to buffer
|
|
|
|
void Core::Db::PreparedStatement::setBool( uint8_t index, const bool value )
|
|
|
|
{
|
|
|
|
if( index >= m_statementData.size() )
|
|
|
|
m_statementData.resize( index + 1 );
|
|
|
|
|
|
|
|
m_statementData[index].data.boolean = value;
|
|
|
|
m_statementData[index].type = TYPE_BOOL;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Core::Db::PreparedStatement::setUInt( uint8_t index, uint32_t value )
|
|
|
|
{
|
|
|
|
if( index >= m_statementData.size() )
|
|
|
|
m_statementData.resize(index+1);
|
|
|
|
|
|
|
|
m_statementData[index].data.ui32 = value;
|
|
|
|
m_statementData[index].type = TYPE_UI;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Core::Db::PreparedStatement::setUInt64( uint8_t index, uint64_t value )
|
|
|
|
{
|
|
|
|
if( index >= m_statementData.size() )
|
|
|
|
m_statementData.resize( index + 1 );
|
|
|
|
|
|
|
|
m_statementData[index].data.ui64 = value;
|
|
|
|
m_statementData[index].type = TYPE_UI64;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Core::Db::PreparedStatement::setInt( uint8_t index, int32_t value )
|
|
|
|
{
|
|
|
|
if( index >= m_statementData.size() )
|
|
|
|
m_statementData.resize( index + 1 );
|
|
|
|
|
|
|
|
m_statementData[index].data.i32 = value;
|
|
|
|
m_statementData[index].type = TYPE_I;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Core::Db::PreparedStatement::setInt64( uint8_t index, int64_t value )
|
|
|
|
{
|
|
|
|
if( index >= m_statementData.size() )
|
2017-10-07 23:10:13 +02:00
|
|
|
m_statementData.resize( index + 1);
|
2017-09-30 23:51:01 +02:00
|
|
|
|
|
|
|
m_statementData[index].data.i64 = value;
|
|
|
|
m_statementData[index].type = TYPE_I64;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Core::Db::PreparedStatement::setDouble( uint8_t index, double value )
|
|
|
|
{
|
|
|
|
if( index >= m_statementData.size() )
|
|
|
|
m_statementData.resize( index + 1 );
|
|
|
|
|
|
|
|
m_statementData[index].data.d = value;
|
|
|
|
m_statementData[index].type = TYPE_DOUBLE;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Core::Db::PreparedStatement::setString( uint8_t index, const std::string& value )
|
|
|
|
{
|
|
|
|
if( index >= m_statementData.size() )
|
|
|
|
m_statementData.resize( index + 1 );
|
|
|
|
|
|
|
|
m_statementData[index].binary.resize( value.length() + 1 );
|
|
|
|
memcpy( m_statementData[index].binary.data(), value.c_str(), value.length() + 1 );
|
|
|
|
m_statementData[index].type = TYPE_STRING;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Core::Db::PreparedStatement::setBinary( uint8_t index, const std::vector< uint8_t >& value )
|
|
|
|
{
|
|
|
|
if( index >= m_statementData.size() )
|
|
|
|
m_statementData.resize( index + 1 );
|
|
|
|
|
|
|
|
m_statementData[index].binary = value;
|
|
|
|
m_statementData[index].type = TYPE_BINARY;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Core::Db::PreparedStatement::setNull( uint8_t index )
|
|
|
|
{
|
|
|
|
if( index >= m_statementData.size() )
|
|
|
|
m_statementData.resize( index + 1 );
|
|
|
|
|
|
|
|
m_statementData[index].type = TYPE_NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
uint32_t Core::Db::PreparedStatement::getIndex() const
|
|
|
|
{
|
|
|
|
return m_index;
|
|
|
|
}
|
|
|
|
|
2017-10-07 23:10:13 +02:00
|
|
|
void Core::Db::PreparedStatement::setMysqlPS( boost::shared_ptr< Mysql::PreparedStatement> pStmt )
|
2017-09-30 23:51:01 +02:00
|
|
|
{
|
|
|
|
m_stmt = pStmt;
|
|
|
|
}
|