From 598c7ce1d04cb9139b3051aa02f3d083640eaeca Mon Sep 17 00:00:00 2001 From: Gent S Date: Fri, 18 Dec 2020 20:32:49 -0500 Subject: [PATCH] Add racing-related DB functions --- src/Database.cpp | 68 ++++++++++++++++++++++++++++++++++++++++++++++++ src/Database.hpp | 12 +++++++++ 2 files changed, 80 insertions(+) diff --git a/src/Database.cpp b/src/Database.cpp index a7cdca8..eda0e8e 100644 --- a/src/Database.cpp +++ b/src/Database.cpp @@ -1758,3 +1758,71 @@ bool Database::sendEmail(EmailData* data, std::vector attachments) { return true; } +Database::RaceRanking Database::getTopRaceRanking(int epID) { + std::lock_guard lock(dbCrit); + const char* sql = R"( + SELECT + "EPID", + "PlayerID", + "Score", + "RingCount", + "Time", + "Timestamp" + FROM "RaceResults" + WHERE "EPID" = ? + ORDER BY "Score" DESC + LIMIT 1; + )"; + sqlite3_stmt* stmt; + + sqlite3_prepare_v2(db, sql, -1, &stmt, NULL); + sqlite3_bind_int(stmt, 1, epID); + + Database::RaceRanking ranking = {}; + if (sqlite3_step(stmt) != SQLITE_ROW) { + // this race hasn't been run before, so return a blank ranking + sqlite3_finalize(stmt); + return ranking; + } + + assert(epID == sqlite3_column_int(stmt, 0)); // EPIDs should always match + + ranking.EPID = epID; + ranking.PlayerID = sqlite3_column_int(stmt, 1); + ranking.Score = sqlite3_column_int(stmt, 2); + ranking.RingCount = sqlite3_column_int(stmt, 3); + ranking.Time = sqlite3_column_int64(stmt, 4); + ranking.Timestamp = sqlite3_column_int64(stmt, 5); + + sqlite3_finalize(stmt); + return ranking; +} + +void Database::postRaceRanking(Database::RaceRanking ranking) { + std::lock_guard lock(dbCrit); + + const char* sql = R"( + INSERT INTO "RaceResults" + ("EPID", "PlayerID", "Score", "RingCount", "Time", "Timestamp") + VALUES(?, ?, ?, ?, ?, ?); + )"; + sqlite3_stmt* stmt; + + sqlite3_prepare_v2(db, sql, -1, &stmt, NULL); + sqlite3_bind_int(stmt, 1, ranking.EPID); + sqlite3_bind_int(stmt, 2, ranking.PlayerID); + sqlite3_bind_int(stmt, 3, ranking.Score); + sqlite3_bind_int(stmt, 4, ranking.RingCount); + sqlite3_bind_int64(stmt, 5, ranking.Time); + sqlite3_bind_int64(stmt, 6, ranking.Timestamp); + + if (sqlite3_step(stmt) != SQLITE_DONE) { + std::cout << "[WARN] Database: Failed to post race result" << std::endl; + } + + sqlite3_finalize(stmt); + return; +} + + + diff --git a/src/Database.hpp b/src/Database.hpp index 6ed8cca..03eade7 100644 --- a/src/Database.hpp +++ b/src/Database.hpp @@ -29,6 +29,14 @@ namespace Database { uint64_t SendTime; uint64_t DeleteTime; }; + struct RaceRanking { + int EPID; + int PlayerID; + int Score; + int RingCount; + uint64_t Time; + uint64_t Timestamp; + }; void open(); void close(); @@ -88,4 +96,8 @@ namespace Database { void deleteEmails(int playerID, int64_t* indices); int getNextEmailIndex(int playerID); bool sendEmail(EmailData* data, std::vector attachments); + + // racing + RaceRanking getTopRaceRanking(int epID); + void postRaceRanking(RaceRanking ranking); }