From f1de1708815427da10d2361c96712f24876be578 Mon Sep 17 00:00:00 2001 From: lganzzzo Date: Wed, 19 Aug 2020 02:46:58 +0300 Subject: [PATCH] mapping. Add postgresql::Uuid Ser/De. --- src/oatpp-postgresql/mapping/Deserializer.cpp | 19 ++++++++++++- src/oatpp-postgresql/mapping/Serializer.cpp | 17 ++++++++++++ src/oatpp-postgresql/mapping/Serializer.hpp | 7 +++++ src/oatpp-postgresql/mapping/TypeMapper.cpp | 9 +++++-- test/oatpp-postgresql/tests.cpp | 27 ++++++++++++++++--- 5 files changed, 72 insertions(+), 7 deletions(-) diff --git a/src/oatpp-postgresql/mapping/Deserializer.cpp b/src/oatpp-postgresql/mapping/Deserializer.cpp index 66a6a9f..d30db79 100644 --- a/src/oatpp-postgresql/mapping/Deserializer.cpp +++ b/src/oatpp-postgresql/mapping/Deserializer.cpp @@ -25,6 +25,7 @@ #include "Deserializer.hpp" #include "Oid.hpp" +#include "oatpp-postgresql/Types.hpp" #if defined(WIN32) || defined(_WIN32) #include @@ -74,6 +75,10 @@ Deserializer::Deserializer() { setDeserializerMethod(data::mapping::type::__class::AbstractPairList::CLASS_ID, nullptr); setDeserializerMethod(data::mapping::type::__class::AbstractUnorderedMap::CLASS_ID, nullptr); + //// + + setDeserializerMethod(postgresql::mapping::type::__class::Uuid::CLASS_ID, &Deserializer::deserializeUuid); + } void Deserializer::setDeserializerMethod(const data::mapping::type::ClassId& classId, DeserializerMethod method) { @@ -151,6 +156,10 @@ oatpp::Void Deserializer::deserializeString(const Deserializer* _this, const InD switch(data.oid) { case TEXTOID: case VARCHAROID: return oatpp::String(data.data, data.size, true); + case UUIDOID: { + postgresql::mapping::type::Uuid uuid((p_char8)data.data); + return uuid.toString(); + } } throw std::runtime_error("[oatpp::postgresql::mapping::Deserializer::deserializeString()]: Error. Unknown OID."); @@ -197,8 +206,16 @@ oatpp::Void Deserializer::deserializeAny(const Deserializer* _this, const InData } oatpp::Void Deserializer::deserializeUuid(const Deserializer* _this, const InData& data, const Type* type) { + + (void) _this; (void) type; - return oatpp::String(""); + + if(data.isNull) { + return oatpp::postgresql::Uuid(); + } + + return postgresql::Uuid((p_char8)data.data); + } }}} diff --git a/src/oatpp-postgresql/mapping/Serializer.cpp b/src/oatpp-postgresql/mapping/Serializer.cpp index 0866573..7a5a253 100644 --- a/src/oatpp-postgresql/mapping/Serializer.cpp +++ b/src/oatpp-postgresql/mapping/Serializer.cpp @@ -24,6 +24,8 @@ #include "Serializer.hpp" +#include "oatpp-postgresql/Types.hpp" + #if defined(WIN32) || defined(_WIN32) #include #else @@ -65,6 +67,10 @@ Serializer::Serializer() { setSerializerMethod(data::mapping::type::__class::AbstractPairList::CLASS_ID, nullptr); setSerializerMethod(data::mapping::type::__class::AbstractUnorderedMap::CLASS_ID, nullptr); + //// + + setSerializerMethod(postgresql::mapping::type::__class::Uuid::CLASS_ID, &Serializer::serializeUuid); + } void Serializer::setSerializerMethod(const data::mapping::type::ClassId& classId, SerializerMethod method) { @@ -225,4 +231,15 @@ void Serializer::serializeFloat64(OutputData& outData, const oatpp::Void& polymo } } +void Serializer::serializeUuid(OutputData& outData, const oatpp::Void& polymorph) { + if(polymorph) { + auto v = polymorph.staticCast(); + outData.data = (const char*) v->getData(); + outData.dataSize = v->getSize(); + outData.dataFormat = 1; + } else{ + serNull(outData); + } +} + }}} diff --git a/src/oatpp-postgresql/mapping/Serializer.hpp b/src/oatpp-postgresql/mapping/Serializer.hpp index 12c57a0..010d3fb 100644 --- a/src/oatpp-postgresql/mapping/Serializer.hpp +++ b/src/oatpp-postgresql/mapping/Serializer.hpp @@ -137,6 +137,13 @@ public: */ static void serializeFloat64(OutputData& outData, const oatpp::Void& polymorph); + /** + * OID used - UUIDOID + * @param outData + * @param polymorph + */ + static void serializeUuid(OutputData& outData, const oatpp::Void& polymorph); + }; }}} diff --git a/src/oatpp-postgresql/mapping/TypeMapper.cpp b/src/oatpp-postgresql/mapping/TypeMapper.cpp index 3ca124e..0a175d6 100644 --- a/src/oatpp-postgresql/mapping/TypeMapper.cpp +++ b/src/oatpp-postgresql/mapping/TypeMapper.cpp @@ -62,6 +62,11 @@ TypeMapper::TypeMapper() { setTypeOid(data::mapping::type::__class::AbstractPairList::CLASS_ID, 0); setTypeOid(data::mapping::type::__class::AbstractUnorderedMap::CLASS_ID, 0); + + //// + + setTypeOid(postgresql::mapping::type::__class::Uuid::CLASS_ID, UUIDOID); + } { @@ -77,12 +82,12 @@ TypeMapper::TypeMapper() { setOidType(BOOLOID, oatpp::Boolean::Class::getType()); + //// + setOidType(TIMESTAMPOID, oatpp::UInt64::Class::getType()); setOidType(UUIDOID, oatpp::postgresql::Uuid::Class::getType()); - - } } diff --git a/test/oatpp-postgresql/tests.cpp b/test/oatpp-postgresql/tests.cpp index b4cc2ce..27d7221 100644 --- a/test/oatpp-postgresql/tests.cpp +++ b/test/oatpp-postgresql/tests.cpp @@ -62,7 +62,18 @@ public: PARAM(oatpp::String, email), PREPARE(true)) - QUERY(selectUsers, "SELECT * FROM EXAMPLE_USER", PREPARE(true)) + QUERY(createUserUuid, + "INSERT INTO EXAMPLE_USER " + "(userId, login, password, email) VALUES " + "(:userId, :login, :password, :email) " + "RETURNING *;", + PARAM(oatpp::postgresql::Uuid, userId), + PARAM(oatpp::String, login), + PARAM(oatpp::String, password), + PARAM(oatpp::String, email), + PREPARE(true)) + + QUERY(selectUsers, "SELECT userId FROM EXAMPLE_USER", PREPARE(true)) QUERY(insertStrs, "INSERT INTO test_strs " @@ -127,11 +138,19 @@ public: void onRun() override { { - v_char8 data[16] = "012345670123456"; - oatpp::postgresql::mapping::type::Uuid uuid(data); + v_char8 data1[16] = "012345670123456"; + v_char8 data2[16] = "012345670123457"; + oatpp::postgresql::Uuid uuid1(data1); + oatpp::postgresql::Uuid uuid2(data2); - auto text = uuid.toString(); + auto text = uuid1->toString(); OATPP_LOGD(TAG, "uuid='%s'", text->c_str()); + + if(uuid1 == uuid2) { + OATPP_LOGD(TAG, "eq"); + } else { + OATPP_LOGD(TAG, "!eq"); + } } oatpp::String connStr = "postgresql://postgres:db-pass@localhost:5432/postgres";