@@ -57,7 +57,8 @@ class VersionRow : public oatpp::DTO {
57
57
Executor::QueryParams::QueryParams (const StringTemplate& queryTemplate,
58
58
const std::unordered_map<oatpp::String, oatpp::Void>& params,
59
59
const mapping::TypeMapper& typeMapper,
60
- const mapping::Serializer& serializer)
60
+ const mapping::Serializer& serializer,
61
+ const data::mapping::type::BaseObject::PropertyTraverser& objectTraverser)
61
62
{
62
63
63
64
auto extra = std::static_pointer_cast<ql_template::Parser::TemplateExtra>(queryTemplate.getExtraData ());
@@ -78,42 +79,116 @@ Executor::QueryParams::QueryParams(const StringTemplate& queryTemplate,
78
79
paramFormats.resize (count);
79
80
80
81
for (v_uint32 i = 0 ; i < count; i ++) {
82
+
81
83
const auto & var = queryTemplate.getTemplateVariables ()[i];
82
84
auto it = params.find (var.name );
83
- if (it == params.end ()) {
84
- throw std::runtime_error (" [oatpp::postgresql::Executor::QueryParams::QueryParams()]: "
85
- " Error. Parameter not found " + var.name ->std_str ());
85
+
86
+ if (it != params.end ()) {
87
+
88
+ auto & data = outData[i];
89
+ serializer.serialize (data, it->second );
90
+
91
+ paramOids[i] = typeMapper.getTypeOid (it->second .valueType );
92
+ paramValues[i] = data.data ;
93
+ paramLengths[i] = data.dataSize ;
94
+ paramFormats[i] = data.dataFormat ;
95
+
96
+ continue ;
97
+
86
98
}
87
99
88
- auto & data = outData[i];
89
- serializer.serialize (data, it->second );
100
+ auto dtoParam = paramNameAsDtoParam (var.name );
101
+ if (dtoParam.name ) {
102
+ it = params.find (dtoParam.name );
103
+ if (it != params.end () && it->second .valueType ->classId .id == data::mapping::type::__class::AbstractObject::CLASS_ID.id ) {
104
+ auto value = objectTraverser.findPropertyValue (it->second , dtoParam.propertyPath , {});
105
+ if (value.valueType ->classId .id != oatpp::Void::Class::CLASS_ID.id ) {
106
+
107
+ auto & data = outData[i];
108
+ serializer.serialize (data, value);
109
+
110
+ paramOids[i] = typeMapper.getTypeOid (value.valueType );
111
+ paramValues[i] = data.data ;
112
+ paramLengths[i] = data.dataSize ;
113
+ paramFormats[i] = data.dataFormat ;
114
+
115
+ continue ;
116
+
117
+ }
118
+ }
119
+ }
120
+
121
+ throw std::runtime_error (" [oatpp::postgresql::Executor::QueryParams::QueryParams()]: "
122
+ " Error. Parameter not found " + var.name ->std_str ());
90
123
91
- paramOids[i] = typeMapper.getTypeOid (it->second .valueType );
92
- paramValues[i] = data.data ;
93
- paramLengths[i] = data.dataSize ;
94
- paramFormats[i] = data.dataFormat ;
95
124
}
96
125
97
126
}
98
127
99
128
Executor::Executor (const std::shared_ptr<provider::Provider<Connection>>& connectionProvider)
100
129
: m_connectionProvider(connectionProvider)
101
130
, m_resultMapper(std::make_shared<mapping::ResultMapper>())
102
- {}
131
+ {
132
+ m_objectTraverser.addKnownTypes ({
133
+ Uuid::Class::CLASS_ID
134
+ });
135
+ }
136
+
137
+ Executor::DtoParam Executor::paramNameAsDtoParam (const oatpp::String& paramName) {
138
+
139
+ parser::Caret caret (paramName);
140
+ auto nameLabel = caret.putLabel ();
141
+ if (caret.findChar (' .' ) && caret.getPosition () < caret.getDataSize () - 1 ) {
103
142
143
+ DtoParam result;
144
+ result.name = nameLabel.toString ();
145
+
146
+ do {
147
+
148
+ caret.inc ();
149
+ auto label = caret.putLabel ();
150
+ caret.findChar (' .' );
151
+ result.propertyPath .push_back (label.std_str ());
152
+
153
+ } while (caret.getPosition () < caret.getDataSize ());
154
+
155
+ return result;
156
+
157
+ }
158
+
159
+ return {};
160
+
161
+ }
104
162
105
163
std::unique_ptr<Oid[]> Executor::getParamTypes (const StringTemplate& queryTemplate, const ParamsTypeMap& paramsTypeMap) {
106
164
107
165
std::unique_ptr<Oid[]> result (new Oid[queryTemplate.getTemplateVariables ().size ()]);
108
166
109
167
for (v_uint32 i = 0 ; i < queryTemplate.getTemplateVariables ().size (); i++) {
110
- const auto & v = queryTemplate.getTemplateVariables ()[i];
111
- auto it = paramsTypeMap.find (v.name );
112
- if (it == paramsTypeMap.end ()) {
113
- throw std::runtime_error (" [oatpp::postgresql::Executor::getParamTypes()]: Error. "
114
- " Type info not found for variable " + v.name ->std_str ());
168
+
169
+ const auto & var = queryTemplate.getTemplateVariables ()[i];
170
+ auto it = paramsTypeMap.find (var.name );
171
+
172
+ if (it != paramsTypeMap.end ()) {
173
+ result.get ()[i] = m_typeMapper.getTypeOid (it->second );
174
+ continue ;
175
+ }
176
+
177
+ auto dtoParam = paramNameAsDtoParam (var.name );
178
+ if (dtoParam.name ) {
179
+ it = paramsTypeMap.find (dtoParam.name );
180
+ if (it != paramsTypeMap.end () && it->second ->classId .id == data::mapping::type::__class::AbstractObject::CLASS_ID.id ) {
181
+ auto type = m_objectTraverser.findPropertyType (it->second , dtoParam.propertyPath , {});
182
+ if (type) {
183
+ result.get ()[i] = m_typeMapper.getTypeOid (type);
184
+ continue ;
185
+ }
186
+ }
115
187
}
116
- result.get ()[i] = m_typeMapper.getTypeOid (it->second );
188
+
189
+ throw std::runtime_error (" [oatpp::postgresql::Executor::getParamTypes()]: Error. "
190
+ " Type info not found for variable " + var.name ->std_str ());
191
+
117
192
}
118
193
119
194
return result;
@@ -141,7 +216,7 @@ std::shared_ptr<QueryResult> Executor::executeQueryPrepared(const StringTemplate
141
216
const std::shared_ptr<postgresql::Connection>& connection)
142
217
{
143
218
144
- QueryParams queryParams (queryTemplate, params, m_typeMapper, m_serializer);
219
+ QueryParams queryParams (queryTemplate, params, m_typeMapper, m_serializer, m_objectTraverser );
145
220
146
221
PGresult *qres = PQexecPrepared (connection->getHandle (),
147
222
queryParams.queryName ,
@@ -160,7 +235,7 @@ std::shared_ptr<QueryResult> Executor::executeQuery(const StringTemplate& queryT
160
235
const std::shared_ptr<postgresql::Connection>& connection)
161
236
{
162
237
163
- QueryParams queryParams (queryTemplate, params, m_typeMapper, m_serializer);
238
+ QueryParams queryParams (queryTemplate, params, m_typeMapper, m_serializer, m_objectTraverser );
164
239
165
240
PGresult *qres = PQexecParams (connection->getHandle (),
166
241
queryParams.query ,
0 commit comments