/
tytyshka
/
Typing_Race_Game
Обзор
Документация
Войти
/
tytyshka
/
Typing_Race_Game
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
db.cpp
85 строк
3 KB
tytyshka
Client
16 дек 2025, 21:37
16 дек 2025, 21:37
f770ab5
Код
Авторство
О чём код?
#include <iostream> #include <chrono> #include <sqlite3.h> #include "db.h" DBManager::DBManager() : db_(nullptr) {} DBManager::~DBManager() { close(); } bool DBManager::open(const std::string& filename) { if (sqlite3_open(filename.c_str(), (sqlite3**)&db_) != SQLITE_OK) { std::cerr << "[DB] open failed: " << sqlite3_errmsg((sqlite3*)db_) << "\n"; db_ = nullptr; return false; } return init_schema(); } void DBManager::close() { if (db_) { sqlite3_close((sqlite3*)db_); db_ = nullptr; } } bool DBManager::init_schema() { const char* sql = "CREATE TABLE IF NOT EXISTS scores (" "id INTEGER PRIMARY KEY AUTOINCREMENT," "player_id TEXT," "username TEXT," "score INTEGER," "ts INTEGER" ");"; char* err = nullptr; if (sqlite3_exec((sqlite3*)db_, sql, nullptr, nullptr, &err) != SQLITE_OK) { std::cerr << "[DB] init schema failed: " << (err ? err : "") << "\n"; sqlite3_free(err); return false; } return true; } bool DBManager::save_score(const std::string& player_id, const std::string& username, int score) { const char* sql = "INSERT INTO scores (player_id, username, score, ts) VALUES (?, ?, ?, ?);"; sqlite3_stmt* stmt = nullptr; if (sqlite3_prepare_v2((sqlite3*)db_, sql, -1, &stmt, nullptr) != SQLITE_OK) { std::cerr << "[DB] prepare failed\n"; return false; } sqlite3_bind_text(stmt, 1, player_id.c_str(), -1, SQLITE_TRANSIENT); sqlite3_bind_text(stmt, 2, username.c_str(), -1, SQLITE_TRANSIENT); sqlite3_bind_int(stmt, 3, score); uint64_t ts = (uint64_t)std::chrono::duration_cast<std::chrono::milliseconds>( std::chrono::system_clock::now().time_since_epoch()) .count(); sqlite3_bind_int64(stmt, 4, (sqlite3_int64)ts); if (sqlite3_step(stmt) != SQLITE_DONE) { std::cerr << "[DB] insert failed\n"; sqlite3_finalize(stmt); return false; } sqlite3_finalize(stmt); return true; } std::vector<DBEntry> DBManager::top_scores(int limit) { std::vector<DBEntry> out; const char* sql = "SELECT player_id, username, score, ts FROM scores ORDER BY score DESC, ts ASC LIMIT ?;"; sqlite3_stmt* stmt = nullptr; if (sqlite3_prepare_v2((sqlite3*)db_, sql, -1, &stmt, nullptr) != SQLITE_OK) { return out; } sqlite3_bind_int(stmt, 1, limit); while (sqlite3_step(stmt) == SQLITE_ROW) { DBEntry e; e.player_id = (const char*)sqlite3_column_text(stmt, 0); e.username = (const char*)sqlite3_column_text(stmt, 1); e.score = sqlite3_column_int(stmt, 2); e.ts = (uint64_t)sqlite3_column_int64(stmt, 3); out.push_back(e); } sqlite3_finalize(stmt); return out; }