Add boolean type mapping.

This commit is contained in:
lganzzzo 2020-10-10 02:18:03 +03:00
parent eab915b05a
commit d511320a06
6 changed files with 85 additions and 16 deletions

View File

@ -64,7 +64,7 @@ Deserializer::Deserializer() {
setDeserializerMethod(data::mapping::type::__class::Float32::CLASS_ID, &Deserializer::deserializeFloat32);
setDeserializerMethod(data::mapping::type::__class::Float64::CLASS_ID, &Deserializer::deserializeFloat64);
setDeserializerMethod(data::mapping::type::__class::Boolean::CLASS_ID, nullptr);
setDeserializerMethod(data::mapping::type::__class::Boolean::CLASS_ID, &Deserializer::deserializeBoolean);
setDeserializerMethod(data::mapping::type::__class::AbstractObject::CLASS_ID, nullptr);
setDeserializerMethod(data::mapping::type::__class::AbstractEnum::CLASS_ID, nullptr);
@ -177,8 +177,18 @@ oatpp::Void Deserializer::deserializeFloat32(const Deserializer* _this, const In
return oatpp::Float32();
}
v_int32 intVal = deInt4(data);
return oatpp::Float32(*((p_float32) &intVal));
switch(data.oid) {
case FLOAT4OID: {
v_int32 intVal = deInt4(data);
return oatpp::Float32(*((p_float32) &intVal));
}
case FLOAT8OID: {
v_int64 intVal = deInt8(data);
return oatpp::Float32(*((p_float64) &intVal));
}
}
throw std::runtime_error("[oatpp::postgresql::mapping::Deserializer::deserializeFloat32()]: Error. Unknown OID.");
}
@ -191,8 +201,38 @@ oatpp::Void Deserializer::deserializeFloat64(const Deserializer* _this, const In
return oatpp::Float64();
}
v_int64 intVal = deInt8(data);
return oatpp::Float64(*((p_float64) &intVal));
switch(data.oid) {
case FLOAT4OID: {
v_int32 intVal = deInt4(data);
return oatpp::Float64(*((p_float32) &intVal));
}
case FLOAT8OID: {
v_int64 intVal = deInt8(data);
return oatpp::Float64(*((p_float64) &intVal));
}
}
throw std::runtime_error("[oatpp::postgresql::mapping::Deserializer::deserializeFloat32()]: Error. Unknown OID.");
}
oatpp::Void Deserializer::deserializeBoolean(const Deserializer* _this, const InData& data, const Type* type) {
(void) _this;
(void) type;
if(data.isNull) {
return oatpp::Boolean();
}
switch(data.oid) {
case BOOLOID: return oatpp::Boolean((bool) data.data[0]);
case INT2OID:
case INT4OID:
case INT8OID: return oatpp::Boolean((bool) deInt(data));
}
throw std::runtime_error("[oatpp::postgresql::mapping::Deserializer::deserializeBoolean()]: Error. Unknown OID.");
}

View File

@ -87,6 +87,8 @@ public:
static oatpp::Void deserializeFloat32(const Deserializer* _this, const InData& data, const Type* type);
static oatpp::Void deserializeFloat64(const Deserializer* _this, const InData& data, const Type* type);
static oatpp::Void deserializeBoolean(const Deserializer* _this, const InData& data, const Type* type);
static oatpp::Void deserializeAny(const Deserializer* _this, const InData& data, const Type* type);
static oatpp::Void deserializeUuid(const Deserializer* _this, const InData& data, const Type* type);

View File

