Use Settings class in redis backend
This commit is contained in:
parent
c08b218f71
commit
fcedce3e13
83
db-redis.cpp
83
db-redis.cpp
@ -3,6 +3,7 @@
|
|||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include "db-redis.h"
|
#include "db-redis.h"
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
|
#include "Settings.h"
|
||||||
|
|
||||||
static inline int64_t stoi64(const std::string &s)
|
static inline int64_t stoi64(const std::string &s)
|
||||||
{
|
{
|
||||||
@ -20,89 +21,17 @@ static inline std::string i64tos(int64_t i)
|
|||||||
return os.str();
|
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) :
|
DBRedis::DBRedis(const std::string &mapdir) :
|
||||||
m_blocksReadCount(0),
|
m_blocksReadCount(0),
|
||||||
m_blocksQueriedCount(0)
|
m_blocksQueriedCount(0)
|
||||||
{
|
{
|
||||||
std::ifstream ifs((mapdir + "/world.mt").c_str());
|
Settings world_mt(mapdir + "/world.mt");
|
||||||
if(!ifs.good())
|
std::string address;
|
||||||
throw std::runtime_error("Failed to read world.mt");
|
if (!world_mt.check("redis_address", address) || !world_mt.check("redis_hash", hash)) {
|
||||||
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) {
|
|
||||||
throw std::runtime_error("Set redis_address and redis_hash in world.mt to use the redis backend");
|
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(world_mt.get("redis_port", "6379"));
|
||||||
int port = stoi64(get_setting_default("redis_port", ifs, "6379"));
|
ctx = redisConnect(address.c_str(), port);
|
||||||
ctx = redisConnect(addr, port);
|
|
||||||
if(!ctx)
|
if(!ctx)
|
||||||
throw std::runtime_error("Cannot allocate redis context");
|
throw std::runtime_error("Cannot allocate redis context");
|
||||||
else if(ctx->err) {
|
else if(ctx->err) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user