Go to the documentation of this file.00001 #include <iostream>
00002 #include <iomanip>
00003 #include <string>
00004 #include <fstream>
00005
00006 #include <mysql++/mysql++.h>
00007 #include <Wt/WStringUtil>
00008
00009 #include <Wt/WApplication>
00010 #include "HangmanDb.h"
00011
00012 using namespace mysqlpp;
00013
00014 std::string HangmanDb::DbUser()
00015 {
00016 std::string retval;
00017 std::ifstream dbconf((Wt::WApplication::appRoot()
00018 + "HangmanDb.info").c_str());
00019 dbconf >> retval;
00020 return retval;
00021 }
00022
00023 std::string HangmanDb::DbPass()
00024 {
00025 std::string retval;
00026 std::ifstream dbconf((Wt::WApplication::appRoot()
00027 + "HangmanDb.info").c_str());
00028 dbconf >> retval;
00029 dbconf >> retval;
00030 return retval;
00031 }
00032
00033
00034
00035
00036 bool HangmanDb::addUser(const std::wstring &user, const std::wstring &password)
00037 {
00038 try {
00039 Connection con("hangman", "localhost", DbUser().c_str(), DbPass().c_str());
00040 Query q = con.query();
00041 q << "insert into users "
00042 << "set user='" << Wt::toUTF8(user) << "', pass=MD5('"
00043 << Wt::toUTF8(password) << "'), numgames=0, score=0, lastseen=now()";
00044 q.store();
00045 return true;
00046 } catch(Exception &e) {
00047 std::cerr << "Database exception!\n";
00048 std::cerr << e.what() << std::endl;
00049 return false;
00050 }
00051 }
00052
00053 bool HangmanDb::validLogin(const std::wstring &user, const std::wstring &pass)
00054 {
00055 try {
00056 Connection con("hangman", "localhost", DbUser().c_str(), DbPass().c_str());
00057 Query q = con.query();
00058 q << "select user,pass from users where "
00059 << "user='" << Wt::toUTF8(user)
00060 << "' and pass=MD5('" << Wt::toUTF8(pass) << "')";
00061 StoreQueryResult res = q.store();
00062 return res.size() > 0;
00063 } catch(Exception &e) {
00064 std::cerr << "Database exception!\n";
00065 std::cerr << e.what() << std::endl;
00066 return false;
00067 }
00068 }
00069
00070 void HangmanDb::addToScore(const std::wstring &user, int delta)
00071 {
00072 try {
00073 Connection con("hangman", "localhost", DbUser().c_str(), DbPass().c_str());
00074 Query q = con.query();
00075 q << "update users set score=(score+" << delta << "), "
00076 << "numgames=(numgames+1), lastseen=now() "
00077 << "where user='" << Wt::toUTF8(user) << "'";
00078 StoreQueryResult res = q.store();
00079 } catch(Exception &e) {
00080 std::cerr << "Database exception!\n";
00081 std::cerr << e.what() << std::endl;
00082 }
00083 }
00084
00085 std::vector<HangmanDb::Score> HangmanDb::getHighScores(int top)
00086 {
00087 std::vector<HangmanDb::Score> retval;
00088 try {
00089 Connection con("hangman", "localhost", DbUser().c_str(), DbPass().c_str());
00090 Query q = con.query();
00091 q << "select user, numgames, score, lastseen from users "
00092 << "order by score desc "
00093 << "limit " << top;
00094 StoreQueryResult res = q.store();
00095
00096 for(unsigned int i = 0; i < res.size(); ++i) {
00097 struct Score s;
00098 s.number = i + 1;
00099 s.user = Wt::fromUTF8((std::string)res.at(i)["user"]);
00100 s.numgames = res.at(i)["numgames"];
00101 s.score = res.at(i)["score"];
00102 s.lastseen = Wt::fromUTF8((std::string)res.at(i)["lastseen"]);
00103 retval.push_back(s);
00104 }
00105 } catch(Exception &e) {
00106 std::cerr << "Database exception!\n";
00107 std::cerr << e.what() << std::endl;
00108 }
00109 return retval;
00110 }
00111
00112 HangmanDb::Score HangmanDb::getUserPosition(const std::wstring &user)
00113 {
00114 try {
00115 Connection con("hangman", "localhost", DbUser().c_str(), DbPass().c_str());
00116 Query q = con.query();
00117 q << "select user, numgames, score, lastseen from users "
00118 << "order by score desc";
00119 StoreQueryResult res = q.store();
00120
00121
00122 for(unsigned int i = 0; i < res.size(); ++i) {
00123 if(Wt::fromUTF8((std::string)res.at(i)["user"]) == user) {
00124 struct Score s;
00125 s.number = i + 1;
00126 s.user = Wt::fromUTF8((std::string)res.at(i)["user"]);
00127 s.numgames = res.at(i)["numgames"];
00128 s.score = res.at(i)["score"];
00129 s.lastseen = Wt::fromUTF8((std::string)res.at(i)["lastseen"]);
00130 return s;
00131 }
00132 }
00133 } catch(Exception &e) {
00134 std::cerr << "Database exception!\n";
00135 std::cerr << e.what() << std::endl;
00136 }
00137 Score s;
00138 s.number=0;
00139 s.user=L"DBase error";
00140 s.numgames = s.score = 0;
00141 return s;
00142 }