]> jfr.im git - irc/gameservirc.git/blobdiff - gameserv-2.0/libgameservgldl/src/DataLayer/MySQL/MySQLPlayerDAO.cpp
Moved all SSQLS macros into their corresponding .cpp files so including the header...
[irc/gameservirc.git] / gameserv-2.0 / libgameservgldl / src / DataLayer / MySQL / MySQLPlayerDAO.cpp
index 74ce3ca8fe648883d453d9f4037c02ba7a94e425..ebbfb94d985c89e9db23e3026ed3959519a2b18d 100644 (file)
@@ -1,19 +1,8 @@
 #include <GameServ/DataLayer/MySQL/MySQLPlayerDAO.h>\r
 using GameServ::DataLayer::MySQL::MySQLPlayerDAO;\r
-using GameServ::DataLayer::MySQL::player;\r
-\r
-#define MYSQLPP_SSQLS_NO_STATICS\r
-#include <GameServ/DataLayer/MySQL/MySQLItemDAO.h>\r
-using GameServ::DataLayer::MySQL::MySQLItemDAO;\r
 \r
 #include <GameServ/GameLayer/GameObjects/PlayerGO.h>\r
 using GameServ::GameLayer::GameObjects::PlayerGO;\r
-#include <GameServ/GameLayer/GameObjects/ItemGO.h>\r
-using GameServ::GameLayer::GameObjects::ItemGO;\r
-#include <GameServ/GameLayer/GameObjects/ArmorGO.h>\r
-using GameServ::GameLayer::GameObjects::ArmorGO;\r
-#include <GameServ/GameLayer/GameObjects/WeaponGO.h>\r
-using GameServ::GameLayer::GameObjects::WeaponGO;\r
 \r
 #include <GameServ/DataLayer/DataLayerExceptions.h>\r
 using GameServ::DataLayer::Exceptions::ResourceException;\r
@@ -39,9 +28,35 @@ using std::string;
 #include <vector>\r
 using std::vector;\r
 \r
+#include <list>\r
+using std::list;\r
+\r
 #include <mysql++.h>\r
 #include <ssqls.h>\r
 \r
+sql_create_17(player, 1, 0,\r
+mysqlpp::sql_int_unsigned, id,\r
+mysqlpp::sql_varchar, name,\r
+mysqlpp::Null<mysqlpp::sql_int_unsigned>, weaponId,\r
+mysqlpp::Null<mysqlpp::sql_int_unsigned>, armorId,\r
+mysqlpp::sql_int_unsigned, levelId,\r
+mysqlpp::sql_int, experience,\r
+mysqlpp::sql_int_unsigned, gold,\r
+mysqlpp::sql_int, bank,\r
+mysqlpp::sql_int, strength,\r
+mysqlpp::sql_int, defense,\r
+mysqlpp::sql_int_unsigned, health,\r
+mysqlpp::sql_int_unsigned, maxhealth,\r
+mysqlpp::sql_int_unsigned, forestfights,\r
+mysqlpp::sql_int_unsigned, playerfights,\r
+mysqlpp::sql_datetime, lastlogin,\r
+mysqlpp::sql_boolean, alive,\r
+mysqlpp::sql_boolean, foughtmaster);\r
+\r
+\r
+shared_ptr<PlayerGO> CreatePlayerFromPlayerSSQLS(const player &p);\r
+player CreatePlayerSSQLSFromPlayer(shared_ptr<PlayerGO> spPlayer);\r
+\r
 MySQLPlayerDAO::MySQLPlayerDAO()\r
 {\r
        Initialize("player");\r
@@ -239,53 +254,30 @@ void MySQLPlayerDAO::Update(shared_ptr<PlayerGO> spPlayer)
        }\r
 }\r
 \r
