db.cpp 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. #include "db.h"
  2. #include <SQLiteCpp/VariadicBind.h>
  3. #include <iomanip>
  4. #include <iostream>
  5. #include <sstream>
  6. DBData::DBData(void)
  7. : db("space-data.db", SQLite::OPEN_READWRITE | SQLite::OPEN_CREATE) {
  8. init();
  9. }
  10. // DBData::DBData(void) : sql(std::string(DB_CONNECT_STRING)) {}
  11. DBData::~DBData() {}
  12. void DBData::init(void) {
  13. db.exec("CREATE TABLE IF NOT EXISTS \
  14. settings(username TEXT, setting TEXT, value TEXT, \
  15. PRIMARY KEY(username, setting));");
  16. db.exec("CREATE TABLE IF NOT EXISTS \
  17. scores ( \"username\" TEXT, \"when\" INTEGER, \
  18. \"date\" TEXT, \"hand\" INTEGER, \"score\" INTEGER, \
  19. PRIMARY KEY(\"username\", \"date\", \"hand\"));");
  20. }
  21. void DBData::setUser(std::string currentUser) { user = currentUser; }
  22. std::string DBData::getSetting(const std::string &setting,
  23. std::string ifMissing) {
  24. SQLite::Statement query(
  25. db, "SELECT value FROM settings WHERE username=? AND setting=?");
  26. query.reset();
  27. query.bind(1, user);
  28. query.bind(2, setting);
  29. if (query.executeStep()) {
  30. std::string value = query.getColumn(0);
  31. return value;
  32. };
  33. return ifMissing;
  34. }
  35. void DBData::setSetting(const std::string &setting, const std::string &value) {
  36. SQLite::Statement stmt(
  37. db, "REPLACE INTO settings(username, setting, value) VALUES(?,?,?);");
  38. stmt.reset();
  39. stmt.bind(1, user);
  40. stmt.bind(2, setting);
  41. stmt.bind(3, value);
  42. stmt.exec();
  43. }
  44. void DBData::save_score(time_t when, std::string date, int hand, int score) {
  45. SQLite::Statement stmt(db, "INSERT INTO scores( \"username\", \"when\", "
  46. "\"date\", \"hand\", \"score\") VALUES(?,?,?,?);");
  47. stmt.bind(1, user);
  48. stmt.bind(2, when);
  49. stmt.bind(3, date);
  50. stmt.bind(4, hand);
  51. stmt.bind(5, score);
  52. stmt.exec();
  53. }
  54. bool DBData::has_played_day(time_t day) {
  55. // get date from this
  56. // std::stringstream ss;
  57. // ss << std::put_time(std::localtime(&day), "%Y/%0m/%0d");
  58. std::string today = make_date(day);
  59. SQLite::Statement stmt(
  60. db, "SELECT COUNT(*) FROM scores WHERE \"username\"=? AND \"DATE\"=?;");
  61. stmt.bind(1, user);
  62. stmt.bind(2, today);
  63. int count = -1;
  64. if (stmt.executeStep()) {
  65. count = stmt.getColumn(0);
  66. };
  67. return (count > 0);
  68. }
  69. std::string make_date(time_t tt) {
  70. std::stringstream ss;
  71. ss << std::put_time(std::localtime(&tt), "%Y/%0m/%0d");
  72. std::string date = ss.str();
  73. return date;
  74. }