]> granicus.if.org Git - pdns/commitdiff
bindbackend hashed
authorbert hubert <bert.hubert@netherlabs.nl>
Sun, 4 Sep 2016 19:02:51 +0000 (21:02 +0200)
committerbert hubert <bert.hubert@powerdns.com>
Tue, 13 Sep 2016 10:53:30 +0000 (12:53 +0200)
modules/bindbackend/bindbackend2.cc
modules/bindbackend/bindbackend2.hh

index 07330b4fa254bbd12031085f229d9fc8d55912b6..9be212f0d718041b90d1b4c8b77e367e9cb1ab5f 100644 (file)
@@ -998,16 +998,11 @@ bool Bind2Backend::getBeforeAndAfterNamesAbsolute(uint32_t id, const std::string
     return findBeforeAndAfterUnhashed(bbd, dqname, unhashed, before, after);
   }
   else {
-    typedef recordstorage_t::index<HashedTag>::type records_by_hashindex_t;
-    records_by_hashindex_t& hashindex=boost::multi_index::get<HashedTag>(*bbd.d_records.getWRITABLE());
+    auto& hashindex=boost::multi_index::get<NSEC3Tag>(*bbd.d_records.getWRITABLE());
 
-    records_by_hashindex_t::const_iterator iter, first;
-    first = hashindex.upper_bound(""); // skip records without a hash
+    auto first = hashindex.upper_bound("");
+    auto iter = hashindex.upper_bound(toLower(qname));
 
-    // for(auto iter = first; iter != hashindex.end(); iter++)
-    //   cerr<<iter->nsec3hash<<endl;
-
-    iter = hashindex.upper_bound(toLower(qname));
     if (iter == hashindex.end()) {
       --iter;
       before = iter->nsec3hash;
@@ -1081,20 +1076,17 @@ void Bind2Backend::lookup(const QType &qtype, const DNSName &qname, DNSPacket *p
   if(d_handle.d_records->empty())
     DLOG(L<<"Query with no results"<<endl);
 
-  pair<recordstorage_t::const_iterator, recordstorage_t::const_iterator> range;
-
-  range = d_handle.d_records->equal_range(d_handle.qname);
-  //cout<<"End equal range"<<endl;
   d_handle.mustlog = mustlog;
+
+  auto& hashedidx = boost::multi_index::get<UnorderedNameTag>(*d_handle.d_records);
+  auto range = hashedidx.equal_range(d_handle.qname);
   
   if(range.first==range.second) {
-    // cerr<<"Found nothing!"<<endl;
     d_handle.d_list=false;
     d_handle.d_iter = d_handle.d_end_iter  = range.first;
     return;
   }
   else {
-    // cerr<<"Found something!"<<endl;
     d_handle.d_iter=range.first;
     d_handle.d_end_iter=range.second;
   }
index b3ec460753e5b759596902f5494f3ef2b20a6e76..ec6b0a444d3d610ca449f3b41ddb563d0041deef 100644 (file)
@@ -34,6 +34,7 @@
 #include <boost/tuple/tuple.hpp>
 #include <boost/tuple/tuple_comparison.hpp>
 #include <boost/multi_index_container.hpp>
+#include <boost/multi_index/hashed_index.hpp>
 #include <boost/multi_index/ordered_index.hpp>
 #include <boost/multi_index/identity.hpp>
 #include <boost/multi_index/member.hpp>
@@ -86,13 +87,15 @@ struct Bind2DNSCompare : std::less<Bind2DNSRecord>
     {return a.qname.canonCompare(b.qname);}
 };
 
-struct HashedTag{};
+struct NSEC3Tag{};
+struct UnorderedNameTag{};
 
 typedef multi_index_container<
   Bind2DNSRecord,
   indexed_by  <
                 ordered_non_unique<identity<Bind2DNSRecord>, Bind2DNSCompare >,
-                ordered_non_unique<tag<HashedTag>, member<Bind2DNSRecord, std::string, &Bind2DNSRecord::nsec3hash> >
+                hashed_non_unique<tag<UnorderedNameTag>, member<Bind2DNSRecord, DNSName, &Bind2DNSRecord::qname> >,
+                ordered_non_unique<tag<NSEC3Tag>, member<Bind2DNSRecord, std::string, &Bind2DNSRecord::nsec3hash> >
               >
 > recordstorage_t;
 
@@ -194,7 +197,7 @@ public:
   void lookup(const QType &, const DNSName &qdomain, DNSPacket *p=0, int zoneId=-1);
   bool list(const DNSName &target, int id, bool include_disabled=false);
   bool get(DNSResourceRecord &);
-  bool get(DNSZoneRecord &) override;
+  //  bool get(DNSZoneRecord &) override;
   void getAllDomains(vector<DomainInfo> *domains, bool include_disabled=false);
 
   static DNSBackend *maker();
@@ -264,9 +267,10 @@ private:
     handle();
 
     shared_ptr<const recordstorage_t > d_records;
-    recordstorage_t::const_iterator d_iter, d_end_iter;
-    recordstorage_t::const_iterator d_qname_iter;
-    recordstorage_t::const_iterator d_qname_end;
+    recordstorage_t::index<UnorderedNameTag>::type::const_iterator d_iter, d_end_iter;
+
+    recordstorage_t::const_iterator d_qname_iter, d_qname_end;
+
     DNSName qname;
     DNSName domain;