]> granicus.if.org Git - pdns/commitdiff
Add support for searchRecords to bind backend
authorAki Tuomi <cmouse@desteem.org>
Fri, 31 Jul 2015 20:28:44 +0000 (23:28 +0300)
committerAki Tuomi <cmouse@cmouse.fi>
Tue, 4 Aug 2015 12:26:16 +0000 (15:26 +0300)
modules/bindbackend/bindbackend2.cc
modules/bindbackend/bindbackend2.hh

index f23c239caf082b3a5353595e65a478a3871349a0..80536026f1f338287275e8041169edbda7154f5c 100644 (file)
@@ -1310,6 +1310,40 @@ bool Bind2Backend::createSlaveDomain(const string &ip, const DNSName& domain, co
   return true;
 }
 
+bool Bind2Backend::searchRecords(const string &pattern, int maxResults, vector<DNSResourceRecord>& result)
+{
+  SimpleMatch sm(pattern,true);
+  static bool mustlog=::arg().mustDo("query-logging");
+  if(mustlog)
+    L<<Logger::Warning<<"Search for pattern '"<<pattern<<"'"<<endl;
+
+  {
+    ReadLock rl(&s_state_lock);
+
+    for(state_t::const_iterator i = s_state.begin(); i != s_state.end() ; ++i) {
+      BB2DomainInfo h;
+      safeGetBBDomainInfo(i->d_id, &h);
+      shared_ptr<const recordstorage_t> handle = h.d_records.get();
+
+      for(recordstorage_t::const_iterator ri = handle->begin(); result.size() < static_cast<vector<DNSResourceRecord>::size_type>(maxResults) && ri != handle->end(); ri++) {
+        DNSName name = ri->qname.empty() ? i->d_name : (ri->qname+i->d_name);
+        if (sm.match(name) || sm.match(ri->content)) {
+          DNSResourceRecord r;
+          r.qname=name;
+          r.domain_id=i->d_id;
+          r.content=ri->content;
+          r.qtype=ri->qtype;
+          r.ttl=ri->ttl;
+          r.auth = ri->auth;
+          result.push_back(r);
+        }
+      }
+    }
+  }
+
+  return true;
+}
+
 class Bind2Factory : public BackendFactory
 {
    public:
index 3794c091a953cc5cd7724b5debcbbaddde77700f..131ba22d878b86226e1381304c201965bbf37104 100644 (file)
@@ -204,6 +204,7 @@ public:
   bool commitTransaction();
   bool abortTransaction();
   void alsoNotifies(const DNSName &domain, set<string> *ips);
+  bool searchRecords(const string &pattern, int maxResults, vector<DNSResourceRecord>& result);
 
 // the DNSSEC related (getDomainMetadata has broader uses too)
   virtual bool getAllDomainMetadata(const DNSName& name, std::map<std::string, std::vector<std::string> >& meta);