19 if (!fields.is_array())
throw std::invalid_argument(
"Fields must be an array");
23 for (
const auto &field: fields) {
24 const auto field_name = field.at(
"name").get<std::string>();
26 if (field_name ==
"id" || field_name ==
"created" || field_name ==
"updated") {
30 if (!entity.contains(field_name))
continue;
33 if (field_name ==
"password") {
35 auto hashed_password =
hashPassword(entity.at(field_name).get<std::string>());
38 vals.set(field_name, hashed_password);
43 if (entity[field_name].is_null()) {
44 std::optional<int> val;
45 vals.set(field_name, val, soci::i_null);
50 const auto field_type = field.at(
"type").get<std::string>();
51 if (field_type ==
"xml" || field_type ==
"string" || field_type ==
"file") {
52 vals.set(field_name, entity.value(field_name,
""));
53 }
else if (field_type ==
"double") {
54 vals.set(field_name, entity.value(field_name, 0.0));
55 }
else if (field_type ==
"date") {
56 auto dt_str = entity.value(field_name,
"");
58 vals.set(field_name, 0, soci::i_null);
61 std::istringstream ss{dt_str};
62 ss >> std::get_time(&tm,
"%Y-%m-%dT%H:%M:%S");
64 vals.set(field_name, tm);
66 }
else if (field_type ==
"int8") {
67 vals.set(field_name,
static_cast<int8_t
>(entity.value(field_name, 0)));
68 }
else if (field_type ==
"uint8") {
69 vals.set(field_name,
static_cast<uint8_t
>(entity.value(field_name, 0)));
70 }
else if (field_type ==
"int16") {
71 vals.set(field_name,
static_cast<int16_t
>(entity.value(field_name, 0)));
72 }
else if (field_type ==
"uint16") {
73 vals.set(field_name,
static_cast<uint16_t
>(entity.value(field_name, 0)));
74 }
else if (field_type ==
"int32") {
75 vals.set(field_name,
static_cast<int32_t
>(entity.value(field_name, 0)));
76 }
else if (field_type ==
"uint32") {
77 vals.set(field_name,
static_cast<uint32_t
>(entity.value(field_name, 0)));
78 }
else if (field_type ==
"int64") {
79 vals.set(field_name,
static_cast<int64_t
>(entity.value(field_name, 0)));
80 }
else if (field_type ==
"uint64") {
81 vals.set(field_name,
static_cast<uint64_t
>(entity.value(field_name, 0)));
82 }
else if (field_type ==
"blob") {
85 }
else if (field_type ==
"json") {
86 vals.set(field_name, entity.value(field_name, json::object()));
87 }
else if (field_type ==
"bool") {
88 vals.set(field_name, entity.value(field_name,
false));
89 }
else if (field_type ==
"files") {
90 vals.set(field_name, entity.value(field_name, json::array()));
110 if (entity_fields.empty())
111 throw std::invalid_argument(
"Reference schema fields can't be empty!");
115 for (
size_t i = 0; i < row.size(); i++) {
116 const auto colName = row.get_properties(i).get_name();
123 throw std::runtime_error(std::format(
"Unknown column type `{}` for column `{}`", colType, colName));
127 if (row.get_indicator(i) == soci::i_null) {
129 res_json[colName] =
nullptr;
134 if (colType ==
"xml" || colType ==
"string") {
135 res_json[colName] = row.get<std::string>(i,
"");
136 }
else if (colType ==
"double") {
137 res_json[colName] = row.get<
double>(i);
138 }
else if (colType ==
"date") {
140 }
else if (colType ==
"int8") {
141 res_json[colName] = row.get<int8_t>(i);
142 }
else if (colType ==
"uint8") {
143 res_json[colName] = row.get<uint8_t>(i);
144 }
else if (colType ==
"int16") {
145 res_json[colName] = row.get<int16_t>(i);
146 }
else if (colType ==
"uint16") {
147 res_json[colName] = row.get<uint16_t>(i);
148 }
else if (colType ==
"int32") {
149 res_json[colName] = row.get<int32_t>(i);
150 }
else if (colType ==
"uint32") {
151 res_json[colName] = row.get<uint32_t>(i);
152 }
else if (colType ==
"int64") {
153 res_json[colName] = row.get<int64_t>(i);
154 }
else if (colType ==
"uint64") {
155 res_json[colName] = row.get<uint64_t>(i);
156 }
else if (colType ==
"blob") {
159 }
else if (colType ==
"json" || colType ==
"list") {
160 res_json[colName] = row.get<
json>(i);
161 }
else if (colType ==
"bool") {
162 res_json[colName] = row.get<
bool>(i);
163 }
else if (colType ==
"file") {
164 res_json[colName] = row.get<std::string>(i);
165 }
else if (colType ==
"files") {
166 res_json[colName] = row.get<
json>(i);
std::string dbDateToString(const soci::row &row, int index)
Convert database date value from SOCI row to string.
Definition date_utils.cpp:28
std::string hashPassword(const std::string &password)
Digests user password + a generated salt to yield a hashed password.
Definition auth_utils.cpp:8