#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
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
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
#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
\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
\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
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