@ -55,7 +55,7 @@ Serializer::Serializer() {
setSerializerMethod(data::mapping::type::__class::Float32::CLASS_ID, &Serializer::serializeFloat32);
setSerializerMethod(data::mapping::type::__class::Float64::CLASS_ID, &Serializer::serializeFloat64);
setSerializerMethod(data::mapping::type::__class::Boolean::CLASS_ID, nullptr);
setSerializerMethod(data::mapping::type::__class::Boolean::CLASS_ID, &Serializer::serializeBoolean);
setSerializerMethod(data::mapping::type::__class::AbstractObject::CLASS_ID, nullptr);
setSerializerMethod(data::mapping::type::__class::AbstractEnum::CLASS_ID, nullptr);
@ -138,7 +138,7 @@ void Serializer::serInt8(OutputData& outData, v_int64 value) {
void Serializer::serializeString(OutputData& outData, const oatpp::Void& polymorph) {
if(polymorph) {
base::StrBuffer *buff = static_cast<base::StrBuffer *>(polymorph.get());
outData.data = buff->c_str();
outData.data = (char *)buff->getData();
outData.dataSize = buff->getSize();
outData.dataFormat = 1;
} else {
@ -231,10 +231,23 @@ void Serializer::serializeFloat64(OutputData& outData, const oatpp::Void& polymo
}
}
void Serializer::serializeBoolean(OutputData& outData, const oatpp::Void& polymorph) {
if(polymorph) {
auto v = polymorph.staticCast<oatpp::Boolean>();
outData.dataBuffer.reset(new char[1]);
outData.data = outData.dataBuffer.get();
outData.dataSize = 1;
outData.dataFormat = 1;
outData.data[0] = (bool)v;
} else{
serNull(outData);
}
}
void Serializer::serializeUuid(OutputData& outData, const oatpp::Void& polymorph) {
if(polymorph) {
auto v = polymorph.staticCast<postgresql::Uuid>();
outData.data = (const char*) v->getData();
outData.data = (char*) v->getData();
outData.dataSize = v->getSize();
outData.dataFormat = 1;
} else{

View File

@ -34,7 +34,7 @@ public:
struct OutputData {
std::unique_ptr<char[]> dataBuffer;
const char* data;
char* data;
int dataSize;
int dataFormat;
};
@ -137,6 +137,13 @@ public:
*/
static void serializeFloat64(OutputData& outData, const oatpp::Void& polymorph);
/**
* OID used - BOOLOID
* @param outData
* @param polymorph
*/
static void serializeBoolean(OutputData& outData, const oatpp::Void& polymorph);
/**
* OID used - UUIDOID
* @param outData

View File

@ -3,5 +3,6 @@ DROP TABLE IF EXISTS test_ints;
CREATE TABLE test_ints (
f_int16 smallint,
f_int32 integer,
f_int64 bigint
f_int64 bigint,
f_bool boolean
);

View File

@ -43,6 +43,7 @@ class IntsRow : public oatpp::DTO {
DTO_FIELD(Int16, f_int16);
DTO_FIELD(Int32, f_int32);
DTO_FIELD(Int64, f_int64);
DTO_FIELD(Boolean, f_bool);
};
@ -70,12 +71,13 @@ public:
QUERY(insertIntValues,
"INSERT INTO test_ints "
"(f_int16, f_int32, f_int64) "
"(f_int16, f_int32, f_int64, f_bool) "
"VALUES "
"(:f_int16, :f_int32, :f_int64)",
"(:f_int16, :f_int32, :f_int64, :f_bool)",
PARAM(Int16, f_int16),
PARAM(Int32, f_int32),
PARAM(Int64, f_int64))
PARAM(Int64, f_int64),
PARAM(Boolean, f_bool))
QUERY(selectAllInts, "SELECT * FROM test_ints")
@ -98,20 +100,24 @@ void IntTest::onRun() {
auto connection = client.getConnection();
client.insertIntValues(nullptr,
nullptr,
nullptr,
nullptr, connection);
client.insertIntValues(-1,
-1,
-1, connection);
-1,
false, connection);
client.insertIntValues(std::numeric_limits<v_int16>::min(),
std::numeric_limits<v_int32>::min(),
std::numeric_limits<v_int64>::min(), connection);
std::numeric_limits<v_int64>::min(),
true, connection);
client.insertIntValues(std::numeric_limits<v_int16>::max(),
std::numeric_limits<v_int32>::max(),
std::numeric_limits<v_int64>::max(), connection);
std::numeric_limits<v_int64>::max(),
true, connection);
}