| 76 | } |
| 77 | |
| 78 | Status JsonToTraceEvent(const std::string& json, TraceEvent* event) { |
| 79 | rapidjson::Document d; |
| 80 | d.Parse<0>(json.c_str()); |
| 81 | // Check for any parse failure |
| 82 | if (d.HasParseError()) { |
| 83 | return Status(Substitute("Failed to parse TraceEvent JSON. Error: $0 JSON: $1", |
| 84 | rapidjson::GetParseError_En(d.GetParseError()), json)); |
| 85 | } |
| 86 | // Verify that this is an object and the required fields are present |
| 87 | if (!d.IsObject() || !d.HasMember("ts") || !d.HasMember("s") || !d.HasMember("f") || |
| 88 | !d.HasMember("m") || !d.HasMember("o")) { |
| 89 | return Status(Substitute("Invalid TraceEvent JSON: $0", json)); |
| 90 | } |
| 91 | event->timestamp = d["ts"].GetDouble(); |
| 92 | event->type = StringToEventType(d["s"].GetString()); |
| 93 | event->filename = d["f"].GetString(); |
| 94 | event->mtime = d["m"].GetInt64(); |
| 95 | event->offset = d["o"].GetInt64(); |
| 96 | event->entry_length = d.HasMember("eLen") ? d["eLen"].GetInt64() : -1; |
| 97 | event->lookup_length = d.HasMember("lLen") ? d["lLen"].GetInt64() : -1; |
| 98 | return Status::OK(); |
| 99 | } |
| 100 | |
| 101 | std::string TraceEventToJson(const TraceEvent& event) { |
| 102 | ostringstream buf; |