diff --git a/client/src/Entrypoint.ts b/client/src/Entrypoint.ts index b53a2dd..e578a9a 100644 --- a/client/src/Entrypoint.ts +++ b/client/src/Entrypoint.ts @@ -22,7 +22,7 @@ class Entrypoint { private static initStatus = { keyInit: false, fileCache: false - } + }; private static initCheck(): void { var done = true; diff --git a/server/CMakeLists.txt b/server/CMakeLists.txt index 87317c8..1e7a5ed 100644 --- a/server/CMakeLists.txt +++ b/server/CMakeLists.txt @@ -12,7 +12,7 @@ if(CMAKE_COMPILER_IS_GNUCXX) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -static") endif() -add_executable(server ${server_src}) +add_executable(server ${server_src} src/db/_init_sql.cpp) if(${CMAKE_SYSTEM_NAME} STREQUAL "Windows") target_link_libraries(server wsock32 ws2_32) diff --git a/server/src/crypto/keyex.cpp b/server/src/crypto/keyex.cpp index a21c442..9a4ca5c 100644 --- a/server/src/crypto/keyex.cpp +++ b/server/src/crypto/keyex.cpp @@ -18,7 +18,7 @@ sosc::Packet sosc::cgc::KeyExchange::GenerateRequest() const { } bool sosc::cgc::KeyExchange::ParseRequest - (const Packet& request, Packet* response) + (const Packet& request, Packet* response, uint8_t id) { if(request.GetId() != 1 || request.RegionCount() != 3) return false; @@ -33,7 +33,7 @@ bool sosc::cgc::KeyExchange::ParseRequest this->private_key = BigUInt::ModPow(public_key, this->secret, modulus); public_key = BigUInt::ModPow(generator, this->secret, modulus); - *response = Packet(1, { public_key.ToString() }); + *response = Packet(id, { public_key.ToString() }); return true; } diff --git a/server/src/crypto/keyex.hpp b/server/src/crypto/keyex.hpp index 20d8214..29811e7 100644 --- a/server/src/crypto/keyex.hpp +++ b/server/src/crypto/keyex.hpp @@ -11,7 +11,7 @@ public: KeyExchange(); Packet GenerateRequest() const; - bool ParseRequest(const Packet& request, Packet* response); + bool ParseRequest(const Packet& request, Packet* response, uint8_t id); bool ParseResponse(const Packet& response); inline bool Succeeded() const { diff --git a/server/src/db/_init_sql.cpp b/server/src/db/_init_sql.cpp new file mode 100644 index 0000000..5db77c2 --- /dev/null +++ b/server/src/db/_init_sql.cpp @@ -0,0 +1,10 @@ +#include + +const char* _mem_db_sql = + "CREATE TABLE "; + +const std::vector _hard_db_sql = { + /** START MIGRATION 0 **/ + "CREATE TABLE ", + /** END MIGRATION 0 **/ +}; \ No newline at end of file diff --git a/server/src/db/database.cpp b/server/src/db/database.cpp index 85ca9b7..3440713 100644 --- a/server/src/db/database.cpp +++ b/server/src/db/database.cpp @@ -1 +1,31 @@ #include "database.hpp" +#include "_init_sql.cpp" + +static struct { + bool ready = false; + + sqlite3* mem_db; + sqlite3* hard_db; +} _ctx; + +void sosc::db::init_databases() { + if(_ctx.ready) + return; + + sqlite3_open(":memory:", &_ctx.mem_db); + sqlite3_exec(_ctx.mem_db, _mem_db_sql, nullptr, nullptr, nullptr); + + sqlite3_open("scape.db", &_ctx.hard_db); + + + _ctx.ready = true; +} + +void sosc::db::close_databases() { + if(!_ctx.ready) + return; + + sqlite3_close(_ctx.mem_db); + sqlite3_close(_ctx.hard_db); + _ctx.ready = false; +} \ No newline at end of file diff --git a/server/src/db/database.hpp b/server/src/db/database.hpp index d467dfc..01447f9 100644 --- a/server/src/db/database.hpp +++ b/server/src/db/database.hpp @@ -2,10 +2,33 @@ #define SOSC_DATABASE_H #include "sqlite/sqlite3.h" +#include namespace sosc { namespace db { - +class ResultSet { +public: + +private: + +}; + +class Query { +public: + template + static T ScalarOnce(); + static void NonQueryOnce(); + static ResultSet Once(); + + +private: + +}; + +// THE FOLLOWING ARE NOT THREAD SAFE !! +// CALL THEM ONLY WHEN MASTER POOL IS INACTIVE +void init_databases(); +void close_databases(); }} #endif diff --git a/server/src/hosts/master_intra.cpp b/server/src/hosts/master_intra.cpp index f0b5001..3fa43d2 100644 --- a/server/src/hosts/master_intra.cpp +++ b/server/src/hosts/master_intra.cpp @@ -18,13 +18,16 @@ bool sosc::MasterIntra::Process() { return this->Close(Packet(EncryptionError, { "\x01" })); Packet response; - if(!this->key.ParseRequest(pck, &response)) + if(!this->key.ParseRequest(pck, &response, KeyExchange)) return this->Close(Packet(EncryptionError, { "\x02" })); this->sock.Send(response); break; case Authentication: + break; + case StatusUpdate: + break; default: this->Close();