summaryrefslogtreecommitdiff
path: root/src/account-server/storage.cpp
diff options
context:
space:
mode:
authorPhilipp Sehmisch <mana@crushnet.org>2010-01-08 22:01:45 +0100
committerPhilipp Sehmisch <mana@crushnet.org>2010-01-08 22:01:45 +0100
commitde7d79c7f42636065ca5281fa3bec151e34a7c48 (patch)
treea7c0b7769b5fdbe7c84dfc644dc6a54e4ed2f79a /src/account-server/storage.cpp
parent9137942b624a152f143662b58ebc7277b508cb50 (diff)
downloadmanaserv-de7d79c7f42636065ca5281fa3bec151e34a7c48.tar.gz
manaserv-de7d79c7f42636065ca5281fa3bec151e34a7c48.tar.bz2
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.cpp86
1 files changed, 83 insertions, 3 deletions
diff --git a/src/account-server/storage.cpp b/src/account-server/storage.cpp
index e40e19da..c547977f 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