If you're using an MySQL datasource, you will be using this\r
DAO to access Items.\r
*/\r
- sql_create_22(item, 1, 0,\r
- mysqlpp::sql_varchar, id,\r
+ sql_create_22(item, 1, 0,\r
+ mysqlpp::sql_int_unsigned, id,\r
mysqlpp::sql_varchar, name,\r
mysqlpp::sql_int, strengthhigh,\r
mysqlpp::sql_int, strengthlow,\r
virtual shared_ptr<ItemGO> GetById(const string &Id) const;\r
\r
virtual bool IdExists(const string &Id) const;\r
+ \r
+ virtual void Insert(shared_ptr<ItemGO> spItem);\r
+ virtual void Update(shared_ptr<ItemGO> spItem);\r
\r
private:\r
//! Data mysql\r
\r
//! Creates the ItemGO found at iterator position\r
shared_ptr<ItemGO> CreateItemFromItemSSQLS(const item &i) const;\r
+ item CreateItemSSQLSFromItem(shared_ptr<ItemGO> spItem) const;\r
\r
//! Get the Item database mysql path\r
string GetItemTableName(void) const;\r
using boost::str;\r
using boost::format;\r
using boost::lexical_cast;\r
+using boost::bad_lexical_cast;\r
\r
MySQLId::MySQLId()\r
{\r
return Id;\r
}\r
\r
-string MySQLId::CreateItemId(const string &Number)\r
+string MySQLId::CreateItemId(const unsigned long long &Number)\r
{\r
- return Number;\r
+ return lexical_cast<string>(Number);\r
}\r
\r
-unsigned int MySQLId::GetItemNumberFromId(const string &Id)\r
+unsigned long long MySQLId::GetItemNumberFromId(const string &Id)\r
{\r
- return lexical_cast<unsigned int>(Id);\r
+ try\r
+ {\r
+ return lexical_cast<unsigned int>(Id);\r
+ }\r
+ catch (bad_lexical_cast)\r
+ {\r
+ throw GameServException(str(format("Improperly formatted Item ID: %1%") % Id), __FILE__, __LINE__);\r
+ }\r
}\r
\r
string MySQLId::CreateMonsterId(const string &LevelId, const string &Name)\r
\r
unsigned int MySQLId::GetLevelNumberFromId(const string &Id)\r
{\r
- return lexical_cast<unsigned int>(Id);\r
+ try\r
+ {\r
+ return lexical_cast<unsigned int>(Id);\r
+ }\r
+ catch (bad_lexical_cast)\r
+ {\r
+ throw GameServException(str(format("Improperly formatted Level ID: %1%") % Id), __FILE__, __LINE__);\r
+ }\r
}\r
\r
string MySQLId::CreateMasterId(const unsigned int &LevelNumber, const string &Name)\r
#include <GameServ/DataLayer/MySQL/MySQLItemDAO.h>\r
using GameServ::DataLayer::MySQL::MySQLItemDAO;\r
+using GameServ::DataLayer::MySQL::item;\r
#include <GameServ/GameLayer/GameObjects/ItemGO.h>\r
using GameServ::GameLayer::GameObjects::ItemGO;\r
#include <GameServ/GameLayer/GameObjects/ArmorGO.h>\r
\r
MySQLItemDAO::MySQLItemDAO()\r
{\r
- Initialize("items");\r
+ Initialize("item");\r
}\r
\r
MySQLItemDAO::~MySQLItemDAO()\r
\r
shared_ptr<ItemGO> MySQLItemDAO::GetById(const string &Id) const\r
{\r
+ // TODO: Enable and catch exceptions\r
mysqlpp::Connection conn(false);\r
+\r
+ // TODO: Load from config\r
if (conn.connect("gameserv", "localhost", "gameserv", "gameserv", 3306))\r
{\r
mysqlpp::Query query = conn.query();\r
- query << "select * from items where id = 1";\r
+ try\r
+ {\r
+ query << "select * from " << mTableName << " where id = " << MySQLId::GetItemNumberFromId(Id);\r
+ }\r
+ catch (GameServException &e)\r
+ {\r
+ throw DataLayerException(str(format("Error generating sql query: %1%") % e.VerboseError()),\r
+ __FILE__, __LINE__);\r
+ }\r
\r
vector<item> items;\r
query.storein(items);\r
}\r
}\r
\r
-shared_ptr<ItemGO> MySQLItemDAO::CreateItemFromItemSSQLS(const GameServ::DataLayer::MySQL::item &i) const\r
+\r
+void MySQLItemDAO::Insert(shared_ptr<ItemGO> spItem)\r
+{\r
+ // TODO: Enable and catch exceptions\r
+ mysqlpp::Connection conn(false);\r
+\r
+ // TODO: Load from config\r
+ if (conn.connect("gameserv", "localhost", "gameserv", "gameserv", 3306))\r
+ {\r
+ mysqlpp::Query query = conn.query();\r
+ item i = CreateItemSSQLSFromItem(spItem);\r
+\r
+ i.id = 0;\r
+ query.insert(i);\r
+ query.execute();\r
+ spItem->Id(MySQLId::CreateItemId(query.insert_id()));\r
+ spItem->Number(query.insert_id());\r
+ }\r
+}\r
+\r
+void MySQLItemDAO::Update(shared_ptr<ItemGO> spItem)\r
+{\r
+ // TODO: Enable and catch exceptions\r
+ mysqlpp::Connection conn(false);\r
+ // TODO: Load from config\r
+ if (conn.connect("gameserv", "localhost", "gameserv", "gameserv", 3306))\r
+ {\r
+ mysqlpp::Query query = conn.query();\r
+ item oldrow, newrow = CreateItemSSQLSFromItem(spItem);\r
+ try\r
+ {\r
+ query << "select * from " << mTableName << " where id = " << MySQLId::GetItemNumberFromId(spItem->Id());\r
+ }\r
+ catch (GameServException &e)\r
+ {\r
+ throw DataLayerException(str(format("Error generating sql query: %1%") % e.VerboseError()),\r
+ __FILE__, __LINE__);\r
+ }\r
+\r
+ mysqlpp::StoreQueryResult res = query.store();\r
+ if (res.empty())\r
+ {\r
+ throw DataLayerException(str(format("Attempt to update a non-existant item. Id: %1%") % spItem->Id()),\r
+ __FILE__, __LINE__);\r
+ }\r
+ oldrow = res[0];\r
+\r
+ query.update(oldrow, newrow);\r
+ query.execute();\r
+ }\r
+}\r
+\r
+shared_ptr<ItemGO> MySQLItemDAO::CreateItemFromItemSSQLS(const item &i) const\r
{\r
shared_ptr<ItemGO> spItem;\r
\r
default:\r
throw DataLayerException(str(format("Invalid item type %1%") % i.type));\r
}\r
- spItem->Id(i.id);\r
- spItem->Number(MySQLId::GetItemNumberFromId(i.id));\r
+\r
+ spItem->Id(MySQLId::CreateItemId(i.id));\r
spItem->Name(i.name);\r
spItem->Uses(i.startinguses);\r
map<Modifiers::Modifier, Range<int> > modifiers;\r
\r
return spItem;\r
}\r
+item MySQLItemDAO::CreateItemSSQLSFromItem(shared_ptr<ItemGO> spItem) const\r
+{\r
+ item i;\r
+ i.name = spItem->Name();\r
+ map<Modifiers::Modifier, Range<int> > modifiers = spItem->Modifiers();\r
+ i.strengthhigh = modifiers[Modifiers::strength].High();\r
+ i.strengthlow = modifiers[Modifiers::strength].Low();\r
+ i.defensehigh = modifiers[Modifiers::defense].High();\r
+ i.defenselow = modifiers[Modifiers::defense].Low();\r
+ i.healthhigh = modifiers[Modifiers::health].High();\r
+ i.healthlow = modifiers[Modifiers::health].Low();\r
+ i.goldhigh = modifiers[Modifiers::gold].High();\r
+ i.goldlow = modifiers[Modifiers::gold].Low();\r
+ i.experiencehigh = modifiers[Modifiers::experience].High();\r
+ i.experiencelow = modifiers[Modifiers::experience].Low();\r
+ i.bankhigh = modifiers[Modifiers::bank].High();\r
+ i.banklow = modifiers[Modifiers::bank].Low();\r
+ i.forestfightshigh = modifiers[Modifiers::forestfights].High();\r
+ i.forestfightslow = modifiers[Modifiers::forestfights].Low();\r
+ i.playerfightshigh = modifiers[Modifiers::playerfights].High();\r
+ i.playerfightslow = modifiers[Modifiers::playerfights].Low();\r
+ i.maxhealthhigh = modifiers[Modifiers::maxhealth].High();\r
+ i.maxhealthlow = modifiers[Modifiers::maxhealth].Low();\r
+\r
+ i.type = ItemTypes::GetName(spItem->Type());\r
+ i.startinguses = spItem->Uses();\r
+\r
+ return i;\r
+}\r
\r
bool MySQLItemDAO::IdExists(const std::string &Id) const\r
{\r