]> granicus.if.org Git - pdns/commitdiff
mydnsbackend: Add getAllDomains
authorAki Tuomi <cmouse@cmouse.fi>
Thu, 16 Feb 2017 13:20:15 +0000 (15:20 +0200)
committerAki Tuomi <cmouse@cmouse.fi>
Thu, 16 Feb 2017 13:56:56 +0000 (15:56 +0200)
modules/mydnsbackend/mydnsbackend.cc
modules/mydnsbackend/mydnsbackend.hh

index 8a2cf7c987977b3cd0a56a9563425d3921e559c0..0d405e417e1f1835b4ff9169c7903aafae38666f 100644 (file)
@@ -72,6 +72,7 @@ MyDNSBackend::MyDNSBackend(const string &suffix) {
   d_basicQuery_stmt = NULL;
   d_anyQuery_stmt = NULL;
   d_query_stmt = NULL;
+  d_allDomainsQuery_stmt = NULL;
 
   try {
     d_db = new SMySQL(getArg("dbname"),
@@ -105,17 +106,20 @@ MyDNSBackend::MyDNSBackend(const string &suffix) {
     string domainIdQuery = "SELECT origin, minimum FROM `"+soatable+"` WHERE id = ?";
     string domainNoIdQuery = "SELECT id, origin, minimum FROM `"+soatable+"` WHERE origin = ?";
     string soaQuery = "SELECT id, mbox, serial, ns, refresh, retry, expire, minimum, ttl FROM `"+soatable+"` WHERE origin = ?";
+    string allDomainsQuery = "SELECT id, origin, serial FROM `"+soatable+"`";
 
     if (!soawhere.empty()) {
       domainIdQuery += " AND " + soawhere;  
       domainNoIdQuery += " AND " + soawhere;
       soaQuery += " AND "+soawhere;
+      allDomainsQuery += " WHERE "+soawhere;
     }
 
     d_domainIdQuery_stmt = d_db->prepare(domainIdQuery, 1);
     d_domainNoIdQuery_stmt = d_db->prepare(domainNoIdQuery, 1);
     d_soaQuery_stmt = d_db->prepare(soaQuery, 1);
-  
+    d_allDomainsQuery_stmt = d_db->prepare(allDomainsQuery, 0);
+
     string listQuery = "SELECT type, data, aux, ttl, zone, name FROM `"+rrtable+"` WHERE zone = ?";
     string basicQuery = "SELECT type, data, aux, ttl, zone FROM `"+rrtable+"` WHERE zone = ? AND (name = ? OR name = ?) AND type = ?";
     string anyQuery = "(SELECT type, data, aux, ttl, zone FROM `"+rrtable+"` WHERE zone = ? AND (name = ? OR name = ?)";
@@ -158,6 +162,8 @@ MyDNSBackend::~MyDNSBackend() {
   d_basicQuery_stmt = NULL;
   delete d_anyQuery_stmt;
   d_anyQuery_stmt = NULL;
+  delete d_allDomainsQuery_stmt;
+  d_allDomainsQuery_stmt = NULL;
   delete(d_db);
 }
 
@@ -437,6 +443,34 @@ bool MyDNSBackend::get(DNSResourceRecord &rr) {
   return false;
 }
 
+void MyDNSBackend::getAllDomains(vector<DomainInfo> *domains, bool include_disabled) {
+  /* include_disabled is unfortunately ignored here */
+  try {
+    d_allDomainsQuery_stmt->
+      execute();
+
+    while(d_allDomainsQuery_stmt->hasNextRow()) {
+      SSqlStatement::row_t row;
+      DomainInfo di;
+      d_allDomainsQuery_stmt->nextRow(row);
+
+      di.id = pdns_stou(row[0]);
+      di.zone = DNSName(row[1]);
+      di.serial = pdns_stou(row[2]);
+      di.kind = DomainInfo::Native;
+      di.backend = this;
+
+      domains->push_back(di);
+    }
+
+    d_allDomainsQuery_stmt->
+      reset();
+  }
+  catch (SSqlException &e) {
+    throw PDNSException("MyDNSBackend unable to list all domains: "+e.txtReason());
+  }
+}
+
 class MyDNSFactory : public BackendFactory {
 
 public:
index fc5b4d362fe008294f0148f4e1dea2a0985e6d11..28c56e3cd29928a10e93a0767f939a144d3991b1 100644 (file)
@@ -40,7 +40,7 @@ public:
   bool list(const DNSName &target, int domain_id, bool include_disabled=false);
   bool get(DNSResourceRecord &r);
   bool getSOA(const DNSName& name, SOAData& soadata, DNSPacket*);
-    
+  void getAllDomains(vector<DomainInfo> *domains, bool include_disabled=false);
 private:
   SMySQL *d_db; 
 
@@ -58,6 +58,7 @@ private:
   SSqlStatement* d_soaQuery_stmt;
   SSqlStatement* d_basicQuery_stmt;
   SSqlStatement* d_anyQuery_stmt;
+  SSqlStatement* d_allDomainsQuery_stmt;
 };
 
 #endif /* MYDNSBACKEND_HH */