Files
2022-10-26 12:25:11 +08:00

409 lines
14 KiB
C++

/*------------------------------------------------------------------------------
* SUN_DBHandler.cpp
*------------------------------------------------------------------------------
* DBHandler 클래스를 상속받아 만든 SUN 전용 DBHandler 클래스이다.
*
* 파르페 로그의 data type에 따라 DB에 저장하는 함수를 작성해야 한다.
* (작성된 함수들은 파르페 전용 라이터에서만 사용해야 한다.)
*------------------------------------------------------------------------------
* All rights reserved by Jin Hye Jin (jiny7749@hotmail.com)
**----------------------------------------------------------------------------*/
#include "stdafx.h"
#include "SUN_DBHandler.h"
#include "LogCollectorLog.h"
/** ----------------------------------------------------------------------------
\brief
\param
\return
------------------------------------------------------------------------------*/
SUN_DBHandler::SUN_DBHandler(int max, TCHAR * dsn, TCHAR * id, TCHAR * passwd)
{
if (NULL == dsn ||
NULL == id ||
NULL == passwd)
{
_ASSERTE(!"SUN_DBHandler");
}
m_pDBPool = new DatabasePool(max, dsn, id, passwd);
}
/** ----------------------------------------------------------------------------
\brief
\param
\return
------------------------------------------------------------------------------*/
SUN_DBHandler::~SUN_DBHandler()
{
if (NULL != m_pDBPool)
{
delete m_pDBPool, m_pDBPool = NULL;
}
}
/** ----------------------------------------------------------------------------
\brief
\param
\return
------------------------------------------------------------------------------*/
BOOL SUN_DBHandler::WriteInvenSnapShotBlob(TCHAR* szSQL, InventoryDataEx& stData)
{
const int INVEN_SIZE = stData.GetInventorySize();
const int TMP_INVEN_SIZE = stData.GetTempInventorySize();
SQLINTEGER iData1 = INVEN_SIZE;//MAX_INVENTORYITEM_SIZE;
SQLINTEGER iData2 = TMP_INVEN_SIZE;//MAX_TEMPINVENTORYITEM_SIZE;
// lParam에 로그 관련 블로브 데이터가 포인터 형태로 들어와야 한다.
// 그리고 SQLBindParameter()한 후에 메모리에 카피한후, SQLExecute(SQLStateHandle) 하면 데이터가 삽입된다.
/////////////////////////////////////////////////
UCHAR sqlQuery[512] = {0,};
SQLHSTMT hstmt = SQL_NULL_HSTMT;
SQLHDBC hdbc = SQL_NULL_HDBC;
SQLRETURN retcode;
DBInfo* pdbConnection = NULL;
LogCollectorLog cSQLLog(_T("SQL_FAIL_LOG"), _T("SQL_FAIL_LOG"));
///////////////////////
pdbConnection = m_pDBPool->GetDBHandle();
if ( pdbConnection == NULL )
{
cSQLLog.AddLog(_T("Error DBConnection is null\n"));
return FALSE;
}
hdbc = pdbConnection->hSQLConnection;
hstmt = AllocStatement(hdbc);
if (hstmt == SQL_NULL_HSTMT)
{
cSQLLog.AddLog(_T("Error SQL_NULL_HSTMT\n"));
m_pDBPool->ReleaseDBHandle(pdbConnection);
return FALSE;
}
/////////////////////////////////////////////////
// 쿼리문 컴파일
retcode = SQLPrepare(hstmt, (SQLTCHAR*)szSQL, SQL_NTS);
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO && retcode != SQL_NO_DATA && retcode != SQL_STILL_EXECUTING && retcode != SQL_NEED_DATA)
{
SQLTCHAR SqlState[6], Msg[SQL_MAX_MESSAGE_LENGTH];
SQLINTEGER NativeError;
SQLSMALLINT i = 1, MsgLen;
SQLGetDiagRec(SQL_HANDLE_STMT, hstmt, i, SqlState, &NativeError,
Msg, sizeof(Msg), &MsgLen);
cSQLLog.AddLog(_T("WriteBlob InventoryData Error, SQLSTATE : %d, Msg : %s"), SqlState , Msg);
m_pDBPool->ReleaseDBHandle(pdbConnection);
FreeStatement(hstmt);
TRACE(_T("SQL Prepare failed : sql : %s"), szSQL);
return FALSE;
}
// 데이터 바인딩
retcode = SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_BINARY, SQL_BINARY, iData1, 0, stData.GetInventoryPtr(), 0, &iData1);
retcode = SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_BINARY, SQL_BINARY, iData2, 0, stData.GetTempInventoryPtr(), 0, &iData2);
// 실행
retcode = SQLExecute(hstmt); //(retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) && (retcode != SQL_NO_DATA) && (retcode != SQL_STILL_EXECUTING) && (retcode != SQL_NEED_DATA)
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO && retcode != SQL_NO_DATA && retcode != SQL_STILL_EXECUTING && retcode != SQL_NEED_DATA)
{
TRACE(_T("not SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, szSQL : %s"), szSQL);
SQLTCHAR SqlState[6], Msg[SQL_MAX_MESSAGE_LENGTH];
SQLINTEGER NativeError;
SQLSMALLINT i = 1, MsgLen;
SQLGetDiagRec(SQL_HANDLE_STMT, hstmt, i, SqlState, &NativeError,
Msg, sizeof(Msg), &MsgLen);
cSQLLog.AddLog(_T("WriteBlob Inventory Data Error, SQLSTATE : %d, Msg : %s"), SqlState , Msg);
FreeStatement(hstmt);
m_pDBPool->ReleaseDBHandle(pdbConnection);
return FALSE;
}
FreeStatement(hstmt);
m_pDBPool->ReleaseDBHandle(pdbConnection);
return TRUE;
}
BOOL SUN_DBHandler::WriteItemBlob(TCHAR* szSQL, ItemDataEx& stData)
{
SQLINTEGER iData;
SQLHSTMT hstmt = SQL_NULL_HSTMT;
SQLHDBC hdbc = SQL_NULL_HDBC;
SQLRETURN retcode;
pDBInfo pdbConnection = NULL;
LogCollectorLog cSQLLog(_T("SQL_FAIL_LOG"), _T("SQL_FAIL_LOG"));
pdbConnection = m_pDBPool->GetDBHandle();
if ( pdbConnection == NULL )
{
cSQLLog.AddLog(_T("Error DBConnection is null\n"));
return FALSE;
}
hdbc = pdbConnection->hSQLConnection;
hstmt = AllocStatement(hdbc);
if (hstmt == SQL_NULL_HSTMT)
{
cSQLLog.AddLog(_T("Error SQL_NULL_HSTMT\n"));
m_pDBPool->ReleaseDBHandle(pdbConnection);
return FALSE;
}
retcode = SQLPrepare(hstmt, (SQLTCHAR*)szSQL, SQL_NTS);
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO && retcode != SQL_NO_DATA && retcode != SQL_STILL_EXECUTING && retcode != SQL_NEED_DATA)
{
SQLTCHAR SqlState[6], Msg[SQL_MAX_MESSAGE_LENGTH];
SQLINTEGER NativeError;
SQLSMALLINT i = 1, MsgLen;
SQLGetDiagRec(SQL_HANDLE_STMT, hstmt, i, SqlState, &NativeError,
Msg, sizeof(Msg), &MsgLen);
cSQLLog.AddLog(_T("WriteBlob ItemData Error, SQLSTATE : %d, Msg : %s"), SqlState , Msg);
m_pDBPool->ReleaseDBHandle(pdbConnection);
FreeStatement(hstmt);
TRACE(_T("SQL Prepare failed : sql : %s"), szSQL);
return FALSE;
}
// 데이터 바인딩
//////////////////////////////////////////////////////////////////////////
const int MAX_ITEM_SIZE1 = stData.GetItemStreamEx1Size();
const int MAX_ITEM_SIZE2 = stData.GetItemStreamEx2Size();
#ifdef _TEST_SERVER
TCHAR szOutput1[100];
TCHAR szOutput2[100];
ZeroMemory(szOutput1, 100);
ZeroMemory(szOutput1, 100);
StringCchPrintf(szOutput1, sizeof(szOutput1), _T("ItemStreamEX1Size : %d"), MAX_ITEM_SIZE1);
StringCchPrintf(szOutput2, sizeof(szOutput2), _T("ItemStreamEX2Size : %d"), MAX_ITEM_SIZE2);
OutputDebugString(szOutput1);
OutputDebugString(szOutput2);
#endif //_TEST_SERVER
//////////////////////////////////////////////////////////////////////////
iData = MAX_ITEM_SIZE1;
retcode = SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_BINARY, SQL_BINARY, iData, 0, stData.GetItemStreamEx1(), 0, &iData);
iData = MAX_ITEM_SIZE2;
retcode = SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_BINARY, SQL_BINARY, iData, 0, stData.GetItemStreamEx2(), 0, &iData);
// 실행
retcode = SQLExecute(hstmt);
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO && retcode != SQL_NO_DATA && retcode != SQL_STILL_EXECUTING && retcode != SQL_NEED_DATA)
{
TRACE(_T("not SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, szSQL : %s"), szSQL);
SQLTCHAR SqlState[6], Msg[SQL_MAX_MESSAGE_LENGTH];
SQLINTEGER NativeError;
SQLSMALLINT i = 1, MsgLen;
SQLGetDiagRec(SQL_HANDLE_STMT, hstmt, i, SqlState, &NativeError,
Msg, sizeof(Msg), &MsgLen);
cSQLLog.AddLog(_T("WriteBlob ItemData Data Error, SQLSTATE : %d, Msg : %s"), SqlState , Msg);
FreeStatement(hstmt);
m_pDBPool->ReleaseDBHandle(pdbConnection);
return FALSE;
}
FreeStatement(hstmt);
m_pDBPool->ReleaseDBHandle(pdbConnection);
return TRUE;
}
BOOL SUN_DBHandler::WriteSnapShotBlob(TCHAR* szSQL, SnapShotDataEx& stData)
{
SQLHSTMT hstmt = SQL_NULL_HSTMT;
SQLHDBC hdbc = SQL_NULL_HDBC;
SQLRETURN retcode;
pDBInfo pdbConnection = NULL;
LogCollectorLog cSQLLog(_T("SQL_FAIL_LOG"), _T("SQL_FAIL_LOG"));
pdbConnection = m_pDBPool->GetDBHandle();
if ( pdbConnection == NULL )
{
cSQLLog.AddLog(_T("Error DBConnection is null\n"));
return FALSE;
}
hdbc = pdbConnection->hSQLConnection;
hstmt = AllocStatement(hdbc);
if (hstmt == SQL_NULL_HSTMT)
{
cSQLLog.AddLog(_T("Error SQL_NULL_HSTMT\n"));
m_pDBPool->ReleaseDBHandle(pdbConnection);
return FALSE;
}
//////////////////////////////////////////////////////////////////////////
// 사이즈를 DLL에 의존적으로 가져오게 함.
// 2007-11-20 pavonine66
const int iCharStatSize = stData.GetCharStatSize();
const int iCharInvenSize = stData.GetInventorySize();
const int iCharTmpInvenSize = stData.GetTempInventorySize();
const int iCharEquipItemSize = stData.GetEquipItemSize();
const int iCharSkillSize = stData.GetSkillSize();
const int iCharMissionSize = stData.GetMissionSize();
const int iCharProgQuestSize = stData.GetProgrQuestSize();
const int iCharCompQuestSize = stData.GetComplQuestSize();
const int iCharAcSize = stData.GetACSize();
//////////////////////////////////////////////////////////////////////////
SQLINTEGER iData1 = iCharStatSize;
SQLINTEGER iData2 = iCharInvenSize;
SQLINTEGER iData3 = iCharTmpInvenSize;
SQLINTEGER iData4 = iCharEquipItemSize;
SQLINTEGER iData5 = iCharSkillSize;
SQLINTEGER iData6 = iCharMissionSize;
SQLINTEGER iData7 = iCharProgQuestSize;
SQLINTEGER iData8 = iCharCompQuestSize;
SQLINTEGER iData9 = iCharAcSize;
retcode = SQLPrepare(hstmt, (SQLTCHAR*)szSQL, SQL_NTS);
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO && retcode != SQL_NO_DATA && retcode != SQL_STILL_EXECUTING && retcode != SQL_NEED_DATA)
{
SQLTCHAR SqlState[6], Msg[SQL_MAX_MESSAGE_LENGTH];
SQLINTEGER NativeError;
SQLSMALLINT i = 1, MsgLen;
SQLGetDiagRec(SQL_HANDLE_STMT, hstmt, i, SqlState, &NativeError,
Msg, sizeof(Msg), &MsgLen);
cSQLLog.AddLog(_T("WriteBlob SnapShotData Error, SQLSTATE : %d, Msg : %s"), SqlState , Msg);
m_pDBPool->ReleaseDBHandle(pdbConnection);
FreeStatement(hstmt);
TRACE(_T("SQL Prepare failed : sql : %s"), szSQL);
return FALSE;
}
// 데이터 바인딩
retcode = SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_BINARY, SQL_BINARY, iCharStatSize, 0, stData.GetCharStatPtr(), 0, &iData1);
retcode = SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_BINARY, SQL_BINARY, iCharInvenSize, 0, stData.GetInventoryPtr(), 0, &iData2);
retcode = SQLBindParameter(hstmt, 3, SQL_PARAM_INPUT, SQL_C_BINARY, SQL_BINARY, iCharTmpInvenSize, 0, stData.GetTempInventoryPtr(), 0, &iData3);
retcode = SQLBindParameter(hstmt, 4, SQL_PARAM_INPUT, SQL_C_BINARY, SQL_BINARY, iCharEquipItemSize, 0, stData.GetEquipItemPtr(), 0, &iData4);
retcode = SQLBindParameter(hstmt, 5, SQL_PARAM_INPUT, SQL_C_BINARY, SQL_BINARY, iCharSkillSize, 0, stData.GetSkillPtr(), 0, &iData5);
retcode = SQLBindParameter(hstmt, 6, SQL_PARAM_INPUT, SQL_C_BINARY, SQL_BINARY, iCharMissionSize, 0, stData.GetMissionPtr(), 0, &iData6);
retcode = SQLBindParameter(hstmt, 7, SQL_PARAM_INPUT, SQL_C_BINARY, SQL_BINARY, iCharProgQuestSize, 0, stData.GetProgrQuestPtr(), 0, &iData7);
retcode = SQLBindParameter(hstmt, 8, SQL_PARAM_INPUT, SQL_C_BINARY, SQL_BINARY, iCharCompQuestSize, 0, stData.GetComplQuestPtr(), 0, &iData8);
retcode = SQLBindParameter(hstmt, 9, SQL_PARAM_INPUT, SQL_C_BINARY, SQL_BINARY, iCharAcSize, 0, stData.GetACPtr(), 0, &iData9);
retcode = SQLExecute(hstmt);
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO && retcode != SQL_NO_DATA && retcode != SQL_STILL_EXECUTING && retcode != SQL_NEED_DATA)
{
TRACE(_T("not SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, szSQL : %s"), szSQL);
SQLTCHAR SqlState[6], Msg[SQL_MAX_MESSAGE_LENGTH];
SQLINTEGER NativeError;
SQLSMALLINT i = 1, MsgLen;
SQLGetDiagRec(SQL_HANDLE_STMT, hstmt, i, SqlState, &NativeError,
Msg, sizeof(Msg), &MsgLen);
cSQLLog.AddLog(_T("WriteBlob SnapshotData Data Error, SQLSTATE : %d, Msg : %s"), SqlState , Msg);
FreeStatement(hstmt);
m_pDBPool->ReleaseDBHandle(pdbConnection);
return FALSE;
}
FreeStatement(hstmt);
m_pDBPool->ReleaseDBHandle(pdbConnection);
return TRUE;
}
BOOL SUN_DBHandler::WriteWarehouseBlob(TCHAR* szSQL, WareHouseDataEx& stData)
{
SQLINTEGER iData;
SQLHSTMT hstmt = SQL_NULL_HSTMT;
SQLHDBC hdbc = SQL_NULL_HDBC;
SQLRETURN retcode;
pDBInfo pdbConnection = NULL;
LogCollectorLog cSQLLog(_T("SQL_FAIL_LOG"), _T("SQL_FAIL_LOG"));
pdbConnection = m_pDBPool->GetDBHandle();
if ( pdbConnection == NULL )
{
cSQLLog.AddLog(_T("Error DBConnection is null\n"));
return FALSE;
}
hdbc = pdbConnection->hSQLConnection;
hstmt = AllocStatement(hdbc);
if (hstmt == SQL_NULL_HSTMT)
{
cSQLLog.AddLog(_T("Error SQL_NULL_HSTMT\n"));
m_pDBPool->ReleaseDBHandle(pdbConnection);
return FALSE;
}
retcode = SQLPrepare(hstmt, (SQLTCHAR*)szSQL, SQL_NTS);
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO && retcode != SQL_NO_DATA && retcode != SQL_STILL_EXECUTING && retcode != SQL_NEED_DATA)
{
SQLTCHAR SqlState[6], Msg[SQL_MAX_MESSAGE_LENGTH];
SQLINTEGER NativeError;
SQLSMALLINT i = 1, MsgLen;
SQLGetDiagRec(SQL_HANDLE_STMT, hstmt, i, SqlState, &NativeError,
Msg, sizeof(Msg), &MsgLen);
cSQLLog.AddLog(_T("WriteBlob SnapShotData Error, SQLSTATE : %d, Msg : %s"), SqlState , Msg);
m_pDBPool->ReleaseDBHandle(pdbConnection);
FreeStatement(hstmt);
TRACE(_T("SQL Prepare failed : sql : %s"), szSQL);
return FALSE;
}
const int IWAREHOUSE_SIZE = stData.GetWareHouseSize();
iData = IWAREHOUSE_SIZE;
// 데이터 바인딩
retcode = SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_BINARY, SQL_BINARY, iData, 0, stData.GetWareHousePtr(), 0, &iData);
// 실행
retcode = SQLExecute(hstmt);
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO && retcode != SQL_NO_DATA && retcode != SQL_STILL_EXECUTING && retcode != SQL_NEED_DATA)
{
TRACE(_T("not SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, szSQL : %s"), szSQL);
SQLTCHAR SqlState[6], Msg[SQL_MAX_MESSAGE_LENGTH];
SQLINTEGER NativeError;
SQLSMALLINT i = 1, MsgLen;
SQLGetDiagRec(SQL_HANDLE_STMT, hstmt, i, SqlState, &NativeError,
Msg, sizeof(Msg), &MsgLen);
cSQLLog.AddLog(_T("WriteBlob WareHouseData Data Error, SQLSTATE : %d, Msg : %s"), SqlState , Msg);
FreeStatement(hstmt);
m_pDBPool->ReleaseDBHandle(pdbConnection);
return FALSE;
}
FreeStatement(hstmt);
m_pDBPool->ReleaseDBHandle(pdbConnection);
return TRUE;
}