diff options
author | Andreas Habel <mail@exceptionfault.de> | 2008-11-30 12:08:57 +0100 |
---|---|---|
committer | Andreas Habel <mail@exceptionfault.de> | 2008-11-30 12:08:57 +0100 |
commit | 4abae69f1180ffe6a4dbd2db60dfa76b6ef41ebb (patch) | |
tree | 4b2e3eb8e5c35e65ec18996060a5daac9bff1938 /src/account-server | |
parent | 6d263b7550468306018934ad1dc9928b57b8f129 (diff) | |
download | manaserv-4abae69f1180ffe6a4dbd2db60dfa76b6ef41ebb.tar.gz manaserv-4abae69f1180ffe6a4dbd2db60dfa76b6ef41ebb.tar.bz2 manaserv-4abae69f1180ffe6a4dbd2db60dfa76b6ef41ebb.tar.xz manaserv-4abae69f1180ffe6a4dbd2db60dfa76b6ef41ebb.zip |
Add sync Buffer according to mantis #550
The game server buffers all changes made to a character in a sync buffer.
The buffer is sent to the account server if the buffer contains more then
20 message, reaches size of 1kb or at least every 10 seconds.
ATM Character attributes, corr points and attribute points and skills are
synchronized. TODO: items, location, money...
Diffstat (limited to 'src/account-server')
-rw-r--r-- | src/account-server/dalstorage.cpp | 131 | ||||
-rw-r--r-- | src/account-server/dalstorage.hpp | 21 | ||||
-rw-r--r-- | src/account-server/serverhandler.cpp | 41 | ||||
-rw-r--r-- | src/account-server/serverhandler.hpp | 8 |
4 files changed, 148 insertions, 53 deletions
diff --git a/src/account-server/dalstorage.cpp b/src/account-server/dalstorage.cpp index 06a1c83a..20815a7d 100644 --- a/src/account-server/dalstorage.cpp +++ b/src/account-server/dalstorage.cpp @@ -67,11 +67,6 @@ DALStorage::~DALStorage() /** * Connect to the database and initialize it if necessary. * - * TODO: <b>Exceptionfault:</b> after connecting to the database, we have to - * verify if the version matches a supported version. Maybe implement a - * "version table" to check after connect. Raise an error with verbose - * informations about the discrepancy between the versions. - * */ void DALStorage::open() { @@ -538,7 +533,8 @@ bool DALStorage::updateCharacter(Character *character, { for (unsigned int skill_id = 0; skill_id < CHAR_SKILL_NB; skill_id++) { - flushSkill(character, skill_id); + updateExperience(character->getDatabaseID(), skill_id, + character->getExperience(skill_id)); } } catch (const dal::DbSqlQueryExecFailure& e) @@ -635,57 +631,15 @@ bool DALStorage::updateCharacter(Character *character, /** * Save changes of a skill to the database permanently. + * @deprecated Use DALStorage::updateExperience instead!!! */ void DALStorage::flushSkill(const Character* const character, const int skill_id ) { - try - { - const unsigned int exp = character->getExperience(skill_id); - - // if experience has decreased to 0 we don't store is anymore, - // its the default - if (exp == 0) - { - std::ostringstream sql; - sql << "DELETE FROM " << CHAR_SKILLS_TBL_NAME << " " - << "WHERE char_id = '" << character->getDatabaseID() << "' " - << "AND skill_id = '" << skill_id << "'"; - mDb->execSql(sql.str()); - return; - } - - // try to update the skill - std::ostringstream sql; - sql << "UPDATE " << CHAR_SKILLS_TBL_NAME << " " - << "SET skill_exp = '" << exp << "' " - << "WHERE char_id = '" << character->getDatabaseID() << "' " - << "AND skill_id = '" << skill_id << "'"; - mDb->execSql(sql.str()); - - // check if the update has modified a row - if (mDb->getModifiedRows() > 0) - { - return; - } - - sql.clear(); - sql.str(""); - sql << "INSERT INTO " << CHAR_SKILLS_TBL_NAME << " " - << "(char_id, skill_id, skill_exp) VALUES ( " - << "'" << character->getDatabaseID() << "', " - << "'" << skill_id << "', " - << "'" << exp << "' )"; - mDb->execSql(sql.str()); - } - catch (const dal::DbSqlQueryExecFailure &e) - { - LOG_ERROR("DALStorage::flushSkill: " << e.what()); - throw; - } + updateExperience(character->getDatabaseID(), skill_id, + character->getExperience(skill_id)); } - /** * Add an account to the database. */ @@ -804,7 +758,8 @@ void DALStorage::flush(Account *account) // update the characters skills for (unsigned int skill_id = 0; skill_id < CHAR_SKILL_NB; skill_id++) { - flushSkill((*it), skill_id); + updateExperience((*it)->getDatabaseID(), skill_id, + (*it)->getExperience(skill_id)); } } } // @@ -886,6 +841,78 @@ void DALStorage::updateLastLogin(const Account *account) mDb->execSql(sql.str()); } +void DALStorage::updateCharacterPoints(const int CharId, const int CharPoints, + const int CorrPoints, const int AttribId, const int AttribValue ) +{ + std::ostringstream sql; + sql << "UPDATE " << CHARACTERS_TBL_NAME + << " SET char_pts = " << CharPoints << ", " + << " correct_pts = " << CorrPoints << ", "; + + switch (AttribId) + { + case CHAR_ATTR_STRENGTH: sql << "str = "; break; + case CHAR_ATTR_AGILITY: sql << "agi = "; break; + case CHAR_ATTR_DEXTERITY: sql << "dex = "; break; + case CHAR_ATTR_VITALITY: sql << "vit = "; break; + case CHAR_ATTR_INTELLIGENCE: sql << "int = "; break; + case CHAR_ATTR_WILLPOWER: sql << "will = "; break; + } + sql << AttribValue + << " WHERE id = " << CharId; + + mDb->execSql(sql.str()); +} + +void DALStorage::updateExperience(const int CharId, const int SkillId, + const int SkillValue) +{ + try + { + // if experience has decreased to 0 we don't store it anymore, + // its the default + if (SkillValue == 0) + { + std::ostringstream sql; + sql << "DELETE FROM " << CHAR_SKILLS_TBL_NAME + << " WHERE char_id = " << CharId + << " AND skill_id = " << SkillId; + mDb->execSql(sql.str()); + return; + } + + // try to update the skill + std::ostringstream sql; + sql << "UPDATE " << CHAR_SKILLS_TBL_NAME + << " SET skill_exp = " << SkillValue + << " WHERE char_id = " << CharId + << " AND skill_id = " << SkillId; + mDb->execSql(sql.str()); + + // check if the update has modified a row + if (mDb->getModifiedRows() > 0) + { + return; + } + + sql.clear(); + sql.str(""); + sql << "INSERT INTO " << CHAR_SKILLS_TBL_NAME << " " + << "(char_id, skill_id, skill_exp) VALUES ( " + << CharId << ", " + << SkillId << ", " + << SkillValue << ")"; + mDb->execSql(sql.str()); + } + catch (const dal::DbSqlQueryExecFailure &e) + { + LOG_ERROR("DALStorage::updateExperience: " << e.what()); + throw; + } +} + + + /** * Add a guild */ diff --git a/src/account-server/dalstorage.hpp b/src/account-server/dalstorage.hpp index e0cfead5..896151d1 100644 --- a/src/account-server/dalstorage.hpp +++ b/src/account-server/dalstorage.hpp @@ -123,6 +123,27 @@ class DALStorage void updateLastLogin(const Account *account); /** + * Write a modification message about Character points to the database. + * + * @param CharId ID of the character + * @param CharPoints Number of character points left for the character + * @param CorrPoints Number of correction points left for the character + * @param AttribId ID of the modified attribute + * @param AttribValue New value of the modified attribute + */ + void updateCharacterPoints(const int CharId, const int CharPoints, + const int CorrPoints, const int AttribId, const int AttribValue ); + + /** + * Write a modification message about character skills to the database. + * @param CharId ID of the character + * @param SkillId ID of the skill + * @param SkillValue new skill points + */ + void updateExperience(const int CharId, const int SkillId, + const int SkillValue); + + /** * Sets a ban on an account (hence on all its characters). * * @param id character identifier. diff --git a/src/account-server/serverhandler.cpp b/src/account-server/serverhandler.cpp index bdbdb1f6..1c4a5219 100644 --- a/src/account-server/serverhandler.cpp +++ b/src/account-server/serverhandler.cpp @@ -31,7 +31,6 @@ #include "account-server/dalstorage.hpp" #include "chat-server/post.hpp" #include "net/connectionhandler.hpp" -#include "net/messagein.hpp" #include "net/messageout.hpp" #include "net/netcomputer.hpp" #include "serialize/characterdata.hpp" @@ -241,6 +240,12 @@ void ServerHandler::processMessage(NetComputer *comp, MessageIn &msg) } } break; + case GAMSG_PLAYER_SYNC: + { + LOG_DEBUG("GAMSG_PLAYER_SYNC"); + GameServerHandler::syncDatabase(msg); + } break; + case GAMSG_REDIRECT: { LOG_DEBUG("GAMSG_REDIRECT"); @@ -511,3 +516,37 @@ void GameServerHandler::sendPartyChange(Character *ptr, int partyId) s->send(msg); } } + +void GameServerHandler::syncDatabase(MessageIn &msg) +{ + int msgType = msg.readByte(); + while( msgType != SYNC_END_OF_BUFFER ) + { + switch (msgType) + { + case SYNC_CHARACTER_POINTS: + { + LOG_DEBUG("received SYNC_CHARACTER_POINTS"); + int CharId = msg.readLong(); + int CharPoints = msg.readLong(); + int CorrPoints = msg.readLong(); + int AttribId = msg.readByte(); + int AttribValue = msg.readLong(); + storage->updateCharacterPoints(CharId, CharPoints, CorrPoints, + AttribId, AttribValue); + } break; + + case SYNC_CHARACTER_SKILL: + { + LOG_DEBUG("received SYNC_CHARACTER_SKILL"); + int CharId = msg.readLong(); + int SkillId = msg.readByte(); + int SkillValue = msg.readLong(); + storage->updateExperience(CharId, SkillId, SkillValue); + } break; + } + + // read next message type from buffer + msgType = msg.readByte(); + } +} diff --git a/src/account-server/serverhandler.hpp b/src/account-server/serverhandler.hpp index 0d75219c..646ebf4c 100644 --- a/src/account-server/serverhandler.hpp +++ b/src/account-server/serverhandler.hpp @@ -25,6 +25,8 @@ #include <iosfwd> #include <string> +#include "net/messagein.hpp" + class Character; namespace GameServerHandler @@ -64,6 +66,12 @@ namespace GameServerHandler * Sends chat party information */ void sendPartyChange(Character *ptr, int partyId); + + /** + * Takes a GAMSG_PLAYER_SYNC from the gameserver and stores all changes in + * the database. + */ + void syncDatabase(MessageIn &msg); } #endif |