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=6f6e2aa7cfea84c9170f374f09fc62ddcfc91773;p=thirdparty%2Fpdns.git Factor code responsible for filling DomainInfo. NFC yet. Signed-off-by: Miod Vallat (cherry picked from commit 7c5d7af8ba785c99021a78b229f89ea6ad652170) --- diff --git a/modules/lmdbbackend/lmdbbackend.cc b/modules/lmdbbackend/lmdbbackend.cc index d1e5e162c..d4d8468f9 100644 --- a/modules/lmdbbackend/lmdbbackend.cc +++ b/modules/lmdbbackend/lmdbbackend.cc @@ -1120,6 +1120,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. @@ -1137,12 +1158,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) { @@ -1405,7 +1425,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); } @@ -1684,10 +1704,10 @@ bool LMDBBackend::deleteDomain(const ZoneName& domain) if (!d_handle_dups) { // get domain id - auto txn = d_tdomains->getROTransaction(); - - DomainInfo di; - idvec.push_back(txn.get<0>(domain, di)); + DomainInfo info; + if (findDomain(domain, info)) { + idvec.push_back(info.id); + } } else { // this transaction used to be RO. @@ -1776,7 +1796,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; } @@ -1809,11 +1829,11 @@ void LMDBBackend::lookupInternal(const QType& type, const DNSName& qdomain, doma DomainInfo info; if (zoneId == UnknownDomainID) { 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); @@ -2031,14 +2033,13 @@ bool LMDBBackend::getDomainInfo(const ZoneName& domain, DomainInfo& info, bool g int LMDBBackend::genChangeDomain(const ZoneName& domain, const std::function& func) { + DomainInfo info; + if (!findDomain(domain, info)) { + return static_cast(false); + } + func(info); auto txn = d_tdomains->getRWTransaction(); - - DomainInfo di; - - auto id = txn.get<0>(domain, di); - func(di); - txn.put(di, id); - + txn.put(info, info.id); txn.commit(); return true; } @@ -2046,17 +2047,13 @@ int 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; } @@ -2084,20 +2081,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(); } @@ -2122,18 +2119,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) { @@ -2247,8 +2239,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; }); } @@ -2519,12 +2511,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: "<()); - 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); @@ -2612,7 +2604,7 @@ bool LMDBBackend::getBeforeAndAfterNamesAbsolute(domainid_t id, const DNSName& q } } before = co.getQName(key.getNoStripHeader()); - 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'!"<()); - 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); + 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);