From 6794dada92eaee8187563cf0658106f26a6d6408 Mon Sep 17 00:00:00 2001 From: Nikola Petrov Date: Mon, 16 Feb 2026 23:07:22 +0100 Subject: [PATCH] store id in DB --- CMakeLists.txt | 1 + app/inc/App.hpp | 1 + app/inc/DnaStore.hpp | 2 + app/src/App.cpp | 3 +- app/src/DnaStore.cpp | 26 ++++++++---- shared/inc/sql.hpp | 3 +- shared/inc/values/DnaDB.hpp | 20 +++++++++ shared/inc/values/DnaManager.hpp | 6 +-- shared/src/sql.cpp | 4 ++ shared/src/values/DnaDB.cpp | 69 ++++++++++++++++++++++++++++++++ 10 files changed, 123 insertions(+), 12 deletions(-) create mode 100644 shared/inc/values/DnaDB.hpp create mode 100644 shared/src/values/DnaDB.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 587c14a..122f341 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -33,6 +33,7 @@ add_library(shared STATIC shared/src/values/Similarity.cpp shared/src/TcpSocket.cpp shared/src/sql.cpp + shared/src/values/DnaDB.cpp ) add_executable(app diff --git a/app/inc/App.hpp b/app/inc/App.hpp index 1f9b894..1c796d2 100644 --- a/app/inc/App.hpp +++ b/app/inc/App.hpp @@ -1,6 +1,7 @@ #include #include "canvas/Canvas.hpp" #include "DnaStore.hpp" + class App { diff --git a/app/inc/DnaStore.hpp b/app/inc/DnaStore.hpp index 9b687a9..a95c9ab 100644 --- a/app/inc/DnaStore.hpp +++ b/app/inc/DnaStore.hpp @@ -2,6 +2,8 @@ namespace DnaStore { + void init(); + void deinit(); void load(DnaManagerData *data); void saveData(DnaManagerData *data); void saveVec(DnaManagerData *data); diff --git a/app/src/App.cpp b/app/src/App.cpp index be8b05c..11cc763 100644 --- a/app/src/App.cpp +++ b/app/src/App.cpp @@ -64,7 +64,7 @@ void App::init(int screenWidth, int screenHeight) this->screenWidth = screenWidth; this->screenHeight = screenHeight; this->canvas.init(screenWidth); - + DnaStore::init(); // int s = MeasureText("GEN 9999: 999/999", 20); // TraceLog(LOG_INFO, "%d", s); @@ -239,4 +239,5 @@ void App::deinit() UnloadRenderTexture(canvasTexure[i]); } canvas.deinit(); + DnaStore::deinit(); } \ No newline at end of file diff --git a/app/src/DnaStore.cpp b/app/src/DnaStore.cpp index 7c96a7e..abbeb65 100644 --- a/app/src/DnaStore.cpp +++ b/app/src/DnaStore.cpp @@ -9,6 +9,7 @@ #include "sys.hpp" #include "DnaStore.hpp" #include "TcpSocket.hpp" +#include "values/DnaDB.hpp" #include @@ -17,19 +18,30 @@ #define VECTOR_FILE_NAME "VECTOR.bin" #define GEN_FILE_PATTRN "gen/%04d.bin" #define HOST_NAME "localhost" +#define DB_NAME "data.db" + +DnaDB dnaDB; + +void DnaStore::init(){ + const char* filename = sys::transformFilePath(DB_NAME); + dnaDB.init(filename); +} + +void DnaStore::deinit(){ + dnaDB.deinit(); +} void DnaStore::load(DnaManagerData *data) { const char *dir = sys::transformFilePath("gen"); std::filesystem::create_directory(dir); - if (sys::fileExists(ID_FILE_NAME)) - { - sys::loadDataFromFile(ID_FILE_NAME, &data->id, sizeof(int64_t)); - } - else - { + + std::vector ids = dnaDB.getUserIds(); + if(!ids.empty()){ + data->id = ids[0]; + }else{ data->id = time(nullptr); - sys::saveDataToFile(ID_FILE_NAME, &data->id, sizeof(int64_t)); + dnaDB.insertUser(data->id, 0); } if (sys::fileExists(DATA_FILE_NAME)) diff --git a/shared/inc/sql.hpp b/shared/inc/sql.hpp index ea7590d..a2449f9 100644 --- a/shared/inc/sql.hpp +++ b/shared/inc/sql.hpp @@ -33,7 +33,7 @@ constexpr char DB_NAME[] = "data.db"; struct sqlite3; struct sqlite3_stmt; -#define SQLITE_ROW 100 /* sqlite3_step() has another row ready */ +#define SQLITE_ROW 100 /* sqlite3_step() has another row ready */ #define SQL_DONE 101 #define SQL_NULL 5 #define SQLITE_OK 0 @@ -44,6 +44,7 @@ namespace sql void init(); void shutdown(); int open(const char *filename, sqlite3 **ppDb); + int exec(sqlite3 *db, const char *sql, int (*callback)(void *, int, char **, char **), void *first_arg, char **errmsg); int prepare_v2(sqlite3 *db, const char *zSql, int nByte, sqlite3_stmt **pStmt, const char **pzTail); int bind_int64(sqlite3_stmt *pStmt, int column, int64_t value); int step(sqlite3_stmt *pStmt); diff --git a/shared/inc/values/DnaDB.hpp b/shared/inc/values/DnaDB.hpp new file mode 100644 index 0000000..f05f6a3 --- /dev/null +++ b/shared/inc/values/DnaDB.hpp @@ -0,0 +1,20 @@ +#include +#include + +struct sqlite3; + +class DnaDB +{ + sqlite3 *db; + +public: + void init(const char *db_name = "data.db"); + void deinit(); + std::vector getUserIds(); + int insertUser(int64_t id, int64_t max_gen); + int updateUser(int64_t id, int64_t max_gen); + + void getGenerations(); + void getLikesForGeneration(); + void getVectorForGeneration(); +}; diff --git a/shared/inc/values/DnaManager.hpp b/shared/inc/values/DnaManager.hpp index 50332da..5ba0118 100644 --- a/shared/inc/values/DnaManager.hpp +++ b/shared/inc/values/DnaManager.hpp @@ -7,9 +7,9 @@ enum Liked { - tbd, - yes, - no + tbd = 0, + yes = 1, + no = 2, }; struct UiUnit diff --git a/shared/src/sql.cpp b/shared/src/sql.cpp index c60d1d9..efed439 100644 --- a/shared/src/sql.cpp +++ b/shared/src/sql.cpp @@ -78,6 +78,10 @@ namespace sql { return sqlite3_open(filename, ppDb); } + int exec(sqlite3 *db, const char *sql, int (*callback)(void *, int, char **, char **), void *first, char **errmsg) + { + return sqlite3_exec(db, sql, callback, first, errmsg); + } int prepare_v2(sqlite3 *db, const char *zSql, int nByte, sqlite3_stmt **pStmt, const char **pzTail) { return sqlite3_prepare_v2(db, zSql, nByte, pStmt, pzTail); diff --git a/shared/src/values/DnaDB.cpp b/shared/src/values/DnaDB.cpp new file mode 100644 index 0000000..820da90 --- /dev/null +++ b/shared/src/values/DnaDB.cpp @@ -0,0 +1,69 @@ +#include "values/DnaDB.hpp" + +#include + + + +void DnaDB::init(const char * db_name) +{ + sql::init(); + int res = sql::open(db_name, &db); + + constexpr char create_user_table[] = "CREATE TABLE IF NOT EXISTS user_table ( ID INTEGER PRIMARY KEY, USER_ID INTEGER, MAX_GENERATION INTEGER);"; + res = sql::exec(db, create_user_table, nullptr, nullptr, nullptr); +} + +void DnaDB::deinit() +{ + sql::close(db); + sql::shutdown(); +} + +std::vector DnaDB::getUserIds() +{ + constexpr char sql[] = "SELECT USER_ID FROM user_table;"; + sqlite3_stmt *stmt; + sql::prepare_v2(db, sql, -1, &stmt, nullptr); + std::vector ids; + while (sql::step(stmt) != SQL_DONE) + { + int64_t id = sql::column_int64(stmt, 0); + ids.push_back(id); + } + sql::finalize(stmt); + return ids; +} + +int DnaDB::insertUser(int64_t id, int64_t max_gen){ + constexpr char sql[] = "INSERT INTO user_table (USER_ID, MAX_GENERATION) VALUES (?,?);"; + sqlite3_stmt *stmt; + sql::prepare_v2(db, sql, -1, &stmt, nullptr); + sql::bind_int64(stmt, 1, id); + sql::bind_int64(stmt, 2, max_gen); + int ret = sql::step(stmt); + sql::finalize(stmt); + return ret; +} + +int DnaDB::updateUser(int64_t id, int64_t max_gen){ + constexpr char sql[] = "UPDATE user_table SET MAX_GENERATION = ? WHERE USER_ID = ?;"; + sqlite3_stmt *stmt; + sql::prepare_v2(db, sql, -1, &stmt, nullptr); + sql::bind_int64(stmt, 1, max_gen); + sql::bind_int64(stmt, 2, id); + int ret = sql::step(stmt); + sql::finalize(stmt); + return ret; +} + +void DnaDB::getGenerations() +{ +} + +void DnaDB::getLikesForGeneration() +{ +} + +void DnaDB::getVectorForGeneration() +{ +}