00001 /* 00002 * Copyright (C) 2011 Emweb bvba, Heverlee, Belgium. 00003 * 00004 * See the LICENSE file for terms of use. 00005 */ 00006 00007 #include "Session.h" 00008 00009 #include <Wt/WApplication> 00010 #include <Wt/WLogger> 00011 00012 using namespace Wt; 00013 00014 Session::Session() 00015 : sqlite3_(WApplication::instance()->appRoot() + "hangman.db") 00016 { 00017 session_.setConnection(sqlite3_); 00018 sqlite3_.setProperty("show-queries", "true"); 00019 00020 session_.mapClass<User>("user"); 00021 00022 Dbo::Transaction transaction(session_); 00023 try { 00024 session_.createTables(); 00025 session_.add(new User("guest", "guest")); 00026 WApplication::instance()->log("info") << "Database created"; 00027 } catch (...) { 00028 WApplication::instance()->log("info") << "Using existing database"; 00029 } 00030 00031 transaction.commit(); 00032 } 00033 00034 bool Session::login(std::string name, std::string password) 00035 { 00036 Dbo::Transaction transaction(session_); 00037 user_ = session_.find<User>().where("name = ?").bind(name); 00038 if (!user_) 00039 user_ = session_.add(new User(name, password)); 00040 00041 bool ok = user_->authenticate(password); 00042 00043 transaction.commit(); 00044 00045 return ok; 00046 } 00047 00048 void Session::addToScore(int s) 00049 { 00050 user_.modify()->score += s; 00051 ++user_.modify()->gamesPlayed; 00052 user_.modify()->lastLogin = WDateTime::currentDateTime(); 00053 } 00054 00055 std::vector<User> Session::topUsers(int limit) 00056 { 00057 Dbo::Transaction transaction(session_); 00058 Users top = session_.find<User>().orderBy("score desc").limit(20); 00059 00060 std::vector<User> result; 00061 for (Users::const_iterator i = top.begin(); i != top.end(); ++i) 00062 result.push_back(**i); 00063 00064 transaction.commit(); 00065 00066 return result; 00067 } 00068 00069 int Session::findRanking(const User *user) 00070 { 00071 Dbo::Transaction transaction(session_); 00072 00073 int ranking = 00074 session_.query<int>("select distinct count(score) from user") 00075 .where("score > ?") 00076 .bind(user->score); 00077 00078 transaction.commit(); 00079 00080 return ranking + 1; 00081 }
1.7.2