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/dalstorage.cpp | |
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/dalstorage.cpp')
-rw-r--r-- | src/account-server/dalstorage.cpp | 131 |
1 files changed, 79 insertions, 52 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 */ |