feat/support_fiber #6
@ -212,6 +212,7 @@ set(TILE_SRCS
|
|||||||
# "tile/rpc/server.cc"
|
# "tile/rpc/server.cc"
|
||||||
"tile/util/config.cc"
|
"tile/util/config.cc"
|
||||||
"tile/util/ini_file_config.cc"
|
"tile/util/ini_file_config.cc"
|
||||||
|
"tile/util/layered_config.cc"
|
||||||
)
|
)
|
||||||
|
|
||||||
if((NOT TILE_HAVE_GETIFADDRS) OR (NOT TILE_HAVE_FREEIFADDRS))
|
if((NOT TILE_HAVE_GETIFADDRS) OR (NOT TILE_HAVE_FREEIFADDRS))
|
||||||
|
@ -109,13 +109,14 @@ protected:
|
|||||||
};
|
};
|
||||||
|
|
||||||
virtual bool GetRaw(const Slice &key, std::string *value) const = 0;
|
virtual bool GetRaw(const Slice &key, std::string *value) const = 0;
|
||||||
virtual void SetRaw(const Slice &key, const Slice &value) = 0;
|
virtual bool SetRaw(const Slice &key, const Slice &value) = 0;
|
||||||
virtual void RemoveRaw(const Slice &key) = 0;
|
virtual void RemoveRaw(const Slice &key) = 0;
|
||||||
virtual Keys Enumerate(const Slice &range) const = 0;
|
virtual Keys Enumerate(const Slice &range) const = 0;
|
||||||
void SetRawWithEvent(const Slice &key, const std::string &value);
|
void SetRawWithEvent(const Slice &key, const std::string &value);
|
||||||
virtual ~Config();
|
virtual ~Config();
|
||||||
|
|
||||||
friend class std::default_delete<Config>;
|
friend class std::default_delete<Config>;
|
||||||
|
friend class LayeredConfig;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
mutable Mutex mutex_;
|
mutable Mutex mutex_;
|
||||||
|
@ -35,8 +35,9 @@ bool IniFileConfig::GetRaw(const Slice &key, std::string *value) const {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
void IniFileConfig::SetRaw(const Slice &key, const Slice &value) {
|
bool IniFileConfig::SetRaw(const Slice &key, const Slice &value) {
|
||||||
map_[key] = value;
|
map_[key] = value;
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void IniFileConfig::RemoveRaw(const Slice &key) {
|
void IniFileConfig::RemoveRaw(const Slice &key) {
|
||||||
|
@ -21,7 +21,7 @@ public:
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool GetRaw(const Slice &key, std::string *value) const override;
|
bool GetRaw(const Slice &key, std::string *value) const override;
|
||||||
void SetRaw(const Slice &key, const Slice &value) override;
|
bool SetRaw(const Slice &key, const Slice &value) override;
|
||||||
void RemoveRaw(const Slice &key) override;
|
void RemoveRaw(const Slice &key) override;
|
||||||
Keys Enumerate(const Slice &range) const override;
|
Keys Enumerate(const Slice &range) const override;
|
||||||
|
|
||||||
|
@ -1,25 +0,0 @@
|
|||||||
#ifndef TILE_UTIL_LAYERD_CONFIG_H
|
|
||||||
#define TILE_UTIL_LAYERD_CONFIG_H
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "tile/util/config.h"
|
|
||||||
|
|
||||||
namespace tile {
|
|
||||||
namespace util {
|
|
||||||
class LayerdConfig : public Config {
|
|
||||||
public:
|
|
||||||
protected:
|
|
||||||
struct ConfigItem {
|
|
||||||
Config::Ptr cfg;
|
|
||||||
// 1 < 2 < 3 < 4 ...
|
|
||||||
int priority;
|
|
||||||
// can remove or set new?
|
|
||||||
bool writeable;
|
|
||||||
std::string label;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
} // namespace util
|
|
||||||
} // namespace tile
|
|
||||||
|
|
||||||
#endif // TILE_UTIL_LAYERD_CONFIG_H
|
|
129
tile/util/layered_config.cc
Normal file
129
tile/util/layered_config.cc
Normal file
@ -0,0 +1,129 @@
|
|||||||
|
#include "tile/util/layered_config.h"
|
||||||
|
|
||||||
|
namespace tile {
|
||||||
|
namespace util {
|
||||||
|
|
||||||
|
LayeredConfig::LayeredConfig() {}
|
||||||
|
LayeredConfig::~LayeredConfig() {}
|
||||||
|
|
||||||
|
void LayeredConfig::Add(Config::Ptr cfg) { Add(cfg, highest(), false); }
|
||||||
|
|
||||||
|
void LayeredConfig::Add(Config::Ptr cfg, int priority) {
|
||||||
|
Add(cfg, priority, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
void LayeredConfig::Add(Config::Ptr cfg, const std::string &label) {
|
||||||
|
Add(cfg, label, highest(), false);
|
||||||
|
}
|
||||||
|
|
||||||
|
void LayeredConfig::Add(Config::Ptr cfg, const std::string &label,
|
||||||
|
int priority) {
|
||||||
|
Add(cfg, label, priority, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
void LayeredConfig::Add(Config::Ptr cfg, const std::string &label,
|
||||||
|
bool writeable) {
|
||||||
|
Add(cfg, label, highest(), writeable);
|
||||||
|
}
|
||||||
|
|
||||||
|
void LayeredConfig::Add(Config::Ptr cfg, const std::string &label, int priority,
|
||||||
|
bool writeable) {
|
||||||
|
Config::ScopedLock lock(*this);
|
||||||
|
ConfigItem item;
|
||||||
|
item.cfg = cfg;
|
||||||
|
item.priority = priority;
|
||||||
|
item.writeable = writeable;
|
||||||
|
item.label = label;
|
||||||
|
auto it = configs_.begin();
|
||||||
|
while (it != configs_.end() && it->priority < priority) {
|
||||||
|
++it;
|
||||||
|
}
|
||||||
|
configs_.insert(it, item);
|
||||||
|
}
|
||||||
|
|
||||||
|
void LayeredConfig::Add(Config::Ptr cfg, int priority, bool writeable) {
|
||||||
|
Add(cfg, std::string(), priority, writeable);
|
||||||
|
}
|
||||||
|
void LayeredConfig::AddWriteable(Config::Ptr cfg, int priority) {
|
||||||
|
Add(cfg, priority, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
Config::Ptr LayeredConfig::Find(const Slice &label) const {
|
||||||
|
Config::ScopedLock lock(*this);
|
||||||
|
|
||||||
|
for (const auto &conf : configs_) {
|
||||||
|
if (conf.label == label) {
|
||||||
|
return conf.cfg;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void LayeredConfig::RemoveConfig(Config::Ptr cfg) {
|
||||||
|
Config::ScopedLock lock(*this);
|
||||||
|
for (auto it = configs_.begin(); it != configs_.end();) {
|
||||||
|
if (it->cfg == cfg) {
|
||||||
|
it = configs_.erase(it);
|
||||||
|
} else {
|
||||||
|
++it;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool LayeredConfig::GetRaw(const Slice &key, std::string *value) const {
|
||||||
|
for (const auto &conf : configs_) {
|
||||||
|
if (conf.cfg->GetRaw(key, value)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool LayeredConfig::SetRaw(const Slice &key, const Slice &value) {
|
||||||
|
for (const auto &conf : configs_) {
|
||||||
|
if (conf.writeable && conf.cfg->SetRaw(key, value)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
Config::Keys LayeredConfig::Enumerate(const Slice &key) const {
|
||||||
|
Config::Keys keys;
|
||||||
|
std::set<Slice> key_set;
|
||||||
|
for (const auto &conf : configs_) {
|
||||||
|
auto conf_keys = conf.cfg->Enumerate(key);
|
||||||
|
for (const auto &k : conf_keys) {
|
||||||
|
if (key_set.insert(k).second) {
|
||||||
|
keys.push_back(k);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return keys;
|
||||||
|
}
|
||||||
|
|
||||||
|
void LayeredConfig::RemoveRaw(const std::string &key) {
|
||||||
|
for (auto &conf : configs_) {
|
||||||
|
if (conf.writeable) {
|
||||||
|
conf.cfg->RemoveRaw(key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int LayeredConfig::lowest() const {
|
||||||
|
if (configs_.empty()) {
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
return configs_.front().priority - 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int LayeredConfig::highest() const {
|
||||||
|
if (configs_.empty()) {
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
return configs_.back().priority + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace util
|
||||||
|
} // namespace tile
|
57
tile/util/layered_config.h
Normal file
57
tile/util/layered_config.h
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
#ifndef TILE_UTIL_LAYERD_CONFIG_H
|
||||||
|
#define TILE_UTIL_LAYERD_CONFIG_H
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "tile/util/config.h"
|
||||||
|
#include <list>
|
||||||
|
|
||||||
|
namespace tile {
|
||||||
|
namespace util {
|
||||||
|
class LayeredConfig : public Config {
|
||||||
|
public:
|
||||||
|
using Ptr = RefPtr<LayeredConfig>;
|
||||||
|
LayeredConfig();
|
||||||
|
LayeredConfig(const LayeredConfig &) = delete;
|
||||||
|
LayeredConfig &operator=(const LayeredConfig &) = delete;
|
||||||
|
|
||||||
|
void Add(Config::Ptr cfg);
|
||||||
|
void Add(Config::Ptr cfg, int priority);
|
||||||
|
void Add(Config::Ptr cfg, const std::string &label);
|
||||||
|
void Add(Config::Ptr cfg, const std::string &label, int priority);
|
||||||
|
void Add(Config::Ptr cfg, const std::string &label, bool writeable);
|
||||||
|
void Add(Config::Ptr cfg, const std::string &label, int priority,
|
||||||
|
bool writeable);
|
||||||
|
void Add(Config::Ptr cfg, int priority, bool writeable);
|
||||||
|
void AddWriteable(Config::Ptr cfg, int priority);
|
||||||
|
Config::Ptr Find(const Slice &label) const;
|
||||||
|
void RemoveConfig(Config::Ptr cfg);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
struct ConfigItem {
|
||||||
|
Config::Ptr cfg;
|
||||||
|
// ... > -2 > -1 > 0 > 1 > 2 > 3 > 4 ...
|
||||||
|
int priority;
|
||||||
|
// can remove or set new?
|
||||||
|
bool writeable;
|
||||||
|
std::string label;
|
||||||
|
};
|
||||||
|
|
||||||
|
bool GetRaw(const Slice &key, std::string *value) const override;
|
||||||
|
bool SetRaw(const Slice &key, const Slice &value) override;
|
||||||
|
Config::Keys Enumerate(const Slice &key) const override;
|
||||||
|
void RemoveRaw(const std::string &key);
|
||||||
|
|
||||||
|
int lowest() const;
|
||||||
|
int highest() const;
|
||||||
|
|
||||||
|
~LayeredConfig();
|
||||||
|
|
||||||
|
private:
|
||||||
|
using ConfigList = std::list<ConfigItem>;
|
||||||
|
ConfigList configs_;
|
||||||
|
};
|
||||||
|
} // namespace util
|
||||||
|
} // namespace tile
|
||||||
|
|
||||||
|
#endif // TILE_UTIL_LAYERD_CONFIG_H
|
Loading…
x
Reference in New Issue
Block a user