From: Peter van Dijk Date: Fri, 28 Apr 2023 12:37:22 +0000 (+0200) Subject: filter duplicate domain entries X-Git-Tag: auth-4.8.0-beta1~1^2~9 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b5cb63baeeb52b03348de1ec3798fc3c143aa726;p=thirdparty%2Fpdns.git filter duplicate domain entries --- diff --git a/modules/lmdbbackend/lmdbbackend.cc b/modules/lmdbbackend/lmdbbackend.cc index 23804d3674..5da5503b45 100644 --- a/modules/lmdbbackend/lmdbbackend.cc +++ b/modules/lmdbbackend/lmdbbackend.cc @@ -1660,14 +1660,53 @@ bool LMDBBackend::createDomain(const DNSName& domain, const DomainInfo::DomainKi } void LMDBBackend::getAllDomainsFiltered(vector* domains, const std::function& allow) { - auto txn = d_tdomains->getROTransaction(); - for (auto iter = txn.begin(); iter != txn.end(); ++iter) { - DomainInfo di = *iter; - di.id = iter.getID(); - di.backend = this; + if (d_handle_dups) { + cerr<<"handling dups"<getROTransaction(); + + map zonemap; + set dups; - if (allow (di)) { - domains->push_back(di); + for (auto iter = txn.begin(); iter != txn.end(); ++iter) { + DomainInfo di = *iter; + di.id = iter.getID(); + di.backend = this; + + if (zonemap.count(di.zone) == 1) { + dups.insert(di.zone); + } + else { + zonemap[di.zone] = di; + } + } + + for (const auto& zone : dups) { + DomainInfo di; + + if (!(di.id = txn.get<0>(zone, di))) { + continue; + } + + di.backend = this; + zonemap[di.zone] = di; + } + + for (auto [k,v] : zonemap) { + if (allow (v)) { + domains->push_back(v); + } + } + } + else { + auto txn = d_tdomains->getROTransaction(); + for (auto iter = txn.begin(); iter != txn.end(); ++iter) { + DomainInfo di = *iter; + di.id = iter.getID(); + di.backend = this; + + if (allow (di)) { + domains->push_back(di); + } } } }