]> granicus.if.org Git - pdns/commitdiff
ws: split zone get/list into it's own function
authorChristian Hofstaedtler <christian@hofstaedtler.name>
Fri, 20 Sep 2013 12:54:39 +0000 (14:54 +0200)
committerChristian Hofstaedtler <christian@hofstaedtler.name>
Fri, 27 Sep 2013 16:05:44 +0000 (18:05 +0200)
pdns/ws.cc

index 6506b4c916b0e6d77fe079b1f7ebce6a13fe2d86..86781e6f0a7ed253a9689deea6d4626a45c9bc3f 100644 (file)
@@ -257,6 +257,62 @@ static int int_from_json(const Value& val) {
   }
 }
 
+static string getZone(const string& zonename) {
+  UeberBackend B;
+  SOAData sd;
+  DomainInfo di;
+  sd.db = (DNSBackend*)-1;
+  if(!B.getSOA(zonename, sd) || !sd.db || !B.getDomainInfo(zonename, di)) {
+    map<string, string> err;
+    err["error"] = "Could not find domain '"+zonename+"'";
+    return returnJSONObject(err);
+  }
+
+  Document doc;
+  doc.SetObject();
+
+  Value root;
+  root.SetObject();
+  root.AddMember("name", zonename.c_str(), doc.GetAllocator());
+  root.AddMember("type", "Zone", doc.GetAllocator());
+  root.AddMember("kind", di.getKindString(), doc.GetAllocator());
+  Value masters;
+  masters.SetArray();
+  BOOST_FOREACH(const string& master, di.masters) {
+    Value value(master.c_str(), doc.GetAllocator());
+    masters.PushBack(value, doc.GetAllocator());
+  }
+  root.AddMember("masters", masters, doc.GetAllocator());
+  root.AddMember("serial", di.serial, doc.GetAllocator());
+  root.AddMember("notified_serial", di.notified_serial, doc.GetAllocator());
+  root.AddMember("last_check", (unsigned int) di.last_check, doc.GetAllocator());
+
+  DNSResourceRecord rr;
+  Value records;
+  records.SetArray();
+  sd.db->list(zonename, sd.domain_id);
+  while(sd.db->get(rr)) {
+    if (!rr.qtype.getCode())
+      continue; // skip empty non-terminals
+
+    Value object;
+    object.SetObject();
+    Value jname(rr.qname.c_str(), doc.GetAllocator()); // copy
+    object.AddMember("name", jname, doc.GetAllocator());
+    Value jtype(rr.qtype.getName().c_str(), doc.GetAllocator()); // copy
+    object.AddMember("type", jtype, doc.GetAllocator());
+    object.AddMember("ttl", rr.ttl, doc.GetAllocator());
+    object.AddMember("priority", rr.priority, doc.GetAllocator());
+    Value jcontent(rr.content.c_str(), doc.GetAllocator()); // copy
+    object.AddMember("content", jcontent, doc.GetAllocator());
+    records.PushBack(object, doc.GetAllocator());
+  }
+  root.AddMember("records", records, doc.GetAllocator());
+
+  doc.AddMember("zone", root, doc.GetAllocator());
+  return makeStringFromDocument(doc);
+}
+
 static string json_dispatch(const string& method, const string& post, varmap_t& varmap, const string& command) {
   if(command=="get") {
     if(varmap.empty()) {
@@ -447,60 +503,7 @@ static string json_dispatch(const string& method, const string& post, varmap_t&
 
     if(method == "GET") {
       // get current zone
-      UeberBackend B;
-      SOAData sd;
-      DomainInfo di;
-      sd.db = (DNSBackend*)-1;
-      if(!B.getSOA(zonename, sd) || !sd.db || !B.getDomainInfo(zonename, di)) {
-        map<string, string> err;
-        err["error"] = "Could not find domain '"+zonename+"'";
-        return returnJSONObject(err);
-      }
-
-      Document doc;
-      doc.SetObject();
-
-      Value root;
-      root.SetObject();
-      root.AddMember("name", zonename.c_str(), doc.GetAllocator());
-      root.AddMember("type", "Zone", doc.GetAllocator());
-      root.AddMember("kind", di.getKindString(), doc.GetAllocator());
-      Value masters;
-      masters.SetArray();
-      BOOST_FOREACH(const string& master, di.masters) {
-        Value value(master.c_str(), doc.GetAllocator());
-        masters.PushBack(value, doc.GetAllocator());
-      }
-      root.AddMember("masters", masters, doc.GetAllocator());
-      root.AddMember("serial", di.serial, doc.GetAllocator());
-      root.AddMember("notified_serial", di.notified_serial, doc.GetAllocator());
-      root.AddMember("last_check", (unsigned int) di.last_check, doc.GetAllocator());
-
-      DNSResourceRecord rr;
-      Value records;
-      records.SetArray();
-      sd.db->list(zonename, sd.domain_id);
-      while(sd.db->get(rr)) {
-        if (!rr.qtype.getCode())
-          continue; // skip empty non-terminals
-
-        Value object;
-        object.SetObject();
-        Value jname(rr.qname.c_str(), doc.GetAllocator()); // copy
-        object.AddMember("name", jname, doc.GetAllocator());
-        Value jtype(rr.qtype.getName().c_str(), doc.GetAllocator()); // copy
-        object.AddMember("type", jtype, doc.GetAllocator());
-        object.AddMember("ttl", rr.ttl, doc.GetAllocator());
-        object.AddMember("priority", rr.priority, doc.GetAllocator());
-        Value jcontent(rr.content.c_str(), doc.GetAllocator()); // copy
-        object.AddMember("content", jcontent, doc.GetAllocator());
-        records.PushBack(object, doc.GetAllocator());
-      }
-      root.AddMember("records", records, doc.GetAllocator());
-
-      doc.AddMember("zone", root, doc.GetAllocator());
-      return makeStringFromDocument(doc);
-
+      return getZone(zonename);
     } else {
       map<string, string> err;
       err["error"] = "Method not allowed";