From 254b97aa80dc322970d74ec93c7d1432ce070c66 Mon Sep 17 00:00:00 2001 From: Kayne Ruse Date: Tue, 7 Oct 2014 01:23:55 +1100 Subject: [PATCH] Implemented ManagerInterface in AccountManager and CharacterManager ManagerInterface was already designed for those two anyway. The only thing left to do is to rewrite the room API, and the whole thing should work fine again. I still think map data should be saved and loaded by lua code, so the rooms will still implement lua hooks. There may be other things that can be loaded from SQL, but I don't know what. --- server/accounts/account_manager.cpp | 36 ++++++++++++------------ server/accounts/account_manager.hpp | 31 +++++++++++---------- server/accounts/makefile | 2 +- server/characters/character_manager.cpp | 37 +++++++++++++------------ server/characters/character_manager.hpp | 31 +++++++++++---------- server/characters/makefile | 2 +- server/rooms/room_manager.cpp | 8 +++++- server/rooms/room_manager.hpp | 14 ++++++---- 8 files changed, 90 insertions(+), 71 deletions(-) diff --git a/server/accounts/account_manager.cpp b/server/accounts/account_manager.cpp index e16ad3c..fccf530 100644 --- a/server/accounts/account_manager.cpp +++ b/server/accounts/account_manager.cpp @@ -87,13 +87,13 @@ int AccountManager::Load(std::string username, int clientIndex) { int uid = sqlite3_column_int(statement, 0); //check to see if this account is already loaded - if (accountMap.find(uid) != accountMap.end()) { + if (elementMap.find(uid) != elementMap.end()) { sqlite3_finalize(statement); return -1; } //extract the data into memory - AccountData& newAccount = accountMap[uid]; + AccountData& newAccount = elementMap[uid]; newAccount.username = reinterpret_cast(sqlite3_column_text(statement, 1)); newAccount.blackListed = sqlite3_column_int(statement, 2); newAccount.whiteListed = sqlite3_column_int(statement, 3); @@ -121,11 +121,11 @@ int AccountManager::Save(int uid) { //DOCS: To use this method, change the in-memory copy, and then call this function using that object's UID. //this method fails if this account is not loaded - if (accountMap.find(uid) == accountMap.end()) { + if (elementMap.find(uid) == elementMap.end()) { return -1; } - AccountData& account = accountMap[uid]; + AccountData& account = elementMap[uid]; sqlite3_stmt* statement = nullptr; //prep @@ -163,7 +163,7 @@ void AccountManager::Unload(int uid) { //save this user account, and then unload it //NOTE: the associated characters are unloaded externally Save(uid); - accountMap.erase(uid); + elementMap.erase(uid); } void AccountManager::Delete(int uid) { @@ -190,25 +190,27 @@ void AccountManager::Delete(int uid) { //finish the routine sqlite3_finalize(statement); - accountMap.erase(uid); + elementMap.erase(uid); } void AccountManager::UnloadAll() { - for (auto& it : accountMap) { + for (auto& it : elementMap) { Save(it.first); } - accountMap.clear(); + elementMap.clear(); } -void AccountManager::UnloadIf(std::function)> fn) { +void AccountManager::UnloadIf(std::function)> fn) { //replicate std::remove_if, using custom code - for (std::map::iterator it = accountMap.begin(); it != accountMap.end(); /* empty */) { + std::map::iterator it = elementMap.begin(); + while (it != elementMap.end()) { if (fn(*it)) { Save(it->first); - it = accountMap.erase(it); - continue; + it = elementMap.erase(it); + } + else { + ++it; } - ++it; } } @@ -218,9 +220,9 @@ void AccountManager::UnloadIf(std::function)> f AccountData* AccountManager::Get(int uid) { //TODO: could this load an account first? - std::map::iterator it = accountMap.find(uid); + std::map::iterator it = elementMap.find(uid); - if (it == accountMap.end()) { + if (it == elementMap.end()) { return nullptr; } @@ -228,7 +230,7 @@ AccountData* AccountManager::Get(int uid) { } int AccountManager::GetLoadedCount() { - return accountMap.size(); + return elementMap.size(); } int AccountManager::GetTotalCount() { @@ -250,7 +252,7 @@ int AccountManager::GetTotalCount() { } std::map* AccountManager::GetContainer() { - return &accountMap; + return &elementMap; } sqlite3* AccountManager::SetDatabase(sqlite3* db) { diff --git a/server/accounts/account_manager.hpp b/server/accounts/account_manager.hpp index 327eb3a..e1bb576 100644 --- a/server/accounts/account_manager.hpp +++ b/server/accounts/account_manager.hpp @@ -24,29 +24,33 @@ #include "account_data.hpp" #include "singleton.hpp" +#include "manager_interface.hpp" #include "sqlite3/sqlite3.h" #include #include -class AccountManager : public Singleton { +class AccountManager: + public Singleton, + public ManagerInterface +{ public: - //public access methods - int Create(std::string username, int clientIndex); - int Load(std::string username, int clientIndex); - int Save(int uid); - void Unload(int uid); - void Delete(int uid); + //common public methods + int Create(std::string username, int clientIndex) override; + int Load(std::string username, int clientIndex) override; + int Save(int uid) override; + void Unload(int uid) override; + void Delete(int uid) override; - void UnloadAll(); - void UnloadIf(std::function)> fn); + void UnloadAll() override; + void UnloadIf(std::function)> fn) override; //accessors and mutators - AccountData* Get(int uid); - int GetLoadedCount(); - int GetTotalCount(); - std::map* GetContainer(); + AccountData* Get(int uid) override; + int GetLoadedCount() override; + int GetTotalCount() override; + std::map* GetContainer() override; sqlite3* SetDatabase(sqlite3* db); sqlite3* GetDatabase(); @@ -57,7 +61,6 @@ private: AccountManager() = default; ~AccountManager() = default; - std::map accountMap; sqlite3* database = nullptr; }; diff --git a/server/accounts/makefile b/server/accounts/makefile index f24e1ba..2a5c671 100644 --- a/server/accounts/makefile +++ b/server/accounts/makefile @@ -1,5 +1,5 @@ #config -INCLUDES+=. ../../common/utilities +INCLUDES+=. ../server_utilities ../../common/utilities LIBS+= CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES)) diff --git a/server/characters/character_manager.cpp b/server/characters/character_manager.cpp index 080b0ea..a9079b3 100644 --- a/server/characters/character_manager.cpp +++ b/server/characters/character_manager.cpp @@ -98,7 +98,7 @@ int CharacterManager::Load(int owner, std::string handle, std::string avatar) { int uid = sqlite3_column_int(statement, 0); //check to see if this character is already loaded - if (characterMap.find(uid) != characterMap.end()) { + if (elementMap.find(uid) != elementMap.end()) { sqlite3_finalize(statement); return -1; } @@ -110,7 +110,7 @@ int CharacterManager::Load(int owner, std::string handle, std::string avatar) { } //extract the data into memory - CharacterData& newChar = characterMap[uid]; + CharacterData& newChar = elementMap[uid]; //metadata newChar.owner = owner; @@ -145,11 +145,11 @@ int CharacterManager::Save(int uid) { //DOCS: To use this method, change the in-memory copy, and then call this function using that object's UID. //this method fails if this character is not loaded - if (characterMap.find(uid) == characterMap.end()) { + if (elementMap.find(uid) == elementMap.end()) { return -1; } - CharacterData& character = characterMap[uid]; + CharacterData& character = elementMap[uid]; sqlite3_stmt* statement = nullptr; //prep @@ -187,7 +187,7 @@ int CharacterManager::Save(int uid) { void CharacterManager::Unload(int uid) { //save this character, then unload it Save(uid); - characterMap.erase(uid); + elementMap.erase(uid); } void CharacterManager::Delete(int uid) { @@ -213,25 +213,26 @@ void CharacterManager::Delete(int uid) { //finish the routine sqlite3_finalize(statement); - characterMap.erase(uid); + elementMap.erase(uid); } void CharacterManager::UnloadAll() { - for (auto& it : characterMap) { + for (auto& it : elementMap) { Save(it.first); } - characterMap.clear(); + elementMap.clear(); } -void CharacterManager::UnloadIf(std::function)> fn) { - //replicate std::remove_if, using custom code - for (std::map::iterator it = characterMap.begin(); it != characterMap.end(); /* empty */) { +void CharacterManager::UnloadIf(std::function)> fn) { + std::map::iterator it = elementMap.begin(); + while (it != elementMap.end()) { if (fn(*it)) { Save(it->first); - it = characterMap.erase(it); - continue; + it = elementMap.erase(it); + } + else { + ++it; } - ++it; } } @@ -240,9 +241,9 @@ void CharacterManager::UnloadIf(std::function //------------------------- CharacterData* CharacterManager::Get(int uid) { - std::map::iterator it = characterMap.find(uid); + std::map::iterator it = elementMap.find(uid); - if (it == characterMap.end()) { + if (it == elementMap.end()) { return nullptr; } @@ -250,7 +251,7 @@ CharacterData* CharacterManager::Get(int uid) { } int CharacterManager::GetLoadedCount() { - return characterMap.size(); + return elementMap.size(); } int CharacterManager::GetTotalCount() { @@ -272,7 +273,7 @@ int CharacterManager::GetTotalCount() { } std::map* CharacterManager::GetContainer() { - return &characterMap; + return &elementMap; } sqlite3* CharacterManager::SetDatabase(sqlite3* db) { diff --git a/server/characters/character_manager.hpp b/server/characters/character_manager.hpp index 68b58aa..d73cd42 100644 --- a/server/characters/character_manager.hpp +++ b/server/characters/character_manager.hpp @@ -24,29 +24,33 @@ #include "character_data.hpp" #include "singleton.hpp" +#include "manager_interface.hpp" #include "sqlite3/sqlite3.h" #include #include -class CharacterManager : public Singleton { +class CharacterManager: + public Singleton, + public ManagerInterface +{ public: - //public access methods - int Create(int owner, std::string handle, std::string avatar); - int Load(int owner, std::string handle, std::string avatar); - int Save(int uid); - void Unload(int uid); - void Delete(int uid); + //common public methods + int Create(int owner, std::string handle, std::string avatar) override; + int Load(int owner, std::string handle, std::string avatar) override; + int Save(int uid) override; + void Unload(int uid) override; + void Delete(int uid) override; - void UnloadAll(); - void UnloadIf(std::function)> fn); + void UnloadAll() override; + void UnloadIf(std::function)> fn) override; //accessors and mutators - CharacterData* Get(int uid); - int GetLoadedCount(); - int GetTotalCount(); - std::map* GetContainer(); + CharacterData* Get(int uid) override; + int GetLoadedCount() override; + int GetTotalCount() override; + std::map* GetContainer() override; sqlite3* SetDatabase(sqlite3* db); sqlite3* GetDatabase(); @@ -57,7 +61,6 @@ private: CharacterManager() = default; ~CharacterManager() = default; - std::map characterMap; sqlite3* database = nullptr; }; diff --git a/server/characters/makefile b/server/characters/makefile index 68368e7..7133d20 100644 --- a/server/characters/makefile +++ b/server/characters/makefile @@ -1,5 +1,5 @@ #config -INCLUDES+=. ../../common/gameplay ../../common/utilities +INCLUDES+=. ../server_utilities ../../common/gameplay ../../common/utilities LIBS+= CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES)) diff --git a/server/rooms/room_manager.cpp b/server/rooms/room_manager.cpp index bccfd8d..5d0329e 100644 --- a/server/rooms/room_manager.cpp +++ b/server/rooms/room_manager.cpp @@ -112,7 +112,13 @@ void RoomManager::UnloadIf(std::function)> fn } RoomData* RoomManager::Get(int uid) { - return &elementMap[uid]; + std::map::iterator it = elementMap.find(uid); + + if (it == elementMap.end()) { + return nullptr; + } + + return &it->second; } int RoomManager::GetLoadedCount() { diff --git a/server/rooms/room_manager.hpp b/server/rooms/room_manager.hpp index 7527147..5245d9c 100644 --- a/server/rooms/room_manager.hpp +++ b/server/rooms/room_manager.hpp @@ -23,17 +23,16 @@ #define ROOMMANAGER_HPP_ #include "room_data.hpp" - #include "singleton.hpp" #include "manager_interface.hpp" #include "lua/lua.hpp" -class RoomManager: public Singleton, public ManagerInterface { +class RoomManager: + public Singleton, + public ManagerInterface +{ public: - RoomManager() = default; - ~RoomManager() = default; - //common public methods int Create() override; int Load() override; @@ -55,6 +54,11 @@ public: lua_State* GetLuaState() { return lua; } private: + friend Singleton; + + RoomManager() = default; + ~RoomManager() = default; + lua_State* lua = nullptr; int counter = 0; };