#include #include "RylDBStoreCommand.h" #include "RylDBCharCommand.h" namespace RylDBCommand { #define BOUNDED_SUBTRACT(data, minusval, minbound) if ((data) < (minusval) + (minbound)) { (data) = (minbound); } else { (data) -= (minusval); } void DBErrorLogByCID(DBErrorType eErrorType, unsigned long dwCID, HRESULT hr, const char* szClassName, const CString& DBStatus) { switch(eErrorType) { case DBERR_CONVERT_FAILED: ERRLOG2(g_Log, "CID:%10u / %s µ¥ÀÌÅÍ Ã³¸® ½ÇÆÐ", dwCID, szClassName); break; case DBERR_SETDATA_FAILED: ERRLOG4(g_Log, "CID:%10u / hr:0x%08x / %s SetData ½ÇÆÐ : DBStatus:%s", dwCID, hr, szClassName, DBStatus); break; case DBERR_UPDATE_FAILED: ERRLOG4(g_Log, "CID:%10u / hr:0x%08x / %s Update ½ÇÆÐ : DBStatus:%s", dwCID, hr, szClassName, DBStatus); break; } } void CCharData::Init(void) { m_CID = 0; memset(m_Name, 0, sizeof(char) * CHAR_INFOST::MAX_NAME_LEN); memset(m_EquipData, 0, sizeof(BYTE) * MAX_EQUIP_DATA); m_Sex = m_Hair = m_Face = m_Race = 0; m_Class = 0; m_Fame = m_Mileage = m_GID = m_PID = 0; m_Level = 0; m_Gold = 0; m_IP = m_STR = m_DEX = m_CON = m_INT = m_WIS = m_HP = m_MP = 0; m_Exp = 0LL; m_Chance = 0; m_NameLen = m_EquipLen = 0; // Data Status m_CIDStatus = m_NameStatus = m_SexStatus = m_HairStatus = m_FaceStatus = m_RaceStatus = m_ClassStatus = m_FameStatus = m_MileageStatus = m_GIDStatus = m_PIDStatus = m_LevelStatus = m_GoldStatus = m_IPStatus = m_STRStatus = m_DEXStatus = m_CONStatus = m_INTStatus = m_WISStatus = m_HPStatus = m_MPStatus = m_ExpStatus = m_ChanceStatus = m_EquipDataStatus = DBSTATUS_S_OK; } bool CCharData::operator == (const CCharData& rhs) const { return (m_CID == rhs.m_CID && 0 == memcmp(m_Name, rhs.m_Name, sizeof(char) * CHAR_INFOST::MAX_NAME_LEN) && m_Sex == rhs.m_Sex && m_Hair == rhs.m_Hair && m_Face == rhs.m_Face && m_Race == rhs.m_Race && m_Class == rhs.m_Class && m_Fame == rhs.m_Fame && m_Mileage == rhs.m_Mileage && m_GID == rhs.m_GID && m_PID == rhs.m_PID && m_Level == rhs.m_Level && m_Gold == rhs.m_Gold && m_IP == rhs.m_IP && m_STR == rhs.m_STR && m_DEX == rhs.m_DEX && m_CON == rhs.m_CON && m_INT == rhs.m_INT && m_WIS == rhs.m_WIS && m_HP == rhs.m_HP && m_MP == rhs.m_MP && m_Exp == rhs.m_Exp && m_Chance == rhs.m_Chance && 0 == memcmp(m_EquipData, rhs.m_EquipData, sizeof(BYTE) * MAX_EQUIP_DATA)); } void CCharData::LogError(DBErrorType eErrorType, HRESULT hr) { DBErrorLogByCID(eErrorType, GetCID(), hr, "CCharData", GetDBStatus()); } CString CCharData::GetDBStatus() { CString dbStatus; dbStatus.Format("CID:%10u(0x%08x) " "Name:%s(0x%08x) " "Sex:%d(0x%08x) " "Hair:%d(0x%08x) " "Face:%d(0x%08x) " "Race:%d(0x%08x) " "Class:%d(0x%08x) " "Fame:%6d(0x%08x) " "Mileage:%6d(0x%08x) " "GID:%d(0x%08x) " "PID:%d(0x%08x) " "Level:%d(0x%08x) " "Gold:%10u(0x%08x) " "IP:%d(0x%08x) " "STR:%3d(0x%08x) " "DEX:%3d(0x%08x) " "CON:%3d(0x%08x) " "INT:%3d(0x%08x) " "WIS:%3d(0x%08x) " "HP:%d(0x%08x) " "MP:%d(0x%08x) " "Exp:%I64u(0x%08x) " "Chance:%d(0x%08x) " "Equipdata(0x%08x) ", m_CID, m_CIDStatus, m_Name, m_NameStatus, m_Sex, m_SexStatus, m_Hair, m_HairStatus, m_Face, m_FaceStatus, m_Race, m_RaceStatus, m_Class, m_ClassStatus, m_Fame, m_FameStatus, m_Mileage, m_MileageStatus, m_GID, m_GIDStatus, m_PID, m_PIDStatus, m_Level, m_LevelStatus, m_Gold, m_GoldStatus, m_IP, m_IPStatus, m_STR, m_STRStatus, m_DEX, m_DEXStatus, m_CON, m_CONStatus, m_INT, m_INTStatus, m_WIS, m_WISStatus, m_HP, m_HPStatus, m_MP, m_MPStatus, m_Exp, m_ExpStatus, m_Chance, m_ChanceStatus, m_EquipDataStatus); return dbStatus; } void CSkillData::Init(void) { m_CID = 0; memset(m_Skill, 0, sizeof(BYTE) * sizeof(SKILL)); m_SkillLength = 0; m_CIDStatus = m_SkillStatus = DBSTATUS_S_OK; } void CSkillData::LogError(DBErrorType eErrorType, HRESULT hr) { DBErrorLogByCID(eErrorType, GetCID(), hr, "CSkillData", GetDBStatus()); } bool CSkillData::operator == (const CSkillData& rhs) const { return m_CID == rhs.m_CID && 0 == memcmp(m_Skill, rhs.m_Skill, sizeof(SKILL)); } CString CSkillData::GetDBStatus() { CString dbStatus; dbStatus.Format("CID:%10u(0x%08x) Skill(0x%08x)", m_CID, m_CIDStatus, m_SkillStatus); return dbStatus; } void CCharItem::Init() { m_CID = 0; memset(m_Quick, 0, sizeof(QUICK)); memset(m_Equip, 0, sizeof(EQUIP)); memset(m_Inven, 0, sizeof(INVEN)); memset(m_Extra, 0, sizeof(EXTRA)); m_QuickLen = m_EquipLen = m_InvenLen = m_ExtraLen = 0; m_CIDStatus = m_QuickStatus = m_EquipStatus = m_InvenStatus = m_ExtraStatus = DBSTATUS_S_OK; m_bAdjustSize = false; } void CCharItem::LogError(DBErrorType eErrorType, HRESULT hr) { DBErrorLogByCID(eErrorType, GetCID(), hr, "CCharItem", GetDBStatus()); } void CCharItem::AdjustSize(bool bRestore) { if (bRestore && m_bAdjustSize) { reinterpret_cast(m_Equip).dwSize += sizeof(unsigned long); reinterpret_cast(m_Inven).dwSize += sizeof(unsigned long); reinterpret_cast(m_Extra).dwSize += sizeof(unsigned long); m_bAdjustSize = false; } else if (!bRestore && !m_bAdjustSize) { BOUNDED_SUBTRACT(reinterpret_cast(m_Equip).dwSize, sizeof(unsigned long), 0); BOUNDED_SUBTRACT(reinterpret_cast(m_Inven).dwSize, sizeof(unsigned long), 0); BOUNDED_SUBTRACT(reinterpret_cast(m_Extra).dwSize, sizeof(unsigned long), 0); m_bAdjustSize = true; } } bool CCharItem::operator == (const CCharItem& rhs) const { return m_CID == rhs.m_CID && 0 == memcmp(m_Quick, rhs.m_Quick, sizeof(QUICK)) && 0 == memcmp(m_Equip, rhs.m_Equip, sizeof(EQUIP)) && 0 == memcmp(m_Inven, rhs.m_Inven, sizeof(INVEN)) && 0 == memcmp(m_Extra, rhs.m_Extra, sizeof(EXTRA)); } CString CCharItem::GetDBStatus() { CString dbStatus; dbStatus.Format("CID:%10u(0x%08x) Quick(0x%08x) " "Equip:%d(0x%08x) Inven:%d(0x%08x) Extra:%d(0x%08x)", m_CID, m_CIDStatus, m_QuickStatus, GetEquip().dwSize, m_EquipStatus, GetInven().dwSize, m_InvenStatus, GetExtra().dwSize, m_ExtraStatus); return dbStatus; } void CCharItemEx::Init() { m_CID = 0; memset(m_Exchange, 0, sizeof(EXCHANGE)); memset(m_TempInven, 0, sizeof(TEMPINVEN)); m_ExchangeLen = m_TempInvenLen = 0; m_CIDStatus = m_ExchangeStatus = m_TempInvenStatus = DBSTATUS_S_OK; m_bAdjustSize = false; } void CCharItemEx::LogError(DBErrorType eErrorType, HRESULT hr) { DBErrorLogByCID(eErrorType, GetCID(), hr, "CCharItemEx", GetDBStatus()); } void CCharItemEx::AdjustSize(bool bRestore) { if (bRestore && m_bAdjustSize) { reinterpret_cast(m_Exchange).dwSize += sizeof(unsigned long); reinterpret_cast(m_TempInven).dwSize += sizeof(unsigned long); m_bAdjustSize = false; } else if (!bRestore && !m_bAdjustSize) { BOUNDED_SUBTRACT(reinterpret_cast(m_Exchange).dwSize, sizeof(unsigned long), 0); BOUNDED_SUBTRACT(reinterpret_cast(m_TempInven).dwSize, sizeof(unsigned long), 0); m_bAdjustSize = true; } } bool CCharItemEx::operator == (const CCharItemEx& rhs) const { return m_CID == rhs.m_CID && 0 == memcmp(m_Exchange, rhs.m_Exchange, sizeof(EXCHANGE)) && 0 == memcmp(m_TempInven, rhs.m_TempInven, sizeof(TEMPINVEN)); } CString CCharItemEx::GetDBStatus() { CString dbStatus; dbStatus.Format("CID:%10u(0x%08x) Exchange:%d(0x%08x) TempInven:%d(0x%08x)", m_CID, m_CIDStatus, GetExchange().dwSize, m_ExchangeStatus, GetTempInven().dwSize, m_TempInvenStatus); return dbStatus; } void CCharQuest::Init() { m_CID = 0; memset(m_Quest, 0, sizeof(QUEST)); memset(m_History, 0, sizeof(HISTORY)); m_QuestLen = m_HistoryLen = 0; m_CIDStatus = m_QuestStatus = m_HistoryStatus = DBSTATUS_S_OK; m_bAdjustSize = false; } void CCharQuest::LogError(DBErrorType eErrorType, HRESULT hr) { DBErrorLogByCID(eErrorType, GetCID(), hr, "CCharQuest", GetDBStatus()); } void CCharQuest::AdjustSize(bool bRestore) { if (bRestore && m_bAdjustSize) { reinterpret_cast(m_Quest).dwSize += sizeof(unsigned long); reinterpret_cast(m_History).dwSize += sizeof(unsigned long); m_bAdjustSize = false; } else if(!bRestore && !m_bAdjustSize) { BOUNDED_SUBTRACT(reinterpret_cast(m_Quest).dwSize, sizeof(unsigned long), 0); BOUNDED_SUBTRACT(reinterpret_cast(m_History).dwSize, sizeof(unsigned long), 0); m_bAdjustSize = true; } } bool CCharQuest::operator == (const CCharQuest& rhs) const { return m_CID == rhs.m_CID && 0 == memcmp(m_Quest, rhs.m_Quest, sizeof(QUEST)) && 0 == memcmp(m_History, rhs.m_History, sizeof(HISTORY)); } CString CCharQuest::GetDBStatus() { CString dbStatus; dbStatus.Format("CID:%10u(0x%08x) Quest(0x%08x) History(0x%08x)", m_CID, m_CIDStatus, m_QuestStatus, m_HistoryStatus); return dbStatus; } void CPartyData::Init() { m_PID = m_GID = 0; memset(m_PartyInfo, 0, sizeof(m_PartyInfo)); memset(m_UserInfo, 0, sizeof(m_UserInfo)); m_PartyLen = sizeof(m_PartyInfo); m_UserInfoLen = sizeof(m_UserInfo); m_PIDStatus = m_GIDStatus = m_PartyStatus = m_UserInfoStatus = DBSTATUS_S_OK; } void CPartyData::LogError(DBErrorType eErrorType, HRESULT hr) { switch(eErrorType) { case DBERR_CONVERT_FAILED: ERRLOG1(g_Log, "PID:%10u / CPartyData µ¥ÀÌÅÍ Ã³¸® ½ÇÆÐ", GetPID()); break; case DBERR_SETDATA_FAILED: ERRLOG3(g_Log, "PID:%10u / hr:0x%08x / CPartyData SetData ½ÇÆÐ : DBStatus:%s", GetPID(), hr, GetDBStatus()); break; case DBERR_UPDATE_FAILED: ERRLOG3(g_Log, "PID:%10u / hr:0x%08x / CPartyData Update ½ÇÆÐ : DBStatus:%s", GetPID(), hr, GetDBStatus()); break; } } bool CPartyData::operator == (const CPartyData& rhs) const { return (m_PID == rhs.m_PID && m_GID == rhs.m_GID && 0 == memcmp(m_PartyInfo, rhs.m_PartyInfo, sizeof(m_PartyInfo)) && 0 == memcmp(m_UserInfo, rhs.m_UserInfo, sizeof(m_UserInfo))); } CString CPartyData::GetDBStatus() { CString dbStatus; dbStatus.Format("PID:%10u(0x%08x) GID:%10u(0x%08x) Party(0x%08x) PartyUserInfo(0x%08x)", m_PID, m_PIDStatus, m_GID, m_GIDStatus, m_PartyStatus, m_UserInfoStatus); return dbStatus; } void CFriendData::Init() { m_CID = 0; memset(m_Friend, 0, sizeof(m_Friend)); memset(m_Ban, 0, sizeof(m_Ban)); memset(m_FriendInfo, 0, sizeof(m_FriendInfo)); memset(m_BanInfo, 0, sizeof(m_BanInfo)); m_FriendLen = sizeof(m_Friend); m_BanLen = sizeof(m_Ban); m_FriendInfoLen = sizeof(m_FriendInfo); m_BanInfoLen = sizeof(m_BanInfo); m_CIDStatus = m_FriendStatus = m_BanStatus = m_FriendInfoStatus = m_BanInfoStatus = DBSTATUS_S_OK; m_bAdjustSize = false; } void CFriendData::AdjustSize(bool bRestore) { if (bRestore && m_bAdjustSize) { *reinterpret_cast(m_Friend) += sizeof(unsigned long); *reinterpret_cast(m_FriendInfo) += sizeof(unsigned long); *reinterpret_cast(m_Ban) += sizeof(unsigned long); *reinterpret_cast(m_BanInfo) += sizeof(unsigned long); m_bAdjustSize = false; } else if (!bRestore && !m_bAdjustSize) { BOUNDED_SUBTRACT(*reinterpret_cast(m_Friend), sizeof(unsigned long), 0); BOUNDED_SUBTRACT(*reinterpret_cast(m_FriendInfo), sizeof(unsigned long), 0); BOUNDED_SUBTRACT(*reinterpret_cast(m_Ban), sizeof(unsigned long), 0); BOUNDED_SUBTRACT(*reinterpret_cast(m_BanInfo), sizeof(unsigned long), 0); m_bAdjustSize = true; } } void CFriendData::LogError(DBErrorType eErrorType, HRESULT hr) { DBErrorLogByCID(eErrorType, GetCID(), hr, "FriendData", GetDBStatus()); } const FRIEND CFriendData::GetFriend() const { FRIEND localFriend; memcpy(&localFriend, m_Friend, sizeof(m_Friend)); memcpy(reinterpret_cast(&localFriend) + sizeof(m_Friend), m_FriendInfo, sizeof(m_FriendInfo)); return localFriend; } const BAN CFriendData::GetBan() const { BAN localBan; memcpy(&localBan, m_Ban, sizeof(m_Ban)); memcpy(reinterpret_cast(&localBan) + sizeof(m_Ban), m_BanInfo, sizeof(m_BanInfo)); return localBan; } void CFriendData::SetFriend(const FRIEND& friendData) { memcpy(m_Friend, &friendData.dwSize, sizeof(friendData.dwSize)); memcpy(m_Friend + sizeof(friendData.dwSize), friendData.Data, sizeof(friendData.Data)); memcpy(m_FriendInfo, &friendData.dwInfoSize, sizeof(friendData.dwInfoSize)); memcpy(m_FriendInfo + sizeof(friendData.dwInfoSize), friendData.Info, sizeof(friendData.Info)); m_FriendLen = sizeof(m_Friend); m_FriendInfoLen = sizeof(m_FriendInfo); m_FriendStatus = DBSTATUS_S_OK; m_FriendInfoStatus = DBSTATUS_S_OK; } void CFriendData::SetBan(const BAN& banData) { memcpy(m_Ban, &banData.dwSize, sizeof(banData.dwSize)); memcpy(m_Ban + sizeof(banData.dwSize), banData.Data, sizeof(banData.Data)); memcpy(m_BanInfo, &banData.dwInfoSize, sizeof(banData.dwInfoSize)); memcpy(m_BanInfo + sizeof(banData.dwSize), banData.Info, sizeof(banData.Info)); m_BanLen = sizeof(m_Ban); m_BanInfoLen = sizeof(m_BanInfo); m_BanStatus = DBSTATUS_S_OK; m_BanInfoStatus = DBSTATUS_S_OK; } bool CFriendData::operator == (const CFriendData& rhs) const { return m_CID == rhs.m_CID && 0 == memcmp(m_Friend, rhs.m_Friend, sizeof(m_Friend)) && 0 == memcmp(m_Ban, rhs.m_Ban, sizeof(m_Ban)) && 0 == memcmp(m_FriendInfo, rhs.m_FriendInfo, sizeof(m_FriendInfo)) && 0 == memcmp(m_BanInfo, rhs.m_BanInfo, sizeof(m_BanInfo)); } CString CFriendData::GetDBStatus() { CString dbStatus; dbStatus.Format("CID:%10u(0x%08x) Friend(0x%08x) Ban(0x%08x) FriendInfo(0x%08x) BanInfo(0x%08x)", m_CID, m_CIDStatus, m_FriendStatus, m_BanStatus, m_FriendInfoStatus, m_BanInfoStatus); return dbStatus; } void CUnifiedCharList::Init() { m_UID = m_BeforeCID = m_NewCID = 0; memset(m_BeforeCharName, 0, sizeof(m_BeforeCharName)); m_OldServerGroupID = 0; m_BeforeCharNameLen = 0; m_UIDStatus = m_OldServerGroupIDStatus = m_BeforeCIDStatus = m_NewCIDStatus = m_BeforeCharNameStatus = DBSTATUS_S_ISNULL; } void CUnifiedCharList::LogError(DBErrorType eErrorType, HRESULT hr) { switch(eErrorType) { case DBERR_CONVERT_FAILED: ERRLOG2(g_Log, "UID:%10u / NewCID:%10u / CUnifiedCharList µ¥ÀÌÅÍ Ã³¸® ½ÇÆÐ", GetUID(), GetNewCID()); break; case DBERR_SETDATA_FAILED: ERRLOG4(g_Log, "CID:%10u / NewCID:%10u / hr:0x%08x / CUnifiedCharList SetData ½ÇÆÐ : DBStatus:%s", GetUID(), GetNewCID(), hr, GetDBStatus()); break; case DBERR_UPDATE_FAILED: ERRLOG4(g_Log, "CID:%10u / NewCID:%10u / hr:0x%08x / CUnifiedCharList Update ½ÇÆÐ : DBStatus:%s", GetUID(), GetNewCID(), hr, GetDBStatus()); break; } } CString CUnifiedCharList::GetDBStatus() { CString DBStatus; DBStatus.Format("UIDStatus(0x%08x)/OldServerGroupID(0x%08x)/BeforeCIDStatus(0x%08x)/" "NewCIDStatus(0x%08x)/BeforeCharNameStatus(0x%08x)", m_UIDStatus, m_OldServerGroupIDStatus, m_BeforeCIDStatus, m_NewCIDStatus, m_BeforeCharNameStatus); return DBStatus; } bool CUnifiedCharList::operator == (const CUnifiedCharList& rhs) const { return m_UID == rhs.m_UID && m_BeforeCID == rhs.m_BeforeCID && m_NewCID == rhs.m_NewCID && m_OldServerGroupID == rhs.m_OldServerGroupID && 0 == memcmp(m_BeforeCharName, rhs.m_BeforeCharName, sizeof(m_BeforeCharName)); } }