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;
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)
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);
}
#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;
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") {
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()) {