}
}
+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.
// 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");
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) {
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);
}
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 {
{
// 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;
}
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();
}
}
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);
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);
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;
}
// 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;
}
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();
}
}
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) {
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;
});
}
{
// 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);
{
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);
{
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
{
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
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);
}
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;
}