Skip to content

Commit d511320

Browse files
committed
Add boolean type mapping.
1 parent eab915b commit d511320

File tree

6 files changed

+85
-16
lines changed

6 files changed

+85
-16
lines changed

src/oatpp-postgresql/mapping/Deserializer.cpp

Lines changed: 45 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ Deserializer::Deserializer() {
6464

6565
setDeserializerMethod(data::mapping::type::__class::Float32::CLASS_ID, &Deserializer::deserializeFloat32);
6666
setDeserializerMethod(data::mapping::type::__class::Float64::CLASS_ID, &Deserializer::deserializeFloat64);
67-
setDeserializerMethod(data::mapping::type::__class::Boolean::CLASS_ID, nullptr);
67+
setDeserializerMethod(data::mapping::type::__class::Boolean::CLASS_ID, &Deserializer::deserializeBoolean);
6868

6969
setDeserializerMethod(data::mapping::type::__class::AbstractObject::CLASS_ID, nullptr);
7070
setDeserializerMethod(data::mapping::type::__class::AbstractEnum::CLASS_ID, nullptr);
@@ -177,8 +177,18 @@ oatpp::Void Deserializer::deserializeFloat32(const Deserializer* _this, const In
177177
return oatpp::Float32();
178178
}
179179

180-
v_int32 intVal = deInt4(data);
181-
return oatpp::Float32(*((p_float32) &intVal));
180+
switch(data.oid) {
181+
case FLOAT4OID: {
182+
v_int32 intVal = deInt4(data);
183+
return oatpp::Float32(*((p_float32) &intVal));
184+
}
185+
case FLOAT8OID: {
186+
v_int64 intVal = deInt8(data);
187+
return oatpp::Float32(*((p_float64) &intVal));
188+
}
189+
}
190+
191+
throw std::runtime_error("[oatpp::postgresql::mapping::Deserializer::deserializeFloat32()]: Error. Unknown OID.");
182192

183193
}
184194

@@ -191,8 +201,38 @@ oatpp::Void Deserializer::deserializeFloat64(const Deserializer* _this, const In
191201
return oatpp::Float64();
192202
}
193203

194-
v_int64 intVal = deInt8(data);
195-
return oatpp::Float64(*((p_float64) &intVal));
204+
switch(data.oid) {
205+
case FLOAT4OID: {
206+
v_int32 intVal = deInt4(data);
207+
return oatpp::Float64(*((p_float32) &intVal));
208+
}
209+
case FLOAT8OID: {
210+
v_int64 intVal = deInt8(data);
211+
return oatpp::Float64(*((p_float64) &intVal));
212+
}
213+
}
214+
215+
throw std::runtime_error("[oatpp::postgresql::mapping::Deserializer::deserializeFloat32()]: Error. Unknown OID.");
216+
217+
}
218+
219+
oatpp::Void Deserializer::deserializeBoolean(const Deserializer* _this, const InData& data, const Type* type) {
220+
221+
(void) _this;
222+
(void) type;
223+
224+
if(data.isNull) {
225+
return oatpp::Boolean();
226+
}
227+
228+
switch(data.oid) {
229+
case BOOLOID: return oatpp::Boolean((bool) data.data[0]);
230+
case INT2OID:
231+
case INT4OID:
232+
case INT8OID: return oatpp::Boolean((bool) deInt(data));
233+
}
234+
235+
throw std::runtime_error("[oatpp::postgresql::mapping::Deserializer::deserializeBoolean()]: Error. Unknown OID.");
196236

197237
}
198238

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
static oatpp::Void deserializeFloat32(const Deserializer* _this, const InData& data, const Type* type);
8888
static oatpp::Void deserializeFloat64(const Deserializer* _this, const InData& data, const Type* type);
8989

