⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 database.cpp

📁 墨香最新私服
💻 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 + -