]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
mydnsbackend: Add getAllDomains
authorAki Tuomi <cmouse@cmouse.fi>
Thu, 16 Feb 2017 13:20:15 +0000 (15:20 +0200)
committerPieter Lexis <pieter.lexis@powerdns.com>
Tue, 7 Nov 2017 20:25:13 +0000 (21:25 +0100)
(cherry picked from commit cfc5b5c0d05f1a0d13120c2c2bc6087323a214de)

modules/mydnsbackend/mydnsbackend.cc
modules/mydnsbackend/mydnsbackend.hh

index fff37784af18220f3c95a02958aefd6b8d790522..e69fa7d9b01bd9074e1c02ad1af3cd13e7a96fc6 100644 (file)
@@ -73,6 +73,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"),
@@ -106,17 +107,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 = ?)";
@@ -159,6 +163,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);
 }
 
@@ -438,6 +444,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 */