4.9.0 to 5.0.0/master
---------------------
-LMDB backend, views and DNS Update support
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+LMDB backend, views
+^^^^^^^^^^^^^^^^^^^
Version 5.0.0-alpha1 ships a new version of the LMDB database schema (called version 6), in support of the new views feature.
There is no downgrade process.
Specifically, catalog zones have not been updated for views support at all.
Most other things are expected to work; if you find something wrong, please :ref:`let us know <getting-support>`.
+LMDB backend, DNS Update support
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
The LMDB backend also now supports :doc:`DNS Update <dnsupdate>` (RFC2136).
+LMDB backend, search support
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+The record search from the :doc:`HTTP API <http-api/search>` functionality has
+been implemented in the LMDB backend.
+
LOC record parsing
^^^^^^^^^^^^^^^^^^
return comments.empty();
}
+bool LMDBBackend::searchRecords(const string& pattern, size_t maxResults, vector<DNSResourceRecord>& result)
+{
+ SimpleMatch simpleMatch(pattern, true);
+ std::vector<DomainInfo> domains;
+ getAllDomains(&domains, false, true);
+ for (const auto& info : domains) {
+ if (!list(info.zone, info.id, true)) {
+ return false;
+ }
+ DNSResourceRecord rec;
+ while (get(rec)) {
+ if (maxResults == 0) {
+ continue;
+ }
+ if (simpleMatch.match(rec.qname.toStringNoDot()) || simpleMatch.match(rec.content)) {
+ result.emplace_back(rec);
+ --maxResults;
+ }
+ }
+ if (maxResults == 0) {
+ break;
+ }
+ }
+ return true;
+}
+
// FIXME: this is not very efficient
static DNSName keyUnconv(std::string& instr)
{
bool feedEnts3(domainid_t domain_id, const DNSName& domain, map<DNSName, bool>& nonterm, const NSEC3PARAMRecordContent& ns3prc, bool narrow) override;
bool replaceRRSet(domainid_t domain_id, const DNSName& qname, const QType& qt, const vector<DNSResourceRecord>& rrset) override;
bool replaceComments(domainid_t domain_id, const DNSName& qname, const QType& qt, const vector<Comment>& comments) override;
+ bool searchRecords(const string& pattern, size_t maxResults, vector<DNSResourceRecord>& result) override;
void viewList(vector<string>& /* result */) override;
void viewListZones(const string& /* view */, vector<ZoneName>& /* result */) override;
self.assertEqual(serverset['records'], rrset2['records'])
self.assertEqual(serverset['comments'], rrset['comments'])
- @unittest.skipIf(is_auth_lmdb(), "No search in LMDB")
def test_search_rr_exact_zone(self):
name = unique_zone_name()
self.create_zone(name=name, serial=22, soa_edit_api='')
u'ttl': 3600, u'type': u'SOA', u'name': name},
])
- @unittest.skipIf(is_auth_lmdb(), "No search in LMDB")
def test_search_rr_exact_zone_filter_type_zone(self):
name = unique_zone_name()
data_type = "zone"
{u'object_type': u'zone', u'name': name, u'zone_id': name},
])
- @unittest.skipIf(is_auth_lmdb(), "No search in LMDB")
def test_search_rr_exact_zone_filter_type_record(self):
name = unique_zone_name()
data_type = "record"
u'ttl': 3600, u'type': u'SOA', u'name': name},
])
- @unittest.skipIf(is_auth_lmdb(), "No search in LMDB")
def test_search_rr_substring(self):
name = unique_zone_name()
search = name[5:-5]
# should return zone, SOA, ns1, ns2
self.assertEqual(len(r.json()), 4)
- @unittest.skipIf(is_auth_lmdb(), "No search in LMDB")
def test_search_rr_case_insensitive(self):
name = unique_zone_name()+'testsuffix.'
self.create_zone(name=name)
# should return zone, SOA, ns1, ns2
self.assertEqual(len(r.json()), 4)
- @unittest.skipIf(is_auth_lmdb(), "No search or comments in LMDB")
+ @unittest.skipIf(is_auth_lmdb(), "No comments in LMDB")
def test_search_rr_comment(self):
name = unique_zone_name()
rrsets = [{
self.assertEqual(data[0]['name'], name)
self.assertEqual(data[0]['content'], rrsets[0]['comments'][0]['content'])
- @unittest.skipIf(is_auth_lmdb(), "No search in LMDB")
def test_search_after_rectify_with_ent(self):
name = unique_zone_name()
search = name.split('.')[0]