feat add json configuration
This commit is contained in:
parent
34f0461a68
commit
04d41aa566
@ -209,6 +209,7 @@ set(TILE_SRCS
|
|||||||
# "tile/rpc/server.cc"
|
# "tile/rpc/server.cc"
|
||||||
"tile/base/config/configuration.cc"
|
"tile/base/config/configuration.cc"
|
||||||
"tile/base/config/ini_file_configuration.cc"
|
"tile/base/config/ini_file_configuration.cc"
|
||||||
|
"tile/base/config/json_configuration.cc"
|
||||||
"tile/base/config/layered_configuration.cc"
|
"tile/base/config/layered_configuration.cc"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -5,7 +5,6 @@
|
|||||||
#include "tile/base/string.h"
|
#include "tile/base/string.h"
|
||||||
|
|
||||||
namespace tile {
|
namespace tile {
|
||||||
namespace util {
|
|
||||||
class Configurable {
|
class Configurable {
|
||||||
Configurable();
|
Configurable();
|
||||||
virtual ~Configurable() = default;
|
virtual ~Configurable() = default;
|
||||||
@ -13,7 +12,6 @@ class Configurable {
|
|||||||
virtual std::string GetProperty(const Slice &name) const = 0;
|
virtual std::string GetProperty(const Slice &name) const = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace util
|
|
||||||
} // namespace tile
|
} // namespace tile
|
||||||
|
|
||||||
#endif // TILE_BASE_CONFIG_CONFIGURABLE_H
|
#endif // TILE_BASE_CONFIG_CONFIGURABLE_H
|
||||||
|
@ -2,7 +2,6 @@
|
|||||||
#include "tile/base/thread/unique_lock.h"
|
#include "tile/base/thread/unique_lock.h"
|
||||||
|
|
||||||
namespace tile {
|
namespace tile {
|
||||||
namespace util {
|
|
||||||
bool Configuration::Has(const Slice &key) const {
|
bool Configuration::Has(const Slice &key) const {
|
||||||
UniqueLock<tile::Mutex> lock(mutex_);
|
UniqueLock<tile::Mutex> lock(mutex_);
|
||||||
std::string value;
|
std::string value;
|
||||||
@ -109,6 +108,4 @@ void Configuration::SetRawWithEvent(const Slice &key,
|
|||||||
|
|
||||||
Configuration::~Configuration() {}
|
Configuration::~Configuration() {}
|
||||||
|
|
||||||
} // namespace util
|
|
||||||
|
|
||||||
} // namespace tile
|
} // namespace tile
|
||||||
|
@ -11,7 +11,6 @@
|
|||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
|
|
||||||
namespace tile {
|
namespace tile {
|
||||||
namespace util {
|
|
||||||
class Configuration : public RefCounted<Configuration> {
|
class Configuration : public RefCounted<Configuration> {
|
||||||
public:
|
public:
|
||||||
using Keys = std::vector<std::string>;
|
using Keys = std::vector<std::string>;
|
||||||
@ -121,7 +120,6 @@ private:
|
|||||||
mutable Mutex mutex_;
|
mutable Mutex mutex_;
|
||||||
bool events_enabled_{false};
|
bool events_enabled_{false};
|
||||||
};
|
};
|
||||||
} // namespace util
|
|
||||||
} // namespace tile
|
} // namespace tile
|
||||||
|
|
||||||
#endif // TILE_BASE_CONFIG_CONFIGURATION_H
|
#endif // TILE_BASE_CONFIG_CONFIGURATION_H
|
||||||
|
@ -2,7 +2,6 @@
|
|||||||
#include "tile/base/thread/scoped_lock.h"
|
#include "tile/base/thread/scoped_lock.h"
|
||||||
|
|
||||||
namespace tile {
|
namespace tile {
|
||||||
namespace util {
|
|
||||||
|
|
||||||
IniFileConfiguration::IniFileConfiguration() {}
|
IniFileConfiguration::IniFileConfiguration() {}
|
||||||
// IniFileConfig::IniFileConfig(std::istream &istr) { load(istr); }
|
// IniFileConfig::IniFileConfig(std::istream &istr) { load(istr); }
|
||||||
@ -10,6 +9,10 @@ IniFileConfiguration::IniFileConfiguration() {}
|
|||||||
IniFileConfiguration::~IniFileConfiguration() {}
|
IniFileConfiguration::~IniFileConfiguration() {}
|
||||||
|
|
||||||
bool IniFileConfiguration::load(std::istream &istr) {
|
bool IniFileConfiguration::load(std::istream &istr) {
|
||||||
|
if (!istr.good()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
Configuration::ScopedLock lock(*this);
|
Configuration::ScopedLock lock(*this);
|
||||||
map_.clear();
|
map_.clear();
|
||||||
section_key_.clear();
|
section_key_.clear();
|
||||||
@ -20,11 +23,7 @@ bool IniFileConfiguration::load(std::istream &istr) {
|
|||||||
}
|
}
|
||||||
bool IniFileConfiguration::load(const std::string &path) {
|
bool IniFileConfiguration::load(const std::string &path) {
|
||||||
std::ifstream istr(path);
|
std::ifstream istr(path);
|
||||||
if (istr.good()) {
|
|
||||||
return load(istr);
|
return load(istr);
|
||||||
} else {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
bool IniFileConfiguration::GetRaw(const Slice &key, std::string *value) const {
|
bool IniFileConfiguration::GetRaw(const Slice &key, std::string *value) const {
|
||||||
auto iter = map_.find(key.ToString());
|
auto iter = map_.find(key.ToString());
|
||||||
@ -141,5 +140,4 @@ bool IniFileConfiguration::ICompare::operator()(const std::string &s1,
|
|||||||
return strncmp(s1.c_str(), s2.c_str(), len) < 0;
|
return strncmp(s1.c_str(), s2.c_str(), len) < 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace util
|
|
||||||
} // namespace tile
|
} // namespace tile
|
||||||
|
@ -7,7 +7,6 @@
|
|||||||
#include <map>
|
#include <map>
|
||||||
|
|
||||||
namespace tile {
|
namespace tile {
|
||||||
namespace util {
|
|
||||||
class IniFileConfiguration : public Configuration {
|
class IniFileConfiguration : public Configuration {
|
||||||
public:
|
public:
|
||||||
using Ptr = RefPtr<IniFileConfiguration>;
|
using Ptr = RefPtr<IniFileConfiguration>;
|
||||||
@ -34,7 +33,6 @@ private:
|
|||||||
IStringMap map_;
|
IStringMap map_;
|
||||||
std::string section_key_;
|
std::string section_key_;
|
||||||
};
|
};
|
||||||
} // namespace util
|
|
||||||
} // namespace tile
|
} // namespace tile
|
||||||
|
|
||||||
#endif // TILE_BASE_CONFIG_INI_FILE_CONFIG_H
|
#endif // TILE_BASE_CONFIG_INI_FILE_CONFIG_H
|
||||||
|
@ -16,7 +16,6 @@ a=4
|
|||||||
)";
|
)";
|
||||||
|
|
||||||
namespace tile {
|
namespace tile {
|
||||||
namespace util {
|
|
||||||
|
|
||||||
static_assert(
|
static_assert(
|
||||||
!detail::HasClassofImpl<IniFileConfiguration, Configuration>::value, "");
|
!detail::HasClassofImpl<IniFileConfiguration, Configuration>::value, "");
|
||||||
@ -43,5 +42,4 @@ TEST(IniFileConfig, LoadFromIStream) {
|
|||||||
ASSERT_EQ(3, *config->GetInt("sec3.a"));
|
ASSERT_EQ(3, *config->GetInt("sec3.a"));
|
||||||
ASSERT_EQ(4, *config->GetInt("sec2.kk.a"));
|
ASSERT_EQ(4, *config->GetInt("sec2.kk.a"));
|
||||||
}
|
}
|
||||||
} // namespace util
|
|
||||||
} // namespace tile
|
} // namespace tile
|
||||||
|
128
tile/base/config/json_configuration.cc
Normal file
128
tile/base/config/json_configuration.cc
Normal file
@ -0,0 +1,128 @@
|
|||||||
|
#include "tile/base/config/json_configuration.h"
|
||||||
|
#include "tile/base/logging.h"
|
||||||
|
|
||||||
|
namespace tile {
|
||||||
|
JSONConfiguration::JSONConfiguration() : object_() {}
|
||||||
|
JSONConfiguration::~JSONConfiguration() {}
|
||||||
|
|
||||||
|
bool JSONConfiguration::load(const std::string &path) {
|
||||||
|
std::ifstream istr(path);
|
||||||
|
return load(istr);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool JSONConfiguration::load(std::istream &istr) {
|
||||||
|
if (!istr.good()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
Configuration::ScopedLock _(*this);
|
||||||
|
object_.clear();
|
||||||
|
Json::Reader reader;
|
||||||
|
return reader.parse(istr, object_, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void JSONConfiguration::SetInt(const Slice &key, int value) {
|
||||||
|
SetValue(key, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
void JSONConfiguration::SetBool(const Slice &key, bool value) {
|
||||||
|
SetValue(key, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
void JSONConfiguration::SetDouble(const Slice &key, double value) {
|
||||||
|
SetValue(key, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
void JSONConfiguration::SetString(const Slice &key, const std::string &value) {
|
||||||
|
SetValue(key, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
void JSONConfiguration::RemoveRaw(const Slice &key) {
|
||||||
|
Configuration::ScopedLock _(*this);
|
||||||
|
Json::Value root;
|
||||||
|
Slice last_part;
|
||||||
|
if (!FindStart(key, &last_part, &root)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
root.removeMember(last_part.ToString());
|
||||||
|
}
|
||||||
|
|
||||||
|
bool JSONConfiguration::GetRaw(const Slice &key, std::string *value) const {
|
||||||
|
Configuration::ScopedLock _(*this);
|
||||||
|
auto keys = Split(key, '.');
|
||||||
|
auto root = object_;
|
||||||
|
for (std::size_t i = 0; i < keys.size(); ++i) {
|
||||||
|
const auto &cur_key = keys[i];
|
||||||
|
if (cur_key.empty()) {
|
||||||
|
TILE_LOG_ERROR("Invalid key: {}", key);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (!object_.isMember(cur_key)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
root = root[cur_key];
|
||||||
|
}
|
||||||
|
|
||||||
|
*value = root.asString();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool JSONConfiguration::SetRaw(const Slice &key, const Slice &value) {
|
||||||
|
return SetValue(key, value.ToString());
|
||||||
|
}
|
||||||
|
|
||||||
|
Configuration::Keys JSONConfiguration::Enumerate(const Slice &range) const {
|
||||||
|
Configuration::ScopedLock _(*this);
|
||||||
|
Configuration::Keys key_set;
|
||||||
|
|
||||||
|
auto keys = Split(range, '.');
|
||||||
|
auto root = object_;
|
||||||
|
for (std::size_t i = 0; i < keys.size(); ++i) {
|
||||||
|
const auto &cur_key = keys[i];
|
||||||
|
if (cur_key.empty()) {
|
||||||
|
TILE_LOG_ERROR("Invalid range: {}", range);
|
||||||
|
return key_set;
|
||||||
|
}
|
||||||
|
if (!object_.isMember(cur_key)) {
|
||||||
|
return key_set;
|
||||||
|
}
|
||||||
|
root = root[cur_key];
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const auto &key : root.getMemberNames()) {
|
||||||
|
key_set.push_back(key);
|
||||||
|
}
|
||||||
|
return key_set;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool JSONConfiguration::FindStart(const Slice &key, Slice *last_part,
|
||||||
|
Json::Value *parent_obj) {
|
||||||
|
auto keys = Split(key, '.');
|
||||||
|
if (keys.empty()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto root = object_;
|
||||||
|
for (std::size_t i = 0; i < keys.size() - 1; ++i) {
|
||||||
|
const auto &cur_key = keys[i];
|
||||||
|
if (cur_key.empty()) {
|
||||||
|
TILE_LOG_ERROR("Invalid key: {}", key);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!root.isMember(cur_key)) {
|
||||||
|
root[cur_key] = Json::Value(Json::objectValue);
|
||||||
|
} else if (!root[cur_key].isObject()) {
|
||||||
|
TILE_LOG_ERROR("only leaf nodes can be set: key: {}, cur_key(idx={}): {}",
|
||||||
|
key, i, cur_key);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
root = root[cur_key];
|
||||||
|
}
|
||||||
|
|
||||||
|
*last_part = keys.back();
|
||||||
|
*parent_obj = root;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace tile
|
48
tile/base/config/json_configuration.h
Normal file
48
tile/base/config/json_configuration.h
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
#ifndef TILE_BASE_CONFIG_JSON_CONFIGURATION_H
|
||||||
|
#define TILE_BASE_CONFIG_JSON_CONFIGURATION_H
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "tile/base/config/configuration.h"
|
||||||
|
#include "json/json.h"
|
||||||
|
|
||||||
|
namespace tile {
|
||||||
|
class JSONConfiguration : public Configuration {
|
||||||
|
public:
|
||||||
|
using Ptr = RefPtr<JSONConfiguration>;
|
||||||
|
JSONConfiguration();
|
||||||
|
~JSONConfiguration() override;
|
||||||
|
bool load(const std::string &path);
|
||||||
|
bool load(std::istream &istr);
|
||||||
|
|
||||||
|
void SetInt(const Slice &key, int value) override;
|
||||||
|
void SetBool(const Slice &key, bool value) override;
|
||||||
|
void SetDouble(const Slice &key, double value) override;
|
||||||
|
void SetString(const Slice &key, const std::string &value) override;
|
||||||
|
void RemoveRaw(const Slice &key) override;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
bool GetRaw(const Slice &key, std::string *value) const override;
|
||||||
|
bool SetRaw(const Slice &key, const Slice &value) override;
|
||||||
|
Keys Enumerate(const Slice &range) const override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool FindStart(const Slice &key, Slice *last_prt, Json::Value *parent_obj);
|
||||||
|
template <typename T> bool SetValue(const Slice &key, T value);
|
||||||
|
Json::Value object_;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
bool JSONConfiguration::SetValue(const Slice &key, T value) {
|
||||||
|
Slice last_part;
|
||||||
|
Json::Value root;
|
||||||
|
Configuration::ScopedLock _(*this);
|
||||||
|
if (!FindStart(key, &last_part, &root)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
root[last_part] = Json::Value(value);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
} // namespace tile
|
||||||
|
|
||||||
|
#endif // TILE_BASE_CONFIG_JSON_CONFIGURATION_H
|
@ -1,7 +1,6 @@
|
|||||||
#include "tile/base/config/layered_configuration.h"
|
#include "tile/base/config/layered_configuration.h"
|
||||||
|
|
||||||
namespace tile {
|
namespace tile {
|
||||||
namespace util {
|
|
||||||
|
|
||||||
LayeredConfiguration::LayeredConfiguration() {}
|
LayeredConfiguration::LayeredConfiguration() {}
|
||||||
LayeredConfiguration::~LayeredConfiguration() {}
|
LayeredConfiguration::~LayeredConfiguration() {}
|
||||||
@ -129,5 +128,4 @@ int LayeredConfiguration::highest() const {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace util
|
|
||||||
} // namespace tile
|
} // namespace tile
|
||||||
|
@ -7,7 +7,6 @@
|
|||||||
#include <list>
|
#include <list>
|
||||||
|
|
||||||
namespace tile {
|
namespace tile {
|
||||||
namespace util {
|
|
||||||
class LayeredConfiguration : public Configuration {
|
class LayeredConfiguration : public Configuration {
|
||||||
public:
|
public:
|
||||||
using Ptr = RefPtr<LayeredConfiguration>;
|
using Ptr = RefPtr<LayeredConfiguration>;
|
||||||
@ -51,7 +50,6 @@ private:
|
|||||||
using ConfigList = std::list<ConfigItem>;
|
using ConfigList = std::list<ConfigItem>;
|
||||||
ConfigList configs_;
|
ConfigList configs_;
|
||||||
};
|
};
|
||||||
} // namespace util
|
|
||||||
} // namespace tile
|
} // namespace tile
|
||||||
|
|
||||||
#endif // TILE_BASE_CONFIG_LAYERED_CONFIGURATION_H
|
#endif // TILE_BASE_CONFIG_LAYERED_CONFIGURATION_H
|
||||||
|
@ -47,7 +47,6 @@
|
|||||||
#include "sigslot/sigslot.h"
|
#include "sigslot/sigslot.h"
|
||||||
|
|
||||||
// Tile Init
|
// Tile Init
|
||||||
#include "mustache.hpp"
|
|
||||||
#include "tile/init.h"
|
#include "tile/init.h"
|
||||||
|
|
||||||
#endif // TILE_TILE_H
|
#endif // TILE_TILE_H
|
||||||
|
Loading…
x
Reference in New Issue
Block a user