]> jfr.im git - irc/gameservirc.git/blame - gameserv-2.0/libgameservgldl/src/DataLayer/File/FilePlayerDAO.cpp
Made FilePlayerDAO::Insert() only append a line instead of writing the whole file...
[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
50}\r
51\r
52void FilePlayerDAO::Initialize(const string &filename)\r
53{\r
54 mFilename = filename;\r
f4f0d89d 55 LoadPlayerCache();\r
56}\r
57\r
58void FilePlayerDAO::LoadPlayerCache()\r
59{\r
60 assert(!mFilename.empty());\r
61 spPlayerCache.clear();\r
62 ifstream infile;\r
63 infile.open(mFilename.c_str());\r
64 if (infile.fail())\r
65 {\r
66 throw DataLayerException(str(format("Unable to open %1% for loading Players") % mFilename),\r
67 __FILE__, __LINE__);\r
68 }\r
69 while (!infile.eof())\r
70 {\r
71 string line;\r
72 shared_ptr<PlayerGO> spPlayer;\r
73 getline(infile, line);\r
74 spPlayer = CreatePlayerFromLine(line);\r
75 spPlayerCache[spPlayer->Id()] = spPlayer;\r
76 }\r
77 infile.close();\r
78}\r
79\r
80void FilePlayerDAO::WritePlayerCache()\r
81{\r
82 ofstream outfile;\r
83 outfile.open(mFilename.c_str());\r
84 if (outfile.fail())\r
85 {\r
86 throw DataLayerException(str(format("Unable to open %1% for writing Players") % mFilename),\r
87 __FILE__, __LINE__);\r
88 }\r
89\r
90 map<string, shared_ptr<PlayerGO> >::const_iterator iter;\r
91 for (iter = spPlayerCache.begin(); iter != spPlayerCache.end(); iter++)\r
92 {\r
93 outfile << CreateLineFromPlayer(iter->second) << endl;\r
94 }\r
95 outfile.close();\r
ce4e8c42 96}\r
97\r
98string FilePlayerDAO::GetPlayerFilePath() const\r
99{\r
100 return mFilename;\r
101}\r
102\r
103shared_ptr<PlayerGO> FilePlayerDAO::GetById(const string &Id) const\r
104{\r
105 string line;\r
106 ifstream infile;\r
107 infile.open(GetPlayerFilePath().c_str());\r
108\r
109 if (infile.fail())\r
110 {\r
111 throw ResourceException(str(format("Unable to open file %1%") % GetPlayerFilePath()), __FILE__, __LINE__);\r
112 }\r
113\r
114\r
115 while (getline(infile, line))\r
116 {\r
117 shared_ptr<PlayerGO> spPlayer = CreatePlayerFromLine(line);\r
118 if (spPlayer->Id() == Id)\r
119 {\r
120 return spPlayer;\r
121 }\r
122 }\r
123 return shared_ptr<PlayerGO>();\r
124}\r
125\r
126shared_ptr<PlayerGO> FilePlayerDAO::CreatePlayerFromLine(const string &line) const\r
127{\r
f4f0d89d 128 assert(!line.empty());\r
ce4e8c42 129 shared_ptr<PlayerGO> spPlayer;\r
130 spPlayer = shared_ptr<PlayerGO>(new PlayerGO());\r
2a8a990d 131 boost::char_separator<char> sep(" ", 0, boost::keep_empty_tokens);\r
ce4e8c42 132 tokenizer tokens(line, sep);\r
133 tokenizer::iterator tok_iter = tokens.begin();\r
134\r
f4f0d89d 135 spPlayer->Name((*tok_iter));\r
136 spPlayer->Id(FileId::CreatePlayerId(spPlayer->Name()));\r
137 tok_iter++;\r
2a8a990d 138 spPlayer->Level(lexical_cast<int>((*tok_iter)));\r
139 tok_iter++;\r
140 spPlayer->Experience(lexical_cast<unsigned long int>((*tok_iter)));\r
141 tok_iter++;\r
142 spPlayer->Gold(lexical_cast<unsigned long int>((*tok_iter)));\r
143 tok_iter++;\r
144 spPlayer->Bank(lexical_cast<unsigned long int>((*tok_iter)));\r
145 tok_iter++;\r
146 spPlayer->Health(lexical_cast<int>((*tok_iter)));\r
147 tok_iter++;\r
148 spPlayer->MaxHealth(lexical_cast<int>((*tok_iter)));\r
149 tok_iter++;\r
150 spPlayer->Strength(lexical_cast<int>((*tok_iter)));\r
151 tok_iter++;\r
152 spPlayer->Defense(lexical_cast<int>((*tok_iter)));\r
153 tok_iter++;\r
154 spPlayer->ForestFights(lexical_cast<int>((*tok_iter)));\r
155 tok_iter++;\r
156 spPlayer->PlayerFights(lexical_cast<int>((*tok_iter)));\r
157 tok_iter++;\r
158 int flags = lexical_cast<int>((*tok_iter));\r
159 SetFlags(spPlayer, flags);\r
160 tok_iter++;\r
161 spPlayer->Password((*tok_iter));\r
ce4e8c42 162\r
eec695cf 163 // TODO: Add weapons, armor, and items\r
164\r
ce4e8c42 165 return spPlayer;\r
166}\r
167\r
f4f0d89d 168string FilePlayerDAO::CreateLineFromPlayer(shared_ptr<PlayerGO> spPlayer) const\r
169{\r
170 string line;\r
eec695cf 171 // TODO: Add weapons, armor, and items\r
172 line = str(format("%1% %2% %3% %4% %5% %6% %7% %8% %9% %10% %11% %12% %13%") % \r
f4f0d89d 173 spPlayer->Name() % spPlayer->Level() % spPlayer->Experience() % spPlayer->Gold() %\r
174 spPlayer->Bank() % spPlayer->Health() % spPlayer->MaxHealth() % spPlayer->Strength() %\r
175 spPlayer->Defense() % spPlayer->ForestFights() % spPlayer->PlayerFights() %\r
176 GetFlags(spPlayer) % spPlayer->Password());\r
177 return line;\r
178}\r
179\r
2a8a990d 180void FilePlayerDAO::SetFlags(shared_ptr<PlayerGO> spPlayer, const int &flags) const\r
181{\r
eec695cf 182 // TODO: Add flags of course\r
f4f0d89d 183}\r
ce4e8c42 184\r
f4f0d89d 185int FilePlayerDAO::GetFlags(shared_ptr<PlayerGO> spPlayer) const\r
186{\r
eec695cf 187 // TODO: Return real flags\r
f4f0d89d 188 return 0;\r
2a8a990d 189}\r
ce4e8c42 190\r
f21affc9 191void FilePlayerDAO::Update(shared_ptr<PlayerGO> spPlayer)\r
192{\r
f4f0d89d 193 assert(spPlayer != 0);\r
194 assert(!spPlayer->Id().empty());\r
195 assert(!spPlayer->Name().empty());\r
196\r
eec695cf 197 // TODO: Lock the file\r
f4f0d89d 198 if (IdExists(spPlayer->Id()))\r
199 {\r
200 spPlayerCache[spPlayer->Id()] = spPlayer;\r
eec695cf 201 WritePlayerCache();\r
f4f0d89d 202 }\r
203 else\r
204 {\r
205 throw DataLayerException(str(format("Unable to Update Player %1%: Player does not exist") % \r
206 spPlayer->Name()), __FILE__, __LINE__);\r
207 }\r
f21affc9 208}\r
209\r
210void FilePlayerDAO::Insert(shared_ptr<PlayerGO> spPlayer)\r
211{\r
f4f0d89d 212 assert(spPlayer != 0);\r
213 assert(!spPlayer->Name().empty());\r
eec695cf 214 // TODO: Lock the file\r
f4f0d89d 215 if (!IdExists(FileId::CreatePlayerId(spPlayer->Name())))\r
216 {\r
217 spPlayer->Id(FileId::CreatePlayerId(spPlayer->Name()));\r
218 spPlayerCache[spPlayer->Id()] = spPlayer;\r
eec695cf 219 ofstream outfile;\r
220 outfile.open(mFilename.c_str(), std::ios::app);\r
221 if (outfile.fail())\r
222 {\r
223 throw ResourceException(str(format("Unable to open %1% for appending.") % mFilename), __FILE__, __LINE__);\r
224 }\r
225 outfile << CreateLineFromPlayer(spPlayer) << endl;\r
226 outfile.close();\r
f4f0d89d 227 }\r
228 else\r
229 {\r
230 throw DataLayerException(str(format("Unable to Insert Player %1%: Player exists") %\r
231 spPlayer->Name()), __FILE__, __LINE__);\r
232 }\r
f21affc9 233}\r
ce4e8c42 234\r
f21affc9 235bool FilePlayerDAO::IdExists(const string &Id) const\r
236{\r
f4f0d89d 237 map<string, shared_ptr<PlayerGO> >::const_iterator iter;\r
238 iter = spPlayerCache.find(Id);\r
239 return (iter != spPlayerCache.end());\r
f21affc9 240}\r
241\r
242list<string> FilePlayerDAO::GetIdsByName(const string &Name) const\r
243{\r
f4f0d89d 244 list<string> ids;\r
245 if (IdExists(FileId::CreatePlayerId(Name)))\r
246 {\r
247 ids.push_back(FileId::CreatePlayerId(Name));\r
248 }\r
249 return ids;\r
f21affc9 250}