mirror of
https://github.com/SWG-Source/src.git
synced 2026-08-04 04:16:02 -04:00
Merge branch 'testing'
This commit is contained in:
@@ -220,7 +220,7 @@ void Persister::onFrameBarrierReached()
|
||||
{
|
||||
ServerSnapshotMap delayedSaves;
|
||||
|
||||
for (ServerSnapshotMap::iterator i=m_newCharacterSnapshots.begin(); i!=m_newCharacterSnapshots.end(); ++i)
|
||||
for (auto i=m_newCharacterSnapshots.begin(); i!=m_newCharacterSnapshots.end(); ++i)
|
||||
{
|
||||
if (m_newCharacterLock.find(i->first)==m_newCharacterLock.end())
|
||||
{
|
||||
@@ -298,6 +298,7 @@ void Persister::startSave(void)
|
||||
LOG("Database",("Sending DatabaseSaveStart network message to Central."));
|
||||
DatabaseSaveStart const startSaveMessage;
|
||||
DatabaseProcess::getInstance().sendToCentralServer(startSaveMessage, true);
|
||||
|
||||
// record metrics data
|
||||
m_lastSaveTotalObjectCount=m_objectSnapshotMap.size();
|
||||
m_lastSaveNewObjectCount=m_newObjectCount;
|
||||
@@ -307,10 +308,10 @@ void Persister::startSave(void)
|
||||
// delete any characters for this save cycle
|
||||
if (m_charactersToDeleteNextSaveCycle && m_charactersToDeleteThisSaveCycle)
|
||||
{
|
||||
for (CharactersToDeleteType::const_iterator iter = m_charactersToDeleteThisSaveCycle->begin(); iter != m_charactersToDeleteThisSaveCycle->end(); ++iter)
|
||||
for (auto iter = m_charactersToDeleteThisSaveCycle->begin(); iter != m_charactersToDeleteThisSaveCycle->end(); ++iter)
|
||||
{
|
||||
DeleteCharacterCustomPersistStep *cps = new DeleteCharacterCustomPersistStep(iter->first, iter->second);
|
||||
getSnapshotForObject(iter->second, 0).addCustomPersistStep(cps);
|
||||
getSnapshotForObject(iter->second, 0)->addCustomPersistStep(cps);
|
||||
}
|
||||
|
||||
// if this is the final save before the cluster is brought down,
|
||||
@@ -321,7 +322,7 @@ void Persister::startSave(void)
|
||||
for (CharactersToDeleteType::const_iterator iter2 = m_charactersToDeleteNextSaveCycle->begin(); iter2 != m_charactersToDeleteNextSaveCycle->end(); ++iter2)
|
||||
{
|
||||
DeleteCharacterCustomPersistStep *cps = new DeleteCharacterCustomPersistStep(iter2->first, iter2->second);
|
||||
getSnapshotForObject(iter2->second, 0).addCustomPersistStep(cps);
|
||||
getSnapshotForObject(iter2->second, 0)->addCustomPersistStep(cps);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -383,18 +384,18 @@ void Persister::startSave(void)
|
||||
* the first time we've seen the object, remember which snapshot we
|
||||
* decided to use for it.)
|
||||
*/
|
||||
Snapshot & Persister::getSnapshotForObject(const NetworkId &networkId, uint32 serverId)
|
||||
Snapshot * Persister::getSnapshotForObject(const NetworkId &networkId, uint32 serverId)
|
||||
{
|
||||
ObjectSnapshotMap::const_iterator i=m_objectSnapshotMap.find(networkId);
|
||||
auto i = m_objectSnapshotMap.find(networkId);
|
||||
if (i!=m_objectSnapshotMap.end())
|
||||
{
|
||||
NOT_NULL(i->second);
|
||||
return *(i->second);
|
||||
return i->second;
|
||||
}
|
||||
else
|
||||
{
|
||||
Snapshot &snap = getSnapshotForServer(serverId);
|
||||
m_objectSnapshotMap[networkId]=&snap;
|
||||
Snapshot *snap = getSnapshotForServer(serverId);
|
||||
m_objectSnapshotMap[networkId]=snap;
|
||||
return snap;
|
||||
}
|
||||
}
|
||||
@@ -403,13 +404,13 @@ Snapshot & Persister::getSnapshotForObject(const NetworkId &networkId, uint32 se
|
||||
|
||||
bool Persister::hasDataForObject(const NetworkId &objectId) const
|
||||
{
|
||||
ObjectSnapshotMap::const_iterator i=m_objectSnapshotMap.find(objectId);
|
||||
auto i=m_objectSnapshotMap.find(objectId);
|
||||
return (i!=m_objectSnapshotMap.end());
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
|
||||
Snapshot & Persister::getSnapshotForServer(uint32 serverId)
|
||||
Snapshot *Persister::getSnapshotForServer(uint32 serverId)
|
||||
{
|
||||
if (serverId==0)
|
||||
{
|
||||
@@ -418,54 +419,55 @@ Snapshot & Persister::getSnapshotForServer(uint32 serverId)
|
||||
m_arbitraryGameDataSnapshot = makeSnapshot(DB::ModeQuery::mode_UPDATE);
|
||||
m_currentSnapshots[0] = m_arbitraryGameDataSnapshot;
|
||||
}
|
||||
return *m_arbitraryGameDataSnapshot;
|
||||
return m_arbitraryGameDataSnapshot;
|
||||
}
|
||||
else
|
||||
{
|
||||
ServerSnapshotMap::const_iterator j=m_currentSnapshots.find(serverId);
|
||||
auto j=m_currentSnapshots.find(serverId);
|
||||
|
||||
if (j==m_currentSnapshots.end())
|
||||
{
|
||||
Snapshot *snap = makeSnapshot(DB::ModeQuery::mode_UPDATE);
|
||||
m_currentSnapshots[serverId]=snap;
|
||||
if (!m_arbitraryGameDataSnapshot)
|
||||
|
||||
if (!m_arbitraryGameDataSnapshot) {
|
||||
m_arbitraryGameDataSnapshot = snap;
|
||||
return *snap;
|
||||
}
|
||||
|
||||
return snap;
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
NOT_NULL (j->second);
|
||||
return *(j->second);
|
||||
return j->second;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
|
||||
Snapshot & Persister::getCommoditiesSnapshot(uint32 serverId)
|
||||
Snapshot *Persister::getCommoditiesSnapshot(uint32 serverId)
|
||||
{
|
||||
if (m_commoditiesSnapshot)
|
||||
{
|
||||
return *m_commoditiesSnapshot;
|
||||
return m_commoditiesSnapshot;
|
||||
}
|
||||
else
|
||||
{
|
||||
ServerSnapshotMap::const_iterator j;
|
||||
|
||||
j=m_currentSnapshots.find(serverId);
|
||||
|
||||
auto j = m_currentSnapshots.find(serverId);
|
||||
if (j==m_currentSnapshots.end())
|
||||
{
|
||||
Snapshot *snap = makeCommoditiesSnapshot(DB::ModeQuery::mode_INSERT);
|
||||
m_currentSnapshots[serverId]=snap;
|
||||
m_commoditiesSnapshot = snap;
|
||||
return *snap;
|
||||
return snap;
|
||||
}
|
||||
else
|
||||
{
|
||||
NOT_NULL (j->second);
|
||||
m_commoditiesSnapshot = j->second;
|
||||
return *(j->second);
|
||||
return j->second;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -476,7 +478,7 @@ void Persister::handleDeltasMessage(uint32 serverId, const DeltasMessage &msg)
|
||||
{
|
||||
NetworkId objectId=msg.getTarget();
|
||||
// DEBUG_REPORT_LOG(true,("Got deltas message for object %s.\n",objectId.getValueString().c_str()));
|
||||
getSnapshotForObject(objectId,serverId).handleDeltasMessage(objectId, msg);
|
||||
getSnapshotForObject(objectId,serverId)->handleDeltasMessage(objectId, msg);
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
@@ -486,7 +488,7 @@ void Persister::handleBaselinesMessage(uint32 serverId, const BaselinesMessage &
|
||||
// DEBUG_REPORT_LOG(true,("Got baselines message.\n"));
|
||||
|
||||
NetworkId objectId=msg.getTarget();
|
||||
getSnapshotForObject(objectId,serverId).handleBaselinesMessage(objectId, msg);
|
||||
getSnapshotForObject(objectId,serverId)->handleBaselinesMessage(objectId, msg);
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
@@ -497,7 +499,7 @@ void Persister::handleBaselinesMessage(uint32 serverId, const BaselinesMessage &
|
||||
|
||||
void Persister::handleDeleteMessage(uint32 serverId, const NetworkId &objectId, int reasonCode, bool immediate, bool demandLoadedContainer, bool cascadeReason)
|
||||
{
|
||||
getSnapshotForObject(objectId,serverId).handleDeleteMessage(objectId, reasonCode, immediate, demandLoadedContainer, cascadeReason);
|
||||
getSnapshotForObject(objectId,serverId)->handleDeleteMessage(objectId, reasonCode, immediate, demandLoadedContainer, cascadeReason);
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
@@ -512,7 +514,6 @@ void Persister::newObject(uint32 serverId, const NetworkId &objectId, int templa
|
||||
{
|
||||
UNREF(serverId);
|
||||
|
||||
// DEBUG_REPORT_LOG (true,("Recieved new object message for %s\n",objectId.getValueString().c_str()));
|
||||
if (m_objectSnapshotMap.find(objectId)!=m_objectSnapshotMap.end())
|
||||
{
|
||||
DEBUG_WARNING(true,("Database received multiple new object messages for object %s",objectId.getValueString().c_str()));
|
||||
@@ -521,7 +522,7 @@ void Persister::newObject(uint32 serverId, const NetworkId &objectId, int templa
|
||||
|
||||
Snapshot *snap=nullptr;
|
||||
|
||||
PendingCharactersType::iterator chardata=m_pendingCharacters.find(objectId);
|
||||
auto chardata=m_pendingCharacters.find(objectId);
|
||||
if (chardata!=m_pendingCharacters.end())
|
||||
{
|
||||
// Object is a new character
|
||||
@@ -549,12 +550,12 @@ void Persister::newObject(uint32 serverId, const NetworkId &objectId, int templa
|
||||
// Add the object to the appropriate snapshot
|
||||
snap=nullptr;
|
||||
{
|
||||
ObjectSnapshotMap::const_iterator j=m_objectSnapshotMap.find(container);
|
||||
auto j = m_objectSnapshotMap.find(container);
|
||||
if (j!=m_objectSnapshotMap.end() && j->second->getMode() == DB::ModeQuery::mode_INSERT)
|
||||
snap = j->second;
|
||||
else
|
||||
{
|
||||
ServerSnapshotMap::const_iterator i=m_newObjectSnapshots.find(serverId);
|
||||
auto i = m_newObjectSnapshots.find(serverId);
|
||||
if (i==m_newObjectSnapshots.end())
|
||||
{
|
||||
snap=makeSnapshot(DB::ModeQuery::mode_INSERT);
|
||||
@@ -585,7 +586,7 @@ void Persister::endBaselines(const NetworkId &objectId, uint32 serverId)
|
||||
//TODO: This is a hack until we remove frame boundaries and have "end frame" messages from the game server. Apparently the game
|
||||
// server can split baselines across frame boundaries, so we can't assume we have all the data for a character when we hit a
|
||||
// frame bounday.
|
||||
PendingCharactersType::iterator chardata=m_pendingCharacters.find(objectId);
|
||||
auto chardata=m_pendingCharacters.find(objectId);
|
||||
if (chardata!=m_pendingCharacters.end())
|
||||
{
|
||||
m_pendingCharacters.erase(chardata);
|
||||
@@ -601,12 +602,15 @@ void Persister::endBaselines(const NetworkId &objectId, uint32 serverId)
|
||||
|
||||
void Persister::saveCompleted(Snapshot *completedSnapshot)
|
||||
{
|
||||
SnapshotListType::iterator i=std::remove(m_savingSnapshots.begin(),m_savingSnapshots.end(),completedSnapshot);
|
||||
auto i=std::remove(m_savingSnapshots.begin(),m_savingSnapshots.end(),completedSnapshot);
|
||||
if (i!=m_savingSnapshots.end())
|
||||
{
|
||||
m_savingSnapshots.erase(i, m_savingSnapshots.end());
|
||||
|
||||
//delete completedSnapshot;
|
||||
if (completedSnapshot != nullptr) {
|
||||
delete completedSnapshot;
|
||||
completedSnapshot = nullptr;
|
||||
}
|
||||
|
||||
if (m_savingSnapshots.empty() && ConfigServerDatabase::getReportSaveTimes())
|
||||
{
|
||||
@@ -638,13 +642,18 @@ void Persister::saveCompleted(Snapshot *completedSnapshot)
|
||||
}
|
||||
else
|
||||
{
|
||||
SnapshotListType::iterator j=std::remove(m_savingCharacterSnapshots.begin(),m_savingCharacterSnapshots.end(),completedSnapshot);
|
||||
auto j=std::remove(m_savingCharacterSnapshots.begin(),m_savingCharacterSnapshots.end(),completedSnapshot);
|
||||
|
||||
DEBUG_FATAL(i==m_savingCharacterSnapshots.end(),("Programmer bug: SaveCompleted() called with a snapshot that wasn't in m_savingSnapshots or m_savingCharacterSnapshots."));
|
||||
|
||||
m_savingCharacterSnapshots.erase(j, m_savingCharacterSnapshots.end());
|
||||
if (j != m_savingCharacterSnapshots.end()) {
|
||||
m_savingCharacterSnapshots.erase(j, m_savingCharacterSnapshots.end());
|
||||
}
|
||||
|
||||
delete completedSnapshot;
|
||||
if (completedSnapshot != nullptr) {
|
||||
delete completedSnapshot;
|
||||
completedSnapshot = nullptr;
|
||||
}
|
||||
|
||||
DEBUG_REPORT_LOG(ConfigServerDatabase::getReportSaveTimes(),("New character save completed\n"));
|
||||
}
|
||||
@@ -665,14 +674,14 @@ void Persister::receiveMessage(const MessageDispatch::Emitter & source, const Me
|
||||
switch(messageType) {
|
||||
case constcrc("FlagObjectForDeleteMessage") :
|
||||
{
|
||||
Archive::ReadIterator ri = static_cast<const GameNetworkMessage &>(message).getByteStream().begin();
|
||||
auto ri = static_cast<const GameNetworkMessage &>(message).getByteStream().begin();
|
||||
FlagObjectForDeleteMessage m(ri);
|
||||
handleDeleteMessage(sourceGameServer, m.getId(),m.getReason(),m.getImmediate(),m.getDemandLoadedContainer(),m.getCascadeReason());
|
||||
break;
|
||||
}
|
||||
case constcrc("CreateObjectByCrcMessage") :
|
||||
{
|
||||
Archive::ReadIterator ri = static_cast<const GameNetworkMessage &>(message).getByteStream().begin();
|
||||
auto ri = static_cast<const GameNetworkMessage &>(message).getByteStream().begin();
|
||||
CreateObjectByCrcMessage t(ri);
|
||||
// DEBUG_REPORT_LOG(true,("Got CreateObjectByCrcMessage for %s\n", t.getId().getValueString().c_str()));
|
||||
newObject(sourceGameServer, t.getId(), t.getCrc(), t.getObjectType(), t.getContainer());
|
||||
@@ -680,14 +689,14 @@ void Persister::receiveMessage(const MessageDispatch::Emitter & source, const Me
|
||||
}
|
||||
case constcrc("EndBaselinesMessage") :
|
||||
{
|
||||
Archive::ReadIterator ri = static_cast<const GameNetworkMessage &>(message).getByteStream().begin();
|
||||
auto ri = static_cast<const GameNetworkMessage &>(message).getByteStream().begin();
|
||||
EndBaselinesMessage t(ri);
|
||||
endBaselines(t.getId(),sourceGameServer);
|
||||
break;
|
||||
}
|
||||
case constcrc("DeltasMessage") :
|
||||
{
|
||||
Archive::ReadIterator ri = static_cast<const GameNetworkMessage &>(message).getByteStream().begin();
|
||||
auto ri = static_cast<const GameNetworkMessage &>(message).getByteStream().begin();
|
||||
DeltasMessage msg(ri);
|
||||
|
||||
handleDeltasMessage(sourceGameServer,msg);
|
||||
@@ -695,7 +704,7 @@ void Persister::receiveMessage(const MessageDispatch::Emitter & source, const Me
|
||||
}
|
||||
case constcrc("BaselinesMessage") :
|
||||
{
|
||||
Archive::ReadIterator ri = static_cast<const GameNetworkMessage &>(message).getByteStream().begin();
|
||||
auto ri = static_cast<const GameNetworkMessage &>(message).getByteStream().begin();
|
||||
BaselinesMessage msg(ri);
|
||||
|
||||
handleBaselinesMessage(sourceGameServer,msg);
|
||||
@@ -703,15 +712,15 @@ void Persister::receiveMessage(const MessageDispatch::Emitter & source, const Me
|
||||
}
|
||||
case constcrc("UpdateObjectPositionMessage") :
|
||||
{
|
||||
Archive::ReadIterator ri = static_cast<const GameNetworkMessage &>(message).getByteStream().begin();
|
||||
auto ri = static_cast<const GameNetworkMessage &>(message).getByteStream().begin();
|
||||
UpdateObjectPositionMessage msg(ri);
|
||||
|
||||
getSnapshotForObject(msg.getNetworkId(), sourceGameServer).handleUpdateObjectPosition(msg);
|
||||
getSnapshotForObject(msg.getNetworkId(), sourceGameServer)->handleUpdateObjectPosition(msg);
|
||||
break;
|
||||
}
|
||||
case constcrc("AddCharacterMessage") :
|
||||
{
|
||||
Archive::ReadIterator ri = static_cast<const GameNetworkMessage &>(message).getByteStream().begin();
|
||||
auto ri = static_cast<const GameNetworkMessage &>(message).getByteStream().begin();
|
||||
AddCharacterMessage ocm(ri);
|
||||
DEBUG_REPORT_LOG(true, ("Got AddCharacterMessage for object %s.\n",ocm.getObjectId().getValueString().c_str()));
|
||||
|
||||
@@ -725,7 +734,7 @@ void Persister::receiveMessage(const MessageDispatch::Emitter & source, const Me
|
||||
}
|
||||
case constcrc("MessageToMessage") :
|
||||
{
|
||||
Archive::ReadIterator ri = static_cast<const GameNetworkMessage &>(message).getByteStream().begin();
|
||||
auto ri = static_cast<const GameNetworkMessage &>(message).getByteStream().begin();
|
||||
MessageToMessage m(ri);
|
||||
|
||||
handleMessageTo (sourceGameServer, m.getData());
|
||||
@@ -733,7 +742,7 @@ void Persister::receiveMessage(const MessageDispatch::Emitter & source, const Me
|
||||
}
|
||||
case constcrc("MessageToAckMessage") :
|
||||
{
|
||||
Archive::ReadIterator ri = static_cast<const GameNetworkMessage &>(message).getByteStream().begin();
|
||||
auto ri = static_cast<const GameNetworkMessage &>(message).getByteStream().begin();
|
||||
MessageToAckMessage m(ri);
|
||||
|
||||
handleMessageToAck (sourceGameServer, m.getMessageId());
|
||||
@@ -741,7 +750,7 @@ void Persister::receiveMessage(const MessageDispatch::Emitter & source, const Me
|
||||
}
|
||||
case constcrc("ServerDeleteCharacterMessage") :
|
||||
{
|
||||
Archive::ReadIterator ri = static_cast<const GameNetworkMessage &>(message).getByteStream().begin();
|
||||
auto ri = static_cast<const GameNetworkMessage &>(message).getByteStream().begin();
|
||||
ServerDeleteCharacterMessage m(ri);
|
||||
|
||||
deleteCharacter(m.getStationId(), m.getCharacterId());
|
||||
@@ -749,7 +758,7 @@ void Persister::receiveMessage(const MessageDispatch::Emitter & source, const Me
|
||||
}
|
||||
case constcrc("RenameCharacterMessageEx") :
|
||||
{
|
||||
Archive::ReadIterator ri = static_cast<const GameNetworkMessage &>(message).getByteStream().begin();
|
||||
auto ri = static_cast<const GameNetworkMessage &>(message).getByteStream().begin();
|
||||
RenameCharacterMessageEx msg(ri);
|
||||
|
||||
renameCharacter(sourceGameServer, static_cast<int8>(msg.getRenameCharacterMessageSource()), msg.getStationId(), msg.getCharacterId(), msg.getNewName(), msg.getOldName(), msg.getLastNameChangeOnly(), msg.getRequestedBy(), nullptr);
|
||||
@@ -757,7 +766,7 @@ void Persister::receiveMessage(const MessageDispatch::Emitter & source, const Me
|
||||
}
|
||||
case constcrc("UnloadedPlayerMessage") :
|
||||
{
|
||||
Archive::ReadIterator ri = static_cast<const GameNetworkMessage &>(message).getByteStream().begin();
|
||||
auto ri = static_cast<const GameNetworkMessage &>(message).getByteStream().begin();
|
||||
UnloadedPlayerMessage msg(ri);
|
||||
|
||||
unloadCharacter(msg.getPlayerId(),sourceGameServer);
|
||||
@@ -765,7 +774,7 @@ void Persister::receiveMessage(const MessageDispatch::Emitter & source, const Me
|
||||
}
|
||||
case constcrc("MoveToPlayer") :
|
||||
{
|
||||
Archive::ReadIterator ri = static_cast<const GameNetworkMessage &>(message).getByteStream().begin();
|
||||
auto ri = static_cast<const GameNetworkMessage &>(message).getByteStream().begin();
|
||||
GenericValueTypeMessage<std::pair<NetworkId, NetworkId> > msg(ri);
|
||||
|
||||
moveToPlayer(sourceGameServer, msg.getValue().first, msg.getValue().second, -1, false, false);
|
||||
@@ -773,7 +782,7 @@ void Persister::receiveMessage(const MessageDispatch::Emitter & source, const Me
|
||||
}
|
||||
case constcrc("MoveToPlayerBankMessage") :
|
||||
{
|
||||
Archive::ReadIterator ri = static_cast<const GameNetworkMessage &>(message).getByteStream().begin();
|
||||
auto ri = static_cast<const GameNetworkMessage &>(message).getByteStream().begin();
|
||||
GenericValueTypeMessage<std::pair<NetworkId, NetworkId> > msg(ri);
|
||||
|
||||
moveToPlayer(sourceGameServer, msg.getValue().first, msg.getValue().second, -1, true, false);
|
||||
@@ -781,7 +790,7 @@ void Persister::receiveMessage(const MessageDispatch::Emitter & source, const Me
|
||||
}
|
||||
case constcrc("MoveToPlayerDatapadMessage") :
|
||||
{
|
||||
Archive::ReadIterator ri = static_cast<const GameNetworkMessage &>(message).getByteStream().begin();
|
||||
auto ri = static_cast<const GameNetworkMessage &>(message).getByteStream().begin();
|
||||
GenericValueTypeMessage<std::pair<std::pair<NetworkId, NetworkId>, int> > msg(ri);
|
||||
|
||||
moveToPlayer(sourceGameServer, msg.getValue().first.first, msg.getValue().first.second, msg.getValue().second, false, true);
|
||||
@@ -789,7 +798,7 @@ void Persister::receiveMessage(const MessageDispatch::Emitter & source, const Me
|
||||
}
|
||||
case constcrc("FixLoadWith") :
|
||||
{
|
||||
Archive::ReadIterator ri = static_cast<const GameNetworkMessage &>(message).getByteStream().begin();
|
||||
auto ri = static_cast<const GameNetworkMessage &>(message).getByteStream().begin();
|
||||
GenericValueTypeMessage<std::pair<std::pair<NetworkId, NetworkId>, int> > msg(ri);
|
||||
|
||||
fixLoadWith(sourceGameServer, msg.getValue().first.first, msg.getValue().first.second, msg.getValue().second);
|
||||
@@ -797,7 +806,7 @@ void Persister::receiveMessage(const MessageDispatch::Emitter & source, const Me
|
||||
}
|
||||
case constcrc("ClusterShutdownMessage") :
|
||||
{
|
||||
Archive::ReadIterator ri = static_cast<const GameNetworkMessage &>(message).getByteStream().begin();
|
||||
auto ri = static_cast<const GameNetworkMessage &>(message).getByteStream().begin();
|
||||
GenericValueTypeMessage<bool> msg(ri);
|
||||
|
||||
m_clusterShuttingDown = msg.getValue();
|
||||
@@ -805,7 +814,7 @@ void Persister::receiveMessage(const MessageDispatch::Emitter & source, const Me
|
||||
}
|
||||
case constcrc("StartSaveMessage") :
|
||||
{
|
||||
Archive::ReadIterator ri = static_cast<const GameNetworkMessage &>(message).getByteStream().begin();
|
||||
auto ri = static_cast<const GameNetworkMessage &>(message).getByteStream().begin();
|
||||
GenericValueTypeMessage<NetworkId > msg(ri);
|
||||
|
||||
userRequestedSave(sourceGameServer, msg.getValue());
|
||||
@@ -813,7 +822,7 @@ void Persister::receiveMessage(const MessageDispatch::Emitter & source, const Me
|
||||
}
|
||||
case constcrc("RestoreHouseMessage") :
|
||||
{
|
||||
Archive::ReadIterator ri = static_cast<const GameNetworkMessage &>(message).getByteStream().begin();
|
||||
auto ri = static_cast<const GameNetworkMessage &>(message).getByteStream().begin();
|
||||
GenericValueTypeMessage<std::pair<NetworkId, std::string> > msg(ri);
|
||||
|
||||
restoreHouse(msg.getValue().first, msg.getValue().second);
|
||||
@@ -821,7 +830,7 @@ void Persister::receiveMessage(const MessageDispatch::Emitter & source, const Me
|
||||
}
|
||||
case constcrc("RestoreCharacterMessage") :
|
||||
{
|
||||
Archive::ReadIterator ri = static_cast<const GameNetworkMessage &>(message).getByteStream().begin();
|
||||
auto ri = static_cast<const GameNetworkMessage &>(message).getByteStream().begin();
|
||||
GenericValueTypeMessage<std::pair<NetworkId, std::string> > msg(ri);
|
||||
|
||||
restoreCharacter(msg.getValue().first, msg.getValue().second);
|
||||
@@ -829,7 +838,7 @@ void Persister::receiveMessage(const MessageDispatch::Emitter & source, const Me
|
||||
}
|
||||
case constcrc("UndeleteItemMessage") :
|
||||
{
|
||||
Archive::ReadIterator ri = static_cast<const GameNetworkMessage &>(message).getByteStream().begin();
|
||||
auto ri = static_cast<const GameNetworkMessage &>(message).getByteStream().begin();
|
||||
GenericValueTypeMessage<std::pair<NetworkId, std::string> > msg(ri);
|
||||
|
||||
LOG("CustomerService", ("undeleteItem %s request from %s", msg.getValue().first.getValueString().c_str(), msg.getValue().second.c_str()));
|
||||
@@ -838,7 +847,7 @@ void Persister::receiveMessage(const MessageDispatch::Emitter & source, const Me
|
||||
}
|
||||
case constcrc("MoveToPlayerMessage") :
|
||||
{
|
||||
Archive::ReadIterator ri = static_cast<const GameNetworkMessage &>(message).getByteStream().begin();
|
||||
auto ri = static_cast<const GameNetworkMessage &>(message).getByteStream().begin();
|
||||
GenericValueTypeMessage<std::pair<std::pair<NetworkId, NetworkId>, std::string> > msg(ri);
|
||||
|
||||
LOG("CustomerService", ("moveToPlayer %s, %s request from %s", msg.getValue().first.first.getValueString().c_str(), msg.getValue().first.second.getValueString().c_str(), msg.getValue().second.c_str()));
|
||||
@@ -857,16 +866,16 @@ void Persister::receiveMessage(const MessageDispatch::Emitter & source, const Me
|
||||
}
|
||||
case constcrc("AddResourceTypeMessage") :
|
||||
{
|
||||
Archive::ReadIterator ri = static_cast<const GameNetworkMessage &>(message).getByteStream().begin();
|
||||
auto ri = static_cast<const GameNetworkMessage &>(message).getByteStream().begin();
|
||||
AddResourceTypeMessage msg(ri);
|
||||
handleAddResourceTypeMessage(sourceGameServer, msg);
|
||||
break;
|
||||
}
|
||||
case constcrc("BountyHunterTargetMessage") :
|
||||
{
|
||||
Archive::ReadIterator ri = static_cast<const GameNetworkMessage &>(message).getByteStream().begin();
|
||||
auto ri = static_cast<const GameNetworkMessage &>(message).getByteStream().begin();
|
||||
BountyHunterTargetMessage msg(ri);
|
||||
getSnapshotForServer(sourceGameServer).handleBountyHunterTargetMessage(msg);
|
||||
getSnapshotForServer(sourceGameServer)->handleBountyHunterTargetMessage(msg);
|
||||
break;
|
||||
}
|
||||
case constcrc("CMCreateAuctionMessage") :
|
||||
@@ -882,7 +891,7 @@ void Persister::receiveMessage(const MessageDispatch::Emitter & source, const Me
|
||||
if (commConnection)
|
||||
commServerId = commConnection->getProcessId();
|
||||
|
||||
getCommoditiesSnapshot(commServerId).handleCommoditiesDataMessage(message);
|
||||
getCommoditiesSnapshot(commServerId)->handleCommoditiesDataMessage(message);
|
||||
break;
|
||||
}
|
||||
case constcrc("LoadCommodities") :
|
||||
@@ -901,28 +910,28 @@ void Persister::receiveMessage(const MessageDispatch::Emitter & source, const Me
|
||||
}
|
||||
case constcrc("GetMoneyFromOfflineObjectMessage") :
|
||||
{
|
||||
Archive::ReadIterator ri = static_cast<const GameNetworkMessage &>(message).getByteStream().begin();
|
||||
auto ri = static_cast<const GameNetworkMessage &>(message).getByteStream().begin();
|
||||
GetMoneyFromOfflineObjectMessage msg(ri);
|
||||
getMoneyFromOfflineObject(sourceGameServer, msg.getSourceObject(), msg.getAmount(), msg.getReplyTo(), msg.getSuccessCallback(), msg.getFailCallback(), msg.getPackedDictionary());
|
||||
break;
|
||||
}
|
||||
case constcrc("PurgeCompleteMessage") :
|
||||
{
|
||||
Archive::ReadIterator ri = static_cast<const GameNetworkMessage &>(message).getByteStream().begin();
|
||||
auto ri = static_cast<const GameNetworkMessage &>(message).getByteStream().begin();
|
||||
GenericValueTypeMessage<StationId> msg(ri);
|
||||
handlePurgeCompleteMessage(sourceGameServer, msg.getValue());
|
||||
break;
|
||||
}
|
||||
case constcrc("DBCSRequestMessage" ) :
|
||||
{
|
||||
Archive::ReadIterator ri = static_cast<const GameNetworkMessage &>(message).getByteStream().begin();
|
||||
auto ri = static_cast<const GameNetworkMessage &>(message).getByteStream().begin();
|
||||
DBCSRequestMessage const msg( ri );
|
||||
handleCSRequest( msg );
|
||||
break;
|
||||
}
|
||||
case constcrc("UndeleteItemForCsMessage") :
|
||||
{
|
||||
Archive::ReadIterator ri = static_cast<const GameNetworkMessage &>(message).getByteStream().begin();
|
||||
auto ri = static_cast<const GameNetworkMessage &>(message).getByteStream().begin();
|
||||
GenericValueTypeMessage<std::pair<std::pair<std::pair<NetworkId, NetworkId>, std::string>, bool> > undeleteRequest(ri);
|
||||
handleCsUndelete(undeleteRequest.getValue().first.first.first,
|
||||
undeleteRequest.getValue().first.first.second,
|
||||
@@ -984,7 +993,7 @@ void Persister::addCharacter(uint32 stationId, const NetworkId &characterObject,
|
||||
m_pendingCharacters[characterObject]=temp;
|
||||
|
||||
//TODO: remove this hack: match up create and end messages because we can't count on having all the data at a frame bounday
|
||||
NewCharacterLockType::iterator i=m_newCharacterLock.find(creationGameServer);
|
||||
auto i=m_newCharacterLock.find(creationGameServer);
|
||||
UNREF(i);
|
||||
DEBUG_FATAL(i!=m_newCharacterLock.end(),("Programmer bug: got an addCharacter from server %i before we received EndBaselines from the previous addCharacter. Indicates we're getting network messages out of order.\n",creationGameServer));
|
||||
m_newCharacterLock.insert(creationGameServer);
|
||||
@@ -1014,9 +1023,8 @@ void Persister::handleMessageTo(uint32 sourceServer, const MessageToPayload &dat
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!m_messageSnapshot)
|
||||
m_messageSnapshot = &getSnapshotForServer(sourceServer);
|
||||
|
||||
if (!m_messageSnapshot)
|
||||
m_messageSnapshot = getSnapshotForServer(sourceServer);
|
||||
m_messageSnapshot->handleMessageTo(data);
|
||||
}
|
||||
MessageToManager::getInstance().handleMessageTo(data);
|
||||
@@ -1031,7 +1039,7 @@ void Persister::handleMessageTo(uint32 sourceServer, const MessageToPayload &dat
|
||||
void Persister::handleMessageToAck(uint32 sourceServer, const MessageToId &messageId)
|
||||
{
|
||||
if (!m_messageSnapshot)
|
||||
m_messageSnapshot = &getSnapshotForServer(sourceServer);
|
||||
m_messageSnapshot = getSnapshotForServer(sourceServer);
|
||||
|
||||
m_messageSnapshot->handleMessageToAck(messageId);
|
||||
MessageToManager::getInstance().handleMessageToAck(messageId);
|
||||
@@ -1056,7 +1064,7 @@ void Persister::deleteCharacter(StationId stationId, const NetworkId &characterI
|
||||
else
|
||||
{
|
||||
DeleteCharacterCustomPersistStep *cps = new DeleteCharacterCustomPersistStep(stationId, characterId);
|
||||
getSnapshotForObject(characterId, 0).addCustomPersistStep(cps);
|
||||
getSnapshotForObject(characterId, 0)->addCustomPersistStep(cps);
|
||||
}
|
||||
|
||||
// send delete character message to CommoditiesServer to delete auction items from this character
|
||||
@@ -1111,7 +1119,7 @@ void Persister::renameCharacter(uint32 sourceServer, int8 renameCharacterMessage
|
||||
}
|
||||
|
||||
RenameCharacterCustomPersistStep *cps = new RenameCharacterCustomPersistStep(renameCharacterMessageSource, stationId, characterId, newName, oldName, requestedBy, renameRequest);
|
||||
getSnapshotForServer(sourceServer).addCustomPersistStep(cps);
|
||||
getSnapshotForServer(sourceServer)->addCustomPersistStep(cps);
|
||||
|
||||
if (static_cast<RenameCharacterMessageEx::RenameCharacterMessageSource>(renameCharacterMessageSource) == RenameCharacterMessageEx::RCMS_player_request)
|
||||
{
|
||||
@@ -1156,7 +1164,7 @@ void Persister::changeStationId(const TransferAccountData * transferRequest)
|
||||
void Persister::unloadCharacter(const NetworkId &characterId, uint32 sourceServer)
|
||||
{
|
||||
UnloadCharacterCustomPersistStep *cps = new UnloadCharacterCustomPersistStep(characterId, sourceServer);
|
||||
getSnapshotForObject(characterId, sourceServer).addCustomPersistStep(cps);
|
||||
getSnapshotForObject(characterId, sourceServer)->addCustomPersistStep(cps);
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
@@ -1178,7 +1186,7 @@ bool Persister::isSaveInProgress()
|
||||
void Persister::moveToPlayer(uint32 sourceServer, const NetworkId &objectId, const NetworkId &targetPlayer, int maxDepth, bool useBank, bool useDatapad)
|
||||
{
|
||||
MoveToPlayerCustomPersistStep *cps = new MoveToPlayerCustomPersistStep(objectId, targetPlayer, maxDepth, useBank, useDatapad);
|
||||
getSnapshotForObject(objectId, sourceServer).addCustomPersistStep(cps);
|
||||
getSnapshotForObject(objectId, sourceServer)->addCustomPersistStep(cps);
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
@@ -1186,7 +1194,7 @@ void Persister::moveToPlayer(uint32 sourceServer, const NetworkId &objectId, con
|
||||
void Persister::fixLoadWith(uint32 sourceServer, const NetworkId &topmostObject, const NetworkId &startingLoadWith, int maxDepth)
|
||||
{
|
||||
FixLoadWithCustomPersistStep *cps = new FixLoadWithCustomPersistStep(topmostObject, startingLoadWith, maxDepth);
|
||||
getSnapshotForObject(topmostObject, sourceServer).addCustomPersistStep(cps);
|
||||
getSnapshotForObject(topmostObject, sourceServer)->addCustomPersistStep(cps);
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
@@ -1232,7 +1240,7 @@ void Persister::planetRequestedSave()
|
||||
|
||||
void Persister::handleAddResourceTypeMessage(uint32 const serverId, AddResourceTypeMessage const & message)
|
||||
{
|
||||
getSnapshotForServer(serverId).handleAddResourceTypeMessage(message);
|
||||
getSnapshotForServer(serverId)->handleAddResourceTypeMessage(message);
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
@@ -1240,7 +1248,7 @@ void Persister::handleAddResourceTypeMessage(uint32 const serverId, AddResourceT
|
||||
void Persister::handlePurgeCompleteMessage(uint32 const serverId, StationId stationId)
|
||||
{
|
||||
PurgeCompleteCustomPersistStep * cps = new PurgeCompleteCustomPersistStep(stationId);
|
||||
getSnapshotForServer(serverId).addCustomPersistStep(cps);
|
||||
getSnapshotForServer(serverId)->addCustomPersistStep(cps);
|
||||
}
|
||||
|
||||
// ======================================================================
|
||||
|
||||
@@ -145,8 +145,8 @@ class Persister : public MessageDispatch::Receiver
|
||||
|
||||
virtual void startSave() = 0;
|
||||
|
||||
Snapshot & getSnapshotForObject(const NetworkId &networkId, uint32 serverId);
|
||||
Snapshot & getSnapshotForServer(uint32 serverId);
|
||||
Snapshot *getSnapshotForObject(const NetworkId &networkId, uint32 serverId);
|
||||
Snapshot *getSnapshotForServer(uint32 serverId);
|
||||
|
||||
private:
|
||||
|
||||
@@ -164,7 +164,7 @@ class Persister : public MessageDispatch::Receiver
|
||||
void centralRequestedSave ();
|
||||
void planetRequestedSave ();
|
||||
|
||||
Snapshot & getCommoditiesSnapshot(uint32 serverId);
|
||||
Snapshot *getCommoditiesSnapshot(uint32 serverId);
|
||||
|
||||
/**
|
||||
* Derived class should override this to make a game-specific derived Snapshot.
|
||||
|
||||
@@ -87,14 +87,6 @@ bool Snapshot::saveToDB(DB::Session *session)
|
||||
return false;
|
||||
}
|
||||
|
||||
for (BufferListType::iterator buffer=m_bufferList.begin(); buffer!=m_bufferList.end(); ++buffer)
|
||||
{
|
||||
if (! (*buffer)->save(session)) {
|
||||
m_isBeingSaved = false;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
for (step=m_customStepList.begin(); step !=m_customStepList.end(); ++step)
|
||||
{
|
||||
NOT_NULL(*step);
|
||||
|
||||
@@ -21,7 +21,11 @@ TaskSaveSnapshot::TaskSaveSnapshot(Snapshot *snapshot) : m_snapshot(snapshot)
|
||||
|
||||
bool TaskSaveSnapshot::process(DB::Session *session)
|
||||
{
|
||||
return (m_snapshot->saveToDB(session));
|
||||
if (session != nullptr) {
|
||||
return (m_snapshot->saveToDB(session));
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
|
||||
@@ -47,6 +47,7 @@ public:
|
||||
|
||||
NetworkId& operator= (const NetworkId&);
|
||||
bool operator< (const NetworkId& rhs) const;
|
||||
bool operator> (const NetworkId& rhs) const;
|
||||
bool operator== (const NetworkId& rhs) const;
|
||||
bool operator!= (const NetworkId& rhs) const;
|
||||
size_t getHashValue() const;
|
||||
@@ -94,6 +95,11 @@ inline bool NetworkId::operator< (const NetworkId& rhs) const
|
||||
return m_value < rhs.m_value;
|
||||
}
|
||||
|
||||
inline bool NetworkId::operator> (const NetworkId& rhs) const
|
||||
{
|
||||
return m_value > rhs.m_value;
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------
|
||||
|
||||
inline bool NetworkId::operator== (const NetworkId& rhs) const
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
#define PLATFORM_LINUX
|
||||
|
||||
#include <cstdio>
|
||||
#include <inttypes.h>
|
||||
// ======================================================================
|
||||
// basic types that we assume to be around
|
||||
|
||||
@@ -20,8 +21,8 @@ typedef unsigned long uint32;
|
||||
typedef signed char int8;
|
||||
typedef signed short int16;
|
||||
typedef signed long int32;
|
||||
typedef signed long long int int64;
|
||||
typedef unsigned long long int uint64;
|
||||
typedef int64_t int64;
|
||||
typedef uint64_t uint64;
|
||||
typedef float real;
|
||||
typedef FILE* FILE_HANDLE;
|
||||
|
||||
|
||||
@@ -16,328 +16,322 @@
|
||||
|
||||
// ======================================================================
|
||||
|
||||
namespace ObjvarBufferNamespace
|
||||
{
|
||||
const int ms_maxItemsPerExec = 10000;
|
||||
namespace ObjvarBufferNamespace {
|
||||
const int ms_maxItemsPerExec = 10000;
|
||||
}
|
||||
|
||||
using namespace ObjvarBufferNamespace;
|
||||
|
||||
// ======================================================================
|
||||
|
||||
ObjvarBuffer::ObjvarBuffer(DB::ModeQuery::Mode mode, ObjectTableBuffer *objectTableBuffer, bool useGoldNames) :
|
||||
AbstractTableBuffer(),
|
||||
m_mode(mode),
|
||||
m_data(),
|
||||
m_objectTableBuffer(objectTableBuffer),
|
||||
m_useGoldNames(useGoldNames)
|
||||
{
|
||||
ObjvarBuffer::ObjvarBuffer(DB::ModeQuery::Mode mode, ObjectTableBuffer *objectTableBuffer, bool useGoldNames)
|
||||
: AbstractTableBuffer(), m_mode(mode), m_data(), m_objectTableBuffer(objectTableBuffer),
|
||||
m_useGoldNames(useGoldNames) {
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
|
||||
ObjvarBuffer::~ObjvarBuffer()
|
||||
{
|
||||
m_data.clear();
|
||||
m_overrides.clear();
|
||||
ObjvarBuffer::~ObjvarBuffer() {
|
||||
m_data.clear();
|
||||
}
|
||||
|
||||
bool ObjvarBuffer::load(DB::Session *session,const DB::TagSet &tags, const std::string &schema, bool usingGoldDatabase)
|
||||
{
|
||||
int rowsFetched;
|
||||
UNREF(tags); // all objects have objvars
|
||||
|
||||
DBQuery::GetAllObjectVariables qry(schema);
|
||||
bool
|
||||
ObjvarBuffer::load(DB::Session *session, const DB::TagSet &tags, const std::string &schema, bool usingGoldDatabase) {
|
||||
int rowsFetched;
|
||||
UNREF(tags); // all objects have objvars
|
||||
|
||||
if (! (session->exec(&qry)))
|
||||
return false;
|
||||
DBQuery::GetAllObjectVariables qry(schema);
|
||||
|
||||
while ((rowsFetched = qry.fetch()) > 0)
|
||||
{
|
||||
size_t numRows = qry.getNumRowsFetched();
|
||||
size_t count = 0;
|
||||
const std::vector<DBSchema::ObjectVariableRow> &data = qry.getData();
|
||||
if (!(session->exec(&qry))) {
|
||||
return false;
|
||||
}
|
||||
|
||||
for (std::vector<DBSchema::ObjectVariableRow>::const_iterator row=data.begin(); row!=data.end(); ++row)
|
||||
{
|
||||
if (++count > numRows)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
IndexKey key(row->object_id.getValue(), row->name_id.getValue());
|
||||
ObjvarValue value;
|
||||
value.m_type=row->type.getValue();
|
||||
while ((rowsFetched = qry.fetch()) > 0) {
|
||||
size_t numRows = qry.getNumRowsFetched();
|
||||
size_t count = 0;
|
||||
const std::vector <DBSchema::ObjectVariableRow> &data = qry.getData();
|
||||
|
||||
// The string is stored in the database as utf8, so a wide-to-narrow is appropriate
|
||||
value.m_value=Unicode::wideToNarrow(row->value.getValue());
|
||||
for (std::vector<DBSchema::ObjectVariableRow>::const_iterator row = data.begin(); row != data.end(); ++row) {
|
||||
if (++count > numRows) {
|
||||
break;
|
||||
}
|
||||
|
||||
m_data.insert(std::make_pair(key,value));
|
||||
}
|
||||
}
|
||||
|
||||
qry.done();
|
||||
if (rowsFetched < 0)
|
||||
return false;
|
||||
IndexKey key(row->object_id.getValue(), row->name_id.getValue());
|
||||
ObjvarValue value;
|
||||
value.m_type = row->type.getValue();
|
||||
|
||||
if (usingGoldDatabase)
|
||||
{
|
||||
// Check for local overrides to the gold data
|
||||
DBQuery::GetObjectVariableOverrides qry(DatabaseProcess::getInstance().getSchemaQualifier(), schema);
|
||||
if (! (session->exec(&qry)))
|
||||
return false;
|
||||
// The string is stored in the database as utf8, so a wide-to-narrow is appropriate
|
||||
value.m_value = Unicode::wideToNarrow(row->value.getValue());
|
||||
|
||||
while ((rowsFetched = qry.fetch()) > 0)
|
||||
{
|
||||
size_t numRows = qry.getNumRowsFetched();
|
||||
size_t count = 0;
|
||||
const std::vector<DBSchema::ObjectVariableRow> &data = qry.getData();
|
||||
m_data.insert(std::make_pair(key, value));
|
||||
}
|
||||
}
|
||||
|
||||
for (std::vector<DBSchema::ObjectVariableRow>::const_iterator row=data.begin(); row!=data.end(); ++row)
|
||||
{
|
||||
if (++count > numRows)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
IndexKey key(row->object_id.getValue(), row->name_id.getValue());
|
||||
ObjvarValue value;
|
||||
value.m_type=row->type.getValue();
|
||||
qry.done();
|
||||
if (rowsFetched < 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// The string is stored in the database as utf8, so a wide-to-narrow is appropriate
|
||||
value.m_value=Unicode::wideToNarrow(row->value.getValue());
|
||||
if (usingGoldDatabase) {
|
||||
// Check for local overrides to the gold data
|
||||
DBQuery::GetObjectVariableOverrides qry(DatabaseProcess::getInstance().getSchemaQualifier(), schema);
|
||||
if (!(session->exec(&qry))) {
|
||||
return false;
|
||||
}
|
||||
|
||||
value.m_detached=false;
|
||||
|
||||
m_overrides.insert(std::make_pair(key,value));
|
||||
}
|
||||
}
|
||||
|
||||
qry.done();
|
||||
}
|
||||
return (rowsFetched >= 0);
|
||||
while ((rowsFetched = qry.fetch()) > 0) {
|
||||
size_t numRows = qry.getNumRowsFetched();
|
||||
size_t count = 0;
|
||||
const std::vector <DBSchema::ObjectVariableRow> &data = qry.getData();
|
||||
|
||||
for (std::vector<DBSchema::ObjectVariableRow>::const_iterator row = data.begin();
|
||||
row != data.end(); ++row) {
|
||||
if (++count > numRows) {
|
||||
break;
|
||||
}
|
||||
|
||||
IndexKey key(row->object_id.getValue(), row->name_id.getValue());
|
||||
ObjvarValue value;
|
||||
value.m_type = row->type.getValue();
|
||||
|
||||
// The string is stored in the database as utf8, so a wide-to-narrow is appropriate
|
||||
value.m_value = Unicode::wideToNarrow(row->value.getValue());
|
||||
|
||||
value.m_detached = false;
|
||||
|
||||
m_data.insert(std::make_pair(key, value));
|
||||
}
|
||||
}
|
||||
|
||||
qry.done();
|
||||
}
|
||||
return (rowsFetched >= 0);
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
|
||||
bool ObjvarBuffer::save(DB::Session *session)
|
||||
{
|
||||
LOG("SaveCounts",("Objvars: %i saved to db",m_data.size()));
|
||||
bool ObjvarBuffer::save(DB::Session *session) {
|
||||
LOG("SaveCounts", ("Objvars: %i saved to db", m_data.size()));
|
||||
|
||||
{
|
||||
DBQuery::AddObjectVariableQuery addQuery;
|
||||
if (!addQuery.setupData(session))
|
||||
return false;
|
||||
for (DataType::iterator i=m_data.begin(); i!=m_data.end(); ++i)
|
||||
{
|
||||
if (!i->second.m_detached && !i->second.m_inDatabase)
|
||||
if (!addQuery.addData(i->first.m_objectId, i->first.m_nameId, i->second.m_type, i->second.m_value))
|
||||
return false;
|
||||
if (addQuery.getNumItems() == ObjvarBufferNamespace::ms_maxItemsPerExec)
|
||||
{
|
||||
if (! (session->exec(&addQuery)))
|
||||
return false;
|
||||
addQuery.clearData();
|
||||
}
|
||||
}
|
||||
if (addQuery.getNumItems() != 0)
|
||||
if (! (session->exec(&addQuery)))
|
||||
return false;
|
||||
addQuery.done();
|
||||
addQuery.freeData();
|
||||
}
|
||||
{
|
||||
DBQuery::AddObjectVariableQuery addQuery;
|
||||
if (!addQuery.setupData(session)) {
|
||||
return false;
|
||||
}
|
||||
for (DataType::iterator i = m_data.begin(); i != m_data.end(); ++i) {
|
||||
if (!i->second.m_detached && !i->second.m_inDatabase) {
|
||||
if (!addQuery.addData(i->first.m_objectId, i->first.m_nameId, i->second.m_type, i->second.m_value)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if (addQuery.getNumItems() == ObjvarBufferNamespace::ms_maxItemsPerExec) {
|
||||
if (!(session->exec(&addQuery))) {
|
||||
return false;
|
||||
}
|
||||
addQuery.clearData();
|
||||
}
|
||||
}
|
||||
if (addQuery.getNumItems() != 0) {
|
||||
if (!(session->exec(&addQuery))) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
addQuery.done();
|
||||
addQuery.freeData();
|
||||
}
|
||||
|
||||
{
|
||||
DBQuery::UpdateObjectVariableQuery updateQuery;
|
||||
if (!updateQuery.setupData(session))
|
||||
return false;
|
||||
for (DataType::iterator i=m_data.begin(); i!=m_data.end(); ++i)
|
||||
{
|
||||
if (!i->second.m_detached && i->second.m_inDatabase)
|
||||
if (!updateQuery.addData(i->first.m_objectId, i->first.m_nameId, i->second.m_type, i->second.m_value))
|
||||
return false;
|
||||
if (updateQuery.getNumItems() == ObjvarBufferNamespace::ms_maxItemsPerExec)
|
||||
{
|
||||
if (! (session->exec(&updateQuery)))
|
||||
return false;
|
||||
updateQuery.clearData();
|
||||
}
|
||||
}
|
||||
if (updateQuery.getNumItems() != 0)
|
||||
if (! (session->exec(&updateQuery)))
|
||||
return false;
|
||||
updateQuery.done();
|
||||
updateQuery.freeData();
|
||||
}
|
||||
|
||||
{
|
||||
DBQuery::RemoveObjectVariableQuery removeQuery;
|
||||
if (!removeQuery.setupData(session))
|
||||
return false;
|
||||
for (DataType::iterator i=m_data.begin(); i!=m_data.end(); ++i)
|
||||
{
|
||||
if (i->second.m_detached && i->second.m_inDatabase)
|
||||
if (!removeQuery.addData(i->first.m_objectId, i->first.m_nameId))
|
||||
return false;
|
||||
if (removeQuery.getNumItems() == ObjvarBufferNamespace::ms_maxItemsPerExec)
|
||||
{
|
||||
if (! (session->exec(&removeQuery)))
|
||||
return false;
|
||||
removeQuery.clearData();
|
||||
}
|
||||
}
|
||||
if (removeQuery.getNumItems() != 0)
|
||||
if (! (session->exec(&removeQuery)))
|
||||
return false;
|
||||
removeQuery.done();
|
||||
removeQuery.freeData();
|
||||
}
|
||||
return true;
|
||||
{
|
||||
DBQuery::UpdateObjectVariableQuery updateQuery;
|
||||
if (!updateQuery.setupData(session)) {
|
||||
return false;
|
||||
}
|
||||
for (DataType::iterator i = m_data.begin(); i != m_data.end(); ++i) {
|
||||
if (!i->second.m_detached && i->second.m_inDatabase) {
|
||||
if (!updateQuery.addData(i->first.m_objectId, i->first.m_nameId, i->second.m_type, i->second.m_value)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if (updateQuery.getNumItems() == ObjvarBufferNamespace::ms_maxItemsPerExec) {
|
||||
if (!(session->exec(&updateQuery))) {
|
||||
return false;
|
||||
}
|
||||
updateQuery.clearData();
|
||||
}
|
||||
}
|
||||
if (updateQuery.getNumItems() != 0) {
|
||||
if (!(session->exec(&updateQuery))) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
updateQuery.done();
|
||||
updateQuery.freeData();
|
||||
}
|
||||
|
||||
{
|
||||
DBQuery::RemoveObjectVariableQuery removeQuery;
|
||||
if (!removeQuery.setupData(session)) {
|
||||
return false;
|
||||
}
|
||||
for (DataType::iterator i = m_data.begin(); i != m_data.end(); ++i) {
|
||||
if (i->second.m_detached && i->second.m_inDatabase) {
|
||||
if (!removeQuery.addData(i->first.m_objectId, i->first.m_nameId)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if (removeQuery.getNumItems() == ObjvarBufferNamespace::ms_maxItemsPerExec) {
|
||||
if (!(session->exec(&removeQuery))) {
|
||||
return false;
|
||||
}
|
||||
removeQuery.clearData();
|
||||
}
|
||||
}
|
||||
if (removeQuery.getNumItems() != 0) {
|
||||
if (!(session->exec(&removeQuery))) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
removeQuery.done();
|
||||
removeQuery.freeData();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
|
||||
void ObjvarBuffer::getObjvarsForObject(const NetworkId &objectId, std::vector<DynamicVariableList::MapType::Command> &commands) const
|
||||
{
|
||||
DynamicVariableList::MapType::Command c;
|
||||
void
|
||||
ObjvarBuffer::getObjvarsForObject(const NetworkId &objectId, std::vector <DynamicVariableList::MapType::Command> &commands) const {
|
||||
DynamicVariableList::MapType::Command c;
|
||||
|
||||
// unpacked object variables
|
||||
// unpacked object variables
|
||||
|
||||
{
|
||||
for (DataType::const_iterator i= m_data.lower_bound(IndexKey(objectId,0)); (i!=m_data.end()) && (i->first.m_objectId==objectId); ++i)
|
||||
{
|
||||
std::string name;
|
||||
bool foundName = false;
|
||||
if (m_useGoldNames)
|
||||
foundName=ObjvarNameManager::getGoldInstance().getName(i->first.m_nameId, name);
|
||||
else
|
||||
foundName=ObjvarNameManager::getInstance().getName(i->first.m_nameId, name);
|
||||
|
||||
if (foundName)
|
||||
{
|
||||
c.cmd = DynamicVariableList::MapType::Command::ADD;
|
||||
c.key = name;
|
||||
c.value.load(-1, i->second.m_type, Unicode::utf8ToWide(i->second.m_value));
|
||||
|
||||
commands.push_back(c);
|
||||
}
|
||||
else
|
||||
WARNING_STRICT_FATAL(true,("Object %s has an objvar with name_id %i, which was not in the list of names.",objectId.getValueString().c_str(), i->first.m_nameId));
|
||||
}
|
||||
}
|
||||
|
||||
//packed object variables
|
||||
|
||||
m_objectTableBuffer->getObjvarsForObject(objectId, commands);
|
||||
{
|
||||
for (DataType::const_iterator i = m_data.lower_bound(IndexKey(objectId, 0));
|
||||
(i != m_data.end()) && (i->first.m_objectId == objectId); ++i) {
|
||||
std::string name;
|
||||
bool foundName = false;
|
||||
if (m_useGoldNames) {
|
||||
foundName = ObjvarNameManager::getGoldInstance().getName(i->first.m_nameId, name);
|
||||
} else {
|
||||
foundName = ObjvarNameManager::getInstance().getName(i->first.m_nameId, name);
|
||||
}
|
||||
|
||||
// Apply overrides, if any.
|
||||
// The last objvar sent to the game takes precedence, so we want to send the overrides after the values read in through the regular process
|
||||
if (foundName) {
|
||||
c.cmd = DynamicVariableList::MapType::Command::ADD;
|
||||
c.key = name;
|
||||
c.value.load(-1, i->second.m_type, Unicode::utf8ToWide(i->second.m_value));
|
||||
|
||||
{
|
||||
for (DataType::const_iterator i= m_overrides.lower_bound(IndexKey(objectId,0)); (i!=m_overrides.end()) && (i->first.m_objectId==objectId); ++i)
|
||||
{
|
||||
std::string name;
|
||||
bool foundName = false;
|
||||
foundName=ObjvarNameManager::getInstance().getName(i->first.m_nameId, name); // overrides always use the live names, not the gold names.
|
||||
|
||||
if (foundName)
|
||||
{
|
||||
c.cmd = DynamicVariableList::MapType::Command::ADD;
|
||||
c.key = name;
|
||||
c.value.load(-1, i->second.m_type, Unicode::utf8ToWide(i->second.m_value));
|
||||
|
||||
commands.push_back(c);
|
||||
}
|
||||
else
|
||||
WARNING_STRICT_FATAL(true,("Object %s has an objvar with name_id %i, which was not in the list of names.",objectId.getValueString().c_str(), i->first.m_nameId));
|
||||
}
|
||||
}
|
||||
commands.push_back(c);
|
||||
} else {
|
||||
WARNING_STRICT_FATAL(true, ("Object %s has an objvar with name_id %i, which was not in the list of names.", objectId.getValueString().c_str(), i->first.m_nameId));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//packed object variables
|
||||
|
||||
m_objectTableBuffer->getObjvarsForObject(objectId, commands);
|
||||
|
||||
// Apply overrides, if any.
|
||||
// The last objvar sent to the game takes precedence, so we want to send the overrides after the values read in through the regular process
|
||||
|
||||
{
|
||||
for (DataType::const_iterator i = m_data.lower_bound(IndexKey(objectId, 0));
|
||||
(i != m_data.end()) && (i->first.m_objectId == objectId); ++i) {
|
||||
std::string name;
|
||||
bool foundName = false;
|
||||
foundName = ObjvarNameManager::getInstance().getName(i->first.m_nameId, name); // overrides always use the live names, not the gold names.
|
||||
|
||||
if (foundName) {
|
||||
c.cmd = DynamicVariableList::MapType::Command::ADD;
|
||||
c.key = name;
|
||||
c.value.load(-1, i->second.m_type, Unicode::utf8ToWide(i->second.m_value));
|
||||
|
||||
commands.push_back(c);
|
||||
} else {
|
||||
WARNING_STRICT_FATAL(true, ("Object %s has an objvar with name_id %i, which was not in the list of names.", objectId.getValueString().c_str(), i->first.m_nameId));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
|
||||
void ObjvarBuffer::updateObjvars(const NetworkId &objectId, const std::vector<DynamicVariableList::MapType::Command> &commands)
|
||||
{
|
||||
bool override=false; // flag that we're dealing with the gold data override case (storing an objvar change in the live database, on an object that came from the gold database)
|
||||
if (ConfigServerDatabase::getEnableGoldDatabase() && objectId < ConfigServerDatabase::getMaxGoldNetworkId())
|
||||
override=true;
|
||||
|
||||
for (std::vector<DynamicVariableList::MapType::Command>::const_iterator i=commands.begin(); i!=commands.end(); ++i)
|
||||
{
|
||||
switch(i->cmd)
|
||||
{
|
||||
case DynamicVariableList::MapType::Command::ADD :
|
||||
case DynamicVariableList::MapType::Command::SET :
|
||||
{
|
||||
std::string packedValue(Unicode::wideToUTF8(i->value.getPackedValueString()));
|
||||
void
|
||||
ObjvarBuffer::updateObjvars(const NetworkId &objectId, const std::vector <DynamicVariableList::MapType::Command> &commands) {
|
||||
bool override = false; // flag that we're dealing with the gold data override case (storing an objvar change in the live database, on an object that came from the gold database)
|
||||
if (ConfigServerDatabase::getEnableGoldDatabase() && objectId < ConfigServerDatabase::getMaxGoldNetworkId()) {
|
||||
override = true;
|
||||
}
|
||||
|
||||
if (i->value.getPosition() !=-1 && ConfigServerDatabase::getEnableObjvarPacking() && !override)
|
||||
{
|
||||
m_objectTableBuffer->handlePackedObjvar(objectId, i->value.getPosition(), i->key, i->value.getType(), packedValue);
|
||||
}
|
||||
else
|
||||
{
|
||||
int nameId = ObjvarNameManager::getInstance().getOrAddNameId(i->key);
|
||||
|
||||
DataType::iterator row=m_data.find(IndexKey(objectId, nameId));
|
||||
if (row==m_data.end())
|
||||
{
|
||||
row=m_data.insert(std::make_pair(IndexKey(objectId, nameId),ObjvarValue())).first;
|
||||
if (i->cmd==DynamicVariableList::MapType::Command::ADD || override)
|
||||
row->second.m_inDatabase=false; // new variable
|
||||
else
|
||||
row->second.m_inDatabase=true; // update to existing variable
|
||||
}
|
||||
row->second.m_type = i->value.getType();
|
||||
row->second.m_value = packedValue;
|
||||
row->second.m_detached = false;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case DynamicVariableList::MapType::Command::ERASE :
|
||||
{
|
||||
int nameId = ObjvarNameManager::getInstance().getNameId(i->key);
|
||||
if (nameId != 0) // It's possible to get an ERASE for a packed objvar where the name was never used in the OBJECT_VARIABLES table. We can safely ignore these.
|
||||
{
|
||||
DataType::iterator row=m_data.find(IndexKey(objectId, nameId));
|
||||
if (row==m_data.end())
|
||||
{
|
||||
if (i->value.getPosition() == -1 || override)
|
||||
{
|
||||
row=m_data.insert(std::make_pair(IndexKey(objectId, nameId),ObjvarValue())).first;
|
||||
row->second.m_inDatabase=true; // deleting existing variable
|
||||
}
|
||||
// else it was a packed objvar, and no update is necessary
|
||||
}
|
||||
for (std::vector<DynamicVariableList::MapType::Command>::const_iterator i = commands.begin();
|
||||
i != commands.end(); ++i) {
|
||||
switch (i->cmd) {
|
||||
case DynamicVariableList::MapType::Command::ADD :
|
||||
case DynamicVariableList::MapType::Command::SET : {
|
||||
std::string packedValue(Unicode::wideToUTF8(i->value.getPackedValueString()));
|
||||
|
||||
row->second.m_type = i->value.getType();
|
||||
row->second.m_detached = true; //why the fuck even store it at this point?
|
||||
}
|
||||
if (i->value.getPosition() != -1 && ConfigServerDatabase::getEnableObjvarPacking() && !override) {
|
||||
m_objectTableBuffer->handlePackedObjvar(objectId, i->value.getPosition(), i->key, i->value.getType(), packedValue);
|
||||
} else {
|
||||
int nameId = ObjvarNameManager::getInstance().getOrAddNameId(i->key);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
WARNING_STRICT_FATAL(true,("Unknown command %i unpacked in object variables for object %s.",i->cmd,objectId.getValueString().c_str()));
|
||||
}
|
||||
}
|
||||
DataType::iterator row = m_data.find(IndexKey(objectId, nameId));
|
||||
if (row == m_data.end()) {
|
||||
row = m_data.insert(std::make_pair(IndexKey(objectId, nameId), ObjvarValue())).first;
|
||||
if (i->cmd == DynamicVariableList::MapType::Command::ADD || override) {
|
||||
row->second.m_inDatabase = false; // new variable
|
||||
} else {
|
||||
row->second.m_inDatabase = true;
|
||||
} // update to existing variable
|
||||
}
|
||||
row->second.m_type = i->value.getType();
|
||||
row->second.m_value = packedValue;
|
||||
row->second.m_detached = false;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
DEBUG_WARNING(commands.size() > 100,("Object %s has a suspicious number of objvar updates (%i updates).",objectId.getValueString().c_str(),commands.size()));
|
||||
case DynamicVariableList::MapType::Command::ERASE : {
|
||||
int nameId = ObjvarNameManager::getInstance().getNameId(i->key);
|
||||
if (nameId !=
|
||||
0) // It's possible to get an ERASE for a packed objvar where the name was never used in the OBJECT_VARIABLES table. We can safely ignore these.
|
||||
{
|
||||
DataType::iterator row = m_data.find(IndexKey(objectId, nameId));
|
||||
if (row == m_data.end()) {
|
||||
if (i->value.getPosition() == -1 || override) {
|
||||
row = m_data.insert(std::make_pair(IndexKey(objectId, nameId), ObjvarValue())).first;
|
||||
row->second.m_inDatabase = true; // deleting existing variable
|
||||
}
|
||||
// else it was a packed objvar, and no update is necessary
|
||||
}
|
||||
|
||||
row->second.m_type = i->value.getType();
|
||||
row->second.m_detached = true; //why the fuck even store it at this point?
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
WARNING_STRICT_FATAL(true, ("Unknown command %i unpacked in object variables for object %s.", i->cmd, objectId.getValueString().c_str()));
|
||||
}
|
||||
}
|
||||
|
||||
DEBUG_WARNING(commands.size() >
|
||||
100, ("Object %s has a suspicious number of objvar updates (%i updates).", objectId.getValueString().c_str(), commands.size()));
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
|
||||
void ObjvarBuffer::removeObject(const NetworkId &object)
|
||||
{
|
||||
DataType::iterator i=m_data.lower_bound(IndexKey(object,0));
|
||||
while (i!=m_data.end())
|
||||
{
|
||||
if (i->first.m_objectId==object)
|
||||
i = m_data.erase(i);
|
||||
else
|
||||
++i;
|
||||
}
|
||||
void ObjvarBuffer::removeObject(const NetworkId &object) {
|
||||
DataType::iterator i = m_data.lower_bound(IndexKey(object, 0));
|
||||
while (i != m_data.end()) {
|
||||
if (i->first.m_objectId == object) {
|
||||
i = m_data.erase(i);
|
||||
} else {
|
||||
++i;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ======================================================================
|
||||
|
||||
@@ -16,13 +16,12 @@
|
||||
#include "sharedFoundation/DynamicVariableList.h"
|
||||
#include <map>
|
||||
#include <string>
|
||||
#include <memory>
|
||||
|
||||
// ======================================================================
|
||||
|
||||
class ObjectTableBuffer;
|
||||
namespace DBSchema
|
||||
{
|
||||
struct ObjvarRow;
|
||||
namespace DBSchema {
|
||||
struct ObjvarRow;
|
||||
}
|
||||
|
||||
// ======================================================================
|
||||
@@ -39,80 +38,98 @@ namespace DBSchema
|
||||
* are loaded for that object.
|
||||
*/
|
||||
|
||||
class ObjvarBuffer : public AbstractTableBuffer
|
||||
{
|
||||
class ObjvarBuffer : public AbstractTableBuffer {
|
||||
public:
|
||||
explicit ObjvarBuffer(DB::ModeQuery::Mode mode, ObjectTableBuffer *objectTableBuffer, bool useGoldNames);
|
||||
virtual ~ObjvarBuffer(void);
|
||||
|
||||
virtual bool load(DB::Session *session,const DB::TagSet &tags, const std::string &schema, bool usingGoldDatabase);
|
||||
virtual bool save(DB::Session *session);
|
||||
virtual void removeObject(const NetworkId &object);
|
||||
|
||||
DBSchema::ObjectVariableRow *findRowByIndex(const NetworkId &objectId, const std::string &name);
|
||||
explicit ObjvarBuffer(DB::ModeQuery::Mode mode, ObjectTableBuffer *objectTableBuffer, bool useGoldNames);
|
||||
|
||||
void updateObjvars(const NetworkId &objectId, const std::vector<DynamicVariableList::MapType::Command> &commands);
|
||||
void getObjvarsForObject(const NetworkId &objectId, std::vector<DynamicVariableList::MapType::Command> &commands) const;
|
||||
|
||||
private:
|
||||
struct IndexKey
|
||||
{
|
||||
const NetworkId m_objectId;
|
||||
int m_nameId;
|
||||
virtual ~ObjvarBuffer(void);
|
||||
|
||||
IndexKey(const NetworkId &objectId, int nameId);
|
||||
bool operator==(const IndexKey &rhs) const;
|
||||
bool operator<(const IndexKey &rhs) const;
|
||||
};
|
||||
virtual bool load(DB::Session *session, const DB::TagSet &tags, const std::string &schema, bool usingGoldDatabase);
|
||||
|
||||
struct ObjvarValue
|
||||
{
|
||||
int m_type;
|
||||
std::string m_value;
|
||||
bool m_detached;
|
||||
bool m_inDatabase;
|
||||
};
|
||||
virtual bool save(DB::Session *session);
|
||||
|
||||
typedef std::map<IndexKey,ObjvarValue> DataType;
|
||||
virtual void removeObject(const NetworkId &object);
|
||||
|
||||
DB::ModeQuery::Mode m_mode;
|
||||
DataType m_data;
|
||||
DataType m_overrides;
|
||||
ObjectTableBuffer *m_objectTableBuffer;
|
||||
bool m_useGoldNames;
|
||||
DBSchema::ObjectVariableRow *findRowByIndex(const NetworkId &objectId, const std::string &name);
|
||||
|
||||
void updateObjvars(const NetworkId &objectId, const std::vector <DynamicVariableList::MapType::Command> &commands);
|
||||
|
||||
void
|
||||
getObjvarsForObject(const NetworkId &objectId, std::vector <DynamicVariableList::MapType::Command> &commands) const;
|
||||
|
||||
private:
|
||||
struct IndexKey {
|
||||
const NetworkId m_objectId;
|
||||
int m_nameId;
|
||||
|
||||
IndexKey(const NetworkId &objectId, int nameId);
|
||||
|
||||
bool operator==(const IndexKey &rhs) const;
|
||||
|
||||
bool operator<(const IndexKey &rhs) const;
|
||||
|
||||
bool operator>(const IndexKey &rhs) const;
|
||||
};
|
||||
|
||||
struct ObjvarValue {
|
||||
int m_type;
|
||||
std::string m_value;
|
||||
bool m_detached;
|
||||
bool m_inDatabase;
|
||||
};
|
||||
|
||||
typedef std::map <IndexKey, ObjvarValue> DataType;
|
||||
|
||||
DB::ModeQuery::Mode m_mode;
|
||||
DataType m_data;
|
||||
ObjectTableBuffer *m_objectTableBuffer;
|
||||
bool m_useGoldNames;
|
||||
|
||||
// typedef std::map<NetworkId,std::vector<DBSchema::ObjectVariableRow*> > LoadIndexType;
|
||||
// LoadIndexType m_loadIndex;
|
||||
|
||||
private:
|
||||
ObjvarBuffer(); //disable
|
||||
ObjvarBuffer(const ObjvarBuffer&); //disable
|
||||
ObjvarBuffer & operator=(const ObjvarBuffer&); //disable
|
||||
private:
|
||||
ObjvarBuffer(); //disable
|
||||
ObjvarBuffer(const ObjvarBuffer &); //disable
|
||||
ObjvarBuffer &operator=(const ObjvarBuffer &); //disable
|
||||
}; //lint !e1712 // IndexKey has no default constructor
|
||||
|
||||
// ======================================================================
|
||||
|
||||
inline ObjvarBuffer::IndexKey::IndexKey(const NetworkId &objectId, int nameId) : m_objectId(objectId), m_nameId(nameId)
|
||||
{
|
||||
inline ObjvarBuffer::IndexKey::IndexKey(const NetworkId &objectId, int nameId)
|
||||
: m_objectId(objectId), m_nameId(nameId) {
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
|
||||
inline bool ObjvarBuffer::IndexKey::operator==(const IndexKey &rhs) const
|
||||
{
|
||||
return ((m_objectId == rhs.m_objectId) && (m_nameId == rhs.m_nameId));
|
||||
inline bool ObjvarBuffer::IndexKey::operator==(const IndexKey &rhs) const {
|
||||
return ((m_objectId == rhs.m_objectId) && (m_nameId == rhs.m_nameId));
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
|
||||
inline bool ObjvarBuffer::IndexKey::operator<(const IndexKey &rhs) const
|
||||
{
|
||||
if (m_objectId < rhs.m_objectId)
|
||||
return true;
|
||||
else if (m_objectId == rhs.m_objectId)
|
||||
return (m_nameId < rhs.m_nameId);
|
||||
else
|
||||
return false;
|
||||
inline bool ObjvarBuffer::IndexKey::operator<(const IndexKey &rhs) const {
|
||||
if (m_objectId < rhs.m_objectId) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (m_objectId == rhs.m_objectId) {
|
||||
return (m_nameId < rhs.m_nameId);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
inline bool ObjvarBuffer::IndexKey::operator>(const IndexKey &rhs) const {
|
||||
if (m_objectId > rhs.m_objectId) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (m_objectId == rhs.m_objectId) {
|
||||
return (m_nameId > rhs.m_nameId);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// ======================================================================
|
||||
|
||||
@@ -113,9 +113,9 @@ void SwgPersister::getMoneyFromOfflineObject(uint32 replyServer, NetworkId const
|
||||
SwgSnapshot * snapshot=nullptr;
|
||||
|
||||
if (hasDataForObject(sourceObject))
|
||||
snapshot=safe_cast<SwgSnapshot*>(&getSnapshotForObject(sourceObject, 0));
|
||||
snapshot=safe_cast<SwgSnapshot*>(getSnapshotForObject(sourceObject, 0));
|
||||
else
|
||||
snapshot=safe_cast<SwgSnapshot*>(&getSnapshotForServer(0));
|
||||
snapshot=safe_cast<SwgSnapshot*>(getSnapshotForServer(0));
|
||||
|
||||
snapshot->getMoneyFromOfflineObject(replyServer, sourceObject, amount, replyTo, successCallback, failCallback, packedDictionary);
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user