]> granicus.if.org Git - pdns/commitdiff
Implementation for multi-ip master
authorAki Tuomi <cmouse@desteem.org>
Mon, 9 Dec 2013 12:06:28 +0000 (14:06 +0200)
committerAki Tuomi <cmouse@desteem.org>
Mon, 9 Dec 2013 12:06:28 +0000 (14:06 +0200)
pdns/backends/gsql/gsqlbackend.cc
pdns/backends/gsql/gsqlbackend.hh

index edcf2e68097754d6a3306506d0a3f662566e655c..2f4b9cfde53939fc8e1984b544c16e9db7434dc4 100644 (file)
@@ -294,6 +294,8 @@ GSQLBackend::GSQLBackend(const string &mode, const string &suffix)
   d_InfoOfDomainsZoneQuery=getArg("info-zone-query");
   d_InfoOfAllSlaveDomainsQuery=getArg("info-all-slaves-query");
   d_SuperMasterInfoQuery=getArg("supermaster-query");
+  d_GetSuperMasterName=getArg("supermaster-ip-to-name");
+  d_GetSuperMasterIPs=getArg("supermaster-name-to-ips");
   d_InsertZoneQuery=getArg("insert-zone-query");
   d_InsertSlaveZoneQuery=getArg("insert-slave-query");
   d_InsertRecordQuery=getArg("insert-record-query"+authswitch);
@@ -915,10 +917,30 @@ bool GSQLBackend::createDomain(const string &domain)
 bool GSQLBackend::createSlaveDomain(const string &ip, const string &domain, const string &account)
 {
   string format;
+  string name;
+  string masters=ip;
+
   char output[1024];
-  format = d_InsertSlaveZoneQuery;
-  snprintf(output,sizeof(output)-1,format.c_str(),sqlEscape(domain).c_str(),sqlEscape(ip).c_str(),sqlEscape(account).c_str());
   try {
+    format = d_GetSuperMasterName;
+    snprintf(output,sizeof(output)-1,format.c_str(),sqlEscape(ip).c_str()); 
+    d_db->doQuery(output, d_result);
+    if (!d_result.empty()) {
+      name = d_result[0][0];
+      format = d_GetSuperMasterIPs;
+      snprintf(output,sizeof(output)-1,format.c_str(),sqlEscape(name).c_str()); 
+      d_db->doQuery(output, d_result);
+      if (!d_result.empty()) {
+        vector<string> tmp;
+        BOOST_FOREACH(SSql::row_t& row, d_result) {
+          tmp.push_back(row[0]);
+        }
+        // set as masters
+        masters = boost::join(tmp, ",");
+      }
+    } 
+    format = d_InsertSlaveZoneQuery;
+    snprintf(output,sizeof(output)-1,format.c_str(),sqlEscape(domain).c_str(),sqlEscape(masters).c_str(),sqlEscape(account).c_str());
     d_db->doCommand(output);
   }
   catch(SSqlException &e) {
index 496085e5754059dd3fa4815276b78eb1aed00ed2..94dcde2ee28bd689550ce60b00288e94ccf30638 100644 (file)
@@ -95,6 +95,9 @@ private:
   string d_InfoOfDomainsZoneQuery;
   string d_InfoOfAllSlaveDomainsQuery;
   string d_SuperMasterInfoQuery;
+  string d_GetSuperMasterName;
+  string d_GetSuperMasterIPs;
+
   string d_InsertZoneQuery;
   string d_InsertSlaveZoneQuery;
   string d_InsertRecordQuery;