]> jfr.im git - irc/gameservirc.git/blame - gameserv-2.0/libgameservgldl/src/DataLayer/File/FileMasterDAO.cpp
Working on the test driver to see where I'm at.
[irc/gameservirc.git] / gameserv-2.0 / libgameservgldl / src / DataLayer / File / FileMasterDAO.cpp
CommitLineData
142e3ca5 1#include <GameServ/DataLayer/File/FileMasterDAO.h>\r
2using GameServ::DataLayer::File::FileMasterDAO;\r
3\r
4#include <GameServ/GameLayer/GameObjects/MasterGO.h>\r
5using GameServ::GameLayer::GameObjects::MasterGO;\r
6\r
7#include <GameServ/DataLayer/DataLayerExceptions.h>\r
8using GameServ::DataLayer::Exceptions::ResourceException;\r
9using GameServ::DataLayer::Exceptions::DataLayerException;\r
10\r
11#include <GameServ/DataLayer/File/FileId.h>\r
12using GameServ::DataLayer::File::FileId;\r
13\r
14#include <boost/smart_ptr/shared_ptr.hpp>\r
15#include <boost/format.hpp>\r
16#include <boost/algorithm/string.hpp>\r
17#include <boost/lexical_cast.hpp>\r
33ae7ca7 18\r
142e3ca5 19using boost::shared_static_cast;\r
20using boost::format;\r
21using boost::str;\r
22using boost::lexical_cast;\r
23using boost::bad_lexical_cast;\r
24#include <boost/tokenizer.hpp>\r
25typedef boost::tokenizer<boost::char_separator<char> > \r
26 tokenizer;\r
27\r
28#include <string>\r
29using std::string;\r
30\r
31#include <fstream>\r
32using std::ifstream;\r
33using std::getline;\r
34using std::ofstream;\r
35using std::endl;\r
36\r
37#include <map>\r
38using std::map;\r
39\r
40FileMasterDAO::FileMasterDAO() : mFilename("data\\masters.dat")\r
41{\r
42 Initialize(GetMasterFilePath());\r
43}\r
44\r
45FileMasterDAO::FileMasterDAO(const string &filename)\r
46{\r
47 Initialize(filename);\r
48}\r
49\r
50FileMasterDAO::~FileMasterDAO()\r
51{\r
52}\r
53\r
54void FileMasterDAO::Initialize(const string &filename)\r
55{\r
56 mFilename = filename;\r
57 LoadMasterCache();\r
58}\r
59\r
60void FileMasterDAO::LoadMasterCache(void)\r
61{\r
62 assert(!mFilename.empty());\r
63 spMasterCache.clear();\r
64 ifstream infile;\r
65 infile.open(mFilename.c_str());\r
66 if (infile.fail())\r
67 {\r
68 throw DataLayerException(str(format("Unable to open %1% for loading Masters") % mFilename),\r
69 __FILE__, __LINE__);\r
70 }\r
71 while (!infile.eof())\r
72 {\r
73 string line;\r
33ae7ca7 74 boost::shared_ptr<MasterGO> spMaster;\r
142e3ca5 75 getline(infile, line);\r
76 if (line.empty())\r
77 {\r
78 continue;\r
79 }\r
80 else if (line[0] == '#')\r
81 {\r
82 continue;\r
83 }\r
84 spMaster = CreateMasterFromLine(line);\r
85 spMasterCache[spMaster->Id()] = spMaster;\r
86 }\r
87 infile.close();\r
88}\r
89\r
90string FileMasterDAO::GetMasterFilePath() const\r
91{\r
92 return mFilename;\r
93}\r
94\r
33ae7ca7 95boost::shared_ptr<MasterGO> FileMasterDAO::GetById(const string &Id) const\r
142e3ca5 96{\r
33ae7ca7 97 map<string, boost::shared_ptr<MasterGO> >::const_iterator iter;\r
142e3ca5 98 iter = spMasterCache.find(Id);\r
99 if (iter != spMasterCache.end())\r
100 {\r
33ae7ca7 101 return boost::shared_ptr<MasterGO>(iter->second);\r
142e3ca5 102 }\r
33ae7ca7 103 return boost::shared_ptr<MasterGO>();\r
142e3ca5 104}\r
105\r
33ae7ca7 106void FileMasterDAO::Insert(boost::shared_ptr<MasterGO> spMaster)\r
656c03e5 107{\r
108 throw DataLayerException("Not implemented", __FILE__, __LINE__);\r
109}\r
33ae7ca7 110void FileMasterDAO::Update(boost::shared_ptr<MasterGO> spMaster)\r
656c03e5 111{\r
112 throw DataLayerException("Not implemented", __FILE__, __LINE__);\r
113}\r
114\r
33ae7ca7 115boost::shared_ptr<MasterGO> FileMasterDAO::CreateMasterFromLine(const string &line) const\r
142e3ca5 116{\r
117 assert(!line.empty());\r
33ae7ca7 118 boost::shared_ptr<MasterGO> spMaster;\r
119 spMaster = boost::shared_ptr<MasterGO>(new MasterGO());\r
142e3ca5 120 boost::char_separator<char> sep("~", 0);\r
121 tokenizer tokens(line, sep);\r
122 tokenizer::iterator tok_iter = tokens.begin();\r
123 \r
124 // Level\r
125 try\r
126 {\r
656c03e5 127 spMaster->LevelId(FileId::CreateLevelId(lexical_cast<int>((*tok_iter))));\r
142e3ca5 128 }\r
129 catch (bad_lexical_cast)\r
130 {\r
131 throw DataLayerException(str(format("Corrupt master line %1%. Invalid integer value %2%") % \r
132 line % (*tok_iter)));\r
133 }\r
134 \r
135 // Name\r
136 tok_iter++;\r
137 if (tok_iter == tokens.end())\r
138 {\r
139 throw DataLayerException(str(format("Corrupt master line %1%. Missing information") %\r
140 line), __FILE__, __LINE__);\r
141 }\r
142 spMaster->Name((*tok_iter));\r
656c03e5 143 spMaster->Id(FileId::CreateMasterId(spMaster->LevelId(), spMaster->Name()));\r
142e3ca5 144\r
145 // Weapon\r
146 tok_iter++;\r
147 if (tok_iter == tokens.end())\r
148 {\r
149 throw DataLayerException(str(format("Corrupt master line %1%. Missing information") %\r
150 line), __FILE__, __LINE__);\r
151 }\r
152 spMaster->WeaponName((*tok_iter));\r
153\r
154 // Strength\r
155 tok_iter++;\r
156 if (tok_iter == tokens.end())\r
157 {\r
158 throw DataLayerException(str(format("Corrupt master line %1%. Missing information") %\r
159 line), __FILE__, __LINE__);\r
160 }\r
161 try\r
162 {\r
163 spMaster->Strength(lexical_cast<int>((*tok_iter)));\r
164 }\r
165 catch (bad_lexical_cast)\r
166 {\r
167 throw DataLayerException(str(format("Corrupt master line %1%. Invalid integer value %2%") % \r
168 line % (*tok_iter)));\r
169 }\r
170\r
171 // Defense\r
172 tok_iter++;\r
173 if (tok_iter == tokens.end())\r
174 {\r
175 throw DataLayerException(str(format("Corrupt master line %1%. Missing information") %\r
176 line), __FILE__, __LINE__);\r
177 }\r
178 try\r
179 {\r
180 spMaster->Defense(lexical_cast<int>((*tok_iter)));\r
181 }\r
182 catch (bad_lexical_cast)\r
183 {\r
184 throw DataLayerException(str(format("Corrupt master line %1%. Invalid integer value %2%") % \r
185 line % (*tok_iter)));\r
186 }\r
187\r
188\r
189 // Gold\r
190 tok_iter++;\r
191 if (tok_iter == tokens.end())\r
192 {\r
193 throw DataLayerException(str(format("Corrupt master line %1%. Missing information") %\r
194 line), __FILE__, __LINE__);\r
195 }\r
196 try\r
197 {\r
198 spMaster->Gold(lexical_cast<unsigned long int>((*tok_iter)));\r
199 }\r
200 catch (bad_lexical_cast)\r
201 {\r
202 throw DataLayerException(str(format("Corrupt master line %1%. Invalid integer value %2%") % \r
203 line % (*tok_iter)));\r
204 }\r
205\r
206 // Experience\r
207 tok_iter++;\r
208 if (tok_iter == tokens.end())\r
209 {\r
210 throw DataLayerException(str(format("Corrupt master line %1%. Missing information") %\r
211 line), __FILE__, __LINE__);\r
212 }\r
213 try\r
214 {\r
215 spMaster->Experience(lexical_cast<unsigned long int>((*tok_iter)));\r
216 }\r
217 catch (bad_lexical_cast)\r
218 {\r
219 throw DataLayerException(str(format("Corrupt master line %1%. Invalid integer value %2%") % \r
220 line % (*tok_iter)));\r
221 }\r
222\r
223 // Health and Max Health\r
224 tok_iter++;\r
225 if (tok_iter == tokens.end())\r
226 {\r
227 throw DataLayerException(str(format("Corrupt master line %1%. Missing information") %\r
228 line), __FILE__, __LINE__);\r
229 }\r
230 try\r
231 {\r
232 spMaster->Health(lexical_cast<int>((*tok_iter)));\r
233 spMaster->MaxHealth(spMaster->Health());\r
234 }\r
235 catch (bad_lexical_cast)\r
236 {\r
237 throw DataLayerException(str(format("Corrupt master line %1%. Invalid integer value %2%") % \r
238 line % (*tok_iter)));\r
239 }\r
240\r
241 // Parting Words\r
242 tok_iter++;\r
243 if (tok_iter == tokens.end())\r
244 {\r
245 throw DataLayerException(str(format("Corrupt master line %1%. Missing information") %\r
246 line), __FILE__, __LINE__);\r
247 }\r
248 spMaster->PartingWords((*tok_iter));\r
249 // # level~name~weapon~strength~defense~gold~exp~hp~parting words\r
250 return spMaster;\r
251}\r
252\r
253bool FileMasterDAO::IdExists(const string &Id) const\r
254{\r
33ae7ca7 255 map<string, boost::shared_ptr<MasterGO> >::const_iterator iter;\r
142e3ca5 256 iter = spMasterCache.find(Id);\r
257 return (iter != spMasterCache.end());\r
258}