Skip to content

Commit f3aa022

Browse files
committed
mapping. Support Enum.
1 parent 2862c01 commit f3aa022

File tree

6 files changed

+173
-113
lines changed

6 files changed

+173
-113
lines changed

src/oatpp-postgresql/mapping/Deserializer.cpp

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ Deserializer::Deserializer() {
6767
setDeserializerMethod(data::mapping::type::__class::Boolean::CLASS_ID, &Deserializer::deserializeBoolean);
6868

6969
setDeserializerMethod(data::mapping::type::__class::AbstractObject::CLASS_ID, nullptr);
70-
setDeserializerMethod(data::mapping::type::__class::AbstractEnum::CLASS_ID, nullptr);
70+
setDeserializerMethod(data::mapping::type::__class::AbstractEnum::CLASS_ID, &Deserializer::deserializeEnum);
7171

7272
setDeserializerMethod(data::mapping::type::__class::AbstractVector::CLASS_ID, nullptr);
7373
setDeserializerMethod(data::mapping::type::__class::AbstractList::CLASS_ID, nullptr);
@@ -236,6 +236,31 @@ oatpp::Void Deserializer::deserializeBoolean(const Deserializer* _this, const In
236236

237237
}
238238

239+
oatpp::Void Deserializer::deserializeEnum(const Deserializer* _this, const InData& data, const Type* type) {
240+
241+
auto polymorphicDispatcher = static_cast<const data::mapping::type::__class::AbstractEnum::PolymorphicDispatcher*>(
242+
type->polymorphicDispatcher
243+
);
244+
245+
data::mapping::type::EnumInterpreterError e = data::mapping::type::EnumInterpreterError::OK;
246+
const auto& value = _this->deserialize(data, polymorphicDispatcher->getInterpretationType());
247+
248+
const auto& result = polymorphicDispatcher->fromInterpretation(value, e);
249+
250+
if(e == data::mapping::type::EnumInterpreterError::OK) {
251+
return result;
252+
}
253+
254+
switch(e) {
255+
case data::mapping::type::EnumInterpreterError::CONSTRAINT_NOT_NULL:
256+
throw std::runtime_error("[oatpp::postgresql::mapping::Deserializer::deserializeEnum()]: Error. Enum constraint violated - 'NotNull'.");
257+
258+
default:
259+
throw std::runtime_error("[oatpp::postgresql::mapping::Deserializer::deserializeEnum()]: Error. Can't deserialize Enum.");
260+
}
261+
262+
}
263+
239264
const oatpp::Type* Deserializer::guessAnyType(Oid oid) {
240265

241266
switch(oid) {

src/oatpp-postgresql/mapping/Deserializer.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,8 @@ class Deserializer {
8787

8888
static oatpp::Void deserializeBoolean(const Deserializer* _this, const InData& data, const Type* type);
8989

90+
static oatpp::Void deserializeEnum(const Deserializer* _this, const InData& data, const Type* type);
91+
9092
static oatpp::Void deserializeAny(const Deserializer* _this, const InData& data, const Type* type);
9193

9294
static oatpp::Void deserializeUuid(const Deserializer* _this, const InData& data, const Type* type);

src/oatpp-postgresql/mapping/Serializer.cpp

Lines changed: 91 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,8 @@ void Serializer::setSerializerMethods() {
6262
setSerializerMethod(data::mapping::type::__class::Float64::CLASS_ID, &Serializer::serializeFloat64);
6363
setSerializerMethod(data::mapping::type::__class::Boolean::CLASS_ID, &Serializer::serializeBoolean);
6464

65+
setSerializerMethod(data::mapping::type::__class::AbstractEnum::CLASS_ID, &Serializer::serializeEnum);
66+
6567
////
6668

6769
setSerializerMethod(postgresql::mapping::type::__class::Uuid::CLASS_ID, &Serializer::serializeUuid);
@@ -89,6 +91,8 @@ void Serializer::setTypeOidMethods() {
8991
setTypeOidMethod(data::mapping::type::__class::Float64::CLASS_ID, &Serializer::getTypeOid<FLOAT8OID>);
9092
setTypeOidMethod(data::mapping::type::__class::Boolean::CLASS_ID, &Serializer::getTypeOid<BOOLOID>);
9193

94+
setTypeOidMethod(data::mapping::type::__class::AbstractEnum::CLASS_ID, &Serializer::getEnumTypeOid);
95+
9296
////
9397

9498
setTypeOidMethod(postgresql::mapping::type::__class::Uuid::CLASS_ID, &Serializer::getTypeOid<UUIDOID>);
@@ -117,7 +121,7 @@ void Serializer::serialize(OutputData& outData, const oatpp::Void& polymorph) co
117121
auto id = polymorph.valueType->classId.id;
118122
auto& method = m_methods[id];
119123
if(method) {
120-
(*method)(outData, polymorph);
124+
(*method)(this, outData, polymorph);
121125
} else {
122126
throw std::runtime_error("[oatpp::postgresql::mapping::Serializer::serialize()]: "
123127
"Error. No serialize method for type '" + std::string(polymorph.valueType->classId.name) +
@@ -180,7 +184,10 @@ void Serializer::serInt8(OutputData& outData, v_int64 value) {
180184
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
181185
// Serializer functions
182186

183-
void Serializer::serializeString(OutputData& outData, const oatpp::Void& polymorph) {
187+
void Serializer::serializeString(const Serializer* _this, OutputData& outData, const oatpp::Void& polymorph) {
188+
189+
(void) _this;
190+
184191
if(polymorph) {
185192
base::StrBuffer *buff = static_cast<base::StrBuffer *>(polymorph.get());
186193
outData.data = (char *)buff->getData();
@@ -192,7 +199,10 @@ void Serializer::serializeString(OutputData& outData, const oatpp::Void& polymor
192199
}
193200
}
194201

195-
void Serializer::serializeInt8(OutputData& outData, const oatpp::Void& polymorph) {
202+
void Serializer::serializeInt8(const Serializer* _this, OutputData& outData, const oatpp::Void& polymorph) {
203+
204+
(void) _this;
205+
196206
if(polymorph) {
197207
auto v = polymorph.staticCast<oatpp::Int8>();
198208
serInt2(outData, *v);
@@ -202,7 +212,10 @@ void Serializer::serializeInt8(OutputData& outData, const oatpp::Void& polymorph
202212
}
203213
}
204214

205-
void Serializer::serializeUInt8(OutputData& outData, const oatpp::Void& polymorph) {
215+
void Serializer::serializeUInt8(const Serializer* _this, OutputData& outData, const oatpp::Void& polymorph) {
216+
217+
(void) _this;
218+
206219
if(polymorph) {
207220
auto v = polymorph.staticCast<oatpp::UInt8>();
208221
serInt2(outData, *v);
@@ -212,7 +225,10 @@ void Serializer::serializeUInt8(OutputData& outData, const oatpp::Void& polymorp
212225
}
213226
}
214227

215-
void Serializer::serializeInt16(OutputData& outData, const oatpp::Void& polymorph) {
228+
void Serializer::serializeInt16(const Serializer* _this, OutputData& outData, const oatpp::Void& polymorph) {
229+
230+
(void) _this;
231+
216232
if(polymorph) {
217233
auto v = polymorph.staticCast<oatpp::Int16>();
218234
serInt2(outData, *v);
@@ -222,7 +238,10 @@ void Serializer::serializeInt16(OutputData& outData, const oatpp::Void& polymorp
222238
}
223239
}
224240

225-
void Serializer::serializeUInt16(OutputData& outData, const oatpp::Void& polymorph) {
241+
void Serializer::serializeUInt16(const Serializer* _this, OutputData& outData, const oatpp::Void& polymorph) {
242+
243+
(void) _this;
244+
226245
if(polymorph) {
227246
auto v = polymorph.staticCast<oatpp::UInt16>();
228247
serInt4(outData, *v);
@@ -232,7 +251,10 @@ void Serializer::serializeUInt16(OutputData& outData, const oatpp::Void& polymor
232251
}
233252
}
234253

235-
void Serializer::serializeInt32(OutputData& outData, const oatpp::Void& polymorph) {
254+
void Serializer::serializeInt32(const Serializer* _this, OutputData& outData, const oatpp::Void& polymorph) {
255+
256+
(void) _this;
257+
236258
if(polymorph) {
237259
auto v = polymorph.staticCast<oatpp::Int32>();
238260
serInt4(outData, *v);
@@ -242,7 +264,10 @@ void Serializer::serializeInt32(OutputData& outData, const oatpp::Void& polymorp
242264
}
243265
}
244266

245-
void Serializer::serializeUInt32(OutputData& outData, const oatpp::Void& polymorph) {
267+
void Serializer::serializeUInt32(const Serializer* _this, OutputData& outData, const oatpp::Void& polymorph) {
268+
269+
(void) _this;
270+
246271
if(polymorph) {
247272
auto v = polymorph.staticCast<oatpp::UInt32>();
248273
serInt8(outData, *v);
@@ -252,7 +277,10 @@ void Serializer::serializeUInt32(OutputData& outData, const oatpp::Void& polymor
252277
}
253278
}
254279

255-
void Serializer::serializeInt64(OutputData& outData, const oatpp::Void& polymorph) {
280+
void Serializer::serializeInt64(const Serializer* _this, OutputData& outData, const oatpp::Void& polymorph) {
281+
282+
(void) _this;
283+
256284
if(polymorph) {
257285
auto v = polymorph.staticCast<oatpp::Int64>();
258286
serInt8(outData, *v);
@@ -262,11 +290,17 @@ void Serializer::serializeInt64(OutputData& outData, const oatpp::Void& polymorp
262290
}
263291
}
264292

265-
void Serializer::serializeUInt64(OutputData& outData, const oatpp::Void& polymorph) {
293+
void Serializer::serializeUInt64(const Serializer* _this, OutputData& outData, const oatpp::Void& polymorph) {
294+
(void) _this;
295+
(void) outData;
296+
(void) polymorph;
266297
throw std::runtime_error("[oatpp::postgresql::mapping::Serializer::serializeUInt64()]: Error. Not implemented!");
267298
}
268299

269-
void Serializer::serializeFloat32(OutputData& outData, const oatpp::Void& polymorph) {
300+
void Serializer::serializeFloat32(const Serializer* _this, OutputData& outData, const oatpp::Void& polymorph) {
301+
302+
(void) _this;
303+
270304
if(polymorph) {
271305
auto v = polymorph.staticCast<oatpp::Float32>();
272306
serInt4(outData, *((p_int32) v.get()));
@@ -276,7 +310,10 @@ void Serializer::serializeFloat32(OutputData& outData, const oatpp::Void& polymo
276310
}
277311
}
278312

279-
void Serializer::serializeFloat64(OutputData& outData, const oatpp::Void& polymorph) {
313+
void Serializer::serializeFloat64(const Serializer* _this, OutputData& outData, const oatpp::Void& polymorph) {
314+
315+
(void) _this;
316+
280317
if(polymorph) {
281318
auto v = polymorph.staticCast<oatpp::Float64>();
282319
serInt8(outData, *((p_int64) v.get()));
@@ -286,7 +323,10 @@ void Serializer::serializeFloat64(OutputData& outData, const oatpp::Void& polymo
286323
}
287324
}
288325

289-
void Serializer::serializeBoolean(OutputData& outData, const oatpp::Void& polymorph) {
326+
void Serializer::serializeBoolean(const Serializer* _this, OutputData& outData, const oatpp::Void& polymorph) {
327+
328+
(void) _this;
329+
290330
if(polymorph) {
291331
auto v = polymorph.staticCast<oatpp::Boolean>();
292332
outData.dataBuffer.reset(new char[1]);
@@ -300,7 +340,44 @@ void Serializer::serializeBoolean(OutputData& outData, const oatpp::Void& polymo
300340
}
301341
}
302342

303-
void Serializer::serializeUuid(OutputData& outData, const oatpp::Void& polymorph) {
343+
void Serializer::serializeEnum(const Serializer* _this, OutputData& outData, const oatpp::Void& polymorph) {
344+
345+
auto polymorphicDispatcher = static_cast<const data::mapping::type::__class::AbstractEnum::PolymorphicDispatcher*>(
346+
polymorph.valueType->polymorphicDispatcher
347+
);
348+
349+
data::mapping::type::EnumInterpreterError e = data::mapping::type::EnumInterpreterError::OK;
350+
const auto& enumInterpretation = polymorphicDispatcher->toInterpretation(polymorph, e);
351+
352+
if(e == data::mapping::type::EnumInterpreterError::OK) {
353+
_this->serialize(outData, enumInterpretation);
354+
return;
355+
}
356+
357+
switch(e) {
358+
case data::mapping::type::EnumInterpreterError::CONSTRAINT_NOT_NULL:
359+
throw std::runtime_error("[oatpp::postgresql::mapping::Serializer::serializeEnum()]: Error. Enum constraint violated - 'NotNull'.");
360+
default:
361+
throw std::runtime_error("[oatpp::postgresql::mapping::Serializer::serializeEnum()]: Error. Can't serialize Enum.");
362+
}
363+
364+
}
365+
366+
Oid Serializer::getEnumTypeOid(const Serializer* _this, const oatpp::Type* type) {
367+
368+
auto polymorphicDispatcher = static_cast<const data::mapping::type::__class::AbstractEnum::PolymorphicDispatcher*>(
369+
type->polymorphicDispatcher
370+
);
371+
372+
const oatpp::Type* enumInterType = polymorphicDispatcher->getInterpretationType();
373+
return _this->getTypeOid(enumInterType);
374+
375+
}
376+
377+
void Serializer::serializeUuid(const Serializer* _this, OutputData& outData, const oatpp::Void& polymorph) {
378+
379+
(void) _this;
380+
304381
if(polymorph) {
305382
auto v = polymorph.staticCast<postgresql::Uuid>();
306383
outData.data = (char*) v->getData();

src/oatpp-postgresql/mapping/Serializer.hpp

Lines changed: 25 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ class Serializer {
4343
};
4444

4545
public:
46-
typedef void (*SerializerMethod)(OutputData&, const oatpp::Void&);
46+
typedef void (*SerializerMethod)(const Serializer*, OutputData&, const oatpp::Void&);
4747
typedef Oid (*TypeOidMethod)(const Serializer*, const oatpp::Type*);
4848
private:
4949

@@ -73,96 +73,28 @@ class Serializer {
7373

7474
private:
7575

76-
/*
77-
* OID used - TEXTOID
78-
* @param outData
79-
* @param polymorph
80-
*/
81-
static void serializeString(OutputData& outData, const oatpp::Void& polymorph);
82-
83-
/*
84-
* OID used - INT2OID
85-
* @param outData
86-
* @param polymorph
87-
*/
88-
static void serializeInt8(OutputData& outData, const oatpp::Void& polymorph);
89-
90-
/*
91-
* OID used - INT2OID
92-
* @param outData
93-
* @param polymorph
94-
*/
95-
static void serializeUInt8(OutputData& outData, const oatpp::Void& polymorph);
96-
97-
/*
98-
* OID used - INT2OID
99-
* @param outData
100-
* @param polymorph
101-
*/
102-
static void serializeInt16(OutputData& outData, const oatpp::Void& polymorph);
103-
104-
/*
105-
* OID used - INT4OID
106-
* @param outData
107-
* @param polymorph
108-
*/
109-
static void serializeUInt16(OutputData& outData, const oatpp::Void& polymorph);
110-
111-
/*
112-
* OID used - INT4OID
113-
* @param outData
114-
* @param polymorph
115-
*/
116-
static void serializeInt32(OutputData& outData, const oatpp::Void& polymorph);
117-
118-
/*
119-
* OID used - INT8OID
120-
* @param outData
121-
* @param polymorph
122-
*/
123-
static void serializeUInt32(OutputData& outData, const oatpp::Void& polymorph);
124-
125-
/*
126-
* OID used - INT8OID
127-
* @param outData
128-
* @param polymorph
129-
*/
130-
static void serializeInt64(OutputData& outData, const oatpp::Void& polymorph);
131-
132-
/*
133-
* Not implemented
134-
* @param outData
135-
* @param polymorph
136-
*/
137-
static void serializeUInt64(OutputData& outData, const oatpp::Void& polymorph);
138-
139-
/*
140-
* OID used - FLOAT4OID
141-
* @param outData
142-
* @param polymorph
143-
*/
144-
static void serializeFloat32(OutputData& outData, const oatpp::Void& polymorph);
145-
146-
/*
147-
* OID used - FLOAT8OID
148-
* @param outData
149-
* @param polymorph
150-
*/
151-
static void serializeFloat64(OutputData& outData, const oatpp::Void& polymorph);
152-
153-
/*
154-
* OID used - BOOLOID
155-
* @param outData
156-
* @param polymorph
157-
*/
158-
static void serializeBoolean(OutputData& outData, const oatpp::Void& polymorph);
159-
160-
/*
161-
* OID used - UUIDOID
162-
* @param outData
163-
* @param polymorph
164-
*/
165-
static void serializeUuid(OutputData& outData, const oatpp::Void& polymorph);
76+
static void serializeString(const Serializer* _this, OutputData& outData, const oatpp::Void& polymorph);
77+
78+
static void serializeInt8(const Serializer* _this, OutputData& outData, const oatpp::Void& polymorph);
79+
static void serializeUInt8(const Serializer* _this, OutputData& outData, const oatpp::Void& polymorph);
80+
81+
static void serializeInt16(const Serializer* _this, OutputData& outData, const oatpp::Void& polymorph);
82+
static void serializeUInt16(const Serializer* _this, OutputData& outData, const oatpp::Void& polymorph);
83+
84+
static void serializeInt32(const Serializer* _this, OutputData& outData, const oatpp::Void& polymorph);
85+
static void serializeUInt32(const Serializer* _this, OutputData& outData, const oatpp::Void& polymorph);
86+
87+
static void serializeInt64(const Serializer* _this, OutputData& outData, const oatpp::Void& polymorph);
88+
static void serializeUInt64(const Serializer* _this, OutputData& outData, const oatpp::Void& polymorph);
89+
90+
static void serializeFloat32(const Serializer* _this, OutputData& outData, const oatpp::Void& polymorph);
91+
static void serializeFloat64(const Serializer* _this, OutputData& outData, const oatpp::Void& polymorph);
92+
93+
static void serializeBoolean(const Serializer* _this, OutputData& outData, const oatpp::Void& polymorph);
94+
95+
static void serializeEnum(const Serializer* _this, OutputData& outData, const oatpp::Void& polymorph);
96+
97+
static void serializeUuid(const Serializer* _this, OutputData& outData, const oatpp::Void& polymorph);
16698

16799
private:
168100

@@ -173,6 +105,8 @@ class Serializer {
173105
return OID;
174106
}
175107

108+
static Oid getEnumTypeOid(const Serializer* _this, const oatpp::Type* type);
109+
176110
};
177111

178112
}}}

0 commit comments

Comments
 (0)