📄 database.cpp
字号:
// DataBase.cpp: implementation of the CDataBase class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "DataBase.h"
#include "Console.h"
#include "Network.h"
#include "CommonDBMsgParser.h"
#include <stdio.h>
void ReadDBResultMessage1(DWORD ret, LPDBMESSAGE pMessage){ ReadDBResultMessage(0,ret,pMessage); }
void ReadDBResultMessage2(DWORD ret, LPDBMESSAGE pMessage){ ReadDBResultMessage(1,ret,pMessage); }
void ReadDBResultMessage3(DWORD ret, LPDBMESSAGE pMessage){ ReadDBResultMessage(2,ret,pMessage); }
void ReadDBResultMessage4(DWORD ret, LPDBMESSAGE pMessage){ ReadDBResultMessage(3,ret,pMessage); }
void castingdelete(LPVOID pTarget1, LPVOID pTarget2, int nNum);
void WriteMessage(char* pmsg);
#define WM_DB_MESSAGE WM_USER+231
//#define LOGINDBNAME "DSSOGLOGINDB"
//#define LOGINDBID "dssog"
//#define LOGINDBPASSWORD "hhh0909"
#define LOGINDBNAME "MHCMember"
#define LOGINDBID "GameSrv"
#define LOGINDBPASSWORD "chqkqdpsmsdhktkql!"
//#define LOGINDBID "mhcdssog"
//#define LOGINDBPASSWORD "chqkqrndl!"
#define LOGDBNAME "MHLog"
#define LOGDBID "GameSrv"
#define LOGDBPASSWORD "chqkqdpsmsdhktkql!"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CDataBase g_DB;
BOOL DBTH::Init(DESC_DBTHREAD* pDesc)
{
HRESULT hr = CoCreateInstance(CLSID_DBTHREAD_DLL, NULL, CLSCTX_INPROC_SERVER, IID_DBTHREAD_DLL, (void**)&m_pIDB);
if (FAILED(hr))
{
MessageBox(NULL,"Cannot create IID_DBTHREAD_DLL : unregistered Component","Error",NULL);
return FALSE;
}
BOOL ret = m_pIDB->CreateDBThread(pDesc);
if (!ret)
{
LPSTR pmsg = "can not init db class";
WriteMessage(pmsg);
return FALSE;
}
// 抗傈贸烦 DBTH 孽府 搬苞 贸府甫 困茄 捞亥飘 悸泼茄促.
// GetCustomEventHandle俊 持绰 箭磊绰 INETWORK 积己矫 DBTH孽府搬苞甫 困秦
// 悸泼沁带 捞亥飘 锅龋客 老摹茄促.
#ifndef _MONITORINGSERVER
if (g_Network.GetINet())
m_pIDB->SetDBMessageEvent( g_Network.GetINet()->GetCustomEventHandle(1) );
#endif
/// 眠啊等 DBTH(肺弊牢DBTH)
m_LoginDB = m_pIDB->MakeNewConnection(LOGINDBNAME, LOGINDBID, LOGINDBPASSWORD);
m_LogDB = m_pIDB->MakeNewConnection(LOGDBNAME, LOGDBID, LOGDBPASSWORD);
return TRUE;
}
void DBTH::Release()
{
if(m_pIDB)
{
m_pIDB->Release();
m_pIDB = NULL;
}
}
BOOL DBTH::Query(DBQUERY* pQuery)
{
LPDBFreeQuery pData = (LPDBFreeQuery) m_pIDB->GetDBMessageStackMemory();
if(!pData)
{
return FALSE;
}
if(pQuery->dbcontype == eDBCON_LOGIN)
pData->pCon = m_LoginDB;
else if(pQuery->dbcontype == eDBCON_LOG)
pData->pCon = m_LogDB;
else if(pQuery->dbcontype == eDBCON_ADMIN)
pData->pCon = m_pIDB->GetAdMinCon();
else
{
ASSERT(0);
}
sprintf(pData->szBuffer, "%s", pQuery->strQuery);
LPDBMESSAGE pTemp = (LPDBMESSAGE) m_pIDB->GetDBMessageMemory();
if(!pTemp)
{
m_pIDB->FreeThisMemory( NULL, pData );
return FALSE;
}
pTemp->bFNNo = pQuery->QueryType; // 浚柳惑狼 孽府狼 辆幅
pTemp->bNotifyOnlyError = 0;
pTemp->dwMessageID = pQuery->dwMessageID; // 绢恫 孽府啊 龋免登菌绰啊 备喊
pTemp->dwID = pQuery->dwID; // 漂喊洒 沥狼登瘤 臼绰 巴
pTemp->pData = (LPVOID) pData;
m_pIDB->SendMessageDB(pTemp); //橇肺弊伐 辆丰矫俊 咯扁辑 俊矾巢
return TRUE;
}
void DBTH::DeletePointer(LPDBMESSAGE pMessage,DWORD ret)
{
m_pIDB->DeleteThisPointer(pMessage->bFNNo,(LPVOID)ret);
m_pIDB->FreeThisMemory(pMessage,pMessage->pData);
}
//////////////////////////////////////////////////////////////////////////
CDataBase::CDataBase()
{
m_pDB = NULL;
}
CDataBase::~CDataBase()
{
Release();
}
BOOL CDataBase::AllCleared()
{
if(m_QueryQueue.GetCount() != 0)
return FALSE;
for(DWORD n=0;n<m_MaxDBThreadNum;++n)
{
if(m_pDB[n].m_pIDB->GetUnusedDBMemoryNum() != m_SameTimeQueryPerThread)
return FALSE;
if(m_pDB[n].m_pIDB->GetUnusedStackMemoryNum() != m_SameTimeQueryPerThread)
return FALSE;
}
return TRUE;
}
void CDataBase::Release()
{
if(m_pDB)
{
while(AllCleared() == FALSE)
{
ProcessingDBMessage();
Sleep(50);
}
for(DWORD n=0;n<m_MaxDBThreadNum;++n)
m_pDB[n].Release();
m_MaxDBThreadNum = 0;
delete [] m_pDB;
m_pDB = NULL;
}
}
DBTH* CDataBase::GetCurDB()
{
DWORD maxunusedMem = 0;
DWORD unusedMem;
int idleThread = -1;
for(DWORD n=0;n<m_MaxDBThreadNum;++n)
{
unusedMem = m_pDB[n].m_pIDB->GetUnusedDBMemoryNum();
if(unusedMem > maxunusedMem)
{
maxunusedMem = unusedMem;
idleThread = n;
}
}
if(idleThread == -1)
return NULL;
return &m_pDB[idleThread];
}
BOOL CDataBase::Init(DWORD MaxDBThread,DWORD MaxSameTimeQuery)
{
m_QueryPool.Init(MaxSameTimeQuery/2,MaxSameTimeQuery/4, "QueryPool");
DESC_DBTHREAD desc;
desc.bUsingDLL = TRUE; // 匙飘亏 何巩阑 DLL 葛碘阑 静绰啊
desc.bUsingThread = TRUE; // 静饭靛甫 荤侩窍绰啊?
desc.bUsingEventObject = TRUE; // 捞亥飘 坷宏璃飘甫 烹秦 搬苞甫 罐阑 扒啊..
strcpy(desc.AdminCursor,"Cursor");
strcpy(desc.AdminID,LOGINDBID);
strcpy(desc.AdminPW ,LOGINDBPASSWORD);
strcpy(desc.ClientCursor ,"Cursor");
strcpy(desc.ClientID ,LOGINDBID);
strcpy(desc.ClientPW,LOGINDBPASSWORD);
strcpy(desc.DBName,"MHGame");
strcpy(desc.Default_User_account,"Test");
strcpy(desc.Default_User_guid,"Test");
strcpy(desc.Default_User_pw,"Test");
strcpy(desc.Default_User_table,"Test");
desc.dwDBMessageID = WM_DB_MESSAGE; // 皋技瘤甫 烹秦 搬苞甫 罐阑 版快 镜 皋技瘤 涝仿
#ifdef _RMTOOL_
desc.hWndToPostMessage = AfxGetMainWnd()->m_hWnd;
#else
desc.hWndToPostMessage = GetActiveWindow(); // 皋技瘤甫 烹秦 搬苞甫 罐阑 版快 皋技瘤甫 器胶飘且 扩档 勤甸
#endif
// desc.ReadDBResult = ReadDBResultMessage; // 捞亥飘 规侥阑 捞侩且 版快 搬苞档馒矫俊 call且 窃荐器牢磐
desc.WriteMessage = WriteMessage; // 阿辆 皋技瘤 免仿矫俊 捞侩且 窃荐器牢磐
desc.dwMessageMaxSize = 30; // DBMESSAGE 备炼眉狼 弥措 农扁
m_SameTimeQueryPerThread = MaxSameTimeQuery/MaxDBThread;
desc.dwNumofMessage = m_SameTimeQueryPerThread; // 弥措 孽府 肮荐 (悼矫 )
desc.dwNumofResult = m_SameTimeQueryPerThread; // select茄 搬苞狼 弥措 俺荐
desc.dwResultMaxSize = sizeof(QUERYST)*MAX_ROW_NUM; // select 巩 狼 弥措 搬苞 农扁
desc.dwSizeofStack = sizeof(DBFreeQuery); // 窃荐牢磊甫 淬绰 胶琶狼 农扁
ASSERT(MaxDBThread <= 4);
m_MaxDBThreadNum = MaxDBThread;
m_pDB = new DBTH[MaxDBThread];
for(DWORD n=0;n<m_MaxDBThreadNum;++n)
{
if(n==0) desc.ReadDBResult = ReadDBResultMessage1;
if(n==1) desc.ReadDBResult = ReadDBResultMessage2;
if(n==2) desc.ReadDBResult = ReadDBResultMessage3;
if(n==3) desc.ReadDBResult = ReadDBResultMessage4;
BOOL rt = m_pDB[n].Init(&desc);
ASSERT(rt);
}
return TRUE;
}
BOOL CDataBase::AddQueryQueue(DBQUERY* pQuery, BOOL bAddQueueWhenFull)
{
if(m_pDB == NULL) return FALSE; // 捞固 Release等 版快
DBTH* pDB = GetCurDB(); // 俩 茄啊茄 DB
if(pDB == NULL)
{
m_QueryQueue.AddTail(pQuery);
return FALSE;
}
if(pDB->Query(pQuery) == FALSE) // 钮啊 厚绢乐促搁 孽府甫 夸没秦焊绊
{
if(bAddQueueWhenFull)
m_QueryQueue.AddTail(pQuery); // 贸府啊 救登搁 钮俊 笼绢持绰促.
else
return FALSE;
}
else
m_QueryPool.Free(pQuery); // 孽府啊 贸府 登菌促搁 Free矫挪促.
return TRUE;
}
BOOL CDataBase::LoginQuery(BYTE QueryType,DWORD dwMessageID,DWORD ID,char* strQuery, BOOL bAddQueueWhenFull)
{
if(m_pDB == NULL) return FALSE; // 捞固 Release等 版快
DBQUERY* pQuery = m_QueryPool.Alloc(); //
ASSERT(pQuery);
pQuery->SetQuery(DBTH::eDBCON_LOGIN,QueryType,dwMessageID,strQuery,ID);
return AddQueryQueue(pQuery);
}
BOOL CDataBase::LoginMiddleQuery(void* pReturnFunc,DWORD ID,char* strQuery,...)
{
static char temp[4096];
va_list vl;
va_start(vl, strQuery);
vsprintf(temp, strQuery, vl);
va_end(vl);
DBQUERY* pQuery = m_QueryPool.Alloc();
ASSERT(pQuery);
pQuery->SetQuery(DBTH::eDBCON_LOGIN,eQueryType_FreeMiddleQuery,(DWORD)pReturnFunc,temp,ID);
AddQueryQueue(pQuery);
return TRUE;
}
BOOL CDataBase::Query(BYTE QueryType,DWORD dwMessageID,DWORD ID,char* strQuery)
{
if(m_pDB == NULL) return FALSE; // 捞固 Release等 版快
DBQUERY* pQuery = m_QueryPool.Alloc();
ASSERT(pQuery);
pQuery->SetQuery(DBTH::eDBCON_ADMIN,QueryType,dwMessageID,strQuery,ID);
AddQueryQueue(pQuery);
return TRUE;
}
BOOL CDataBase::LogQuery(BYTE QueryType,DWORD dwMessageID,DWORD ID,char* strQuery)
{
if(m_pDB == NULL) return FALSE; // 捞固 Release等 版快
DBQUERY* pQuery = m_QueryPool.Alloc();
ASSERT(pQuery);
pQuery->SetQuery(DBTH::eDBCON_LOG,QueryType,dwMessageID,strQuery,ID);
AddQueryQueue(pQuery);
return TRUE;
}
BOOL CDataBase::FreeQuery(DWORD dwMessageID, DWORD ID, char* strQuery,...)
{
if(m_pDB == NULL) return FALSE; // 捞固 Release等 版快
static char temp[4096];
va_list vl;
va_start(vl, strQuery);
vsprintf(temp, strQuery, vl);
va_end(vl);
DBQUERY* pQuery = m_QueryPool.Alloc();
ASSERT(pQuery);
pQuery->SetQuery(DBTH::eDBCON_ADMIN,eQueryType_FreeQuery,dwMessageID,temp,ID);
AddQueryQueue(pQuery);
return TRUE;
}
BOOL CDataBase::FreeLargeQuery(void* pReturnFunc,DWORD ID,char* strQuery,...)
{
if(m_pDB == NULL) return FALSE; // 捞固 Release等 版快
static char temp[4096];
va_list vl;
va_start(vl, strQuery);
vsprintf(temp, strQuery, vl);
va_end(vl);
DBQUERY* pQuery = m_QueryPool.Alloc();
ASSERT(pQuery);
pQuery->SetQuery(DBTH::eDBCON_ADMIN,eQueryType_FreeLargeQuery,(DWORD)pReturnFunc,temp,ID);
AddQueryQueue(pQuery);
return TRUE;
}
BOOL CDataBase::FreeMiddleQuery(void* pReturnFunc,DWORD ID,char* strQuery,...)
{
if(m_pDB == NULL) return FALSE; // 捞固 Release等 版快
static char temp[4096];
va_list vl;
va_start(vl, strQuery);
vsprintf(temp, strQuery, vl);
va_end(vl);
DBQUERY* pQuery = m_QueryPool.Alloc();
ASSERT(pQuery);
pQuery->SetQuery(DBTH::eDBCON_ADMIN,eQueryType_FreeMiddleQuery,(DWORD)pReturnFunc,temp,ID);
AddQueryQueue(pQuery);
return TRUE;
}
// 亲惑 龋免登绢具 窍绰 巴
void CDataBase::ProcessingDBMessage()
{
for(DWORD n=0;n<m_MaxDBThreadNum;++n)
m_pDB[n].m_pIDB->ProcessingDBMessage();
while(m_QueryQueue.GetCount() != 0)
{
DBQUERY* pQuery = (DBQUERY*)m_QueryQueue.GetHead();
DBTH* pDB = GetCurDB(); // 俩 茄啊茄 DB
if(pDB == NULL)
break;
if(pDB->Query(pQuery))
{
m_QueryQueue.RemoveHead();
m_QueryPool.Free(pQuery);
}
else
{
break;
}
}
}
void ReadDBResultMessage(int ThreadNum,DWORD ret, LPDBMESSAGE pMessage)
{
switch(pMessage->bFNNo)
{
case eQueryType_FreeQuery:
{
if( ret && g_DBMsgFunc[pMessage->dwMessageID])
g_DBMsgFunc[pMessage->dwMessageID]((LPQUERY)ret, pMessage);
g_DB.m_pDB[ThreadNum].DeletePointer(pMessage,ret);
}
break;
case eQueryType_FreeMiddleQuery:
{
if( ret && pMessage->dwMessageID)
((DBMiddleMsgFunc)pMessage->dwMessageID)((LPMIDDLEQUERY)ret, pMessage);
g_DB.m_pDB[ThreadNum].DeletePointer(pMessage,ret);
}
break;
case eQueryType_FreeLargeQuery:
{
if( ret && pMessage->dwMessageID)
((DBLargeMsgFunc)pMessage->dwMessageID)((LPLARGEQUERY)ret, pMessage);
g_DB.m_pDB[ThreadNum].DeletePointer(pMessage,ret);
}
break;
default:
{
ASSERT(0);
}
}
}
#ifdef _MONITORINGSERVER
char* GetCurTimeToString()
{
static char t[2] = {0,};
return t;
}
#endif
void WriteMessage(char* pmsg)
{
#ifndef _RMTOOL_
g_Console.LOG(2, pmsg);
FILE* fp = fopen("DB_ERROR_LOG.txt","a+");
fprintf(fp,"%s, time:%s\n",pmsg, GetCurTimeToString());
fclose(fp);
#else
FILE* fp = fopen("DB_LOG.txt","a+");
fprintf(fp,"[%s | %s] : %s\n", __DATE__, __TIME__, pmsg);
fclose(fp);
#endif
}
void castingdelete(LPVOID pTarget1, LPVOID pTarget2, int nNum)
{
switch(nNum)
{
case 1:
delete (DBDATA1*) pTarget1;
delete (DBDATA1*) pTarget2;
return;
case 2:
delete (DBDATA2*) pTarget1;
delete (DBDATA2*) pTarget2;
return;
case 3:
delete (DBDATA3*) pTarget1;
delete (DBDATA3*) pTarget2;
return;
case 4:
delete (DBDATA4*) pTarget1;
delete (DBDATA4*) pTarget2;
return;
case 5:
delete (DBDATA5*) pTarget1;
delete (DBDATA5*) pTarget2;
return;
case 6:
delete (DBDATA6*) pTarget1;
delete (DBDATA6*) pTarget2;
return;
case 7:
delete (DBDATA7*) pTarget1;
delete (DBDATA7*) pTarget2;
return;
case 8:
delete (DBDATA8*) pTarget1;
delete (DBDATA8*) pTarget2;
return;
case 9:
delete (DBDATA9*) pTarget1;
delete (DBDATA9*) pTarget2;
return;
case 10:
delete (DBDATA10*) pTarget1;
delete (DBDATA10*) pTarget2;
return;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -