Merge branch 'testing'

This commit is contained in:
DarthArgus
2016-12-14 02:20:18 +00:00
10 changed files with 1404 additions and 1501 deletions
@@ -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