]> jfr.im git - irc/gameservirc.git/blobdiff - gameserv-2.0/libgameservgldl/src/DataLayer/MySQL/MySQLMasterDAO.cpp
Wrote some initial MySQLDAO objects, but they're not complete
[irc/gameservirc.git] / gameserv-2.0 / libgameservgldl / src / DataLayer / MySQL / MySQLMasterDAO.cpp
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..54c42a0775b3144fe59e9cd76e832b644aa21af8 100644 (file)
@@ -0,0 +1,326 @@
+#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