void dnsdist_ffi_stat_node_get_full_name_raw(const dnsdist_ffi_stat_node_t* node, const char** name, size_t* nameSize)
{
- const auto& storage = node->node.fullname;
- *name = storage.c_str();
- *nameSize = storage.size();
+ if (node->fullname.empty()) {
+ node->fullname = node->node.fullname.toString();
+ }
+ *name = node->fullname.c_str();
+ *nameSize = node->fullname.size();
}
unsigned int dnsdist_ffi_stat_node_get_children_count(const dnsdist_ffi_stat_node_t* node)
[](const StatNode& node) -> unsigned int {
return node.size();
});
- luaCtx.registerMember("fullname", &StatNode::fullname);
+ luaCtx.registerMember<std::string(StatNode::*)>(std::string("fullname"), [](const StatNode& node) -> std::string { return node.fullname.toString(); });
luaCtx.registerMember("labelsCount", &StatNode::labelsCount);
luaCtx.registerMember("servfails", &StatNode::Stat::servfails);
luaCtx.registerMember("nxdomains", &StatNode::Stat::nxdomains);
}
auto last = tmp.end() - 1;
- children[*last].submit(last, tmp.begin(), "", rcode, bytes, remote, 1, hit, samplingRate);
+ children[*last].submit(last, tmp.begin(), g_rootdnsname, rcode, bytes, remote, 1, hit, samplingRate);
}
static uint64_t adjustForSampling(uint32_t count, size_t samplingRate)
www.powerdns.com.
*/
-void StatNode::submit(std::vector<string>::const_iterator end, std::vector<string>::const_iterator begin, const std::string& domain, int rcode, unsigned int bytes, const std::optional<ComboAddress>& remote, unsigned int count, bool hit, size_t samplingRate)
+void StatNode::submit(std::vector<string>::const_iterator end, std::vector<string>::const_iterator begin, const DNSName& domain, int rcode, unsigned int bytes, const std::optional<ComboAddress>& remote, unsigned int count, bool hit, size_t samplingRate)
{
// cerr<<"Submit called for domain='"<<domain<<"': ";
// for(const std::string& n : labels)
if (end == begin) {
if (fullname.empty()) {
- size_t needed = name.size() + 1 + domain.size();
- if (fullname.capacity() < needed) {
- fullname.reserve(needed);
- }
- fullname = name;
- fullname.append(".");
- fullname.append(domain);
+ fullname = domain;
+ fullname.prependRawLabel(name);
labelsCount = count;
}
// cerr<<"Hit the end, set our fullname to '"<<fullname<<"'"<<endl<<endl;
}
else {
if (fullname.empty()) {
- size_t needed = name.size() + 1 + domain.size();
- if (fullname.capacity() < needed) {
- fullname.reserve(needed);
- }
- fullname = name;
- fullname.append(".");
- fullname.append(domain);
+ fullname = domain;
+ fullname.prependRawLabel(name);
labelsCount = count;
}
// cerr<<"Not yet end, set our fullname to '"<<fullname<<"', recursing"<<endl;
Stat s;
std::string name;
- std::string fullname;
+ DNSName fullname;
uint8_t labelsCount{0};
void submit(const DNSName& domain, int rcode, uint32_t bytes, bool hit, const std::optional<ComboAddress>& remote, size_t samplingRate);
}
private:
- void submit(std::vector<string>::const_iterator end, std::vector<string>::const_iterator begin, const std::string& domain, int rcode, uint32_t bytes, const std::optional<ComboAddress>& remote, unsigned int count, bool hit, size_t samplingRate);
+ void submit(std::vector<string>::const_iterator end, std::vector<string>::const_iterator begin, const DNSName& domain, int rcode, uint32_t bytes, const std::optional<ComboAddress>& remote, unsigned int count, bool hit, size_t samplingRate);
using children_t = std::map<std::string, StatNode, CIStringCompare>;
children_t children;