]> jfr.im git - irc/gameservirc.git/blame - gameserv-2.0/libgameservgldl/src/DataLayer/MySQL/MySQLLevelDAO.cpp
Wrote some initial MySQLDAO objects, but they're not complete
[irc/gameservirc.git] / gameserv-2.0 / libgameservgldl / src / DataLayer / MySQL / MySQLLevelDAO.cpp
CommitLineData
656c03e5 1#include <GameServ/DataLayer/MySQL/MySQLLevelDAO.h>\r
2using GameServ::DataLayer::MySQL::MySQLLevelDAO;\r
3using GameServ::DataLayer::MySQL::level;\r
4\r
5#include <GameServ/GameLayer/GameObjects/LevelGO.h>\r
6using GameServ::GameLayer::GameObjects::LevelGO;\r
7\r
8#include <GameServ/DataLayer/DataLayerExceptions.h>\r
9using GameServ::DataLayer::Exceptions::ResourceException;\r
10using GameServ::DataLayer::Exceptions::DataLayerException;\r
11\r
12#include <GameServ/DataLayer/MySQL/MySQLId.h>\r
13using GameServ::DataLayer::MySQL::MySQLId;\r
14\r
15#include <boost/shared_ptr.hpp>\r
16#include <boost/format.hpp>\r
17#include <boost/algorithm/string.hpp>\r
18#include <boost/lexical_cast.hpp>\r
19using boost::shared_ptr;\r
20using boost::shared_static_cast;\r
21using boost::format;\r
22using boost::str;\r
23using boost::algorithm::to_upper;\r
24using boost::lexical_cast;\r
25\r
26#include <string>\r
27using std::string;\r
28\r
29#include <vector>\r
30using std::vector;\r
31\r
32#include <mysql++.h>\r
33#include <ssqls.h>\r
34\r
35MySQLLevelDAO::MySQLLevelDAO()\r
36{\r
37 Initialize("level");\r
38}\r
39\r
40MySQLLevelDAO::~MySQLLevelDAO()\r
41{\r
42}\r
43\r
44void MySQLLevelDAO::Initialize(const string &tablename)\r
45{\r
46 mTableName = tablename;\r
47}\r
48\r
49shared_ptr<LevelGO> MySQLLevelDAO::GetById(const string &Id) const\r
50{\r
51 // TODO: Enable and catch exceptions\r
52 mysqlpp::Connection conn;\r
53\r
54 // TODO: Load from config\r
55 try\r
56 {\r
57 conn.connect("gameserv", "localhost", "gameserv", "gameserv", 3306);\r
58 }\r
59 catch (mysqlpp::ConnectionFailed &ex)\r
60 {\r
61 throw DataLayerException(str(format("Failed to connect to the database. Error: %1%") %\r
62 ex.what()), __FILE__, __LINE__);\r
63 }\r
64 catch (mysqlpp::Exception &ex)\r
65 {\r
66 throw DataLayerException(str(format("Unknown error connecting to the database. Error: %1%") %\r
67 ex.what()), __FILE__, __LINE__);\r
68 }\r
69\r
70 mysqlpp::Query query = conn.query();\r
71\r
72 try\r
73 {\r
74 query << "select * from " << mTableName << " where id = " << MySQLId::GetLevelNumberFromId(Id);\r
75 }\r
76 catch (GameServException &e)\r
77 {\r
78 throw DataLayerException(str(format("Error generating sql query: %1%") % e.VerboseError()),\r
79 __FILE__, __LINE__);\r
80 }\r
81 \r
82 vector<level> levels;\r
83\r
84 try\r
85 {\r
86 query.storein(levels);\r
87 }\r
88 catch (mysqlpp::UseQueryError &ex)\r
89 {\r
90 throw DataLayerException(str(format("Unable to execute query: \" %1% \". Error: %2%") %\r
91 query % ex.what()), __FILE__, __LINE__);\r
92 }\r
93 catch (mysqlpp::Exception &ex)\r
94 {\r
95 throw DataLayerException(str(format("Unknown error executing query: \" %1% \". Error: %2%") %\r
96 query % ex.what()), __FILE__, __LINE__);\r
97 }\r
98\r
99 if (levels.size() == 1)\r
100 {\r
101 return CreateLevelFromLevelSSQLS(levels[0]);\r
102 }\r
103 else if (levels.size() == 0)\r
104 {\r
105 return shared_ptr<LevelGO>();\r
106 }\r
107 else\r
108 {\r
109 throw DataLayerException("Problem with database key... more than one row returned on getbyid",\r
110 __FILE__, __LINE__);\r
111 }\r
112}\r
113\r
114\r
115void MySQLLevelDAO::Insert(shared_ptr<LevelGO> spLevel)\r
116{\r
117 // TODO: Enable and catch exceptions\r
118 mysqlpp::Connection conn;\r
119\r
120 // TODO: Load from config\r
121 try\r
122 {\r
123 conn.connect("gameserv", "localhost", "gameserv", "gameserv", 3306);\r
124 }\r
125 catch (mysqlpp::ConnectionFailed &ex)\r
126 {\r
127 throw DataLayerException(str(format("Failed to connect to the database. Error: %1%") %\r
128 ex.what()), __FILE__, __LINE__);\r
129 }\r
130 catch (mysqlpp::Exception &ex)\r
131 {\r
132 throw DataLayerException(str(format("Unknown error connecting to the database. Error: %1%") %\r
133 ex.what()), __FILE__, __LINE__);\r
134 }\r
135\r
136 mysqlpp::Query query = conn.query();\r
137 level l = CreateLevelSSQLSFromLevel(spLevel);\r
138\r
139 l.id = 0;\r
140\r
141 try\r
142 {\r
143 query.insert(l);\r
144 query.execute();\r
145 }\r
146 catch (mysqlpp::UseQueryError &ex)\r
147 {\r
148 throw DataLayerException(str(format("Unable to execute query: \" %1% \". Error: %2%") %\r
149 query % ex.what()), __FILE__, __LINE__);\r
150 }\r
151 catch (mysqlpp::Exception &ex)\r
152 {\r
153 throw DataLayerException(str(format("Unknown error executing query: \" %1% \". Error: %2%") %\r
154 query % ex.what()), __FILE__, __LINE__);\r
155 }\r
156\r
157 spLevel->Id(MySQLId::CreateLevelId(query.insert_id()));\r
158}\r
159\r
160void MySQLLevelDAO::Update(shared_ptr<LevelGO> spLevel)\r
161{\r
162 // TODO: Enable and catch exceptions\r
163 mysqlpp::Connection conn;\r
164 // TODO: Load from config\r
165 try\r
166 {\r
167 conn.connect("gameserv", "localhost", "gameserv", "gameserv", 3306);\r
168 }\r
169 catch (mysqlpp::ConnectionFailed &ex)\r
170 {\r
171 throw DataLayerException(str(format("Failed to connect to the database. Error: %1%") %\r
172 ex.what()), __FILE__, __LINE__);\r
173 }\r
174 catch (mysqlpp::Exception &ex)\r
175 {\r
176 throw DataLayerException(str(format("Unknown error connecting to the database. Error: %1%") %\r
177 ex.what()), __FILE__, __LINE__);\r
178 }\r
179\r
180\r
181 mysqlpp::Query query = conn.query();\r
182 level oldrow, newrow = CreateLevelSSQLSFromLevel(spLevel);\r
183\r
184 try\r
185 {\r
186 query << "select * from " << mTableName << " where id = " << MySQLId::GetLevelNumberFromId(spLevel->Id());\r
187 }\r
188 catch (GameServException &e)\r
189 {\r
190 throw DataLayerException(str(format("Error generating sql query: %1%") % e.VerboseError()),\r
191 __FILE__, __LINE__);\r
192 }\r
193\r
194 try\r
195 {\r
196 mysqlpp::StoreQueryResult res = query.store();\r
197 if (res.empty())\r
198 {\r
199 throw DataLayerException(str(format("Attempt to update a non-existant level. Id: %1%") % spLevel->Id()),\r
200 __FILE__, __LINE__);\r
201 }\r
202 oldrow = res[0];\r
203 }\r
204 catch (mysqlpp::UseQueryError &ex)\r
205 {\r
206 throw DataLayerException(str(format("Unable to execute query: \" %1% \". Error: %2%") %\r
207 query % ex.what()), __FILE__, __LINE__);\r
208 }\r
209 catch (mysqlpp::Exception &ex)\r
210 {\r
211 throw DataLayerException(str(format("Unknown error executing query: \" %1% \". Error: %2%") %\r
212 query % ex.what()), __FILE__, __LINE__);\r
213 }\r
214\r
215 try\r
216 {\r
217 query.update(oldrow, newrow);\r
218 query.execute();\r
219 }\r
220 catch (mysqlpp::UseQueryError &ex)\r
221 {\r
222 throw DataLayerException(str(format("Unable to execute query: \" %1% \". Error: %2%") %\r
223 query % ex.what()), __FILE__, __LINE__);\r
224 }\r
225 catch (mysqlpp::Exception &ex)\r
226 {\r
227 throw DataLayerException(str(format("Unknown error executing query: \" %1% \". Error: %2%") %\r
228 query % ex.what()), __FILE__, __LINE__);\r
229 }\r
230}\r
231\r
232shared_ptr<LevelGO> MySQLLevelDAO::CreateLevelFromLevelSSQLS(const level &l) const\r
233{\r
234 shared_ptr<LevelGO> spLevel = shared_ptr<LevelGO>(new LevelGO());\r
235\r
236 spLevel->Id(MySQLId::CreateLevelId(l.id));\r
237 spLevel->StrengthRange(Range<int>(l.strengthhigh, l.strengthlow));\r
238 spLevel->DefenseRange(Range<int>(l.defensehigh, l.defenselow));\r
239 spLevel->GoldRange(Range<int>(l.goldhigh, l.goldlow));\r
240 spLevel->ExperienceRange(Range<int>(l.experiencehigh, l.experiencelow));\r
241 spLevel->HealthRange(Range<int>(l.healthhigh, l.healthlow));\r
242\r
243 return spLevel;\r
244}\r
245level MySQLLevelDAO::CreateLevelSSQLSFromLevel(shared_ptr<LevelGO> spLevel) const\r
246{\r
247 assert (spLevel != 0);\r
248\r
249 level l;\r
250\r
251 l.id = static_cast<mysqlpp::sql_int_unsigned>(MySQLId::GetLevelNumberFromId(spLevel->Id()));\r
252 l.strengthhigh = spLevel->StrengthRange().High();\r
253 l.strengthlow = spLevel->StrengthRange().Low();\r
254 \r
255 l.defensehigh = spLevel->DefenseRange().High();\r
256 l.defenselow = spLevel->DefenseRange().Low();\r
257\r
258 l.goldhigh = spLevel->GoldRange().High();\r
259 l.goldlow = spLevel->GoldRange().Low();\r
260\r
261 l.experiencehigh = spLevel->ExperienceRange().High();\r
262 l.experiencelow = spLevel->ExperienceRange().Low();\r
263\r
264 l.healthhigh = spLevel->HealthRange().High();\r
265 l.healthlow = spLevel->HealthRange().Low();\r
266\r
267\r
268 return l;\r
269}\r
270\r
271bool MySQLLevelDAO::IdExists(const std::string &Id) const\r
272{\r
273 mysqlpp::Connection conn;\r
274 // TODO: Load from config\r
275 try\r
276 {\r
277 conn.connect("gameserv", "localhost", "gameserv", "gameserv", 3306);\r
278 }\r
279 catch (mysqlpp::ConnectionFailed &ex)\r
280 {\r
281 throw DataLayerException(str(format("Failed to connect to the database. Error: %1%") %\r
282 ex.what()), __FILE__, __LINE__);\r
283 }\r
284 catch (mysqlpp::Exception &ex)\r
285 {\r
286 throw DataLayerException(str(format("Unknown error connecting to the database. Error: %1%") %\r
287 ex.what()), __FILE__, __LINE__);\r
288 }\r
289 mysqlpp::Query query = conn.query();\r
290\r
291 try\r
292 {\r
293 query << "SELECT id from " << mTableName << " where Id=" << MySQLId::GetLevelNumberFromId(Id);\r
294 }\r
295 catch (GameServException &e)\r
296 {\r
297 throw DataLayerException(str(format("Error generating sql query: %1%") % e.VerboseError()),\r
298 __FILE__, __LINE__);\r
299 }\r
300\r
301 try\r
302 {\r
303 mysqlpp::StoreQueryResult res = query.store();\r
304 if (res.empty())\r
305 {\r
306 return false;\r
307 }\r
308 else\r
309 {\r
310 return true;\r
311 }\r
312 }\r
313 catch (mysqlpp::UseQueryError &ex)\r
314 {\r
315 throw DataLayerException(str(format("Unable to execute query: \" %1% \". Error: %2%") %\r
316 query % ex.what()), __FILE__, __LINE__);\r
317 }\r
318 catch (mysqlpp::Exception &ex)\r
319 {\r
320 throw DataLayerException(str(format("Unknown error executing query: \" %1% \". Error: %2%") %\r
321 query % ex.what()), __FILE__, __LINE__);\r
322 }\r
323\r
324}\r
325\r
326string MySQLLevelDAO::GetLevelTableName(void) const\r
327{\r
328 return mTableName;\r
329}\r
330\r
331\r