]> granicus.if.org Git - pdns/commitdiff
remove further amateurish json stunts
authorBert Hubert <bert.hubert@netherlabs.nl>
Mon, 3 Dec 2012 20:08:29 +0000 (20:08 +0000)
committerBert Hubert <bert.hubert@netherlabs.nl>
Mon, 3 Dec 2012 20:08:29 +0000 (20:08 +0000)
git-svn-id: svn://svn.powerdns.com/pdns/trunk/pdns@2958 d19b8d6e-7fed-0310-83ef-9ca221ded41b

pdns/json.cc
pdns/json.hh
pdns/ws.cc

index 6f8888ee35cf9c656f9c91cce448ce3bd9dcf26e..0645d118f8ae8188f003986a2db0b6936e5d7876 100644 (file)
 
 using namespace rapidjson;                        
 
+string makeStringFromDocument(Document& doc)
+{
+  StringBuffer output;
+  Writer<StringBuffer> w(output);
+  doc.Accept(w);
+  return string(output.GetString(), output.Size());
+}
+
 string returnJSONObject(const map<string, string>& items)
 {
   Document doc;
@@ -20,10 +28,7 @@ string returnJSONObject(const map<string, string>& items)
   BOOST_FOREACH(const items_t::value_type& val, items) {
     doc.AddMember(val.first.c_str(), val.second.c_str(), doc.GetAllocator());
   }
-  StringBuffer output;
-  Writer<StringBuffer> w(output);
-  doc.Accept(w);
-  return string(output.GetString(), output.Size());
+  return makeStringFromDocument(doc);
 }
 
 string makeLogGrepJSON(map<string, string>& varmap, const string& fname, const string& prefix)
@@ -65,8 +70,5 @@ string makeLogGrepJSON(map<string, string>& varmap, const string& fname, const s
       doc.PushBack(line.c_str(), doc.GetAllocator());
     }
   }
-  StringBuffer output;
-  Writer<StringBuffer> w(output);
-  doc.Accept(w);
-  return string(output.GetString(), output.Size());
+  return makeStringFromDocument(doc);
 }
index 6c60193ed27b1ff3be7461a75e5ae6412433d112..8d0bb4dd0aba94faa710216b071517b6d90e8ac5 100644 (file)
@@ -19,6 +19,8 @@
 
 #include <string>
 #include <map>
+#include "rapidjson/document.h"
 
 std::string returnJSONObject(const std::map<std::string, std::string>& items);
 std::string makeLogGrepJSON(std::map<std::string, std::string>& varmap, const std::string& fname, const std::string& prefix="");
+std::string makeStringFromDocument(rapidjson::Document& doc);
index f8261282ba3903079b9ee443af81eb294b42be4e..a848e9c1adcdf137797bd74e73254b6378585c55 100644 (file)
 #include <boost/foreach.hpp>
 #include "namespaces.hh"
 #include "rapidjson/document.h"
+#include "rapidjson/stringbuffer.h"
+#include "rapidjson/writer.h"
+
+using namespace rapidjson;
 
 extern StatBag S;
 
@@ -273,43 +277,44 @@ string StatWebServer::jsonstat(const string& method, const string& post, const m
 
     string variable, value;
     
-    ret+="{";
+    Document doc;
+    doc.SetObject();
     for(varmap_t::const_iterator iter = ourvarmap.begin(); iter != ourvarmap.end() ; ++iter) {
-      if(iter != ourvarmap.begin())
-        ret += ",";
-      
       variable = iter->first;
       if(variable == "version") {
-        value = '"'+string(VERSION)+'"';
+        value =VERSION;
       }
       else if(variable == "uptime") {
         value = lexical_cast<string>(time(0) - s_starttime);
       }
       else 
         value = lexical_cast<string>(S.read(variable));
-      
-        ret += '"'+ variable +"\": "+ value;
+      Value jval;
+      jval.SetString(value.c_str(), value.length(), doc.GetAllocator());
+      doc.AddMember(variable.c_str(), jval, doc.GetAllocator());
     }
-    ret+="}";
+    ret+=makeStringFromDocument(doc);
   }
  
   if(command=="config") {
     vector<string> items = ::arg().list();
-    ret += "[";
-    bool first=1;
+    Document doc;
+    doc.SetArray();
     BOOST_FOREACH(const string& var, items) {
+      Value kv, key, value;
+      kv.SetArray();
+      key.SetString(var.c_str(), var.length());
+      kv.PushBack(key, doc.GetAllocator());
       
-      if(!first) ret+=",";
-      first=false;
-      ret += "[";
-      ret += "\""+var+"\", \"";
       if(var.find("password") != string::npos)
-        ret += "*****\"";
+        value="*****";
       else 
-        ret += ::arg()[var] + "\"";
-      ret += "]";
+        value.SetString(::arg()[var].c_str(), ::arg()[var].length(), doc.GetAllocator());
+      
+      kv.PushBack(value, doc.GetAllocator());
+      doc.PushBack(kv, doc.GetAllocator());
     }
-    ret += "]";
+    ret += makeStringFromDocument(doc);
   }
 
   if(command == "flush-cache") {
@@ -451,21 +456,29 @@ string StatWebServer::jsonstat(const string& method, const string& post, const m
     UeberBackend B;
     vector<DomainInfo> domains;
     B.getAllDomains(&domains);
-    ret += "{ \"domains\": [ ";
-    bool first=true;
-    BOOST_FOREACH(DomainInfo& di, domains) {
-      if(!first) ret+=", ";
-      first=false;
-      
-      ret += "{ \"name\": \"";
-      ret += di.zone +"\", \"kind\": \""+ kinds[di.kind]+"\", \"masters\": \"";
-      BOOST_FOREACH(const string& master, di.masters) {
-        ret += master+ " ";
-      }
-      ret+="\", \"serial\": "+lexical_cast<string>(di.serial)+", \"notified_serial\": "+lexical_cast<string>(di.notified_serial)+", \"last_check\": "+lexical_cast<string>(di.last_check);
-      ret+=" }";
+    
+    Document doc;
+    doc.SetObject();
+    
+    Value jdomains;
+    jdomains.SetArray();
+    
+    BOOST_FOREACH(const DomainInfo& di, domains) {
+      Value jdi;
+      jdi.SetObject();
+      jdi.AddMember("name", di.zone.c_str(), doc.GetAllocator());
+      jdi.AddMember("kind", kinds[di.kind], doc.GetAllocator());
+      string masters = boost::join(di.masters, " ");
+      Value jmasters;
+      jmasters.SetString(masters.c_str(), masters.size(), doc.GetAllocator());
+      jdi.AddMember("masters", jmasters, doc.GetAllocator()); // ^^^ this makes an actual copy, otherwise the zerocopy behaviour bites us!
+      jdi.AddMember("serial", di.serial, doc.GetAllocator());
+      jdi.AddMember("notified_serial", di.notified_serial, doc.GetAllocator());
+      jdi.AddMember("last_check", di.last_check, doc.GetAllocator());
+      jdomains.PushBack(jdi, doc.GetAllocator());
     }
-    ret+= "]}";
+    doc.AddMember("domains", jdomains, doc.GetAllocator());
+    ret.append(makeStringFromDocument(doc));
   }
   
   if(!callback.empty()) {