]> jfr.im git - irc/gameservirc.git/blame - gameserv-2.0/libgameservgldl/src/DataLayer/File/FilePlayerDAO.cpp
More exciting additions to FilePlayerDAO!
[irc/gameservirc.git] / gameserv-2.0 / libgameservgldl / src / DataLayer / File / FilePlayerDAO.cpp
CommitLineData
ce4e8c42 1#include <GameServ/DataLayer/File/FilePlayerDAO.h>\r
2using GameServ::DataLayer::File::FilePlayerDAO;\r
3#include <GameServ/GameLayer/GameObjects/PlayerGO.h>\r
4using GameServ::GameLayer::GameObjects::PlayerGO;\r
5\r
6#include <GameServ/DataLayer/DataLayerExceptions.h>\r
7using GameServ::DataLayer::Exceptions::ResourceException;\r
8using GameServ::DataLayer::Exceptions::DataLayerException;\r
9\r
f4f0d89d 10#include <GameServ/DataLayer/File/FileId.h>\r
11using GameServ::DataLayer::File::FileId;\r
12\r
ce4e8c42 13#include <boost/shared_ptr.hpp>\r
14#include <boost/format.hpp>\r
15#include <boost/algorithm/string.hpp>\r
16#include <boost/lexical_cast.hpp>\r
17using boost::shared_ptr;\r
18using boost::format;\r
19using boost::str;\r
20using boost::algorithm::to_upper;\r
21using boost::lexical_cast;\r
22#include <boost/tokenizer.hpp>\r
23typedef boost::tokenizer<boost::char_separator<char> > \r
24 tokenizer;\r
25\r
26#include <string>\r
27using std::string;\r
28\r
29#include <fstream>\r
30using std::ifstream;\r
31using std::getline;\r
f4f0d89d 32using std::ofstream;\r
33using std::endl;\r
ce4e8c42 34\r
f4f0d89d 35#include <map>\r
36using std::map;\r
ce4e8c42 37\r
38FilePlayerDAO::FilePlayerDAO() : mFilename("players.dat")\r
39{\r
40 Initialize(GetPlayerFilePath());\r
41}\r
42\r
43FilePlayerDAO::FilePlayerDAO(const string &filename)\r
44{\r
45 Initialize(filename);\r
46}\r
47\r
48FilePlayerDAO::~FilePlayerDAO()\r
49{\r
f4f0d89d 50 WritePlayerCache();\r
ce4e8c42 51}\r
52\r
53void FilePlayerDAO::Initialize(const string &filename)\r
54{\r
55 mFilename = filename;\r
f4f0d89d 56 LoadPlayerCache();\r
57}\r
58\r
59void FilePlayerDAO::LoadPlayerCache()\r
60{\r
61 assert(!mFilename.empty());\r
62 spPlayerCache.clear();\r
63 ifstream infile;\r
64 infile.open(mFilename.c_str());\r
65 if (infile.fail())\r
66 {\r
67 throw DataLayerException(str(format("Unable to open %1% for loading Players") % mFilename),\r
68 __FILE__, __LINE__);\r
69 }\r
70 while (!infile.eof())\r
71 {\r
72 string line;\r
73 shared_ptr<PlayerGO> spPlayer;\r
74 getline(infile, line);\r
75 spPlayer = CreatePlayerFromLine(line);\r
76 spPlayerCache[spPlayer->Id()] = spPlayer;\r
77 }\r
78 infile.close();\r
79}\r
80\r
81void FilePlayerDAO::WritePlayerCache()\r
82{\r
83 ofstream outfile;\r
84 outfile.open(mFilename.c_str());\r
85 if (outfile.fail())\r
86 {\r
87 throw DataLayerException(str(format("Unable to open %1% for writing Players") % mFilename),\r
88 __FILE__, __LINE__);\r
89 }\r
90\r
91 map<string, shared_ptr<PlayerGO> >::const_iterator iter;\r
92 for (iter = spPlayerCache.begin(); iter != spPlayerCache.end(); iter++)\r
93 {\r
94 outfile << CreateLineFromPlayer(iter->second) << endl;\r
95 }\r
96 outfile.close();\r
ce4e8c42 97}\r
98\r
99string FilePlayerDAO::GetPlayerFilePath() const\r
100{\r
101 return mFilename;\r
102}\r
103\r
104shared_ptr<PlayerGO> FilePlayerDAO::GetById(const string &Id) const\r
105{\r
106 string line;\r
107 ifstream infile;\r
108 infile.open(GetPlayerFilePath().c_str());\r
109\r
110 if (infile.fail())\r
111 {\r
112 throw ResourceException(str(format("Unable to open file %1%") % GetPlayerFilePath()), __FILE__, __LINE__);\r
113 }\r
114\r
115\r
116 while (getline(infile, line))\r
117 {\r
118 shared_ptr<PlayerGO> spPlayer = CreatePlayerFromLine(line);\r
119 if (spPlayer->Id() == Id)\r
120 {\r
121 return spPlayer;\r
122 }\r
123 }\r
124 return shared_ptr<PlayerGO>();\r
125}\r
126\r
127shared_ptr<PlayerGO> FilePlayerDAO::CreatePlayerFromLine(const string &line) const\r
128{\r
f4f0d89d 129 assert(!line.empty());\r
ce4e8c42 130 shared_ptr<PlayerGO> spPlayer;\r
131 spPlayer = shared_ptr<PlayerGO>(new PlayerGO());\r
2a8a990d 132 boost::char_separator<char> sep(" ", 0, boost::keep_empty_tokens);\r
ce4e8c42 133 tokenizer tokens(line, sep);\r
134 tokenizer::iterator tok_iter = tokens.begin();\r
135\r
f4f0d89d 136 spPlayer->Name((*tok_iter));\r
137 spPlayer->Id(FileId::CreatePlayerId(spPlayer->Name()));\r
138 tok_iter++;\r
2a8a990d 139 spPlayer->Level(lexical_cast<int>((*tok_iter)));\r
140 tok_iter++;\r
141 spPlayer->Experience(lexical_cast<unsigned long int>((*tok_iter)));\r
142 tok_iter++;\r
143 spPlayer->Gold(lexical_cast<unsigned long int>((*tok_iter)));\r
144 tok_iter++;\r
145 spPlayer->Bank(lexical_cast<unsigned long int>((*tok_iter)));\r
146 tok_iter++;\r
147 spPlayer->Health(lexical_cast<int>((*tok_iter)));\r
148 tok_iter++;\r
149 spPlayer->MaxHealth(lexical_cast<int>((*tok_iter)));\r
150 tok_iter++;\r
151 spPlayer->Strength(lexical_cast<int>((*tok_iter)));\r
152 tok_iter++;\r
153 spPlayer->Defense(lexical_cast<int>((*tok_iter)));\r
154 tok_iter++;\r
155 spPlayer->ForestFights(lexical_cast<int>((*tok_iter)));\r
156 tok_iter++;\r
157 spPlayer->PlayerFights(lexical_cast<int>((*tok_iter)));\r
158 tok_iter++;\r
159 int flags = lexical_cast<int>((*tok_iter));\r
160 SetFlags(spPlayer, flags);\r
161 tok_iter++;\r
162 spPlayer->Password((*tok_iter));\r
ce4e8c42 163\r
164 return spPlayer;\r
165}\r
166\r
f4f0d89d 167string FilePlayerDAO::CreateLineFromPlayer(shared_ptr<PlayerGO> spPlayer) const\r
168{\r
169 string line;\r
170 line = str(format("%1% %2% %3% %4% %5% %6% %7% %8% %9% %10% %11% %12%") % \r
171 spPlayer->Name() % spPlayer->Level() % spPlayer->Experience() % spPlayer->Gold() %\r
172 spPlayer->Bank() % spPlayer->Health() % spPlayer->MaxHealth() % spPlayer->Strength() %\r
173 spPlayer->Defense() % spPlayer->ForestFights() % spPlayer->PlayerFights() %\r
174 GetFlags(spPlayer) % spPlayer->Password());\r
175 return line;\r
176}\r
177\r
2a8a990d 178void FilePlayerDAO::SetFlags(shared_ptr<PlayerGO> spPlayer, const int &flags) const\r
179{\r
f4f0d89d 180}\r
ce4e8c42 181\r
f4f0d89d 182int FilePlayerDAO::GetFlags(shared_ptr<PlayerGO> spPlayer) const\r
183{\r
184 return 0;\r
2a8a990d 185}\r
ce4e8c42 186\r
f21affc9 187void FilePlayerDAO::Update(shared_ptr<PlayerGO> spPlayer)\r
188{\r
f4f0d89d 189 assert(spPlayer != 0);\r
190 assert(!spPlayer->Id().empty());\r
191 assert(!spPlayer->Name().empty());\r
192\r
193 if (IdExists(spPlayer->Id()))\r
194 {\r
195 spPlayerCache[spPlayer->Id()] = spPlayer;\r
196 }\r
197 else\r
198 {\r
199 throw DataLayerException(str(format("Unable to Update Player %1%: Player does not exist") % \r
200 spPlayer->Name()), __FILE__, __LINE__);\r
201 }\r
f21affc9 202}\r
203\r
204void FilePlayerDAO::Insert(shared_ptr<PlayerGO> spPlayer)\r
205{\r
f4f0d89d 206 assert(spPlayer != 0);\r
207 assert(!spPlayer->Name().empty());\r
208 if (!IdExists(FileId::CreatePlayerId(spPlayer->Name())))\r
209 {\r
210 spPlayer->Id(FileId::CreatePlayerId(spPlayer->Name()));\r
211 spPlayerCache[spPlayer->Id()] = spPlayer;\r
212 WritePlayerCache();\r
213 }\r
214 else\r
215 {\r
216 throw DataLayerException(str(format("Unable to Insert Player %1%: Player exists") %\r
217 spPlayer->Name()), __FILE__, __LINE__);\r
218 }\r
f21affc9 219}\r
ce4e8c42 220\r
f21affc9 221bool FilePlayerDAO::IdExists(const string &Id) const\r
222{\r
f4f0d89d 223 map<string, shared_ptr<PlayerGO> >::const_iterator iter;\r
224 iter = spPlayerCache.find(Id);\r
225 return (iter != spPlayerCache.end());\r
f21affc9 226}\r
227\r
228list<string> FilePlayerDAO::GetIdsByName(const string &Name) const\r
229{\r
f4f0d89d 230 list<string> ids;\r
231 if (IdExists(FileId::CreatePlayerId(Name)))\r
232 {\r
233 ids.push_back(FileId::CreatePlayerId(Name));\r
234 }\r
235 return ids;\r
f21affc9 236}