]> jfr.im git - irc/gameservirc.git/commitdiff
Worked on insert/update for MySQLItemDAO
authorkainazzzo <redacted>
Wed, 30 Sep 2009 22:01:41 +0000 (22:01 +0000)
committerkainazzzo <redacted>
Wed, 30 Sep 2009 22:01:41 +0000 (22:01 +0000)
git-svn-id: https://svn.code.sf.net/p/gameservirc/code/trunk@542 bc333340-6410-0410-a689-9d09f3c113fa

gameserv-2.0/libgameservgldl/include/GameServ/DataLayer/File/FileItemDAO.h
gameserv-2.0/libgameservgldl/include/GameServ/DataLayer/IItemDAO.h
gameserv-2.0/libgameservgldl/include/GameServ/DataLayer/MySQL/MySQLId.h
gameserv-2.0/libgameservgldl/include/GameServ/DataLayer/MySQL/MySQLItemDAO.h
gameserv-2.0/libgameservgldl/include/GameServ/GameLayer/GameObjects/ItemGO.h
gameserv-2.0/libgameservgldl/src/DataLayer/File/FileItemDAO.cpp
gameserv-2.0/libgameservgldl/src/DataLayer/MySQL/MySQLId.cpp
gameserv-2.0/libgameservgldl/src/DataLayer/MySQL/MySQLItemDAO.cpp
gameserv-2.0/libgameservgldl/src/GameLayer/GameObjects/ItemGO.cpp
gameserv-2.0/testdriver/main.cpp

index f7e3fcc7c85510470a4be6fb6daf5c3ec60fd293..b619daf9aa7751cca38c8980639cc0db6a0d4ba6 100644 (file)
@@ -42,6 +42,9 @@ namespace GameServ {  namespace DataLayer { namespace File
 \r
                void LoadItemCache(void);\r
 \r
+               virtual void Insert(shared_ptr<ItemGO> spItem);\r
+               virtual void Update(shared_ptr<ItemGO> spItem);\r
+\r
        private:\r
                //! Data file\r
                string mFilename;\r
index dae1cf720602128d111d5f53a3d3e1bc6f4ce326..8a050e96e6284682d266736f73f0be2b56c8d461 100644 (file)
@@ -41,6 +41,9 @@ namespace GameServ { namespace DataLayer { namespace DataAccessObjects
                */\r
                virtual bool IdExists(const string &Id) const = 0;\r
 \r
+               virtual void Insert(shared_ptr<ItemGO> spItem) = 0;\r
+               virtual void Update(shared_ptr<ItemGO> spItem) = 0;\r
+\r
        private:\r
                \r
                \r
index acc2f0b66cd349b1a6d4cc322e74e8919560e031..c9dc97b772104dd4e43c4b14d6bcbb99fa14f1d6 100644 (file)
@@ -14,8 +14,8 @@ namespace GameServ { namespace DataLayer { namespace MySQL {
                static string CreatePlayerId(const string &Name);\r
                static string GetNameFromPlayerId(const string &Id);\r
 \r
-               static string CreateItemId(const string &Number);\r
-               static unsigned int GetItemNumberFromId(const string &Id);\r
+               static string CreateItemId(const unsigned long long &Number);\r
+               static unsigned long long GetItemNumberFromId(const string &Id);\r
 \r
                static string CreateMonsterId(const string &LevelId, const string &Name);\r
                static string CreateLevelId(const unsigned int &Number);\r
index f2344ddc4e00c4b0ba91d7e6d3d1f48d8c12a751..4e5e7eb3bd500df09e36dd8fdcd2b51bc3c60fbf 100644 (file)
@@ -22,8 +22,8 @@ namespace GameServ {  namespace DataLayer { namespace MySQL
                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
@@ -57,6 +57,9 @@ namespace GameServ {  namespace DataLayer { namespace MySQL
                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
@@ -66,6 +69,7 @@ namespace GameServ {  namespace DataLayer { namespace MySQL
 \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
index 646b138b176041d25fca6eb6b7e2681562379a3b..d0f6771e411e9e2ed1ad814fad69fbe5cde24bce 100644 (file)
@@ -22,10 +22,10 @@ namespace GameServ { namespace GameLayer { namespace GameObjects {
                virtual ~ItemGO();\r
 \r
                //! Property get - Number\r
-               unsigned int Number(void) const;\r
+               unsigned long long Number(void) const;\r
 \r
                //! Property set - Number\r
-               void Number(const unsigned int &value);\r
+               void Number(const unsigned long long &value);\r
 \r
                //! Property get - Name\r
                string Name(void) const;\r
@@ -61,7 +61,7 @@ namespace GameServ { namespace GameLayer { namespace GameObjects {
                virtual ObjectTypes::ObjectType ObjectType(void) const;\r
 \r
        protected:\r
-               unsigned int mNumber;\r
+               unsigned long long mNumber;\r
                string mName;\r
                unsigned long int mPrice;\r
                int mUses;\r
index 1065ca5e32484f18db5f94f34bb53f7d3eb1b97e..c61a141c324dc4bf4c12bf6a5f9fd8d86f048289 100644 (file)
@@ -439,3 +439,13 @@ void FileItemDAO::LoadItemCache(void)
        }\r
        infile.close();\r
 }\r
+\r
+void FileItemDAO::Insert(shared_ptr<ItemGO> spItem)\r
+{\r
+       throw DataLayerException("Not implemented", __FILE__, __LINE__);\r
+}\r
+void FileItemDAO::Update(shared_ptr<ItemGO> spItem)\r
+{\r
+       throw DataLayerException("Not implemented", __FILE__, __LINE__);\r
+}\r
+\r
index dded2c856a2af1c777d15d1b41a6cb1ba8752516..5ef46ee19507b4aea7bf17a31969b3dc759c37c9 100644 (file)
@@ -16,6 +16,7 @@ using GameServ::Exceptions::GameServException;
 using boost::str;\r
 using boost::format;\r
 using boost::lexical_cast;\r
+using boost::bad_lexical_cast;\r
 \r
 MySQLId::MySQLId()\r
 {\r
@@ -35,14 +36,21 @@ string MySQLId::GetNameFromPlayerId(const string &Id)
        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
@@ -57,7 +65,14 @@ string MySQLId::CreateLevelId(const unsigned int &Number)
 \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
index 649f4d82f69a970b7eb67af6438d8407b2d7dee6..38f9a0528e5415b60431dd5416943f2037e9d046 100644 (file)
@@ -1,5 +1,6 @@
 #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
@@ -42,7 +43,7 @@ using std::vector;
 \r
 MySQLItemDAO::MySQLItemDAO()\r
 {\r
-       Initialize("items");\r
+       Initialize("item");\r
 }\r
 \r
 MySQLItemDAO::~MySQLItemDAO()\r
@@ -56,11 +57,22 @@ void MySQLItemDAO::Initialize(const string &tablename)
 \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
@@ -85,7 +97,59 @@ shared_ptr<ItemGO> MySQLItemDAO::GetById(const string &Id) const
        }\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
@@ -106,8 +170,8 @@ shared_ptr<ItemGO> MySQLItemDAO::CreateItemFromItemSSQLS(const GameServ::DataLay
        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
@@ -126,6 +190,35 @@ shared_ptr<ItemGO> MySQLItemDAO::CreateItemFromItemSSQLS(const GameServ::DataLay
 \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
index d69cf5ed3b08b7ac9ffe240d35d5e3591c7fe6f8..f36cf4bf8e3663da5a78bf8478f377ef2b367c7f 100644 (file)
@@ -38,12 +38,12 @@ ItemGO::~ItemGO()
 {\r
 }\r
 \r
-unsigned int ItemGO::Number(void) const\r
+unsigned long long ItemGO::Number(void) const\r
 {\r
        return mNumber;\r
 }\r
 \r
-void ItemGO::Number(const unsigned int &value)\r
+void ItemGO::Number(const unsigned long long &value)\r
 {\r
        mNumber = value;\r
 }\r
index 967e5e9bd2f133e5693f7b1be136fc3276f315f3..351ffa09cce1fec88bfb4122f6b6f0c8b33e2775 100644 (file)
@@ -125,7 +125,9 @@ int main()
 \r
 \r
                MySQLItemDAO test;\r
-               shared_ptr<ItemGO> spItem = test.GetById("test");\r
+               shared_ptr<ItemGO> spItem = test.GetById("3");\r
+               spItem->Name("Testin' again!!");\r
+               test.Insert(spItem);\r
                \r
                //map <int, int> frequencies;\r
                //int x;\r