File tree Expand file tree Collapse file tree 4 files changed +36
-17
lines changed Expand file tree Collapse file tree 4 files changed +36
-17
lines changed Original file line number Diff line number Diff line change 28
28
#include " ql_template/TemplateValueProvider.hpp"
29
29
#include " oatpp/core/data/stream/ChunkedBuffer.hpp"
30
30
31
+ #include < vector>
32
+
31
33
namespace oatpp { namespace postgresql {
32
34
33
35
std::unique_ptr<Oid[]> Executor::getParamTypes (const StringTemplate& queryTemplate, const ParamsTypeMap& paramsTypeMap) {
@@ -81,6 +83,8 @@ void Executor::executeQuery(const StringTemplate& queryTemplate,
81
83
82
84
v_uint32 paramsNumber = queryTemplate.getTemplateVariables ().size ();
83
85
86
+ std::vector<mapping::Serializer::OutputData> outData (paramsNumber);
87
+
84
88
std::unique_ptr<const char * []> paramValues (new const char *[paramsNumber]);
85
89
std::unique_ptr<int []> paramLengths (new int [paramsNumber]);
86
90
std::unique_ptr<int []> paramFormats (new int [paramsNumber]);
@@ -91,8 +95,13 @@ void Executor::executeQuery(const StringTemplate& queryTemplate,
91
95
if (it == params.end ()) {
92
96
throw std::runtime_error (" param not found" );
93
97
}
94
- paramLengths[i] = m_serializer.serialize (¶mValues[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 ;
96
105
}
97
106
98
107
PGresult *qres = PQexecPrepared (pgConnection,
Original file line number Diff line number Diff line change @@ -70,22 +70,23 @@ void Serializer::setSerializerMethod(const data::mapping::type::ClassId& classId
70
70
}
71
71
}
72
72
73
- int Serializer::serialize (const char ** outData, const oatpp::Void& polymorph) const {
74
-
73
+ void Serializer::serialize (OutputData& outData, const oatpp::Void& polymorph) const {
75
74
auto id = polymorph.valueType ->classId .id ;
76
75
auto & method = m_methods[id];
77
76
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
+ " '" );
79
82
}
80
-
81
- throw std::runtime_error (" [oatpp::postgresql::mapping::Serializer::serialize()]: "
82
- " Error. No serialize method for type '" + std::string (polymorph.valueType ->classId .name ) + " '" );
83
83
}
84
84
85
- int Serializer::serializeString (const char ** outData, const oatpp::Void& polymorph) {
85
+ void Serializer::serializeString (OutputData& outData, const oatpp::Void& polymorph) {
86
86
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 ;
89
90
}
90
91
91
92
}}}
Original file line number Diff line number Diff line change @@ -31,7 +31,16 @@ namespace oatpp { namespace postgresql { namespace mapping {
31
31
32
32
class Serializer {
33
33
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&);
35
44
private:
36
45
std::vector<SerializerMethod> m_methods;
37
46
public:
@@ -40,11 +49,11 @@ class Serializer {
40
49
41
50
void setSerializerMethod (const data::mapping::type::ClassId& classId, SerializerMethod method);
42
51
43
- int serialize (const char ** outData, const oatpp::Void& polymorph) const ;
52
+ void serialize (OutputData& outData, const oatpp::Void& polymorph) const ;
44
53
45
54
public:
46
55
47
- static int serializeString (const char ** outData, const oatpp::Void& polymorph);
56
+ static void serializeString (OutputData& outData, const oatpp::Void& polymorph);
48
57
49
58
};
50
59
Original file line number Diff line number Diff line change @@ -47,9 +47,9 @@ TypeMapper::TypeMapper() {
47
47
setTypeOid (data::mapping::type::__class::Int64::CLASS_ID, INT8OID);
48
48
setTypeOid (data::mapping::type::__class::UInt64::CLASS_ID, 0 );
49
49
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 );
53
53
54
54
setTypeOid (data::mapping::type::__class::AbstractObject::CLASS_ID, 0 );
55
55
setTypeOid (data::mapping::type::__class::AbstractEnum::CLASS_ID, 0 );
You can’t perform that action at this time.
0 commit comments