* \return true if ne was filled out, false otherwise
*/
bool NegCache::get(const DNSName& qname, const QType& qtype, const struct timeval& now, NegCacheEntry& ne, bool typeMustMatch) {
- auto range = d_negcache.equal_range(tie(qname));
- negcache_t::iterator ni = range.first;
+ const auto& idx = d_negcache.get<2>();
+ auto range = idx.equal_range(qname);
+ auto ni = range.first;
while (ni != range.second) {
// We have an entry
if ((!typeMustMatch && ni->d_qtype.getCode() == 0) || ni->d_qtype == qtype) {
// We match the QType or the whole name is denied
+ auto firstIndexIterator = d_negcache.project<0>(ni);
+
if((uint32_t) now.tv_sec < ni->d_ttd) {
// Not expired
ne = *ni;
- moveCacheItemToBack(d_negcache, ni);
+ moveCacheItemToBack(d_negcache, firstIndexIterator);
return true;
}
// expired
- moveCacheItemToFront(d_negcache, ni);
+ moveCacheItemToFront(d_negcache, firstIndexIterator);
}
++ni;
}
#pragma once
#include <boost/multi_index_container.hpp>
+#include <boost/multi_index/hashed_index.hpp>
#include "dnsparser.hh"
#include "dnsname.hh"
#include "dns.hh"
CanonDNSNameCompare, std::less<QType>
>
>,
- sequenced<>
+ sequenced<>,
+ hashed_non_unique <
+ member<NegCacheEntry, DNSName, &NegCacheEntry::d_name>
+ >
>
> negcache_t;