]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
Factor code responsible for filling DomainInfo. NFC yet.
authorMiod Vallat <miod.vallat@powerdns.com>
Mon, 15 Sep 2025 10:09:00 +0000 (12:09 +0200)
committerMiod Vallat <miod.vallat@powerdns.com>
Fri, 19 Sep 2025 10:39:16 +0000 (12:39 +0200)
Signed-off-by: Miod Vallat <miod.vallat@powerdns.com>
modules/lmdbbackend/lmdbbackend.cc
modules/lmdbbackend/lmdbbackend.hh

index 51a93bed2e039a67cef449b64a18fbce8e2d8f47..73e292fe68146d93984c3aed2bbacc3889ae0613 100644 (file)
@@ -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<domainid_t>(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("<<domain<<", "<<domain_id<<")"<<endl;
   domainid_t real_id = domain_id;
   if (real_id == UnknownDomainID) {
-    auto rotxn = d_tdomains->getROTransaction();
-    DomainInfo di;
-    real_id = rotxn.get<0>(domain, di);
-    // cout<<"real_id = "<<real_id << endl;
-    if (!real_id)
+    DomainInfo info;
+    if (!findDomain(domain, info)) {
       return false;
+    }
+    real_id = info.id;
   }
   if (d_rwtxn) {
     throw DBException("Attempt to start a transaction while one was open already");
@@ -1422,12 +1442,12 @@ bool LMDBBackend::replaceRRSet(domainid_t domain_id, const DNSName& qname, const
     needCommit = true;
   }
 
-  DomainInfo di;
-  if (!d_tdomains->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<domainid_t>(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<<endl;
       d_getcursor.reset();
@@ -1869,12 +1887,11 @@ void LMDBBackend::lookupInternal(const QType& type, const DNSName& qdomain, doma
     }
   }
   else {
-    if (!d_tdomains->getROTransaction().get(zoneId, info)) {
+    if (!findDomain(zoneId, info)) {
       // cout<<"Could not find a zone with id "<<zoneId<<endl;
       d_getcursor.reset();
       return;
     }
-    info.id = zoneId;
   }
 
   DNSName relqname = qdomain.makeRelative(info.zone);
@@ -2068,27 +2085,10 @@ bool LMDBBackend::getDomainInfo(const ZoneName& domain, DomainInfo& info, bool g
     return false;
   }
 
-  {
-    auto txn = d_tdomains->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<void(DomainInfo&)>& 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<vo
 // NOLINTNEXTLINE(readability-identifier-length)
 bool LMDBBackend::genChangeDomain(domainid_t id, const std::function<void(DomainInfo&)>& 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<ComboAddress
 
 bool LMDBBackend::createDomain(const ZoneName& domain, const DomainInfo::DomainKind kind, const vector<ComboAddress>& 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<DomainInfo>* 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<DomainInfo>& 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__<< ": "<<id <<", "<<qname << " " << unhashed<<endl;
 
-  DomainInfo di;
-  if (!d_tdomains->getROTransaction().get(id, di)) {
+  DomainInfo info;
+  if (!findDomain(id, info)) {
     // domain does not exist, tough luck
     return false;
   }
-  // cout <<"Zone: "<<di.zone<<endl;
+  // cout <<"Zone: "<<info.zone<<endl;
 
   compoundOrdername co;
   auto txn = getRecordsROTransaction(id);
@@ -2624,7 +2611,7 @@ bool LMDBBackend::getBeforeAndAfterNamesAbsolute(domainid_t id, const DNSName& q
     {
       LMDBResourceRecord lrr;
       deserializeFromBuffer(val.get<StringView>(), 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<StringView>(), 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'!"<<endl;
         // for 'after', we need to find the first hash of this zone
@@ -2696,7 +2683,7 @@ bool LMDBBackend::getBeforeAndAfterNamesAbsolute(domainid_t id, const DNSName& q
     {
       LMDBResourceRecord lrr;
       deserializeFromBuffer(val.get<StringView>(), 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 "<<before<<endl;
     // return us to starting point
@@ -2866,13 +2853,13 @@ bool LMDBBackend::updateDNSSECOrderNameAndAuth(domainid_t domain_id, const DNSNa
     needCommit = true;
   }
 
-  DomainInfo di;
-  if (!d_tdomains->getROTransaction().get(domain_id, di)) {
+  DomainInfo info;
+  if (!findDomain(domain_id, info)) {
     //    cout<<"Could not find domain_id "<<domain_id <<endl;
     return false;
   }
 
-  DNSName rel = qname.makeRelative(di.zone);
+  DNSName rel = qname.makeRelative(info.zone);
 
   compoundOrdername co;
   string matchkey = co(domain_id, rel);
@@ -2957,8 +2944,7 @@ bool LMDBBackend::updateEmptyNonTerminals(domainid_t domain_id, set<DNSName>& 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 "<<domain_id<<endl;
     return false;
   }
index 9a0be2988410f410da2d432dccf4eb69acd85046..740a323df817e49d91dd97835729988dcd2270a0 100644 (file)
@@ -339,6 +339,9 @@ private:
   bool genChangeDomain(domainid_t id, const std::function<void(DomainInfo&)>& 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<DomainInfo>* domains, const std::function<bool(DomainInfo&)>& allow);
 
   void lookupStart(domainid_t domain_id, const std::string& match, bool dolog);