From: Miod Vallat Date: Mon, 15 Sep 2025 10:09:00 +0000 (+0200) Subject: Factor code responsible for filling DomainInfo. NFC yet. X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=7c5d7af8ba785c99021a78b229f89ea6ad652170;p=thirdparty%2Fpdns.git Factor code responsible for filling DomainInfo. NFC yet. Signed-off-by: Miod Vallat --- diff --git a/modules/lmdbbackend/lmdbbackend.cc b/modules/lmdbbackend/lmdbbackend.cc index 51a93bed2..73e292fe6 100644 --- a/modules/lmdbbackend/lmdbbackend.cc +++ b/modules/lmdbbackend/lmdbbackend.cc @@ -1185,6 +1185,27 @@ void LMDBBackend::deleteDomainRecords(RecordsRWTransaction& txn, const std::stri } } +bool LMDBBackend::findDomain(const ZoneName& domain, DomainInfo& info) +{ + auto rotxn = d_tdomains->getROTransaction(); + auto domain_id = rotxn.get<0>(domain, info); + if (domain_id == 0) { + return false; + } + info.id = static_cast(domain_id); + return true; +} + +bool LMDBBackend::findDomain(domainid_t domainid, DomainInfo& info) +{ + auto rotxn = d_tdomains->getROTransaction(); + if (!rotxn.get(domainid, info)) { + return false; + } + info.id = domainid; + return true; +} + /* Here's the complicated story. Other backends have just one transaction, which is either on or not. @@ -1202,12 +1223,11 @@ bool LMDBBackend::startTransaction(const ZoneName& domain, domainid_t domain_id) // cout <<"startTransaction("<getROTransaction(); - DomainInfo di; - real_id = rotxn.get<0>(domain, di); - // cout<<"real_id = "<getROTransaction().get(domain_id, di)) { + DomainInfo info; + if (!findDomain(domain_id, info)) { return false; } - DNSName relative = qname.makeRelative(di.zone); + DNSName relative = qname.makeRelative(info.zone); compoundOrdername co; string match; if (qt.getCode() == QType::ANY) { @@ -1474,7 +1494,7 @@ bool LMDBBackend::replaceRRSet(domainid_t domain_id, const DNSName& qname, const for (const auto& rr : rrset) { LMDBResourceRecord lrr(rr); lrr.content = serializeContent(lrr.qtype.getCode(), lrr.qname, lrr.content); - lrr.qname.makeUsRelative(di.zone); + lrr.qname.makeUsRelative(info.zone); adjustedRRSet.emplace_back(lrr); } @@ -1730,11 +1750,9 @@ bool LMDBBackend::deleteDomain(const ZoneName& domain) if (!d_handle_dups) { // get domain id - auto txn = d_tdomains->getROTransaction(); - - DomainInfo di; - if (auto domain_id = txn.get<0>(domain, di); domain_id != 0) { - idvec.push_back(domain_id); + DomainInfo info; + if (findDomain(domain, info)) { + idvec.push_back(info.id); } } else { @@ -1824,7 +1842,7 @@ bool LMDBBackend::listSubZone(const ZoneName& target, domainid_t domain_id) { // 1. from domain_id get base domain name DomainInfo info; - if (!d_tdomains->getROTransaction().get(domain_id, info)) { + if (!findDomain(domain_id, info)) { return false; } @@ -1857,11 +1875,11 @@ void LMDBBackend::lookupInternal(const QType& type, const DNSName& qdomain, doma DomainInfo info; if (zoneId == UnknownDomainID) { // may be the case if coming from lookup() ZoneName hunt(qdomain); - auto rotxn = d_tdomains->getROTransaction(); - do { - info.id = static_cast(rotxn.get<0>(hunt, info)); - } while (info.id == 0 && type != QType::SOA && hunt.chopOff()); + if (findDomain(hunt, info)) { + break; + } + } while (type != QType::SOA && hunt.chopOff()); if (info.id == 0) { // cout << "Did not find zone for "<< qdomain<getROTransaction().get(zoneId, info)) { + if (!findDomain(zoneId, info)) { // cout<<"Could not find a zone with id "<getROTransaction(); - // auto range = txn.prefix_range<0>(domain); - - // bool found = false; - - // for (auto& iter = range.first ; iter != range.second; ++iter) { - // found = true; - // info.id = iter.getID(); - // info.backend = this; - // } - - // if (!found) { - // return false; - // } - if ((info.id = txn.get<0>(domain, info)) == 0) { - return false; - } - - info.backend = this; + if (!findDomain(domain, info)) { + return false; } + info.backend = this; if (getserial) { getSerial(info); @@ -2099,17 +2099,13 @@ bool LMDBBackend::getDomainInfo(const ZoneName& domain, DomainInfo& info, bool g bool LMDBBackend::genChangeDomain(const ZoneName& domain, const std::function& func) { - auto txn = d_tdomains->getRWTransaction(); - - DomainInfo di; - - auto id = txn.get<0>(domain, di); - if (id == 0) { + DomainInfo info; + if (!findDomain(domain, info)) { return false; } - func(di); - txn.put(di, id); - + func(info); + auto txn = d_tdomains->getRWTransaction(); + txn.put(info, info.id); txn.commit(); return true; } @@ -2117,17 +2113,13 @@ bool LMDBBackend::genChangeDomain(const ZoneName& domain, const std::function& func) { - DomainInfo di; - - auto txn = d_tdomains->getRWTransaction(); - - if (!txn.get(id, di)) + DomainInfo info; + if (!findDomain(id, info)) { return false; - - func(di); - - txn.put(di, id); - + } + func(info); + auto txn = d_tdomains->getRWTransaction(); + txn.put(info, id); txn.commit(); return true; } @@ -2155,20 +2147,20 @@ bool LMDBBackend::setPrimaries(const ZoneName& domain, const vector& primaries, const string& account) { - DomainInfo di; + DomainInfo info; + if (findDomain(domain, info)) { + throw DBException("Domain '" + domain.toLogString() + "' exists already"); + } { auto txn = d_tdomains->getRWTransaction(); - if (txn.get<0>(domain, di)) { - throw DBException("Domain '" + domain.toLogString() + "' exists already"); - } - di.zone = domain; - di.kind = kind; - di.primaries = primaries; - di.account = account; + info.zone = domain; + info.kind = kind; + info.primaries = primaries; + info.account = account; - txn.put(di, 0, d_random_ids, domain.hash()); + txn.put(info, 0, d_random_ids, domain.hash()); txn.commit(); } @@ -2193,18 +2185,13 @@ void LMDBBackend::getAllDomainsFiltered(vector* domains, const std:: } for (const auto& zone : dups) { - DomainInfo di; - + DomainInfo info; // this get grabs the oldest item if there are duplicates - di.id = txn.get<0>(zone, di); - - if (di.id == 0) { - // .get actually found nothing for us + if (!findDomain(zone, info)) { continue; } - - di.backend = this; - zonemap[di.zone] = di; + info.backend = this; + zonemap[info.zone] = info; } for (auto& [k, v] : zonemap) { @@ -2318,8 +2305,8 @@ void LMDBBackend::getUpdatedPrimaries(vector& updatedDomains, std::u void LMDBBackend::setNotified(domainid_t domain_id, uint32_t serial) { - genChangeDomain(domain_id, [serial](DomainInfo& di) { - di.notified_serial = serial; + genChangeDomain(domain_id, [serial](DomainInfo& info) { + info.notified_serial = serial; }); } @@ -2586,12 +2573,12 @@ bool LMDBBackend::getBeforeAndAfterNamesAbsolute(domainid_t id, const DNSName& q { // cout << __PRETTY_FUNCTION__<< ": "<getROTransaction().get(id, di)) { + DomainInfo info; + if (!findDomain(id, info)) { // domain does not exist, tough luck return false; } - // cout <<"Zone: "<(), lrr); - unhashed = DNSName(lrr.content.c_str(), lrr.content.size(), 0, false) + di.zone.operator const DNSName&(); + unhashed = DNSName(lrr.content.c_str(), lrr.content.size(), 0, false) + info.zone.operator const DNSName&(); } // now to find after .. at the beginning of the zone return getAfterForwardFromStart(cursor, key, val, id, after); @@ -2683,7 +2670,7 @@ bool LMDBBackend::getBeforeAndAfterNamesAbsolute(domainid_t id, const DNSName& q { LMDBResourceRecord lrr; deserializeFromBuffer(val.get(), lrr); - unhashed = DNSName(lrr.content.c_str(), lrr.content.size(), 0, false) + di.zone.operator const DNSName&(); + unhashed = DNSName(lrr.content.c_str(), lrr.content.size(), 0, false) + info.zone.operator const DNSName&(); } // cout <<"Should still find 'after'!"<(), lrr); - unhashed = DNSName(lrr.content.c_str(), lrr.content.size(), 0, false) + di.zone.operator const DNSName&(); + unhashed = DNSName(lrr.content.c_str(), lrr.content.size(), 0, false) + info.zone.operator const DNSName&(); } // cout<<"Went backwards, found "<getROTransaction().get(domain_id, di)) { + DomainInfo info; + if (!findDomain(domain_id, info)) { // cout<<"Could not find domain_id "<& in } DomainInfo info; - auto rotxn = d_tdomains->getROTransaction(); - if (!rotxn.get(domain_id, info)) { + if (!findDomain(domain_id, info)) { // cout <<"No such domain with id "<& func); static void deleteDomainRecords(RecordsRWTransaction& txn, const std::string& match, QType qtype = QType::ANY); + bool findDomain(const ZoneName& domain, DomainInfo& info); + bool findDomain(domainid_t domainid, DomainInfo& info); + void getAllDomainsFiltered(vector* domains, const std::function& allow); void lookupStart(domainid_t domain_id, const std::string& match, bool dolog);