90+
static oatpp::Void deserializeBoolean(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: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ Serializer::Serializer() {
5555

5656
setSerializerMethod(data::mapping::type::__class::Float32::CLASS_ID, &Serializer::serializeFloat32);
5757
setSerializerMethod(data::mapping::type::__class::Float64::CLASS_ID, &Serializer::serializeFloat64);
58-
setSerializerMethod(data::mapping::type::__class::Boolean::CLASS_ID, nullptr);
58+
setSerializerMethod(data::mapping::type::__class::Boolean::CLASS_ID, &Serializer::serializeBoolean);
5959

6060
setSerializerMethod(data::mapping::type::__class::AbstractObject::CLASS_ID, nullptr);
6161
setSerializerMethod(data::mapping::type::__class::AbstractEnum::CLASS_ID, nullptr);
@@ -138,7 +138,7 @@ void Serializer::serInt8(OutputData& outData, v_int64 value) {
138138
void Serializer::serializeString(OutputData& outData, const oatpp::Void& polymorph) {
139139
if(polymorph) {
140140
base::StrBuffer *buff = static_cast<base::StrBuffer *>(polymorph.get());
141-
outData.data = buff->c_str();
141+
outData.data = (char *)buff->getData();
142142
outData.dataSize = buff->getSize();
143143
outData.dataFormat = 1;
144144
} else {
@@ -231,10 +231,23 @@ void Serializer::serializeFloat64(OutputData& outData, const oatpp::Void& polymo
231231
}
232232
}
233233

234+
void Serializer::serializeBoolean(OutputData& outData, const oatpp::Void& polymorph) {
235+
if(polymorph) {
236+
auto v = polymorph.staticCast<oatpp::Boolean>();
237+
outData.dataBuffer.reset(new char[1]);
238+
outData.data = outData.dataBuffer.get();
239+
outData.dataSize = 1;
240+
outData.dataFormat = 1;
241+
outData.data[0] = (bool)v;
242+
} else{
243+
serNull(outData);
244+
}
245+
}
246+
234247
void Serializer::serializeUuid(OutputData& outData, const oatpp::Void& polymorph) {
235248
if(polymorph) {
236249
auto v = polymorph.staticCast<postgresql::Uuid>();
237-
outData.data = (const char*) v->getData();
250+
outData.data = (char*) v->getData();
238251
outData.dataSize = v->getSize();
239252
outData.dataFormat = 1;
240253
} else{

src/oatpp-postgresql/mapping/Serializer.hpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ class Serializer {
3434

3535
struct OutputData {
3636
std::unique_ptr<char[]> dataBuffer;
37-
const char* data;
37+
char* data;
3838
int dataSize;
3939
int dataFormat;
4040
};
@@ -137,6 +137,13 @@ class Serializer {
137137
*/
138138
static void serializeFloat64(OutputData& outData, const oatpp::Void& polymorph);
139139

140+
/**
141+
* OID used - BOOLOID
142+
* @param outData
143+
* @param polymorph
144+
*/
145+
static void serializeBoolean(OutputData& outData, const oatpp::Void& polymorph);
146+
140147
/**
141148
* OID used - UUIDOID
142149
* @param outData

test/oatpp-postgresql/migration/IntTest.sql

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,6 @@ DROP TABLE IF EXISTS test_ints;
33
CREATE TABLE test_ints (
44
f_int16 smallint,
55
f_int32 integer,
6-
f_int64 bigint
6+
f_int64 bigint,
7+
f_bool boolean
78
);

test/oatpp-postgresql/types/IntTest.cpp

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ class IntsRow : public oatpp::DTO {
4343
DTO_FIELD(Int16, f_int16);
4444
DTO_FIELD(Int32, f_int32);
4545
DTO_FIELD(Int64, f_int64);
46+
DTO_FIELD(Boolean, f_bool);
4647

4748
};
4849

@@ -70,12 +71,13 @@ class MyClient : public oatpp::orm::DbClient {
7071

7172
QUERY(insertIntValues,
7273
"INSERT INTO test_ints "
73-
"(f_int16, f_int32, f_int64) "
74+
"(f_int16, f_int32, f_int64, f_bool) "
7475
"VALUES "
75-
"(:f_int16, :f_int32, :f_int64)",
76+
"(:f_int16, :f_int32, :f_int64, :f_bool)",
7677
PARAM(Int16, f_int16),
7778
PARAM(Int32, f_int32),
78-
PARAM(Int64, f_int64))
79+
PARAM(Int64, f_int64),
80+
PARAM(Boolean, f_bool))
7981

8082
QUERY(selectAllInts, "SELECT * FROM test_ints")
8183

@@ -98,20 +100,24 @@ void IntTest::onRun() {
98100
auto connection = client.getConnection();
99101

100102
client.insertIntValues(nullptr,
103+
nullptr,
101104
nullptr,
102105
nullptr, connection);
103106

104107
client.insertIntValues(-1,
105108
-1,
106-
-1, connection);
109+
-1,
110+
false, connection);
107111

108112
client.insertIntValues(std::numeric_limits<v_int16>::min(),
109113
std::numeric_limits<v_int32>::min(),
110-
std::numeric_limits<v_int64>::min(), connection);
114+
std::numeric_limits<v_int64>::min(),
115+
true, connection);
111116

112117
client.insertIntValues(std::numeric_limits<v_int16>::max(),
113118
std::numeric_limits<v_int32>::max(),
114-
std::numeric_limits<v_int64>::max(), connection);
119+
std::numeric_limits<v_int64>::max(),
120+
true, connection);
115121

116122
}
117123

0 commit comments

Comments
 (0)