Skip to content

Commit 2862c01

Browse files
committed
Simplify. Remove TypeMapper.
1 parent 0409166 commit 2862c01

File tree

12 files changed

+188
-219
lines changed

12 files changed

+188
-219
lines changed

CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ find_package(PostgreSQL REQUIRED)
9696

9797
message("PostgreSQL_INCLUDE_DIRS=${PostgreSQL_INCLUDE_DIRS}")
9898
message("PostgreSQL_LIBRARIES=${PostgreSQL_LIBRARIES}")
99+
message("PostgreSQL_TYPE_INCLUDE_DIR=${PostgreSQL_TYPE_INCLUDE_DIR}")
99100

100101
message("\n############################################################################\n")
101102

src/CMakeLists.txt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,6 @@ add_library(${OATPP_THIS_MODULE_NAME}
99
oatpp-postgresql/mapping/ResultMapper.hpp
1010
oatpp-postgresql/mapping/Serializer.cpp
1111
oatpp-postgresql/mapping/Serializer.hpp
12-
oatpp-postgresql/mapping/TypeMapper.cpp
13-
oatpp-postgresql/mapping/TypeMapper.hpp
1412
oatpp-postgresql/ql_template/Parser.cpp
1513
oatpp-postgresql/ql_template/Parser.hpp
1614
oatpp-postgresql/ql_template/TemplateValueProvider.cpp

src/oatpp-postgresql/Executor.cpp

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,6 @@ namespace {
5656

5757
Executor::QueryParams::QueryParams(const StringTemplate& queryTemplate,
5858
const std::unordered_map<oatpp::String, oatpp::Void>& params,
59-
const mapping::TypeMapper& typeMapper,
6059
const mapping::Serializer& serializer,
6160
const std::shared_ptr<const data::mapping::TypeResolver>& typeResolver)
6261
{
@@ -103,7 +102,7 @@ Executor::QueryParams::QueryParams(const StringTemplate& queryTemplate,
103102
auto& data = outData[i];
104103
serializer.serialize(data, value);
105104

106-
paramOids[i] = typeMapper.getTypeOid(value.valueType);
105+
paramOids[i] = data.oid;
107106
paramValues[i] = data.data;
108107
paramLengths[i] = data.dataSize;
109108
paramFormats[i] = data.dataFormat;
@@ -183,7 +182,7 @@ std::unique_ptr<Oid[]> Executor::getParamTypes(const StringTemplate& queryTempla
183182
if(it != paramsTypeMap.end()) {
184183
auto type = typeResolver->resolveObjectPropertyType(it->second, queryParameter.propertyPath, cache);
185184
if(type) {
186-
result.get()[i] = m_typeMapper.getTypeOid(type);
185+
result.get()[i] = m_serializer.getTypeOid(type);
187186
continue;
188187
}
189188
}
@@ -223,7 +222,7 @@ std::shared_ptr<QueryResult> Executor::executeQueryPrepared(const StringTemplate
223222
const std::shared_ptr<postgresql::Connection>& connection)
224223
{
225224

226-
QueryParams queryParams(queryTemplate, params, m_typeMapper, m_serializer, typeResolver);
225+
QueryParams queryParams(queryTemplate, params, m_serializer, typeResolver);
227226

228227
PGresult *qres = PQexecPrepared(connection->getHandle(),
229228
queryParams.queryName,
@@ -243,7 +242,7 @@ std::shared_ptr<QueryResult> Executor::executeQuery(const StringTemplate& queryT
243242
const std::shared_ptr<postgresql::Connection>& connection)
244243
{
245244

246-
QueryParams queryParams(queryTemplate, params, m_typeMapper, m_serializer, typeResolver);
245+
QueryParams queryParams(queryTemplate, params, m_serializer, typeResolver);
247246

248247
PGresult *qres = PQexecParams(connection->getHandle(),
249248
queryParams.query,

src/oatpp-postgresql/Executor.hpp

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@
2929
#include "QueryResult.hpp"
3030

3131
#include "mapping/Serializer.hpp"
32-
#include "mapping/TypeMapper.hpp"
3332
#include "mapping/ResultMapper.hpp"
3433
#include "Types.hpp"
3534

@@ -59,7 +58,6 @@ class Executor : public orm::Executor {
5958

6059
QueryParams(const StringTemplate& queryTemplate,
6160
const std::unordered_map<oatpp::String, oatpp::Void>& params,
62-
const mapping::TypeMapper& typeMapper,
6361
const mapping::Serializer& serializer,
6462
const std::shared_ptr<const data::mapping::TypeResolver>& typeResolver);
6563

@@ -110,7 +108,6 @@ class Executor : public orm::Executor {
110108
private:
111109
std::shared_ptr<provider::Provider<Connection>> m_connectionProvider;
112110
std::shared_ptr<mapping::ResultMapper> m_resultMapper;
113-
mapping::TypeMapper m_typeMapper;
114111
mapping::Serializer m_serializer;
115112
public:
116113

src/oatpp-postgresql/mapping/Deserializer.cpp

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -236,14 +236,43 @@ oatpp::Void Deserializer::deserializeBoolean(const Deserializer* _this, const In
236236

237237
}
238238

239+
const oatpp::Type* Deserializer::guessAnyType(Oid oid) {
240+
241+
switch(oid) {
242+
243+
case TEXTOID:
244+
case VARCHAROID: return oatpp::String::Class::getType();
245+
246+
case INT2OID: return oatpp::Int16::Class::getType();
247+
case INT4OID: return oatpp::Int32::Class::getType();
248+
case INT8OID: return oatpp::Int64::Class::getType();
249+
250+
case FLOAT4OID: return oatpp::Float32::Class::getType();
251+
case FLOAT8OID: return oatpp::Float64::Class::getType();
252+
253+
case BOOLOID: return oatpp::Boolean::Class::getType();
254+
255+
case TIMESTAMPOID: return oatpp::UInt64::Class::getType();
256+
257+
case UUIDOID: return oatpp::postgresql::Uuid::Class::getType();
258+
259+
}
260+
261+
return nullptr;
262+
}
263+
239264
oatpp::Void Deserializer::deserializeAny(const Deserializer* _this, const InData& data, const Type* type) {
265+
240266
(void) type;
241-
const Type* valueType = _this->m_typeMapper.getOidType(data.oid);
267+
268+
const Type* valueType = guessAnyType(data.oid);
242269
if(valueType == nullptr) {
243270
throw std::runtime_error("[oatpp::postgresql::mapping::Deserializer::deserializeAny()]: Error. Unknown OID.");
244271
}
272+
245273
auto value = _this->deserialize(data, valueType);
246274
auto anyHandle = std::make_shared<data::mapping::type::AnyHandle>(value.getPtr(), value.valueType);
275+
247276
return oatpp::Void(anyHandle, Any::Class::getType());
248277
}
249278

src/oatpp-postgresql/mapping/Deserializer.hpp

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
#ifndef oatpp_postgresql_mapping_Deserializer_hpp
2626
#define oatpp_postgresql_mapping_Deserializer_hpp
2727

28-
#include "TypeMapper.hpp"
2928
#include "oatpp/core/data/mapping/TypeResolver.hpp"
3029
#include "oatpp/core/Types.hpp"
3130

@@ -34,8 +33,6 @@
3433
namespace oatpp { namespace postgresql { namespace mapping {
3534

3635
class Deserializer {
37-
public:
38-
typedef oatpp::data::mapping::type::Type Type;
3936
public:
4037

4138
struct InData {
@@ -58,9 +55,10 @@ class Deserializer {
5855
static v_int32 deInt4(const InData& data);
5956
static v_int64 deInt8(const InData& data);
6057
static v_int64 deInt(const InData& data);
58+
59+
static const oatpp::Type* guessAnyType(Oid oid);
6160
private:
6261
std::vector<DeserializerMethod> m_methods;
63-
TypeMapper m_typeMapper;
6462
public:
6563

6664
Deserializer();
@@ -69,7 +67,7 @@ class Deserializer {
6967

7068
oatpp::Void deserialize(const InData& data, const Type* type) const;
7169

72-
public:
70+
private:
7371

7472
static oatpp::Void deserializeString(const Deserializer* _this, const InData& data, const Type* type);
7573

src/oatpp-postgresql/mapping/Serializer.cpp

Lines changed: 67 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424

2525
#include "Serializer.hpp"
2626

27+
#include "Oid.hpp"
2728
#include "oatpp-postgresql/Types.hpp"
2829

2930
#if defined(WIN32) || defined(_WIN32)
@@ -35,11 +36,15 @@
3536
namespace oatpp { namespace postgresql { namespace mapping {
3637

3738
Serializer::Serializer() {
39+
setSerializerMethods();
40+
setTypeOidMethods();
41+
}
42+
43+
void Serializer::setSerializerMethods() {
3844

3945
m_methods.resize(data::mapping::type::ClassId::getClassCount(), nullptr);
4046

4147
setSerializerMethod(data::mapping::type::__class::String::CLASS_ID, &Serializer::serializeString);
42-
setSerializerMethod(data::mapping::type::__class::Any::CLASS_ID, nullptr);
4348

4449
setSerializerMethod(data::mapping::type::__class::Int8::CLASS_ID, &Serializer::serializeInt8);
4550
setSerializerMethod(data::mapping::type::__class::UInt8::CLASS_ID, &Serializer::serializeUInt8);
@@ -57,19 +62,36 @@ Serializer::Serializer() {
5762
setSerializerMethod(data::mapping::type::__class::Float64::CLASS_ID, &Serializer::serializeFloat64);
5863
setSerializerMethod(data::mapping::type::__class::Boolean::CLASS_ID, &Serializer::serializeBoolean);
5964

60-
setSerializerMethod(data::mapping::type::__class::AbstractObject::CLASS_ID, nullptr);
61-
setSerializerMethod(data::mapping::type::__class::AbstractEnum::CLASS_ID, nullptr);
65+
////
66+
67+
setSerializerMethod(postgresql::mapping::type::__class::Uuid::CLASS_ID, &Serializer::serializeUuid);
68+
69+
}
70+
71+
void Serializer::setTypeOidMethods() {
72+
73+
m_typeOidMethods.resize(data::mapping::type::ClassId::getClassCount(), nullptr);
74+
75+
setTypeOidMethod(data::mapping::type::__class::String::CLASS_ID, &Serializer::getTypeOid<TEXTOID>);
76+
77+
setTypeOidMethod(data::mapping::type::__class::Int8::CLASS_ID, &Serializer::getTypeOid<INT2OID>);
78+
setTypeOidMethod(data::mapping::type::__class::UInt8::CLASS_ID, &Serializer::getTypeOid<INT2OID>);
6279

63-
setSerializerMethod(data::mapping::type::__class::AbstractVector::CLASS_ID, nullptr);
64-
setSerializerMethod(data::mapping::type::__class::AbstractList::CLASS_ID, nullptr);
65-
setSerializerMethod(data::mapping::type::__class::AbstractUnorderedSet::CLASS_ID, nullptr);
80+
setTypeOidMethod(data::mapping::type::__class::Int16::CLASS_ID, &Serializer::getTypeOid<INT2OID>);
81+
setTypeOidMethod(data::mapping::type::__class::UInt16::CLASS_ID, &Serializer::getTypeOid<INT4OID>);
6682

67-
setSerializerMethod(data::mapping::type::__class::AbstractPairList::CLASS_ID, nullptr);
68-
setSerializerMethod(data::mapping::type::__class::AbstractUnorderedMap::CLASS_ID, nullptr);
83+
setTypeOidMethod(data::mapping::type::__class::Int32::CLASS_ID, &Serializer::getTypeOid<INT4OID>);
84+
setTypeOidMethod(data::mapping::type::__class::UInt32::CLASS_ID, &Serializer::getTypeOid<INT8OID>);
85+
86+
setTypeOidMethod(data::mapping::type::__class::Int64::CLASS_ID, &Serializer::getTypeOid<INT8OID>);
87+
88+
setTypeOidMethod(data::mapping::type::__class::Float32::CLASS_ID, &Serializer::getTypeOid<FLOAT4OID>);
89+
setTypeOidMethod(data::mapping::type::__class::Float64::CLASS_ID, &Serializer::getTypeOid<FLOAT8OID>);
90+
setTypeOidMethod(data::mapping::type::__class::Boolean::CLASS_ID, &Serializer::getTypeOid<BOOLOID>);
6991

7092
////
7193

72-
setSerializerMethod(postgresql::mapping::type::__class::Uuid::CLASS_ID, &Serializer::serializeUuid);
94+
setTypeOidMethod(postgresql::mapping::type::__class::Uuid::CLASS_ID, &Serializer::getTypeOid<UUIDOID>);
7395

7496
}
7597

@@ -82,6 +104,15 @@ void Serializer::setSerializerMethod(const data::mapping::type::ClassId& classId
82104
}
83105
}
84106

107+
void Serializer::setTypeOidMethod(const data::mapping::type::ClassId& classId, TypeOidMethod method) {
108+
const v_uint32 id = classId.id;
109+
if(id < m_methods.size()) {
110+
m_typeOidMethods[id] = method;
111+
} else {
112+
throw std::runtime_error("[oatpp::postgresql::mapping::Serializer::setTypeOidMethod()]: Error. Unknown classId");
113+
}
114+
}
115+
85116
void Serializer::serialize(OutputData& outData, const oatpp::Void& polymorph) const {
86117
auto id = polymorph.valueType->classId.id;
87118
auto& method = m_methods[id];
@@ -94,6 +125,20 @@ void Serializer::serialize(OutputData& outData, const oatpp::Void& polymorph) co
94125
}
95126
}
96127

128+
Oid Serializer::getTypeOid(const oatpp::Type* type) const {
129+
130+
auto id = type->classId.id;
131+
auto& method = m_typeOidMethods[id];
132+
if(method) {
133+
return (*method)(this, type);
134+
}
135+
136+
throw std::runtime_error("[oatpp::postgresql::mapping::Serializer::getTypeOid()]: "
137+
"Error. Can't derive OID for type '" + std::string(type->classId.name) +
138+
"'");
139+
140+
}
141+
97142
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
98143
// Serializer utility functions
99144

@@ -141,6 +186,7 @@ void Serializer::serializeString(OutputData& outData, const oatpp::Void& polymor
141186
outData.data = (char *)buff->getData();
142187
outData.dataSize = buff->getSize();
143188
outData.dataFormat = 1;
189+
outData.oid = TEXTOID;
144190
} else {
145191
serNull(outData);
146192
}
@@ -150,6 +196,7 @@ void Serializer::serializeInt8(OutputData& outData, const oatpp::Void& polymorph
150196
if(polymorph) {
151197
auto v = polymorph.staticCast<oatpp::Int8>();
152198
serInt2(outData, *v);
199+
outData.oid = INT2OID;
153200
} else {
154201
serNull(outData);
155202
}
@@ -159,6 +206,7 @@ void Serializer::serializeUInt8(OutputData& outData, const oatpp::Void& polymorp
159206
if(polymorph) {
160207
auto v = polymorph.staticCast<oatpp::UInt8>();
161208
serInt2(outData, *v);
209+
outData.oid = INT2OID;
162210
} else {
163211
serNull(outData);
164212
}
@@ -168,6 +216,7 @@ void Serializer::serializeInt16(OutputData& outData, const oatpp::Void& polymorp
168216
if(polymorph) {
169217
auto v = polymorph.staticCast<oatpp::Int16>();
170218
serInt2(outData, *v);
219+
outData.oid = INT2OID;
171220
} else {
172221
serNull(outData);
173222
}
@@ -177,6 +226,7 @@ void Serializer::serializeUInt16(OutputData& outData, const oatpp::Void& polymor
177226
if(polymorph) {
178227
auto v = polymorph.staticCast<oatpp::UInt16>();
179228
serInt4(outData, *v);
229+
outData.oid = INT4OID;
180230
} else {
181231
serNull(outData);
182232
}
@@ -186,6 +236,7 @@ void Serializer::serializeInt32(OutputData& outData, const oatpp::Void& polymorp
186236
if(polymorph) {
187237
auto v = polymorph.staticCast<oatpp::Int32>();
188238
serInt4(outData, *v);
239+
outData.oid = INT4OID;
189240
} else {
190241
serNull(outData);
191242
}
@@ -195,6 +246,7 @@ void Serializer::serializeUInt32(OutputData& outData, const oatpp::Void& polymor
195246
if(polymorph) {
196247
auto v = polymorph.staticCast<oatpp::UInt32>();
197248
serInt8(outData, *v);
249+
outData.oid = INT8OID;
198250
} else {
199251
serNull(outData);
200252
}
@@ -204,19 +256,21 @@ void Serializer::serializeInt64(OutputData& outData, const oatpp::Void& polymorp
204256
if(polymorph) {
205257
auto v = polymorph.staticCast<oatpp::Int64>();
206258
serInt8(outData, *v);
259+
outData.oid = INT8OID;
207260
} else {
208261
serNull(outData);
209262
}
210263
}
211264

212265
void Serializer::serializeUInt64(OutputData& outData, const oatpp::Void& polymorph) {
213-
serNull(outData);
266+
throw std::runtime_error("[oatpp::postgresql::mapping::Serializer::serializeUInt64()]: Error. Not implemented!");
214267
}
215268

216269
void Serializer::serializeFloat32(OutputData& outData, const oatpp::Void& polymorph) {
217270
if(polymorph) {
218271
auto v = polymorph.staticCast<oatpp::Float32>();
219272
serInt4(outData, *((p_int32) v.get()));
273+
outData.oid = FLOAT4OID;
220274
} else{
221275
serNull(outData);
222276
}
@@ -226,6 +280,7 @@ void Serializer::serializeFloat64(OutputData& outData, const oatpp::Void& polymo
226280
if(polymorph) {
227281
auto v = polymorph.staticCast<oatpp::Float64>();
228282
serInt8(outData, *((p_int64) v.get()));
283+
outData.oid = FLOAT8OID;
229284
} else{
230285
serNull(outData);
231286
}
@@ -239,6 +294,7 @@ void Serializer::serializeBoolean(OutputData& outData, const oatpp::Void& polymo
239294
outData.dataSize = 1;
240295
outData.dataFormat = 1;
241296
outData.data[0] = (bool)v;
297+
outData.oid = BOOLOID;
242298
} else{
243299
serNull(outData);
244300
}
@@ -250,6 +306,7 @@ void Serializer::serializeUuid(OutputData& outData, const oatpp::Void& polymorph
250306
outData.data = (char*) v->getData();
251307
outData.dataSize = v->getSize();
252308
outData.dataFormat = 1;
309+
outData.oid = UUIDOID;
253310
} else{
254311
serNull(outData);
255312
}

0 commit comments

Comments
 (0)