diff --git a/src/common/utils/ini.cpp b/src/common/utils/ini.cpp index 7f77aed..03606c0 100644 --- a/src/common/utils/ini.cpp +++ b/src/common/utils/ini.cpp @@ -132,6 +132,10 @@ std::runtime_error File::LoadError )); } +bool File::HasSection(std::string name) const { + return this->section_lists.count(name) > 0; +} + const File::SectionList& File::operator[] (std::string name) const { @@ -150,9 +154,7 @@ int File::SectionList::SectionCount() const { return this->sections.size(); } -const File::Proxy& - File::SectionList::operator[] (std::string key) const -{ +const File::Proxy File::SectionList::operator[] (std::string key) const{ return this->sections[0][key]; } @@ -170,7 +172,7 @@ bool File::SectionList::Section::HasKey(std::string name) const { return this->values.count(name) == 1; } -const File::Proxy& +const File::Proxy File::SectionList::Section::operator[] (std::string key) const { str::tolower(&key); diff --git a/src/common/utils/ini.hpp b/src/common/utils/ini.hpp index ac9a1cb..7ad6efb 100644 --- a/src/common/utils/ini.hpp +++ b/src/common/utils/ini.hpp @@ -88,7 +88,7 @@ public: class Section { public: bool HasKey(std::string name) const; - const Proxy& operator[] (std::string key) const; + const Proxy operator[] (std::string key) const; private: std::map values; friend class File; @@ -97,7 +97,7 @@ public: bool HasKey(std::string name) const; int SectionCount() const; - const Proxy& operator[] (std::string key) const; + const Proxy operator[] (std::string key) const; const Section& operator[] (int index) const; private: std::vector
sections; diff --git a/src/server/main.cpp b/src/server/main.cpp index 5dad19c..cb22fc3 100644 --- a/src/server/main.cpp +++ b/src/server/main.cpp @@ -25,6 +25,8 @@ typedef _server_ctx slave_ctx; static struct { + sosc::poolinfo_t default_info; + master_intra_ctx* master_intra = nullptr; master_client_ctx* master_client = nullptr; slave_ctx* slaves = nullptr; @@ -39,6 +41,28 @@ void master_intra_stop(); void master_client_stop(); void slave_stop(slave_ctx* ctx); +void configure_poolinfo(sosc::poolinfo_t* info, + const sosc::ini::File::SectionList::Section& section) +{ + *info = sosc::poolinfo_t(_ctx.default_info); + + if(section.HasKey("inital count")) + info->initial_count = (int)section["initial count"]; + if(section.HasKey("inital size")) + info->initial_size = (int)section["initial size"]; + if(section.HasKey("size growth")) + info->size_growth = (int)section["size growth"]; + + if(section.HasKey("max size")) + info->max_size = (int)section["max size"]; + if(section.HasKey("max count")) + info->max_count = (int)section["max count"]; + if(section.HasKey("max total")) + info->max_total = (int)section["max total"]; + if(section.HasKey("tolerance")) + info->tolerance = (int)section["tolerance"]; +} + int main(int argc, char **argv) { using namespace sosc; if(argc < 2) @@ -62,9 +86,11 @@ int main(int argc, char **argv) { ini::Field("max total", ini::Field::INT32), ini::Field("tolerance", ini::Field::INT32), }), - ini::Rule("master", true, false, { - ini::Field("client port", ini::Field::UINT32), - ini::Field("intra port", ini::Field::UINT32), + ini::Rule("master to client", false, false, { + ini::Field("port", ini::Field::UINT32), + }), + ini::Rule("master to slave", false, false, { + ini::Field("port", ini::Field::UINT32), }), ini::Rule("slave", false, true, { ini::Field("port", ini::Field::UINT32), @@ -76,19 +102,31 @@ int main(int argc, char **argv) { return -1; } - poolinfo_t info = poolinfo_t(); - info.initial_count = + poolinfo_t info; + configure_poolinfo(&_ctx.default_info, (*config)["defaults"][0]); if((*config)["master"]["run master"]) { - if(!db::init_databases(nullptr)) + if(!config->HasSection("master to client") || + !config->HasSection("master to slave")) + { + std::cout << "'MASTER TO CLIENT' and 'MASTER TO SLAVE' sections " + << "must exist if 'RUN MASTER' is true." << std::endl; return -1; + } + if(!db::init_databases(nullptr)) { + std::cout << "Could not initialized master database."; + return -1; + } + + configure_poolinfo(&info, (*config)["master to slave"][0]); _ctx.master_intra = new master_intra_ctx; master_intra_start( (uint16_t)(*config)["master"]["intra port"], poolinfo_t() ); + configure_poolinfo(&info, (*config)["master to client"][0]); _ctx.master_client = new master_client_ctx; master_client_start( (uint16_t)(*config)["master"]["client port"], @@ -101,6 +139,7 @@ int main(int argc, char **argv) { _ctx.slaves = new slave_ctx[_ctx.slave_count]; for(int i = 0; i < _ctx.slave_count; ++i) { + configure_poolinfo(&info, (*config)["slave"][i]); slave_start( (uint16_t)(*config)["slave"][i]["port"], poolinfo_t(),