+#include <GameServ/DataLayer/MySQL/MySQLMasterDAO.h>\r
+using GameServ::DataLayer::MySQL::MySQLMasterDAO;\r
+using GameServ::DataLayer::MySQL::master;\r
+#include <GameServ/GameLayer/GameObjects/MasterGO.h>\r
+using GameServ::GameLayer::GameObjects::MasterGO;\r
+\r
+#include <GameServ/DataLayer/DataLayerExceptions.h>\r
+using GameServ::DataLayer::Exceptions::ResourceException;\r
+using GameServ::DataLayer::Exceptions::DataLayerException;\r
+\r
+#include <GameServ/DataLayer/MySQL/MySQLId.h>\r
+using GameServ::DataLayer::MySQL::MySQLId;\r
+\r
+#include <boost/shared_ptr.hpp>\r
+#include <boost/format.hpp>\r
+#include <boost/algorithm/string.hpp>\r
+#include <boost/lexical_cast.hpp>\r
+using boost::shared_ptr;\r
+using boost::format;\r
+using boost::str;\r
+using boost::algorithm::to_upper;\r
+using boost::lexical_cast;\r
+\r
+#include <string>\r
+using std::string;\r
+\r
+#include <vector>\r
+using std::vector;\r
+\r
+#include <mysql++.h>\r
+#include <ssqls.h>\r
+\r
+MySQLMasterDAO::MySQLMasterDAO()\r
+{\r
+ Initialize("master");\r
+}\r
+\r
+MySQLMasterDAO::~MySQLMasterDAO()\r
+{\r
+}\r
+\r
+void MySQLMasterDAO::Initialize(const string &tablename)\r
+{\r
+ mTableName = tablename;\r
+}\r
+\r
+shared_ptr<MasterGO> MySQLMasterDAO::GetById(const string &Id) const\r
+{\r
+ // TODO: Enable and catch exceptions\r
+ mysqlpp::Connection conn;\r
+\r
+ // TODO: Load from config\r
+ try\r
+ {\r
+ conn.connect("gameserv", "localhost", "gameserv", "gameserv", 3306);\r
+ }\r
+ catch (mysqlpp::ConnectionFailed &ex)\r
+ {\r
+ throw DataLayerException(str(format("Failed to connect to the database. Error: %1%") %\r
+ ex.what()), __FILE__, __LINE__);\r
+ }\r
+ catch (mysqlpp::Exception &ex)\r
+ {\r
+ throw DataLayerException(str(format("Unknown error connecting to the database. Error: %1%") %\r
+ ex.what()), __FILE__, __LINE__);\r
+ }\r
+\r
+ mysqlpp::Query query = conn.query();\r
+\r
+ try\r
+ {\r
+ query << "select * from " << mTableName << " where id = " << MySQLId::GetMasterNumberFromId(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<master> masters;\r
+\r
+ try\r
+ {\r
+ query.storein(masters);\r
+ }\r
+ catch (mysqlpp::UseQueryError &ex)\r
+ {\r
+ throw DataLayerException(str(format("Unable to execute query: \" %1% \". Error: %2%") %\r
+ query % ex.what()), __FILE__, __LINE__);\r
+ }\r
+ catch (mysqlpp::Exception &ex)\r
+ {\r
+ throw DataLayerException(str(format("Unknown error executing query: \" %1% \". Error: %2%") %\r
+ query % ex.what()), __FILE__, __LINE__);\r
+ }\r
+\r
+ if (masters.size() == 1)\r
+ {\r
+ return CreateMasterFromMasterSSQLS(masters[0]);\r
+ }\r
+ else if (masters.size() == 0)\r
+ {\r
+ return shared_ptr<MasterGO>();\r
+ }\r
+ else\r
+ {\r
+ throw DataLayerException("Problem with database key... more than one row returned on getbyid",\r
+ __FILE__, __LINE__);\r
+ }\r
+}\r
+\r
+\r
+void MySQLMasterDAO::Insert(shared_ptr<MasterGO> spMaster)\r
+{\r
+ // TODO: Enable and catch exceptions\r
+ mysqlpp::Connection conn;\r
+\r
+ // TODO: Load from config\r
+ try\r
+ {\r
+ conn.connect("gameserv", "localhost", "gameserv", "gameserv", 3306);\r
+ }\r
+ catch (mysqlpp::ConnectionFailed &ex)\r
+ {\r
+ throw DataLayerException(str(format("Failed to connect to the database. Error: %1%") %\r
+ ex.what()), __FILE__, __LINE__);\r
+ }\r
+ catch (mysqlpp::Exception &ex)\r
+ {\r
+ throw DataLayerException(str(format("Unknown error connecting to the database. Error: %1%") %\r
+ ex.what()), __FILE__, __LINE__);\r
+ }\r
+\r
+ mysqlpp::Query query = conn.query();\r
+ master m = CreateMasterSSQLSFromMaster(spMaster);\r
+\r
+ m.id = 0;\r
+\r
+ try\r
+ {\r
+ query.insert(m);\r
+ query.execute();\r
+ }\r
+ catch (mysqlpp::UseQueryError &ex)\r
+ {\r
+ throw DataLayerException(str(format("Unable to execute query: \" %1% \". Error: %2%") %\r
+ query % ex.what()), __FILE__, __LINE__);\r
+ }\r
+ catch (mysqlpp::Exception &ex)\r
+ {\r
+ throw DataLayerException(str(format("Unknown error executing query: \" %1% \". Error: %2%") %\r
+ query % ex.what()), __FILE__, __LINE__);\r
+ }\r
+\r
+ spMaster->Id(MySQLId::CreateMasterId(query.insert_id()));\r
+}\r
+\r
+void MySQLMasterDAO::Update(shared_ptr<MasterGO> spMaster)\r
+{\r
+ // TODO: Enable and catch exceptions\r
+ mysqlpp::Connection conn;\r
+ // TODO: Load from config\r
+ try\r
+ {\r
+ conn.connect("gameserv", "localhost", "gameserv", "gameserv", 3306);\r
+ }\r
+ catch (mysqlpp::ConnectionFailed &ex)\r
+ {\r
+ throw DataLayerException(str(format("Failed to connect to the database. Error: %1%") %\r
+ ex.what()), __FILE__, __LINE__);\r
+ }\r
+ catch (mysqlpp::Exception &ex)\r
+ {\r
+ throw DataLayerException(str(format("Unknown error connecting to the database. Error: %1%") %\r
+ ex.what()), __FILE__, __LINE__);\r
+ }\r
+\r
+\r
+ mysqlpp::Query query = conn.query();\r
+ master oldrow, newrow = CreateMasterSSQLSFromMaster(spMaster);\r
+\r
+ try\r
+ {\r
+ query << "select * from " << mTableName << " where id = " << MySQLId::GetMasterNumberFromId(spMaster->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
+ try\r
+ {\r
+ mysqlpp::StoreQueryResult res = query.store();\r
+ if (res.empty())\r
+ {\r
+ throw DataLayerException(str(format("Attempt to update a non-existant master. Id: %1%") % spMaster->Id()),\r
+ __FILE__, __LINE__);\r
+ }\r
+ oldrow = res[0];\r
+ }\r
+ catch (mysqlpp::UseQueryError &ex)\r
+ {\r
+ throw DataLayerException(str(format("Unable to execute query: \" %1% \". Error: %2%") %\r
+ query % ex.what()), __FILE__, __LINE__);\r
+ }\r
+ catch (mysqlpp::Exception &ex)\r
+ {\r
+ throw DataLayerException(str(format("Unknown error executing query: \" %1% \". Error: %2%") %\r
+ query % ex.what()), __FILE__, __LINE__);\r
+ }\r
+\r
+ try\r
+ {\r
+ query.update(oldrow, newrow);\r
+ query.execute();\r
+ }\r
+ catch (mysqlpp::UseQueryError &ex)\r
+ {\r
+ throw DataLayerException(str(format("Unable to execute query: \" %1% \". Error: %2%") %\r
+ query % ex.what()), __FILE__, __LINE__);\r
+ }\r
+ catch (mysqlpp::Exception &ex)\r
+ {\r
+ throw DataLayerException(str(format("Unknown error executing query: \" %1% \". Error: %2%") %\r
+ query % ex.what()), __FILE__, __LINE__);\r
+ }\r
+}\r
+\r
+shared_ptr<MasterGO> MySQLMasterDAO::CreateMasterFromMasterSSQLS(const master &m) const\r
+{\r
+ shared_ptr<MasterGO> spMaster = shared_ptr<MasterGO>(new MasterGO());\r
+\r
+ spMaster->Id(MySQLId::CreateMasterId(m.id));\r
+ spMaster->Name(m.name);\r
+ spMaster->WeaponName(m.weaponname);\r
+\r
+ spMaster->Strength(m.strength);\r
+ spMaster->Defense(m.defense);\r
+ spMaster->Gold(m.gold);\r
+ spMaster->Experience(m.experience);\r
+ spMaster->Health(m.health);\r
+ spMaster->PartingWords(m.partingwords);\r
+ spMaster->LevelId(MySQLId::CreateLevelId(m.levelId));\r
+\r
+ return spMaster;\r
+}\r
+master MySQLMasterDAO::CreateMasterSSQLSFromMaster(shared_ptr<MasterGO> spMaster) const\r
+{\r
+ master m;\r
+\r
+ m.id = static_cast<mysqlpp::sql_int_unsigned>(MySQLId::GetMasterNumberFromId(spMaster->Id()));\r
+ m.name = spMaster->Name();\r
+ m.weaponname = spMaster->WeaponName();\r
+ m.strength = spMaster->Strength();\r
+ m.defense = spMaster->Defense();\r
+ m.gold = spMaster->Gold();\r
+ m.experience = spMaster->Experience();\r
+ m.health = spMaster->Health();\r
+ m.partingwords = spMaster->PartingWords();\r
+ m.levelId = static_cast<mysqlpp::sql_int_unsigned>(MySQLId::GetLevelNumberFromId(spMaster->LevelId()));\r
+ \r
+ return m;\r
+}\r
+\r
+bool MySQLMasterDAO::IdExists(const std::string &Id) const\r
+{\r
+ mysqlpp::Connection conn;\r
+ // TODO: Load from config\r
+ try\r
+ {\r
+ conn.connect("gameserv", "localhost", "gameserv", "gameserv", 3306);\r
+ }\r
+ catch (mysqlpp::ConnectionFailed &ex)\r
+ {\r
+ throw DataLayerException(str(format("Failed to connect to the database. Error: %1%") %\r
+ ex.what()), __FILE__, __LINE__);\r
+ }\r
+ catch (mysqlpp::Exception &ex)\r
+ {\r
+ throw DataLayerException(str(format("Unknown error connecting to the database. Error: %1%") %\r
+ ex.what()), __FILE__, __LINE__);\r
+ }\r
+ mysqlpp::Query query = conn.query();\r
+\r
+ try\r
+ {\r
+ query << "SELECT id from " << mTableName << " where Id=" << MySQLId::GetMasterNumberFromId(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
+ try\r
+ {\r
+ mysqlpp::StoreQueryResult res = query.store();\r
+ if (res.empty())\r
+ {\r
+ return false;\r
+ }\r
+ else\r
+ {\r
+ return true;\r
+ }\r
+ }\r
+ catch (mysqlpp::UseQueryError &ex)\r
+ {\r
+ throw DataLayerException(str(format("Unable to execute query: \" %1% \". Error: %2%") %\r
+ query % ex.what()), __FILE__, __LINE__);\r
+ }\r
+ catch (mysqlpp::Exception &ex)\r
+ {\r
+ throw DataLayerException(str(format("Unknown error executing query: \" %1% \". Error: %2%") %\r
+ query % ex.what()), __FILE__, __LINE__);\r
+ }\r
+\r
+}\r
+\r
+string MySQLMasterDAO::GetMasterTableName(void) const\r
+{\r
+ return mTableName;\r
+}\r
+\r
+\r