knightonline/server/shared/database/ZoneInfoSet.h

57 lines
1.5 KiB
C++

#pragma once
typedef std::map<uint16, _ZONE_INFO *> ZoneInfoMap;
class CZoneInfoSet : public OdbcRecordset
{
public:
CZoneInfoSet(OdbcConnection * dbConnection, ZoneInfoMap * pMap)
: OdbcRecordset(dbConnection), m_pMap(pMap) {}
virtual tstring GetTableName() { return _T("ZONE_INFO"); }
#if defined(AI_SERVER)
virtual tstring GetColumns() { return _T("ServerNo, ZoneNo, strZoneName, RoomEvent"); }
#else
virtual tstring GetColumns() { return _T("ServerNo, ZoneNo, strZoneName, InitX, InitZ, InitY"); }
#endif
virtual bool Fetch()
{
_ZONE_INFO * pData = new _ZONE_INFO;
int i = 1;
_dbCommand->FetchUInt16(i++, pData->m_nServerNo);
_dbCommand->FetchUInt16(i++, pData->m_nZoneNumber);
_dbCommand->FetchString(i++, pData->m_MapName);
#ifdef AI_SERVER
_dbCommand->FetchByte(i++, pData->m_byRoomEvent);
#else
uint32 iX = 0, iY = 0, iZ = 0;
_dbCommand->FetchUInt32(i++, iX);
_dbCommand->FetchUInt32(i++, iZ);
_dbCommand->FetchUInt32(i++, iY);
pData->m_fInitX = (float)(iX / 100.0f);
pData->m_fInitY = (float)(iY / 100.0f);
pData->m_fInitZ = (float)(iZ / 100.0f);
#endif
if (pData->m_nZoneNumber > MAX_ZONE_ID)
{
printf("ERROR: Zone ID %d is too large. Highest zone ID can be %d.\n", pData->m_nZoneNumber, MAX_ZONE_ID);
delete pData;
return false;
}
if (m_pMap->find(pData->m_nZoneNumber) != m_pMap->end())
delete pData;
else
m_pMap->insert(std::make_pair(pData->m_nZoneNumber, pData));
return true;
}
ZoneInfoMap * m_pMap;
};