summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog3
-rw-r--r--src/account-server/dalstorage.cpp72
-rw-r--r--src/account-server/dalstoragesql.hpp6
3 files changed, 48 insertions, 33 deletions
diff --git a/ChangeLog b/ChangeLog
index ab269d9..9654602 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -23,6 +23,9 @@
used, and of name, so that it does not waste bandwidth.
* src/account-server/serverhandler.cpp: Reverted to the scheme based on
character ID, so that runtime character data are persistent again.
+ * src/account-server/dalstoragesql.hpp,
+ src/account-server/dalstorage.cpp: Added support for storing inventory
+ in database.
2007-06-28 Philipp Sehmisch <tmw@crushnet.org>
diff --git a/src/account-server/dalstorage.cpp b/src/account-server/dalstorage.cpp
index ff5684d..72a6182 100644
--- a/src/account-server/dalstorage.cpp
+++ b/src/account-server/dalstorage.cpp
@@ -681,7 +681,6 @@ DALStorage::updateCharacter(CharacterPtr character)
* Character's inventory
*/
- /*
// Delete the old inventory first
try
{
@@ -699,44 +698,57 @@ DALStorage::updateCharacter(CharacterPtr character)
}
// Insert the new inventory data
- if (character->getNumberOfInventoryItems())
+ try
{
- try
- {
- std::ostringstream sqlInsertCharacterInventory;
+ std::ostringstream sqlInsertCharacterInventory;
+
+ sqlInsertCharacterInventory
+ << "insert into " << INVENTORIES_TBL_NAME
+ << " (owner_id, slot, class_id, amount) "
+ << "values ";
+ int id = character->getDatabaseID();
+ bool first = true;
+ Possessions const &poss = character->getPossessions();
+
+ for (int j = 0; j < EQUIPMENT_SLOTS; ++j)
+ {
+ int v = poss.equipment[j];
+ if (!v) continue;
+ if (first) first = false;
+ else sqlInsertCharacterInventory << ", ";
sqlInsertCharacterInventory
- << "insert into " << INVENTORIES_TBL_NAME
- << " (owner_id, class_id, amount, equipped) "
- << "values ";
+ << '(' << id << ", " << j << ", " << v << ", " << 1 << ')';
+ }
- for (int j = 0; j < character->getNumberOfInventoryItems(); j++)
+ int slot = 32;
+ for (std::vector< InventoryItem >::const_iterator j = poss.inventory.begin(),
+ j_end = poss.inventory.end(); j != j_end; ++j)
+ {
+ int v = j->itemId;
+ if (!v)
{
- sqlInsertCharacterInventory
- << "(" << character->getDatabaseID() << ", "
- << character->getInventoryItem(j).itemClassId << ", "
- << character->getInventoryItem(j).numberOfItemsInSlot
- << ", "
- << (unsigned short)
- character->getInventoryItem(j).isEquiped
- << ")";
-
- // Adding the comma only if it's needed
- if (j < (character->getNumberOfInventoryItems() - 1))
- sqlInsertCharacterInventory << ", ";
+ slot += j->amount;
+ continue;
}
- sqlInsertCharacterInventory << ";";
+ if (first) first = false;
+ else sqlInsertCharacterInventory << ", ";
+ sqlInsertCharacterInventory
+ << '(' << id << ", " << slot << ", " << v << ", " << unsigned(j->amount) << ')';
+ ++slot;
+ }
+ sqlInsertCharacterInventory << ';';
+
+ if (!first)
mDb->execSql(sqlInsertCharacterInventory.str());
- }
- catch (const dal::DbSqlQueryExecFailure& e)
- {
- // TODO: throw an exception.
- LOG_ERROR("(DALStorage::updateCharacter #3) SQL query failure: " << e.what());
- return false;
- }
}
- */
+ catch (const dal::DbSqlQueryExecFailure& e)
+ {
+ // TODO: throw an exception.
+ LOG_ERROR("(DALStorage::updateCharacter #3) SQL query failure: " << e.what());
+ return false;
+ }
return true;
}
diff --git a/src/account-server/dalstoragesql.hpp b/src/account-server/dalstoragesql.hpp
index df141f6..b129b79 100644
--- a/src/account-server/dalstoragesql.hpp
+++ b/src/account-server/dalstoragesql.hpp
@@ -282,24 +282,24 @@ const std::string SQL_INVENTORIES_TABLE(
#if defined (MYSQL_SUPPORT)
"id INTEGER PRIMARY KEY AUTO_INCREMENT,"
"owner_id INTEGER NOT NULL,"
+ "slot SMALLINT NOT NULL,"
"class_id INTEGER NOT NULL,"
"amount SMALLINT NOT NULL,"
- "equipped TINYINT NOT NULL,"
"FOREIGN KEY (owner_id) REFERENCES tmw_characters(id)"
"INDEX (id)"
#elif defined (SQLITE_SUPPORT)
"id INTEGER PRIMARY KEY,"
"owner_id INTEGER NOT NULL,"
+ "slot INTEGER NOT NULL,"
"class_id INTEGER NOT NULL,"
"amount INTEGER NOT NULL,"
- "equipped INTEGER NOT NULL,"
"FOREIGN KEY (owner_id) REFERENCES tmw_characters(id)"
#elif defined (POSTGRESQL_SUPPORT)
"id SERIAL PRIMARY KEY,"
"owner_id INTEGER NOT NULL,"
+ "slot INTEGER NOT NULL,"
"class_id INTEGER NOT NULL,"
"amount INTEGER NOT NULL,"
- "equipped INTEGER NOT NULL,"
"FOREIGN KEY (owner_id) REFERENCES tmw_characters(id)"
#endif
");"