-shared_ptr<PlayerGO> MySQLPlayerDAO::CreatePlayerFromPlayerSSQLS(const player &p) const\r
+shared_ptr<PlayerGO> CreatePlayerFromPlayerSSQLS(const player &p)\r
 {\r
        shared_ptr<PlayerGO> spPlayer = shared_ptr<PlayerGO>(new PlayerGO());\r
 \r
        spPlayer->Id(MySQLId::CreatePlayerId(p.id));\r
        spPlayer->Name(p.name);\r
 \r
-       MySQLItemDAO idao;\r
-\r
        if (p.weaponId != mysqlpp::null)\r
        {\r
-               shared_ptr<ItemGO> spWeapon = idao.GetById(MySQLId::CreateItemId(p.weaponId.data));\r
-               if (spWeapon != 0)\r
-               {\r
-                       if (spWeapon->Type() != ItemTypes::Weapon)\r
-                       {\r
-                               throw DataLayerException(str(format("Invalid item type for linked player weapon: %1%") %\r
-                                       ItemTypes::GetName(spWeapon->Type())), __FILE__, __LINE__);\r
-                       }\r
-                       spPlayer->Weapon(shared_static_cast<WeaponGO>(spWeapon));\r
-               }\r
-               else\r
-               {\r
-                       throw DataLayerException(str(format("Problem with foreign key relationship. Unable to get "\\r
-                               "weapon with Id: %1% to link to Player %2%") % p.weaponId % spPlayer->Name()), __FILE__,\r
-                               __LINE__);\r
-               }\r
+               spPlayer->WeaponId(MySQLId::CreateItemId(p.weaponId.data));\r
        }\r
+       else\r
+       {\r
+               spPlayer->WeaponId("");\r
+       }\r
+\r
 \r
        if (p.armorId != mysqlpp::null)\r
        {\r
-               shared_ptr<ItemGO> spArmor = idao.GetById(MySQLId::CreateItemId(p.armorId.data));\r
-               if (spArmor != 0)\r
-               {\r
-                       if (spArmor->Type() != ItemTypes::Armor)\r
-                       {\r
-                               throw DataLayerException(str(format("Invalid item type for linked player armor: %1%") %\r
-                                       ItemTypes::GetName(spArmor->Type())), __FILE__, __LINE__);\r
-                       }\r
-                       spPlayer->Armor(shared_static_cast<ArmorGO>(spArmor));\r
-               }\r
-               else\r
-               {\r
-                       throw DataLayerException(str(format("Problem with foreign key relationship. Unable to get "\\r
-                               "armor with Id: %1% to link to Player %2%") % p.armorId % spPlayer->Name()), __FILE__,\r
-                               __LINE__);\r
-               }\r
+               spPlayer->ArmorId(MySQLId::CreateItemId(p.armorId.data));\r
+       }\r
+       else\r
+       {\r
+               spPlayer->ArmorId("");\r
        }\r
 \r
        spPlayer->LevelNumber(p.levelId);\r
@@ -308,7 +300,7 @@ shared_ptr<PlayerGO> MySQLPlayerDAO::CreatePlayerFromPlayerSSQLS(const player &p
 \r
        return spPlayer;\r
 }\r
-player MySQLPlayerDAO::CreatePlayerSSQLSFromPlayer(shared_ptr<PlayerGO> spPlayer) const\r
+player CreatePlayerSSQLSFromPlayer(shared_ptr<PlayerGO> spPlayer)\r
 {\r
        player p;\r
        p.name = spPlayer->Name();\r
@@ -403,6 +395,59 @@ bool MySQLPlayerDAO::IdExists(const std::string &Id) const
 \r
 }\r
 \r
+list<string> MySQLPlayerDAO::GetIdsByName(const string &Name) 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
+\r
+       query << "select id from " << mTableName << " where name = " << mysqlpp::quote << Name;\r
+\r
+       \r
+       vector<player> players;\r
+\r
+       try\r
+       {\r
+               query.storein(players);\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
+       list<string> ids;\r
+       for (vector<player>::const_iterator iter = players.begin();\r
+               iter != players.end(); ++iter)\r
+       {\r
+               ids.push_back(MySQLId::CreatePlayerId(iter->id));\r
+       }\r
+       return ids;\r
+}\r
+\r
 string MySQLPlayerDAO::GetPlayerTableName(void) const\r
 {\r
        return mTableName;\r