#include "StdAfx.h"
#include "dploginsrvr.h"
#include "DBWorkerIns.h"
#include "DBInstance.h"
#include "IQuerys.h"
extern APP_INFO g_appInfo;
extern CDPLoginSrvr g_dpLoginSrvr;
CDBWorkerIns::CDBWorkerIns()
{
m_hHandle = NULL;
m_pWorkList[eQUERY_INS::INS_NEW_PLAYER] = &CDBWorkerIns::InsNewCharacter;
}
CDBWorkerIns::~CDBWorkerIns()
{
}
void CDBWorkerIns::Worker()
{
if( m_hHandle == NULL )
return;
DWORD dwBytesTransferred = NULL;
DWORD dwCompletionKey = NULL;
DB_OVERLAPPED* pOverlapped = nullptr;
m_pDBInstance = new CDBInstance;
m_pDBInstance->Connect( "TEST_SRV_03", "", "" );
while( true )
{
GetQueuedCompletionStatus( m_hHandle, &dwBytesTransferred, &dwCompletionKey, (LPOVERLAPPED*)&pOverlapped, INFINITE );
void( CDBWorkerIns::*pFunction )( DB_OVERLAPPED* ) = m_pWorkList[pOverlapped->nQueryMode];
if( pFunction )
( this->*( pFunction ) )( pOverlapped );
else
Error( "(INFO) %s(%d): Invalid QueryMode!! [INS][%d]" __FUNCTION__, __LINE__, pOverlapped->nQueryMode );
}
}
void CDBWorkerIns::InsNewCharacter( _In_ DB_OVERLAPPED* lpDbOverlapped )
{
CAr arRead( lpDbOverlapped->lpBuf, lpDbOverlapped->uBufSize );
char szAccount[MAX_ACCOUNT] = { NULL, };
char szPassword[MAX_PASSWORD] = { NULL, };
char szPlayer[16] = { NULL, };
int nSlot = NULL;
int nSex = NULL;
int nJob = JOB_MERCENARY;
int nHeadMesh = NULL;
int nHairMesh = NULL;
D3DXVECTOR3 vPos = D3DXVECTOR3( 255, 255, 255 );
arRead.ReadString( szAccount, MAX_ACCOUNT );
arRead.ReadString( szPlayer, 16 );
arRead >> nSlot;
arRead >> nSex;
arRead >> nJob;
arRead >> nHairMesh;
arRead >> nHeadMesh;
if( strlen( szPlayer ) < 4 )
{
SAFE_DELETE_ARRAY( lpDbOverlapped->lpBuf );
return;
}
if( nSlot > 2 || nSlot < 0 || nJob > 4 || nJob < 1 || nSex > 1 || nSex < 0 )
{
SAFE_DELETE_ARRAY( lpDbOverlapped->lpBuf );
return;
}
if( prj.IsInvalidName( szPlayer ) || !prj.IsAllowedLetter( szPlayer ) )
{
SAFE_DELETE_ARRAY( lpDbOverlapped->lpBuf );
return;
}
strcpy( lpDbOverlapped->szAccount, szAccount );
prj.GetRandomBeginPos( WI_WORLD_MADRIGAL, &vPos );
m_pDBInstance->Execute( "CHARACTER_STR @iGu = 'I1', @iserverindex = '%02d', @iaccount = '%s', @im_szName = '%s', @iplayerslot = %d, @im_nJob = %d, @im_vPos_x = %f, @im_vPos_y = %f, @im_vPos_z = %f, @idwWorldID = %d, @im_dwSex = %d", g_appInfo.dwSys, szAccount, szPlayer, nSlot, nJob, vPos.x, vPos.y, vPos.z, WI_WORLD_MADRIGAL, nSex );
if( m_pDBInstance->Fetch() )
{
int nError = m_pDBInstance->GetInt( "nError" );
switch( nError )
{
case 0: g_dpLoginSrvr.SendError( ERROR_USER_EXISTS, lpDbOverlapped->dpid ); break; // Player Name exists.
case 1: g_dpLoginSrvr.SendError( ERROR_DUPLICATE_SLOT, lpDbOverlapped->dpid ); break; // Slot not empty.
case 2: g_dpLoginSrvr.SendPlayerList( szAccount, szPassword, lpDbOverlapped->dpid ); break; // User OK --> Created.
}
}
SAFE_DELETE_ARRAY( lpDbOverlapped->lpBuf );
}
|