From: Miod Vallat Date: Fri, 5 Sep 2025 08:41:30 +0000 (+0200) Subject: Change serializeToBuffer() interface to append rather than replace. X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=1fc31e005ef55b7e525d25b932a3f499090b3163;p=thirdparty%2Fpdns.git Change serializeToBuffer() interface to append rather than replace. Signed-off-by: Miod Vallat --- diff --git a/ext/lmdb-safe/lmdb-typed.hh b/ext/lmdb-safe/lmdb-typed.hh index 3a8180352..db408597a 100644 --- a/ext/lmdb-safe/lmdb-typed.hh +++ b/ext/lmdb-safe/lmdb-typed.hh @@ -47,14 +47,12 @@ uint32_t MDBGetRandomID(MDBRWTransaction& txn, MDBDbi& dbi, uint32_t seed=0); * This is our serialization interface. It can be specialized for other types. */ template -std::string serializeToBuffer(const T& value) +void serializeToBuffer(std::string& buffer, const T& value) { - std::string buffer; boost::iostreams::back_insert_device inserter(buffer); boost::iostreams::stream> inserterStream(inserter); boost::archive::binary_oarchive outputArchive(inserterStream, boost::archive::no_header | boost::archive::no_codecvt); outputArchive << value; - return buffer; } template @@ -775,7 +773,9 @@ public: // flags = MDB_APPEND; } } - (*d_txn)->put(d_parent->d_main, itemId, serializeToBuffer(value), flags); + std::string ser; + serializeToBuffer(ser, value); + (*d_txn)->put(d_parent->d_main, itemId, ser, flags); insert<0>(value, itemId); insert<1>(value, itemId); diff --git a/modules/lmdbbackend/lmdbbackend.cc b/modules/lmdbbackend/lmdbbackend.cc index 26683874c..1758fb96e 100644 --- a/modules/lmdbbackend/lmdbbackend.cc +++ b/modules/lmdbbackend/lmdbbackend.cc @@ -1026,23 +1026,21 @@ constexpr size_t serialize_offset_disabled = serialize_offset_auth + sizeof(char constexpr size_t serialize_offset_ordername = serialize_offset_disabled + sizeof(char); template <> -std::string serializeToBuffer(const LMDBBackend::LMDBResourceRecord& value) +void serializeToBuffer(std::string& buffer, const LMDBBackend::LMDBResourceRecord& value) { - std::string buffer; - // Data size of the resource record. uint16_t len = value.content.length(); // Reserve space to store the size of the resource record + the content of the resource // record + a few other things. - buffer.reserve(sizeof(len) + len + sizeof(value.ttl) + sizeof(value.auth) + sizeof(value.disabled) + sizeof(value.hasOrderName)); + buffer.reserve(buffer.size() + sizeof(len) + len + sizeof(value.ttl) + sizeof(value.auth) + sizeof(value.disabled) + sizeof(value.hasOrderName)); - // Store the size of the resource record. + // Store the size of the resource record (in host order). // NOLINTNEXTLINE. - buffer.assign((const char*)&len, sizeof(len)); + buffer.append((const char*)&len, sizeof(len)); // Store the contents of the resource record. - buffer += value.content; + buffer.append(value.content); // The few other things. // NOLINTNEXTLINE. @@ -1050,18 +1048,14 @@ std::string serializeToBuffer(const LMDBBackend::LMDBResourceRecord& value) buffer.append(1, (char)value.auth); buffer.append(1, (char)value.disabled); buffer.append(1, (char)value.hasOrderName); - - return buffer; } template <> -std::string serializeToBuffer(const vector& value) +void serializeToBuffer(std::string& buffer, const vector& value) { - std::string ret; for (const auto& lrr : value) { - ret += serializeToBuffer(lrr); + serializeToBuffer(buffer, lrr); } - return ret; } static inline size_t deserializeRRFromBuffer(const string_view& str, LMDBBackend::LMDBResourceRecord& lrr) @@ -1306,13 +1300,15 @@ void LMDBBackend::writeNSEC3RecordPair(const std::shared_ptr qname back chain record with ttl set to 0 lrr.ttl = 0; lrr.content = qname.toDNSStringLC(); - string ser = serializeToBuffer(lrr); + std::string ser; + serializeToBuffer(ser, lrr); txn->txn->put(txn->db->dbi, co(domain_id, ordername, QType::NSEC3), ser); // Write qname -> ordername forward chain record with ttl set to 1 lrr.ttl = 1; lrr.content = ordername.toDNSString(); - ser = serializeToBuffer(lrr); + ser.clear(); + serializeToBuffer(ser, lrr); txn->txn->put(txn->db->dbi, co(domain_id, qname, QType::NSEC3), ser); } @@ -1361,7 +1357,7 @@ bool LMDBBackend::feedRecord(const DNSResourceRecord& r, const DNSName& ordernam if (!d_rwtxn->txn->get(d_rwtxn->db->dbi, matchName, _rrs)) { rrs = _rrs.get(); } - rrs += serializeToBuffer(lrr); + serializeToBuffer(rrs, lrr); d_rwtxn->txn->put(d_rwtxn->db->dbi, matchName, rrs); @@ -1381,7 +1377,8 @@ bool LMDBBackend::feedEnts(domainid_t domain_id, map& nonterm) lrr.auth = nt.second; lrr.hasOrderName = false; - std::string ser = serializeToBuffer(lrr); + std::string ser; + serializeToBuffer(ser, lrr); d_rwtxn->txn->put(d_rwtxn->db->dbi, co(domain_id, lrr.qname, QType::ENT), ser); } return true; @@ -1398,7 +1395,8 @@ bool LMDBBackend::feedEnts3(domainid_t domain_id, const DNSName& domain, maptxn->put(d_rwtxn->db->dbi, co(domain_id, lrr.qname, QType::ENT), ser); if (lrr.hasOrderName) { @@ -1482,7 +1480,9 @@ bool LMDBBackend::replaceRRSet(domainid_t domain_id, const DNSName& qname, const adjustedRRSet.emplace_back(lrr); } - txn->txn->put(txn->db->dbi, match, serializeToBuffer(adjustedRRSet)); + std::string ser; + serializeToBuffer(ser, adjustedRRSet); + txn->txn->put(txn->db->dbi, match, ser); } if (needCommit) @@ -2905,7 +2905,9 @@ bool LMDBBackend::updateDNSSECOrderNameAndAuth(domainid_t domain_id, const DNSNa newRRs.push_back(std::move(lrr)); } if (changed) { - cursor.put(key, serializeToBuffer(newRRs)); + std::string ser; + serializeToBuffer(ser, newRRs); + cursor.put(key, ser); } } while (cursor.next(key, val) == 0); @@ -3007,7 +3009,8 @@ bool LMDBBackend::updateEmptyNonTerminals(domainid_t domain_id, set& in lrr.qname = name.makeRelative(info.zone); lrr.ttl = 0; lrr.auth = true; - std::string ser = serializeToBuffer(lrr); + std::string ser; + serializeToBuffer(ser, lrr); txn->txn->put(txn->db->dbi, order(domain_id, lrr.qname, QType::ENT), ser); // cout <<" +"<