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

📄 gamedata.h

📁 魔域源代码需要的可以学习一下真么这么麻烦啊
💻 H
字号:
// GameData.h: interface for the CGameMapData class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(GAMEDATA_HEAD3)
#define GAMEDATA_HEAD3

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include "I_mydb.h"
#include "autoptr.h"

//////////////////////////////////////////////////////////////////////
template<TYPENAME T, char* TBL, char* KEY>
class CGameData : IGameData<T>
{
protected:
	CGameData()											{ m_pRecord = NULL; m_idKey = ID_NONE; }
	virtual ~CGameData()								{ if(m_pRecord) m_pRecord->Release(); }
public: // construct
//	static bool			Init(IDatabase* pDb);
	static CGameData*	CreateNew()						{ return new CGameData; }
	virtual void		Release()						{ delete this; }
//	static void			Final()							{ if(m_pDefaultRes) m_pDefaultRes->Release(); m_pDefaultRes=NULL; }	// 可重复调用
	IGameData<T>*			QueryInterface()				{ return (IGameData<T>*)this; }
public: // by set
	virtual void		ReleaseByOwner()				{ delete this; }
	OBJID		GetID()									{ return m_idKey; }
public:
	OBJID		GetKey()								{ return m_idKey; }
	int			GetInt(T nDataName)						{ return m_pRecord->GetInt(nDataName); }
	LPCTSTR		GetStr(T nDataName)						{ return m_pRecord->GetStr(nDataName); }
	void		SetInt(T nDataName, int nData)			{ m_pRecord->SetInt(nDataName, nData); }
	void		SetStr(T nDataName, LPCTSTR szData, int nSize)		{ m_pRecord->SetStr(nDataName, szData, nSize); }
/*public: // IGameData
	int			GetInt(int nDataName)						{ return GetInt_((T)nDataName); }
	LPCTSTR		GetStr(int nDataName)						{ return GetStr_((T)nDataName); }
	void		SetInt(int nDataName, int nData)			{ SetInt_((T)nDataName, nData); }
	void		SetStr(int nDataName, LPCTSTR szData, int nSize)		{ SetStr_((T)nDataName, szData, nSize); }
*/
public:
	bool		Create(OBJID id, IDatabase* pDb);		// 装入数据
	bool		Create(IRecordset* pRecordset)			// 装入数据
														{ m_pRecord = pRecordset->CreateNewRecord(); 
															if(m_pRecord) m_idKey	= m_pRecord->LoadDWord(KEY); 
															return m_pRecord != NULL; }
	bool		Create(IRecord* pDefaultRes, OBJID id)	// 不装入数据
														{ m_pRecord = pDefaultRes->CreateNewRecord(id); 
															if(m_pRecord) m_idKey	= m_pRecord->LoadDWord(KEY); 
															return m_pRecord != NULL; }
	bool		Create(IDatabase* pDb, OBJID id)		// 不装入数据,自动调用CreateDefault(),以初始化m_pDefault
														{ CHECKF(CreateNewDefault(pDb));
															m_pRecord = (*m_pDefault).CreateNewRecord(id); 
															if(m_pRecord) m_idKey	= m_pRecord->LoadDWord(KEY); 
															return m_pRecord != NULL; }
	bool		Update()								{ return m_pRecord->UpdateRecord(); }
	OBJID		InsertRecord()							{ m_idKey = m_pRecord->InsertRecord(); return m_idKey; }
	bool		DeleteRecord()							{ return m_pRecord->DeleteRecord(); }
	void		ClearUpdateFlags()						{ m_pRecord->ClearUpdateFlags(); }
	IRecord*	GetRecord()								{ ASSERT(m_pRecord); return m_pRecord; }

protected:
	IRecord*	m_pRecord;
	OBJID		m_idKey;

//////////////////////////////////////////////////////////////////////
protected: // static
	// 可重复调用,多余的调用被忽略。RECORD模板会自动RELEASE
	static bool	CreateNewDefault(IDatabase* pDb)		{ char szSQL[256]; sprintf(szSQL, "SELECT * FROM %s WHERE %s=0 LIMIT 1", TBL, KEY);
															if(m_pDefault) return true; m_pDefault = pDb->CreateNewRecordset(szSQL, false); return m_pDefault!=NULL; }
protected:
	static CAutoPtr<IRecordset>	m_pDefault;

//	MYHEAP_DECLARATION(s_heap)
};

template<TYPENAME T, char* TBL, char* KEY>
bool CGameData<T,TBL,KEY>::Create(OBJID id, IDatabase* pDb)
{
	CHECKF(pDb);

	char	szSQL[1024];
	sprintf(szSQL, "SELECT * FROM %s WHERE %s=%u LIMIT 1", TBL, KEY, id);
	IRecordset* pRes = pDb->CreateNewRecordset(szSQL, false);
	m_pRecord	= pRes->CreateNewRecord();
	pRes->Release();			//?? IRecordset暂不支持修改KEY值

	if(m_pRecord)
		m_idKey	= m_pRecord->LoadDWord(KEY);

	return m_pRecord != NULL;
}

template<TYPENAME T, char* TBL, char* KEY>
CAutoPtr<IRecordset>	CGameData<T,TBL,KEY>::m_pDefault;


#endif // !defined(GAMEDATA_HEAD3)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -