]> jfr.im git - irc/gameservirc.git/commitdiff
More exciting additions to FilePlayerDAO!
authorkainazzzo <redacted>
Wed, 9 Sep 2009 19:56:33 +0000 (19:56 +0000)
committerkainazzzo <redacted>
Wed, 9 Sep 2009 19:56:33 +0000 (19:56 +0000)
git-svn-id: https://svn.code.sf.net/p/gameservirc/code/trunk@512 bc333340-6410-0410-a689-9d09f3c113fa

gameserv-2.0/libgameservgldl/include/GameServ/DataLayer/File/FileId.h [new file with mode: 0644]
gameserv-2.0/libgameservgldl/include/GameServ/DataLayer/File/FilePlayerDAO.h
gameserv-2.0/libgameservgldl/libgameservgldl.vcproj
gameserv-2.0/libgameservgldl/src/DataLayer/File/FileId.cpp [new file with mode: 0644]
gameserv-2.0/libgameservgldl/src/DataLayer/File/FilePlayerDAO.cpp

diff --git a/gameserv-2.0/libgameservgldl/include/GameServ/DataLayer/File/FileId.h b/gameserv-2.0/libgameservgldl/include/GameServ/DataLayer/File/FileId.h
new file mode 100644 (file)
index 0000000..8454c88
--- /dev/null
@@ -0,0 +1,18 @@
+#ifndef __GameServ__FileId_H__\r
+#define __GameServ__FileId_H__\r
+\r
+#include <string>\r
+using std::string;\r
+\r
+namespace GameServ { namespace DataLayer { namespace File {\r
+       class FileId\r
+       {\r
+       public:\r
+               static string CreatePlayerId(const string &Name);\r
+               static string GetNameFromPlayerId(const string &Id);\r
+       private:\r
+               FileId();\r
+               ~FileId();\r
+       };\r
+}}}\r
+#endif
\ No newline at end of file
index 9143eba964384cd9a74e698b9c8ce2df7744de18..e79fd9aadaf30c13f4723c22e5c2872415503d85 100644 (file)
@@ -12,6 +12,12 @@ using boost::shared_ptr;
 #include <string>\r
 using std::string;\r
 \r
+#include <list>\r
+using std::list;\r
+\r
+#include <map>\r
+using std::map;\r
+\r
 namespace GameServ {  namespace DataLayer { namespace File\r
 {\r
        //! File implementation of IPlayerDAO interface\r
@@ -38,24 +44,29 @@ namespace GameServ {  namespace DataLayer { namespace File
                virtual void Update(shared_ptr<PlayerGO> spPlayer);\r
 \r
                virtual void SetFlags(shared_ptr<PlayerGO> spPlayer, const int &flags) const;\r
+               virtual int GetFlags(shared_ptr<PlayerGO> spPlayer) const;\r
 \r
        private:\r
                //! Data file\r
                string mFilename;\r
 \r
-               // Constants //////////////////////////////////////////////////////////\r
-\r
                // Helper Methods /////////////////////////////////////////////////////\r
                //! Get control sector information\r
                void GetControlInfo(void);\r
 \r
                //! Creates the PlayerGO found at iterator position\r
                shared_ptr<PlayerGO> CreatePlayerFromLine(const string &line) const;\r
+               string CreateLineFromPlayer(shared_ptr<PlayerGO> spPlayer) const;\r
 \r
                //! Get the Player database file path\r
                string GetPlayerFilePath(void) const;\r
 \r
                void Initialize(const string &filename);\r
+               void LoadPlayerCache();\r
+               void WritePlayerCache();\r
+\r
+               //! string is the id and the shared_ptr<PlayerGO> is the player object\r
+               map<string, shared_ptr<PlayerGO> > spPlayerCache;\r
 \r
        };\r
 } } } // GameServ.DataLayer.DataAccessObjects.File\r
index 38e062c5a324e1eeec714680aaf52c30c55523be..ca6abda14b68b2969250faa05ad9f2a371492e2d 100644 (file)
                                        RelativePath=".\include\GameServ\DataLayer\File\FileDAOFactory.h"\r
                                        >\r
                                </File>\r
+                               <File\r
+                                       RelativePath=".\src\DataLayer\File\FileId.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath=".\include\GameServ\DataLayer\File\FileId.h"\r
+                                       >\r
+                               </File>\r
                                <File\r
                                        RelativePath=".\src\DataLayer\File\FilePlayerDAO.cpp"\r
                                        >\r
diff --git a/gameserv-2.0/libgameservgldl/src/DataLayer/File/FileId.cpp b/gameserv-2.0/libgameservgldl/src/DataLayer/File/FileId.cpp
new file mode 100644 (file)
index 0000000..fb1f737
--- /dev/null
@@ -0,0 +1,23 @@
+#include <GameServ/DataLayer/File/FileId.h>\r
+using GameServ::DataLayer::File::FileId;\r
+\r
+#include <string>\r
+using std::string;\r
+\r
+FileId::FileId()\r
+{\r
+}\r
+\r
+FileId::~FileId()\r
+{\r
+}\r
+\r
+string FileId::CreatePlayerId(const string &Name)\r
+{\r
+       return Name;\r
+}\r
+\r
+string FileId::GetNameFromPlayerId(const string &Id)\r
+{\r
+       return Id;\r
+}\r
index 59e6e64755d86b1a0ebee0b3a2592e715178f87c..7fa12147041c8846dd777a0501cf2fbc5e4ef0e0 100644 (file)
@@ -7,6 +7,9 @@ using GameServ::GameLayer::GameObjects::PlayerGO;
 using GameServ::DataLayer::Exceptions::ResourceException;\r
 using GameServ::DataLayer::Exceptions::DataLayerException;\r
 \r
+#include <GameServ/DataLayer/File/FileId.h>\r
+using GameServ::DataLayer::File::FileId;\r
+\r
 #include <boost/shared_ptr.hpp>\r
 #include <boost/format.hpp>\r
 #include <boost/algorithm/string.hpp>\r
@@ -26,8 +29,11 @@ using std::string;
 #include <fstream>\r
 using std::ifstream;\r
 using std::getline;\r
+using std::ofstream;\r
+using std::endl;\r
 \r
-\r
+#include <map>\r
+using std::map;\r
 \r
 FilePlayerDAO::FilePlayerDAO() : mFilename("players.dat")\r
 {\r
@@ -41,11 +47,53 @@ FilePlayerDAO::FilePlayerDAO(const string &filename)
 \r
 FilePlayerDAO::~FilePlayerDAO()\r
 {\r
+       WritePlayerCache();\r
 }\r
 \r
 void FilePlayerDAO::Initialize(const string &filename)\r
 {\r
        mFilename = filename;\r
+       LoadPlayerCache();\r
+}\r
+\r
+void FilePlayerDAO::LoadPlayerCache()\r
+{\r
+       assert(!mFilename.empty());\r
+       spPlayerCache.clear();\r
+       ifstream infile;\r
+       infile.open(mFilename.c_str());\r
+       if (infile.fail())\r
+       {\r
+               throw DataLayerException(str(format("Unable to open %1% for loading Players") % mFilename),\r
+                       __FILE__, __LINE__);\r
+       }\r
+       while (!infile.eof())\r
+       {\r
+               string line;\r
+               shared_ptr<PlayerGO> spPlayer;\r
+               getline(infile, line);\r
+               spPlayer = CreatePlayerFromLine(line);\r
+               spPlayerCache[spPlayer->Id()] = spPlayer;\r
+       }\r
+       infile.close();\r
+}\r
+\r
+void FilePlayerDAO::WritePlayerCache()\r
+{\r
+       ofstream outfile;\r
+       outfile.open(mFilename.c_str());\r
+       if (outfile.fail())\r
+       {\r
+               throw DataLayerException(str(format("Unable to open %1% for writing Players") % mFilename),\r
+                       __FILE__, __LINE__);\r
+       }\r
+\r
+       map<string, shared_ptr<PlayerGO> >::const_iterator iter;\r
+       for (iter = spPlayerCache.begin(); iter != spPlayerCache.end(); iter++)\r
+       {\r
+               outfile << CreateLineFromPlayer(iter->second) << endl;\r
+       }\r
+       outfile.close();\r
 }\r
 \r
 string FilePlayerDAO::GetPlayerFilePath() const\r
@@ -78,12 +126,16 @@ shared_ptr<PlayerGO> FilePlayerDAO::GetById(const string &Id) const
 \r
 shared_ptr<PlayerGO> FilePlayerDAO::CreatePlayerFromLine(const string &line) const\r
 {\r
+       assert(!line.empty());\r
        shared_ptr<PlayerGO> spPlayer;\r
        spPlayer = shared_ptr<PlayerGO>(new PlayerGO());\r
        boost::char_separator<char> sep(" ", 0, boost::keep_empty_tokens);\r
        tokenizer tokens(line, sep);\r
        tokenizer::iterator tok_iter = tokens.begin();\r
 \r
+       spPlayer->Name((*tok_iter));\r
+       spPlayer->Id(FileId::CreatePlayerId(spPlayer->Name()));\r
+       tok_iter++;\r
        spPlayer->Level(lexical_cast<int>((*tok_iter)));\r
        tok_iter++;\r
        spPlayer->Experience(lexical_cast<unsigned long int>((*tok_iter)));\r
@@ -112,28 +164,73 @@ shared_ptr<PlayerGO> FilePlayerDAO::CreatePlayerFromLine(const string &line) con
        return spPlayer;\r
 }\r
 \r
+string FilePlayerDAO::CreateLineFromPlayer(shared_ptr<PlayerGO> spPlayer) const\r
+{\r
+       string line;\r
+       line = str(format("%1% %2% %3% %4% %5% %6% %7% %8% %9% %10% %11% %12%") % \r
+               spPlayer->Name() % spPlayer->Level() % spPlayer->Experience() % spPlayer->Gold() %\r
+               spPlayer->Bank() % spPlayer->Health() % spPlayer->MaxHealth() % spPlayer->Strength() %\r
+               spPlayer->Defense() % spPlayer->ForestFights() % spPlayer->PlayerFights() %\r
+               GetFlags(spPlayer) % spPlayer->Password());\r
+       return line;\r
+}\r
+\r
 void FilePlayerDAO::SetFlags(shared_ptr<PlayerGO> spPlayer, const int &flags) const\r
 {\r
+}\r
 \r
+int FilePlayerDAO::GetFlags(shared_ptr<PlayerGO> spPlayer) const\r
+{\r
+       return 0;\r
 }\r
 \r
 void FilePlayerDAO::Update(shared_ptr<PlayerGO> spPlayer)\r
 {\r
-       throw DataLayerException("Undefined Function", __FILE__, __LINE__);\r
+       assert(spPlayer != 0);\r
+       assert(!spPlayer->Id().empty());\r
+       assert(!spPlayer->Name().empty());\r
+\r
+       if (IdExists(spPlayer->Id()))\r
+       {\r
+               spPlayerCache[spPlayer->Id()] = spPlayer;\r
+       }\r
+       else\r
+       {\r
+               throw DataLayerException(str(format("Unable to Update Player %1%: Player does not exist") % \r
+                       spPlayer->Name()), __FILE__, __LINE__);\r
+       }\r
 }\r
 \r
 void FilePlayerDAO::Insert(shared_ptr<PlayerGO> spPlayer)\r
 {\r
-       throw DataLayerException("Undefined Function", __FILE__, __LINE__);\r
+       assert(spPlayer != 0);\r
+       assert(!spPlayer->Name().empty());\r
+       if (!IdExists(FileId::CreatePlayerId(spPlayer->Name())))\r
+       {\r
+               spPlayer->Id(FileId::CreatePlayerId(spPlayer->Name()));\r
+               spPlayerCache[spPlayer->Id()] = spPlayer;\r
+               WritePlayerCache();\r
+       }\r
+       else\r
+       {\r
+               throw DataLayerException(str(format("Unable to Insert Player %1%: Player exists") %\r
+                       spPlayer->Name()), __FILE__, __LINE__);\r
+       }\r
 }\r
 \r
 bool FilePlayerDAO::IdExists(const string &Id) const\r
 {\r
-       throw DataLayerException("Undefined Function", __FILE__, __LINE__);\r
-       return false;\r
+       map<string, shared_ptr<PlayerGO> >::const_iterator iter;\r
+       iter = spPlayerCache.find(Id);\r
+       return (iter != spPlayerCache.end());\r
 }\r
 \r
 list<string> FilePlayerDAO::GetIdsByName(const string &Name) const\r
 {\r
-       throw DataLayerException("Undefined Function", __FILE__, __LINE__);\r
+       list<string> ids;\r
+       if (IdExists(FileId::CreatePlayerId(Name)))\r
+       {\r
+               ids.push_back(FileId::CreatePlayerId(Name));\r
+       }\r
+       return ids;\r
 }
\ No newline at end of file