Skip to content

Commit 02ddb50

Browse files
committed
Better Serializer
1 parent 78a81bd commit 02ddb50

File tree

4 files changed

+36
-17
lines changed

4 files changed

+36
-17
lines changed

src/oatpp-postgresql/Executor.cpp

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@
2828
#include "ql_template/TemplateValueProvider.hpp"
2929
#include "oatpp/core/data/stream/ChunkedBuffer.hpp"
3030

31+
#include <vector>
32+
3133
namespace oatpp { namespace postgresql {
3234

3335
std::unique_ptr<Oid[]> Executor::getParamTypes(const StringTemplate& queryTemplate, const ParamsTypeMap& paramsTypeMap) {
@@ -81,6 +83,8 @@ void Executor::executeQuery(const StringTemplate& queryTemplate,
8183

8284
v_uint32 paramsNumber = queryTemplate.getTemplateVariables().size();
8385

86+
std::vector<mapping::Serializer::OutputData> outData(paramsNumber);
87+
8488
std::unique_ptr<const char* []> paramValues(new const char*[paramsNumber]);
8589
std::unique_ptr<int[]> paramLengths(new int[paramsNumber]);
8690
std::unique_ptr<int[]> paramFormats(new int[paramsNumber]);
@@ -91,8 +95,13 @@ void Executor::executeQuery(const StringTemplate& queryTemplate,
9195
if(it == params.end()) {
9296
throw std::runtime_error("param not found");
9397
}
94-
paramLengths[i] = m_serializer.serialize(&paramValues[i], it->second);
95-
paramFormats[i] = 1;
98+
99+
auto& data = outData[i];
100+
m_serializer.serialize(data, it->second);
101+
102+
paramValues[i] = data.data;
103+
paramLengths[i] = data.dataSize;
104+
paramFormats[i] = data.dataFormat;
96105
}
97106

98107
PGresult *qres = PQexecPrepared(pgConnection,

src/oatpp-postgresql/mapping/Serializer.cpp

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -70,22 +70,23 @@ void Serializer::setSerializerMethod(const data::mapping::type::ClassId& classId
7070
}
7171
}
7272

73-
int Serializer::serialize(const char** outData, const oatpp::Void& polymorph) const {
74-
73+
void Serializer::serialize(OutputData& outData, const oatpp::Void& polymorph) const {
7574
auto id = polymorph.valueType->classId.id;
7675
auto& method = m_methods[id];
7776
if(method) {
78-
return (*method)(outData, polymorph);
77+
(*method)(outData, polymorph);
78+
} else {
79+
throw std::runtime_error("[oatpp::postgresql::mapping::Serializer::serialize()]: "
80+
"Error. No serialize method for type '" + std::string(polymorph.valueType->classId.name) +
81+
"'");
7982
}
80-
81-
throw std::runtime_error("[oatpp::postgresql::mapping::Serializer::serialize()]: "
82-
"Error. No serialize method for type '" + std::string(polymorph.valueType->classId.name) + "'");
8383
}
8484

85-
int Serializer::serializeString(const char** outData, const oatpp::Void& polymorph) {
85+
void Serializer::serializeString(OutputData& outData, const oatpp::Void& polymorph) {
8686
base::StrBuffer* buff = static_cast<base::StrBuffer*>(polymorph.get());
87-
*outData = buff->c_str();
88-
return buff->getSize();
87+
outData.data = buff->c_str();
88+
outData.dataSize = buff->getSize();
89+
outData.dataFormat = 1;
8990
}
9091

9192
}}}

src/oatpp-postgresql/mapping/Serializer.hpp

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,16 @@ namespace oatpp { namespace postgresql { namespace mapping {
3131

3232
class Serializer {
3333
public:
34-
typedef int (*SerializerMethod)(const char**, const oatpp::Void&);
34+
35+
struct OutputData {
36+
std::unique_ptr<char[]> dataBuffer;
37+
const char* data;
38+
int dataSize;
39+
int dataFormat;
40+
};
41+
42+
public:
43+
typedef void (*SerializerMethod)(OutputData&, const oatpp::Void&);
3544
private:
3645
std::vector<SerializerMethod> m_methods;
3746
public:
@@ -40,11 +49,11 @@ class Serializer {
4049

4150
void setSerializerMethod(const data::mapping::type::ClassId& classId, SerializerMethod method);
4251

43-
int serialize(const char** outData, const oatpp::Void& polymorph) const;
52+
void serialize(OutputData& outData, const oatpp::Void& polymorph) const;
4453

4554
public:
4655

47-
static int serializeString(const char** outData, const oatpp::Void& polymorph);
56+
static void serializeString(OutputData& outData, const oatpp::Void& polymorph);
4857

4958
};
5059

src/oatpp-postgresql/mapping/TypeMapper.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,9 @@ TypeMapper::TypeMapper() {
4747
setTypeOid(data::mapping::type::__class::Int64::CLASS_ID, INT8OID);
4848
setTypeOid(data::mapping::type::__class::UInt64::CLASS_ID, 0);
4949

50-
setTypeOid(data::mapping::type::__class::Float32::CLASS_ID, 0);
51-
setTypeOid(data::mapping::type::__class::Float64::CLASS_ID, 0);
52-
setTypeOid(data::mapping::type::__class::Boolean::CLASS_ID, 0);
50+
setTypeOid(data::mapping::type::__class::Float32::CLASS_ID, FLOAT4OID);
51+
setTypeOid(data::mapping::type::__class::Float64::CLASS_ID, FLOAT8OID);
52+
setTypeOid(data::mapping::type::__class::Boolean::CLASS_ID, BOOLOID);
5353

5454
setTypeOid(data::mapping::type::__class::AbstractObject::CLASS_ID, 0);
5555
setTypeOid(data::mapping::type::__class::AbstractEnum::CLASS_ID, 0);

0 commit comments

Comments
 (0)