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;
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;
}
#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>
{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;
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();
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;