Files

84 lines
2.2 KiB
C++

#include "repositories/Sql.h"
#include <drogon/orm/Field.h>
#include <drogon/orm/ResultIterator.h>
#include <drogon/orm/RowIterator.h>
namespace visione::repositories
{
Json::Value scalarToJson(JsonFieldType type, const drogon::orm::Field &field)
{
switch (type)
{
case JsonFieldType::String:
return Json::Value(field.as<std::string>());
case JsonFieldType::Int64:
return Json::Value(Json::Int64(field.as<long long>()));
case JsonFieldType::UInt64:
return Json::Value(Json::UInt64(field.as<unsigned long long>()));
case JsonFieldType::Double:
return Json::Value(field.as<double>());
case JsonFieldType::Bool:
return Json::Value(field.as<bool>());
}
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<std::string>();
}
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