]>
Commit | Line | Data |
---|---|---|
ce4e8c42 | 1 | #include <GameServ/DataLayer/File/FilePlayerDAO.h>\r |
2 | using GameServ::DataLayer::File::FilePlayerDAO;\r | |
3 | #include <GameServ/GameLayer/GameObjects/PlayerGO.h>\r | |
4 | using GameServ::GameLayer::GameObjects::PlayerGO;\r | |
5 | \r | |
6 | #include <GameServ/DataLayer/DataLayerExceptions.h>\r | |
7 | using GameServ::DataLayer::Exceptions::ResourceException;\r | |
8 | using GameServ::DataLayer::Exceptions::DataLayerException;\r | |
9 | \r | |
f4f0d89d | 10 | #include <GameServ/DataLayer/File/FileId.h>\r |
11 | using 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 | |
17 | using boost::shared_ptr;\r | |
18 | using boost::format;\r | |
19 | using boost::str;\r | |
20 | using boost::algorithm::to_upper;\r | |
21 | using boost::lexical_cast;\r | |
22 | #include <boost/tokenizer.hpp>\r | |
23 | typedef boost::tokenizer<boost::char_separator<char> > \r | |
24 | tokenizer;\r | |
25 | \r | |
26 | #include <string>\r | |
27 | using std::string;\r | |
28 | \r | |
29 | #include <fstream>\r | |
30 | using std::ifstream;\r | |
31 | using std::getline;\r | |
f4f0d89d | 32 | using std::ofstream;\r |
33 | using std::endl;\r | |
ce4e8c42 | 34 | \r |
f4f0d89d | 35 | #include <map>\r |
36 | using std::map;\r | |
ce4e8c42 | 37 | \r |
38 | FilePlayerDAO::FilePlayerDAO() : mFilename("players.dat")\r | |
39 | {\r | |
40 | Initialize(GetPlayerFilePath());\r | |
41 | }\r | |
42 | \r | |
43 | FilePlayerDAO::FilePlayerDAO(const string &filename)\r | |
44 | {\r | |
45 | Initialize(filename);\r | |
46 | }\r | |
47 | \r | |
48 | FilePlayerDAO::~FilePlayerDAO()\r | |
49 | {\r | |
f4f0d89d | 50 | WritePlayerCache();\r |
ce4e8c42 | 51 | }\r |
52 | \r | |
53 | void FilePlayerDAO::Initialize(const string &filename)\r | |
54 | {\r | |
55 | mFilename = filename;\r | |
f4f0d89d | 56 | LoadPlayerCache();\r |
57 | }\r | |
58 | \r | |
59 | void 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 | |
81 | void 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 | |
99 | string FilePlayerDAO::GetPlayerFilePath() const\r | |
100 | {\r | |
101 | return mFilename;\r | |
102 | }\r | |
103 | \r | |
104 | shared_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 | |
127 | shared_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 | 167 | string 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 | 178 | void FilePlayerDAO::SetFlags(shared_ptr<PlayerGO> spPlayer, const int &flags) const\r |
179 | {\r | |
f4f0d89d | 180 | }\r |
ce4e8c42 | 181 | \r |
f4f0d89d | 182 | int FilePlayerDAO::GetFlags(shared_ptr<PlayerGO> spPlayer) const\r |
183 | {\r | |
184 | return 0;\r | |
2a8a990d | 185 | }\r |
ce4e8c42 | 186 | \r |
f21affc9 | 187 | void 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 | |
204 | void 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 | 221 | bool 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 | |
228 | list<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 | } |