3131#include < chrono>
3232#include < sstream>
3333#include < unordered_set>
34-
34+ // boost
3535#include < boost/algorithm/string.hpp>
3636#include < boost/property_tree/json_parser.hpp>
3737#include < boost/property_tree/ptree.hpp>
3838#include < boost/foreach.hpp>
39+ // misc
40+ #include " rapidjson/document.h"
41+ #include " rapidjson/stringbuffer.h"
42+ #include " rapidjson/writer.h"
3943
4044using namespace std ::chrono;
4145using namespace AliceO2 ::Common;
4246using namespace o2 ::quality_control::core;
4347using namespace std ;
48+ using namespace rapidjson ;
4449
4550namespace o2 ::quality_control::repository
4651{
@@ -244,12 +249,15 @@ std::string CcdbDatabase::retrieveMOJson(std::string taskName, std::string objec
244249std::string CcdbDatabase::retrieveJson (std::string path, long timestamp, const std::map<std::string, std::string>& metadata)
245250{
246251 map<string, string> headers;
247- auto tobj = retrieveTObject (path, metadata, timestamp, &headers) ;
252+ Document jsonDocument ;
248253
254+ // Get object
255+ auto * tobj = retrieveTObject (path, metadata, timestamp, &headers);
249256 if (tobj == nullptr ) {
250257 return std::string ();
251258 }
252259
260+ // Convert object to JSON string
253261 TObject* toConvert = nullptr ;
254262 if (tobj->IsA () == MonitorObject::Class ()) { // a full MO -> pre-v0.25
255263 std::shared_ptr<MonitorObject> mo (dynamic_cast <MonitorObject*>(tobj));
@@ -267,7 +275,26 @@ std::string CcdbDatabase::retrieveJson(std::string path, long timestamp, const s
267275 TString json = TBufferJSON::ConvertToJSON (toConvert);
268276 delete toConvert;
269277
270- return json.Data ();
278+ // Prepare JSON document and add metadata
279+ if (jsonDocument.Parse (json.Data ()).HasParseError ()) {
280+ ILOG (Error) << " Unable to parse the JSON returned by TBufferJSON for object " << path << ENDM ;
281+ return std::string ();
282+ }
283+ rapidjson::Document::AllocatorType& allocator = jsonDocument.GetAllocator ();
284+ rapidjson::Value object (rapidjson::Type::kObjectType );
285+ for (auto const & [key, value] : headers) {
286+ rapidjson::Value k (key.c_str (), allocator);
287+ rapidjson::Value v (value.c_str (), allocator);
288+ object.AddMember (k, v, allocator);
289+ }
290+ jsonDocument.AddMember (" metadata" , object, allocator);
291+
292+ // Convert to string
293+ StringBuffer buffer;
294+ buffer.Clear ();
295+ Writer<rapidjson::StringBuffer> writer (buffer);
296+ jsonDocument.Accept (writer);
297+ return strdup (buffer.GetString ());
271298}
272299
273300void CcdbDatabase::disconnect ()
0 commit comments