diff --git a/db-redis.cpp b/db-redis.cpp index 6c5b6a8..213a81b 100644 --- a/db-redis.cpp +++ b/db-redis.cpp @@ -3,6 +3,7 @@ #include #include "db-redis.h" #include "types.h" +#include "Settings.h" static inline int64_t stoi64(const std::string &s) { @@ -20,89 +21,17 @@ static inline std::string i64tos(int64_t i) return os.str(); } -inline std::string trim(const std::string &s) -{ - size_t front = 0; - while(s[front] == ' ' || - s[front] == '\t' || - s[front] == '\r' || - s[front] == '\n' - ) - ++front; - - size_t back = s.size(); - while(back > front && - (s[back-1] == ' ' || - s[back-1] == '\t' || - s[back-1] == '\r' || - s[back-1] == '\n' - ) - ) - --back; - - return s.substr(front, back - front); -} - -#define EOFCHECK() \ - if(is.eof()) \ - throw std::runtime_error("setting not found"); - -std::string get_setting(std::string name, std::istream &is) -{ - char c; - char s[256]; - std::string nm, value; - - next: - while((c = is.get()) == ' ' || c == '\t' || c == '\r' || c == '\n') - ; - EOFCHECK(); - if(c == '#') // Ignore comments - is.ignore(0xffff, '\n'); - EOFCHECK(); - s[0] = c; // The current char belongs to the name too - is.get(&s[1], 255, '='); - is.ignore(1); // Jump over the = - EOFCHECK(); - nm = trim(std::string(s)); - is.get(s, 256, '\n'); - value = trim(std::string(s)); - if(name == nm) - return value; - else - goto next; -} - -#undef EOFCHECK - -std::string get_setting_default(std::string name, std::istream &is, const std::string def) -{ - try { - return get_setting(name, is); - } catch(std::runtime_error e) { - return def; - } -} - DBRedis::DBRedis(const std::string &mapdir) : m_blocksReadCount(0), m_blocksQueriedCount(0) { - std::ifstream ifs((mapdir + "/world.mt").c_str()); - if(!ifs.good()) - throw std::runtime_error("Failed to read world.mt"); - std::string tmp; - try { - tmp = get_setting("redis_address", ifs); - ifs.seekg(0); - hash = get_setting("redis_hash", ifs); - ifs.seekg(0); - } catch(std::runtime_error e) { + Settings world_mt(mapdir + "/world.mt"); + std::string address; + if (!world_mt.check("redis_address", address) || !world_mt.check("redis_hash", hash)) { throw std::runtime_error("Set redis_address and redis_hash in world.mt to use the redis backend"); } - const char *addr = tmp.c_str(); - int port = stoi64(get_setting_default("redis_port", ifs, "6379")); - ctx = redisConnect(addr, port); + int port = stoi64(world_mt.get("redis_port", "6379")); + ctx = redisConnect(address.c_str(), port); if(!ctx) throw std::runtime_error("Cannot allocate redis context"); else if(ctx->err) {