#include "repositories/Sql.h" #include #include #include namespace visione::repositories { Json::Value scalarToJson(JsonFieldType type, const drogon::orm::Field &field) { switch (type) { case JsonFieldType::String: return Json::Value(field.as()); case JsonFieldType::Int64: return Json::Value(Json::Int64(field.as())); case JsonFieldType::UInt64: return Json::Value(Json::UInt64(field.as())); case JsonFieldType::Double: return Json::Value(field.as()); case JsonFieldType::Bool: return Json::Value(field.as()); } return Json::nullValue; } Json::Value rowToJson(const drogon::orm::Row &row) { static const JsonRowSchema emptySchema; return rowToJson(row, emptySchema); } Json::Value rowToJson(const drogon::orm::Row &row, const JsonRowSchema &schema) { Json::Value object(Json::objectValue); for (const auto &field : row) { if (field.isNull()) { object[field.name()] = Json::nullValue; } else { const auto it = schema.find(field.name()); if (it == schema.end()) { object[field.name()] = field.as(); } else { object[field.name()] = scalarToJson(it->second, field); } } } return object; } Json::Value resultToJson(const drogon::orm::Result &result) { static const JsonRowSchema emptySchema; return resultToJson(result, emptySchema); } Json::Value resultToJson(const drogon::orm::Result &result, const JsonRowSchema &schema) { Json::Value array(Json::arrayValue); for (const auto &row : result) { array.append(rowToJson(row, schema)); } return array; } std::string nullableString(const Json::Value &value, const std::string &key) { if (!value.isMember(key) || value[key].isNull()) { return {}; } return value[key].asString(); } } // namespace visione::repositories