Advertisement
Guest User

DataBase.cpp

a guest
Jul 4th, 2017
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.56 KB | None | 0 0
  1. //File:
  2. //DataBase.cpp
  3.  
  4. #include "DataBase.h"
  5.  
  6.  
  7. DataBase::DataBase()
  8. {
  9.     //resetDataBase();
  10.     int rc;
  11.     char* errMsg;
  12.  
  13.     rc = sqlite3_open(DB_FILENAME, &_db);
  14.     if (rc)
  15.     {
  16.         string error = string("Can't open database: ") + sqlite3_errmsg(_db);
  17.         sqlite3_close(_db);
  18.         throw exception(error.c_str());
  19.     }
  20.     string sql = "select count(*) from t_games;";
  21.     rc = sqlite3_exec(_db, sql.c_str(), callbackCount, &currGameID, &errMsg);
  22.     if (rc != SQLITE_OK)
  23.     {
  24.         string error = string("SQL error: ") + sqlite3_errmsg(_db);
  25.         sqlite3_free(errMsg);
  26.         throw exception(error.c_str());
  27.     }
  28. }
  29.  
  30.  
  31. DataBase::~DataBase()
  32. {
  33.     sqlite3_close(_db);
  34. }
  35.  
  36. bool DataBase::isUserExists(string username)
  37. {
  38.     unordered_map<string, vector<string>> results;
  39.     char* errMsg;
  40.     string sql = "select username from t_users where username = \"" + username + "\";";
  41.     int rc = sqlite3_exec(_db, sql.c_str(), callbackPutIntoResults, &results, &errMsg);
  42.     if (rc != SQLITE_OK)
  43.     {
  44.         string error = string("SQL error: ") + sqlite3_errmsg(_db);
  45.         sqlite3_free(errMsg);
  46.         throw exception(error.c_str());
  47.     }
  48.     return results.size();
  49. }
  50.  
  51. bool DataBase::addNewUser(string username, string password, string email)
  52. {
  53.     char* errMsg;
  54.     string sql = "insert into t_users (username,password,email) values (\"" + username + "\",\"" + password + "\",\"" + email + "\");";
  55.     int rc = sqlite3_exec(_db,sql.c_str() , nullptr, nullptr, &errMsg);
  56.     if (rc != SQLITE_OK)
  57.     {
  58.         sqlite3_free(errMsg);
  59.         return false;
  60.     }
  61.     return true;
  62. }
  63.  
  64. bool DataBase::isUserAndPassMatch(string username, string password)
  65. {
  66.     /*if (!isUserExists(username))
  67.         return false;  //Useless condition(?) */
  68.     unordered_map<string, vector<string>> results;
  69.     char* errMsg;
  70.     string sql = "select username,password from t_users where username = \"" + username + "\" and password = \"" + password + "\";";
  71.     int rc = sqlite3_exec(_db, sql.c_str(), callbackPutIntoResults, &results, &errMsg);
  72.     if (rc != SQLITE_OK)
  73.     {
  74.         string error = string("SQL error: ") + sqlite3_errmsg(_db);
  75.         sqlite3_free(errMsg);
  76.         throw exception(error.c_str());
  77.     }
  78.     return results.size();
  79. }
  80.  
  81. vector<Question*> DataBase::initQuestions(int questionNo)
  82. {  
  83.     vector<Question*> ans;
  84.     char *errMsg;
  85.     string sql = "select * from t_questions order by random() limit "+to_string(questionNo)+";";
  86.     int rc = sqlite3_exec(_db, sql.c_str(), callbackQuestions, &ans , &errMsg);
  87.     if (rc != SQLITE_OK)
  88.     {
  89.         string error = string("SQL error: ") + sqlite3_errmsg(_db);
  90.         sqlite3_free(errMsg);
  91.         throw exception(error.c_str());
  92.     }
  93.     return ans;
  94. }
  95.  
  96. vector<string> DataBase::getBestScores()
  97. {
  98.     char *errMsg;
  99.     string sql = "select username,sum(is_correct) as score from t_players_answers where is_correct = 1 group by username order by score desc limit 3;";
  100.     vector<string> ans;
  101.     int rc = sqlite3_exec(_db, sql.c_str(), callBackScoresAndStatus, &ans , &errMsg);
  102.     if (rc != SQLITE_OK)
  103.     {
  104.         string error = string("SQL error: ") + sqlite3_errmsg(_db);
  105.         sqlite3_free(errMsg);
  106.         throw exception(error.c_str());
  107.     }
  108.     return ans;
  109. }
  110.  
  111. vector<string> DataBase::getPersonalStatus(string username)
  112. {
  113.     char *errMsg;
  114.     string sql = "select count(distinct game_id) as NumOfGames ,sum(is_correct) as NumOfRightAnswers ,count(username)-sum(is_correct) as NumOfWrongAnswers ,avg(answer_time) as AvgTimeForAnswer from t_players_answers where username = \"" + username + "\";";
  115.     vector<string> ans;
  116.     int rc = sqlite3_exec(_db, sql.c_str(), callBackScoresAndStatus, &ans, &errMsg);
  117.     if (rc != SQLITE_OK)
  118.     {
  119.         string error = string("SQL error: ") + sqlite3_errmsg(_db);
  120.         sqlite3_free(errMsg);
  121.         throw exception(error.c_str());
  122.     }
  123.     return ans;
  124. }
  125.  
  126. int DataBase::insertNewGame()
  127. {
  128.     cout <<"CurrGameID: " <<  currGameID << endl;
  129.     char* errMsg;
  130.     string sql = "insert into t_games (game_id, status, start_time) values ("+to_string(currGameID)+",0,\""+getTime()+"\");";
  131.     cout << "command:" << endl << sql << endl;
  132.     int rc = sqlite3_exec(_db, sql.c_str(), nullptr, nullptr, &errMsg);
  133.     if (rc != SQLITE_OK && rc != SQLITE_DONE)
  134.     {
  135.  
  136.         cout << "SQLError: " << rc << endl;
  137.         string error = string("SQL error: ") + sqlite3_errmsg(_db);
  138.         cout << "Error: " << endl << error << endl;
  139.         sqlite3_free(errMsg);
  140.         throw exception(error.c_str());
  141.     }
  142.     return currGameID++;
  143. }
  144.  
  145. bool DataBase::updateGameStatus(int gameID)
  146. {
  147.     char* errMsg;
  148.     string sql = "update t_games set status = 1, end_time = " + getTime() + " where game_id = " + to_string(gameID) + ";";
  149.     int rc = sqlite3_exec(_db, sql.c_str(), nullptr, nullptr, &errMsg);
  150.     if (rc != SQLITE_OK)
  151.     {
  152.         sqlite3_free(errMsg);
  153.         return false;
  154.     }
  155.     return true;
  156. }
  157.  
  158. bool DataBase::addAnswerToPlayer(int gameID, string username, int questionID, string answer, bool isCorrect, int answerTime)
  159. {
  160.     char* errMsg;
  161.     string sql = "insert into t_players_answers (game_id,username,question_id,player_answer,is_correct,answer_time) values (" + to_string(gameID) + ",\"" + username + "\"," + to_string(questionID) + ",\"" + answer + "\"," + to_string(isCorrect) + "," + to_string(answerTime) + ");";
  162.     int rc = sqlite3_exec(_db, sql.c_str(), nullptr, nullptr, &errMsg);
  163.     if (rc != SQLITE_OK)
  164.     {
  165.         sqlite3_free(errMsg);
  166.         return false;
  167.     }
  168.     return true;
  169. }
  170.  
  171.  
  172.  
  173. string DataBase::getTime()
  174. {
  175.     time_t rawtime;
  176.     struct tm * timeinfo = new struct tm();
  177.     char buffer[80];
  178.  
  179.     time(&rawtime);
  180.     //timeinfo = localtime(&rawtime);
  181.     localtime_s(timeinfo, &rawtime);
  182.  
  183.     strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", timeinfo);
  184.     string str(buffer);
  185.     return str;
  186. }
  187.  
  188. int DataBase::callbackPutIntoResults(void * _results, int argc, char ** argv, char ** azCol)
  189. {
  190.     unordered_map<string, vector<string>> *results = (unordered_map<string, vector<string>>*) _results;
  191.     for (int i = 0; i < argc; i++)
  192.     {
  193.         auto it = results->find(azCol[i]);
  194.         if (it != results->end())
  195.         {
  196.             it->second.push_back(argv[i]);
  197.         }
  198.         else
  199.         {
  200.             pair<string, vector<string>> p;
  201.             p.first = azCol[i];
  202.             p.second.push_back(argv[i]);
  203.             results->insert(p);
  204.         }
  205.     }
  206.     return 0;
  207. }
  208.  
  209. int DataBase::callbackQuestions(void * ans, int argc, char ** argv, char ** azCol)
  210. {
  211.     ((vector<Question*>*)ans)->push_back(new Question(atoi(argv[0]),argv[1],argv[2],argv[3],argv[4],argv[5]));
  212.     return 0;
  213. }
  214.  
  215. int DataBase::callBackScoresAndStatus(void * ans, int argc, char ** argv, char ** azCol)
  216. {
  217.     if (argv[0] == string("0"))
  218.         for (int i = 0; i < 4; i++)
  219.             ((vector<string>*)ans)->push_back("0");
  220.     else
  221.         for (int i = 0; i < argc; i++)
  222.             ((vector<string>*)ans)->push_back(argv[i]);
  223.     return 0;
  224. }
  225.  
  226. int DataBase::callbackCount(void * ans, int argc, char ** argv, char ** azCol)
  227. {
  228.     *(int*)ans = atoi(argv[0]) + 1;
  229.     return 0;
  230. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement