in src/config/config.cc [323:404]
void Config::initFieldValidator() {
std::map<std::string, ValidateFn> validators = {
{"requirepass",
[this]([[maybe_unused]] const std::string &k, const std::string &v) -> Status {
if (v.empty() && !load_tokens.empty()) {
return {Status::NotOK, "requirepass empty not allowed while the namespace exists"};
}
if (load_tokens.find(v) != load_tokens.end()) {
return {Status::NotOK, "requirepass is duplicated with namespace tokens"};
}
return Status::OK();
}},
{"masterauth",
[this]([[maybe_unused]] const std::string &k, const std::string &v) -> Status {
if (load_tokens.find(v) != load_tokens.end()) {
return {Status::NotOK, "masterauth is duplicated with namespace tokens"};
}
return Status::OK();
}},
{"compact-cron",
[this]([[maybe_unused]] const std::string &k, const std::string &v) -> Status {
std::vector<std::string> args = util::Split(v, " \t");
return compact_cron.SetScheduleTime(args);
}},
{"bgsave-cron",
[this]([[maybe_unused]] const std::string &k, const std::string &v) -> Status {
std::vector<std::string> args = util::Split(v, " \t");
return bgsave_cron.SetScheduleTime(args);
}},
{"dbsize-scan-cron",
[this]([[maybe_unused]] const std::string &k, const std::string &v) -> Status {
std::vector<std::string> args = util::Split(v, " \t");
return dbsize_scan_cron.SetScheduleTime(args);
}},
{"compaction-checker-range",
[this]([[maybe_unused]] const std::string &k, const std::string &v) -> Status {
if (!compaction_checker_cron_str_.empty()) {
return {Status::NotOK, "compaction-checker-range cannot be set while compaction-checker-cron is set"};
}
if (v.empty()) {
compaction_checker_cron.Clear();
return Status::OK();
}
return compaction_checker_cron.SetScheduleTime({"*", v, "*", "*", "*"});
}},
{"compaction-checker-cron",
[this]([[maybe_unused]] const std::string &k, const std::string &v) -> Status {
std::vector<std::string> args = util::Split(v, " \t");
return compaction_checker_cron.SetScheduleTime(args);
}},
{"rename-command",
[]([[maybe_unused]] const std::string &k, const std::string &v) -> Status {
std::vector<std::string> all_args = util::Split(v, "\n");
for (auto &p : all_args) {
std::vector<std::string> args = util::Split(p, " \t");
if (args.size() != 2) {
return {Status::NotOK, "Invalid rename-command format"};
}
auto commands = redis::CommandTable::Get();
auto cmd_iter = commands->find(util::ToLower(args[0]));
if (cmd_iter == commands->end()) {
return {Status::NotOK, "No such command in rename-command"};
}
if (args[1] != "\"\"") {
auto new_command_name = util::ToLower(args[1]);
if (commands->find(new_command_name) != commands->end()) {
return {Status::NotOK, "Target command name already exists"};
}
(*commands)[new_command_name] = cmd_iter->second;
}
commands->erase(cmd_iter);
}
return Status::OK();
}},
};
for (const auto &iter : validators) {
auto field_iter = fields_.find(iter.first);
if (field_iter != fields_.end()) {
field_iter->second->validate = iter.second;
}
}
}