Files
2026-11-07 13:30:45 +07:00

167 lines
4.3 KiB
C++

// QueryData.cpp: implementation of the CQueryData class.
//
//////////////////////////////////////////////////////////////////////
#include "../stdafx.h"
#include "cSerialize.h"
#include "QueryData.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CQueryData::CQueryData()
{
memset( m_szReturnBuf, 0, sizeof( m_szReturnBuf ) );
m_iReturnLength = 0;
m_pBuffer = NULL;
CQuery::Clear();
}
CQueryData::~CQueryData()
{
CQuery::Clear();
}
void CQueryData::GetFields(cSerialize& fieldTypes)
{
if(GetFieldSize() == 0)
return;
if(m_pBuffer)
{
uint32 index = sizeof(int);
fieldTypes.Reset();
fieldTypes.SetBuffer( (uint8*)(m_pBuffer + index), GetFieldSize() );
}
}
void CQueryData::GetResults(vVALUETYPE& valueTypes)
{
valueTypes.clear();
if(GetResultSize() == 0)
return;
if(m_pBuffer)
{
uint32 index = sizeof(int) + GetFieldSize();
for(int32 n = 0 ; n < GetResultSize() ; n += sizeof(ValueType) )
{
ValueType* type = (ValueType*)(m_pBuffer + index + n);
valueTypes.push_back( *type );
}
}
}
void CQueryData::GetReturns(char* buffer, int &size)
{
if(m_pBuffer)
{
uint32 index = sizeof(int) + GetFieldSize() + GetResultSize();
size = GetReturnSize();
memcpy( buffer, m_pBuffer + index, size );
}
}
void CQueryData::SetReturnData( const void *pData, int iSize )
{
memcpy( &m_szReturnBuf[m_iReturnLength], pData, iSize );
m_iReturnLength += iSize;
if( m_iReturnLength >= MAX_BUFFER )
{
//LOG.PrintTimeAndLog( 0, "CQueryData::SetReturnData Return Size : %d", m_iReturnLength );
}
}
void CQueryData::SetBuffer(const char *buffer)
{
memcpy(&m_queryHeader,buffer,sizeof(QueryHeader));
buffer+= sizeof(QueryHeader);
m_pBuffer = new char[m_queryHeader.nQueryBufferSize];
memcpy(m_pBuffer,buffer,m_queryHeader.nQueryBufferSize);
}
void CQueryData::SetBuffer(uint8 *buffer)
{
memcpy(&m_queryHeader,buffer,sizeof(QueryHeader));
buffer+= sizeof(QueryHeader);
m_pBuffer = new char[m_queryHeader.nQueryBufferSize];
memcpy(m_pBuffer,buffer,m_queryHeader.nQueryBufferSize);
}
void CQueryData::SetData(
unsigned int nIndex,
int nResult_Type,
int nMsgType,
int nQueryType,
int queryId,
cSerialize& fieldTypes,
vVALUETYPE& valueTypes,
int nSetValue)
{
CQuery::Clear();
//헤더
m_queryHeader.nIndex = nIndex;
m_queryHeader.nResult_Type = nResult_Type;
m_queryHeader.nMsgType = nMsgType;
m_queryHeader.nQueryType = nQueryType;
m_queryHeader.fieldLength = fieldTypes.GetLength();
m_queryHeader.resultLength = sizeof(ValueType) * valueTypes.size();
m_queryHeader.nValueTypeCnt = 0;
m_queryHeader.returnLength = m_iReturnLength;
m_queryHeader.nSetValue = nSetValue;
m_queryHeader.queryId = queryId;
m_queryHeader.databaseId = 1;
m_queryHeader.nQueryBufferSize = sizeof(queryId) + m_queryHeader.fieldLength + m_queryHeader.resultLength + m_queryHeader.returnLength;
//버퍼 메모리 할당.
if(m_queryHeader.nQueryBufferSize != 0)
{
m_pBuffer = new char[m_queryHeader.nQueryBufferSize];
//데이터.
int nSize = 0; //버퍼의 위치
int nlen = 0;
if(0 != queryId)
{
nlen = sizeof(queryId); //카피할 데이터 사이즈
memcpy(&m_pBuffer[nSize], &queryId, nlen); //쿼리 내용
}
if(fieldTypes.GetLength() > 0)
{
nSize += nlen;
nlen = m_queryHeader.fieldLength;
memcpy(&m_pBuffer[nSize], fieldTypes.GetBuffer(), nlen); // 필드 타입
}
if(valueTypes.size() > 0)
{
nSize += nlen;
nlen = m_queryHeader.resultLength;
memcpy(&m_pBuffer[nSize], &valueTypes[0], nlen); // 결과 타입
}
if(m_iReturnLength > 0)
{
nSize += nlen;
memcpy(&m_pBuffer[nSize], m_szReturnBuf, m_iReturnLength); //돌려받을 데이터.
}
}
}
void CQueryData::Copy( CQueryData &queryData )
{
if(m_pBuffer)
{
delete []m_pBuffer;
}
m_pBuffer = new char[queryData.GetBufferSize()];
if(m_pBuffer)
{
m_queryHeader = queryData.m_queryHeader;
memcpy( m_pBuffer, queryData.m_pBuffer, m_queryHeader.nQueryBufferSize );
}
}