diff options
author | Philipp Sehmisch <mana@crushnet.org> | 2010-01-08 22:01:45 +0100 |
---|---|---|
committer | Philipp Sehmisch <mana@crushnet.org> | 2010-01-08 22:01:45 +0100 |
commit | de7d79c7f42636065ca5281fa3bec151e34a7c48 (patch) | |
tree | a7c0b7769b5fdbe7c84dfc644dc6a54e4ed2f79a /src/account-server/storage.cpp | |
parent | 9137942b624a152f143662b58ebc7277b508cb50 (diff) | |
download | manaserv-de7d79c7f42636065ca5281fa3bec151e34a7c48.tar.gz manaserv-de7d79c7f42636065ca5281fa3bec151e34a7c48.tar.xz manaserv-de7d79c7f42636065ca5281fa3bec151e34a7c48.zip |
Added tracing of kill count for each monster per character
Diffstat (limited to 'src/account-server/storage.cpp')
-rw-r--r-- | src/account-server/storage.cpp | 86 |
1 files changed, 83 insertions, 3 deletions
diff --git a/src/account-server/storage.cpp b/src/account-server/storage.cpp index e40e19d..c547977 100644 --- a/src/account-server/storage.cpp +++ b/src/account-server/storage.cpp @@ -41,7 +41,7 @@ static const char *DEFAULT_ITEM_FILE = "data/items.xml"; // defines the supported db version static const char *DB_VERSION_PARAMETER = "database_version"; -static const char *SUPPORTED_DB_VERSION = "7"; +static const char *SUPPORTED_DB_VERSION = "8"; /* * MySQL specificities: @@ -72,6 +72,7 @@ static const char *ACCOUNTS_TBL_NAME = "mana_accounts"; static const char *CHARACTERS_TBL_NAME = "mana_characters"; static const char *CHAR_SKILLS_TBL_NAME = "mana_char_skills"; static const char *CHAR_STATUS_EFFECTS_TBL_NAME = "mana_char_status_effects"; +static const char *CHAR_KILL_COUNT_TBL_NAME = "mana_char_kill_stats"; static const char *INVENTORIES_TBL_NAME = "mana_inventories"; static const char *ITEMS_TBL_NAME = "mana_items"; static const char *GUILDS_TBL_NAME = "mana_guilds"; @@ -414,9 +415,9 @@ Character *Storage::getCharacterBySQL(Account *owner) toUint(skillInfo(row, 1))); // experience } } + // Load the status effect s.clear(); s.str(""); - // Load the status effect s << "select status_id, status_time FROM " << CHAR_STATUS_EFFECTS_TBL_NAME << " WHERE char_id = " << character->getDatabaseID(); const dal::RecordSet &statusInfo = mDb->execSql(s.str()); @@ -430,6 +431,23 @@ Character *Storage::getCharacterBySQL(Account *owner) toUint(statusInfo(row, 1))); // Time } } + // Load the kill stats + s.clear(); + s.str(""); + // Load the status effect + s << "select monster_id, kills FROM " << CHAR_KILL_COUNT_TBL_NAME + << " WHERE char_id = " << character->getDatabaseID(); + const dal::RecordSet &killsInfo = mDb->execSql(s.str()); + if (!statusInfo.isEmpty()) + { + const unsigned int nRows = killsInfo.rows(); + for (unsigned int row = 0; row < nRows; row++) + { + character->setKillCount( + toUint(killsInfo(row, 0)), // MonsterID + toUint(killsInfo(row, 1))); // Kills + } + } } catch (const dal::DbSqlQueryExecFailure &e) { @@ -693,7 +711,28 @@ bool Storage::updateCharacter(Character *character, return false; } - + /** + * Character's kill count + */ + try + { + std::map<int, int>::const_iterator kill_it; + for (kill_it = character->getKillCountBegin(); + kill_it != character->getKillCountEnd(); kill_it++) + { + updateKillCount(character->getDatabaseID(), kill_it->first, kill_it->second); + } + } + catch (const dal::DbSqlQueryExecFailure& e) + { + // TODO: throw an exception. + if (startTransaction) + { + mDb->rollbackTransaction(); + } + LOG_ERROR("(DALStorage::updateCharacter #2) SQL query failure: " << e.what()); + return false; + } /** * Character's inventory */ @@ -1128,6 +1167,47 @@ void Storage::updateExperience(int charId, int skillId, int skillValue) } /** + * Write a modification message about character skills to the database. + * @param CharId ID of the character + * @param monsterId ID of the monster type + * @param kills new amount of kills + */ +void Storage::updateKillCount(int charId, int monsterId, int kills) +{ + LOG_INFO("Updating kill counts"); //<- DELME + try + { + // try to update the kill count + std::ostringstream sql; + sql << "UPDATE " << CHAR_KILL_COUNT_TBL_NAME + << " SET kills = " << kills + << " WHERE char_id = " << charId + << " AND monster_id = " << monsterId; + 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_KILL_COUNT_TBL_NAME << " " + << "(char_id, monster_id, kills) VALUES ( " + << charId << ", " + << monsterId << ", " + << kills << ")"; + mDb->execSql(sql.str()); + } + catch (const dal::DbSqlQueryExecFailure &e) + { + LOG_ERROR("DALStorage::updateKillCount: " << e.what()); + throw; + } +} + +/** * Inserts a record about a status effect into the database * @param charId ID of the character in the database * @param statusId ID of the status effect |