From 0ff787abda492fa1c2b68d687875bbf32c3dc037 Mon Sep 17 00:00:00 2001 From: Kayne Ruse Date: Tue, 6 May 2014 18:57:49 +1000 Subject: [PATCH] Added Unloading and Deletion of user accounts --- server/server_connections.cpp | 9 +++++++++ server/server_database.cpp | 27 +++++++++++++++++++++++++-- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/server/server_connections.cpp b/server/server_connections.cpp index d0105e0..08fcba1 100644 --- a/server/server_connections.cpp +++ b/server/server_connections.cpp @@ -122,6 +122,15 @@ void ServerApplication::HandleDisconnect(SerialPacket packet) { network.Send(&clientMap[packet.clientInfo.clientIndex].address, buffer, PACKET_BUFFER_SIZE); clientMap.erase(packet.clientInfo.clientIndex); + //unload the client's account + //TODO: change clientIndex to accountIndex for player ID + for (auto it : accountMap) { + if (it.second.clientIndex == packet.clientInfo.clientIndex) { + UnloadUserAccount(it.first); + break; + } + } + //prep the delete packet SerialPacket delPacket; delPacket.meta.type = SerialPacket::Type::CHARACTER_DELETE; diff --git a/server/server_database.cpp b/server/server_database.cpp index 1b9f4b5..4f34947 100644 --- a/server/server_database.cpp +++ b/server/server_database.cpp @@ -32,6 +32,7 @@ static const char* CREATE_USER_ACCOUNT = "INSERT INTO UserAccounts (username) VALUES (?);"; static const char* LOAD_USER_ACCOUNT = "SELECT * FROM UserAccounts WHERE username = ?;"; static const char* SAVE_USER_ACCOUNT = "INSERT OR REPLACE INTO UserAccounts VALUES (?, ?, ?, ?);"; +static const char* DELETE_USER_ACCOUNT = "DELETE FROM UserAccounts WHERE uid = ?;"; //------------------------- //Define the methods @@ -158,10 +159,32 @@ int ServerApplication::SaveUserAccount(int uid) { void ServerApplication::UnloadUserAccount(int uid) { //save this user account, and then unload it - //TODO + SaveUserAccount(uid); + accountMap.erase(uid); } void ServerApplication::DeleteUserAccount(int uid) { //delete a user account from the database, and remove it from memory - //TODO + sqlite3_stmt* statement = nullptr; + + //prep + if (sqlite3_prepare_v2(database, DELETE_USER_ACCOUNT, -1, &statement, nullptr) != SQLITE_OK) { + throw( std::runtime_error(std::string() + "Failed to prepare an SQL statement: " + sqlite3_errmsg(database)) ); + } + + //parameter + if (sqlite3_bind_int(statement, 1, uid) != SQLITE_OK) { + throw( std::runtime_error(std::string() + "Failed to replace a prepared statement's parameter: " + sqlite3_errmsg(database)) ); + } + + //execute + if (sqlite3_step(statement) != SQLITE_DONE) { + //if this fails, than something went horribly wrong + sqlite3_finalize(statement); + throw( std::runtime_error(std::string() + "Unknown SQL error when deleting an account: " + sqlite3_errmsg(database)) ); + } + + //finish the routine + sqlite3_finalize(statement); + accountMap.erase(uid); }