Skip to content

Commit 52beff8

Browse files
committed
Update to the latest oatpp API
1 parent 005a611 commit 52beff8

File tree

6 files changed

+171
-198
lines changed

6 files changed

+171
-198
lines changed

src/oatpp-postgresql/mapping/Deserializer.cpp

Lines changed: 70 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -65,9 +65,9 @@ Deserializer::Deserializer() {
6565
setDeserializerMethod(data::mapping::type::__class::AbstractObject::CLASS_ID, nullptr);
6666
setDeserializerMethod(data::mapping::type::__class::AbstractEnum::CLASS_ID, &Deserializer::deserializeEnum);
6767

68-
setDeserializerMethod(data::mapping::type::__class::AbstractVector::CLASS_ID, &Deserializer::deserializeArray<oatpp::AbstractVector>);
69-
setDeserializerMethod(data::mapping::type::__class::AbstractList::CLASS_ID, &Deserializer::deserializeArray<oatpp::AbstractList>);
70-
setDeserializerMethod(data::mapping::type::__class::AbstractUnorderedSet::CLASS_ID, &Deserializer::deserializeArray<oatpp::AbstractUnorderedSet>);
68+
setDeserializerMethod(data::mapping::type::__class::AbstractVector::CLASS_ID, &Deserializer::deserializeArray);
69+
setDeserializerMethod(data::mapping::type::__class::AbstractList::CLASS_ID, &Deserializer::deserializeArray);
70+
setDeserializerMethod(data::mapping::type::__class::AbstractUnorderedSet::CLASS_ID, &Deserializer::deserializeArray);
7171

7272
setDeserializerMethod(data::mapping::type::__class::AbstractPairList::CLASS_ID, nullptr);
7373
setDeserializerMethod(data::mapping::type::__class::AbstractUnorderedMap::CLASS_ID, nullptr);
@@ -80,11 +80,10 @@ Deserializer::Deserializer() {
8080

8181
void Deserializer::setDeserializerMethod(const data::mapping::type::ClassId& classId, DeserializerMethod method) {
8282
const v_uint32 id = classId.id;
83-
if(id < m_methods.size()) {
84-
m_methods[id] = method;
85-
} else {
86-
throw std::runtime_error("[oatpp::postgresql::mapping::Deserializer::setDeserializerMethod()]: Error. Unknown classId");
83+
if(id >= m_methods.size()) {
84+
m_methods.resize(id + 1, nullptr);
8785
}
86+
m_methods[id] = method;
8887
}
8988

9089
oatpp::Void Deserializer::deserialize(const InData& data, const Type* type) const {
@@ -337,19 +336,76 @@ oatpp::Void Deserializer::deserializeSubArray(const Type* type,
337336
v_int32 dimension)
338337
{
339338

340-
if(data::mapping::type::__class::AbstractVector::CLASS_ID.id == type->classId.id) {
341-
return deserializeSubArray<oatpp::AbstractVector>(type, meta, dimension);
339+
if(!type->isCollection) {
340+
throw std::runtime_error("[oatpp::postgresql::mapping::Deserializer::deserializeSubArray()]: "
341+
"Error. Unknown collection type.");
342+
}
343+
344+
auto dispatcher = static_cast<const data::mapping::type::__class::Collection::PolymorphicDispatcher*>(type->polymorphicDispatcher);
345+
auto itemType = dispatcher->getItemType();
346+
auto collection = dispatcher->createObject();
347+
348+
if(dimension < meta.dimensions.size() - 1) {
349+
350+
auto size = meta.dimensions[dimension];
351+
352+
for(v_int32 i = 0; i < size; i ++) {
353+
const auto& item = deserializeSubArray(itemType, meta, dimension + 1);
354+
dispatcher->addItem(collection, item);
355+
}
356+
357+
return collection;
358+
359+
} else if(dimension == meta.dimensions.size() - 1) {
360+
361+
auto size = meta.dimensions[dimension];
362+
363+
for(v_int32 i = 0; i < size; i ++) {
364+
365+
v_int32 dataSize;
366+
meta.stream.readSimple(&dataSize, sizeof(v_int32));
367+
368+
InData itemData;
369+
itemData.typeResolver = meta.data->typeResolver;
370+
itemData.size = (v_int32) ntohl(dataSize);
371+
itemData.data = (const char*) &meta.stream.getData()[meta.stream.getCurrentPosition()];
372+
itemData.oid = meta.arrayHeader.oid;
373+
itemData.isNull = itemData.size < 0;
374+
375+
if(itemData.size > 0) {
376+
meta.stream.setCurrentPosition(meta.stream.getCurrentPosition() + itemData.size);
377+
}
342378

343-
} else if(data::mapping::type::__class::AbstractList::CLASS_ID.id == type->classId.id) {
344-
return deserializeSubArray<oatpp::AbstractList>(type, meta, dimension);
379+
const auto& item = meta._this->deserialize(itemData, itemType);
345380

346-
} else if(data::mapping::type::__class::AbstractUnorderedSet::CLASS_ID.id == type->classId.id) {
347-
return deserializeSubArray<oatpp::AbstractUnorderedSet>(type, meta, dimension);
381+
dispatcher->addItem(collection, item);
382+
383+
}
384+
385+
return collection;
348386

349387
}
350388

351389
throw std::runtime_error("[oatpp::postgresql::mapping::Deserializer::deserializeSubArray()]: "
352-
"Error. Unknown 1D collection type.");
390+
"Error. Invalid state: dimension >= dimensions.size().");
391+
392+
393+
}
394+
395+
oatpp::Void Deserializer::deserializeArray(const Deserializer* _this, const InData& data, const Type* type) {
396+
397+
if(data.isNull) {
398+
return oatpp::Void(type);
399+
}
400+
401+
auto ndim = (v_int32) ntohl(*((p_int32)data.data));
402+
if(ndim == 0) {
403+
auto dispatcher = static_cast<const data::mapping::type::__class::Collection::PolymorphicDispatcher*>(type->polymorphicDispatcher);
404+
return dispatcher->createObject(); // empty array
405+
}
406+
407+
ArrayDeserializationMeta meta(_this, &data);
408+
return deserializeSubArray(type, meta, 0);
353409

354410
}
355411

src/oatpp-postgresql/mapping/Deserializer.hpp

Lines changed: 1 addition & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -163,83 +163,7 @@ class Deserializer {
163163
ArrayDeserializationMeta& meta,
164164
v_int32 dimension);
165165

166-
template<class Collection>
167-
static oatpp::Void deserializeSubArray(const Type* type,
168-
ArrayDeserializationMeta& meta,
169-
v_int32 dimension)
170-
{
171-
172-
if(dimension < meta.dimensions.size() - 1) {
173-
174-
auto polymorphicDispatcher = static_cast<const typename Collection::Class::PolymorphicDispatcher*>(type->polymorphicDispatcher);
175-
auto itemType = *type->params.begin();
176-
auto listWrapper = polymorphicDispatcher->createObject();
177-
178-
auto size = meta.dimensions[dimension];
179-
180-
for(v_int32 i = 0; i < size; i ++) {
181-
const auto& item = deserializeSubArray(itemType, meta, dimension + 1);
182-
polymorphicDispatcher->addPolymorphicItem(listWrapper, item);
183-
}
184-
185-
return oatpp::Void(listWrapper.getPtr(), listWrapper.getValueType());
186-
187-
} else if(dimension == meta.dimensions.size() - 1) {
188-
189-
auto polymorphicDispatcher = static_cast<const typename Collection::Class::PolymorphicDispatcher*>(type->polymorphicDispatcher);
190-
auto itemType = *type->params.begin();
191-
auto listWrapper = polymorphicDispatcher->createObject();
192-
193-
auto size = meta.dimensions[dimension];
194-
195-
for(v_int32 i = 0; i < size; i ++) {
196-
197-
v_int32 dataSize;
198-
meta.stream.readSimple(&dataSize, sizeof(v_int32));
199-
200-
InData itemData;
201-
itemData.typeResolver = meta.data->typeResolver;
202-
itemData.size = (v_int32) ntohl(dataSize);
203-
itemData.data = (const char*) &meta.stream.getData()[meta.stream.getCurrentPosition()];
204-
itemData.oid = meta.arrayHeader.oid;
205-
itemData.isNull = itemData.size < 0;
206-
207-
if(itemData.size > 0) {
208-
meta.stream.setCurrentPosition(meta.stream.getCurrentPosition() + itemData.size);
209-
}
210-
211-
const auto& item = meta._this->deserialize(itemData, itemType);
212-
213-
polymorphicDispatcher->addPolymorphicItem(listWrapper, item);
214-
215-
}
216-
217-
return oatpp::Void(listWrapper.getPtr(), listWrapper.getValueType());
218-
219-
}
220-
221-
throw std::runtime_error("[oatpp::postgresql::mapping::Deserializer::deserializeSubArray()]: "
222-
"Error. Invalid state: dimension >= dimensions.size().");
223-
224-
}
225-
226-
template<class Collection>
227-
static oatpp::Void deserializeArray(const Deserializer* _this, const InData& data, const Type* type) {
228-
229-
if(data.isNull) {
230-
return oatpp::Void(nullptr, type);
231-
}
232-
233-
auto ndim = (v_int32) ntohl(*((p_int32)data.data));
234-
if(ndim == 0) {
235-
auto polymorphicDispatcher = static_cast<const typename Collection::Class::PolymorphicDispatcher*>(type->polymorphicDispatcher);
236-
return polymorphicDispatcher->createObject(); // empty array
237-
}
238-
239-
ArrayDeserializationMeta meta(_this, &data);
240-
return deserializeSubArray(type, meta, 0);
241-
242-
}
166+
static oatpp::Void deserializeArray(const Deserializer* _this, const InData& data, const Type* type);
243167

244168
};
245169

src/oatpp-postgresql/mapping/ResultMapper.cpp

Lines changed: 74 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -50,46 +50,80 @@ ResultMapper::ResultMapper() {
5050
{
5151
m_readOneRowMethods.resize(data::mapping::type::ClassId::getClassCount(), nullptr);
5252

53-
setReadOneRowMethod(data::mapping::type::__class::AbstractObject::CLASS_ID, &ResultMapper::readRowAsObject);
53+
setReadOneRowMethod(data::mapping::type::__class::AbstractObject::CLASS_ID, &ResultMapper::readOneRowAsObject);
5454

55-
setReadOneRowMethod(data::mapping::type::__class::AbstractVector::CLASS_ID, &ResultMapper::readRowAsList<oatpp::AbstractVector>);
56-
setReadOneRowMethod(data::mapping::type::__class::AbstractList::CLASS_ID, &ResultMapper::readRowAsList<oatpp::AbstractList>);
57-
setReadOneRowMethod(data::mapping::type::__class::AbstractUnorderedSet::CLASS_ID, &ResultMapper::readRowAsList<oatpp::AbstractUnorderedSet>);
55+
setReadOneRowMethod(data::mapping::type::__class::AbstractVector::CLASS_ID, &ResultMapper::readOneRowAsCollection);
56+
setReadOneRowMethod(data::mapping::type::__class::AbstractList::CLASS_ID, &ResultMapper::readOneRowAsCollection);
57+
setReadOneRowMethod(data::mapping::type::__class::AbstractUnorderedSet::CLASS_ID, &ResultMapper::readOneRowAsCollection);
5858

59-
setReadOneRowMethod(data::mapping::type::__class::AbstractPairList::CLASS_ID, &ResultMapper::readRowAsKeyValue<oatpp::AbstractFields>);
60-
setReadOneRowMethod(data::mapping::type::__class::AbstractUnorderedMap::CLASS_ID, &ResultMapper::readRowAsKeyValue<oatpp::AbstractUnorderedFields>);
59+
setReadOneRowMethod(data::mapping::type::__class::AbstractPairList::CLASS_ID, &ResultMapper::readOneRowAsMap);
60+
setReadOneRowMethod(data::mapping::type::__class::AbstractUnorderedMap::CLASS_ID, &ResultMapper::readOneRowAsMap);
6161
}
6262

6363
{
6464
m_readRowsMethods.resize(data::mapping::type::ClassId::getClassCount(), nullptr);
6565

66-
setReadRowsMethod(data::mapping::type::__class::AbstractVector::CLASS_ID, &ResultMapper::readRowsAsList<oatpp::AbstractVector>);
67-
setReadRowsMethod(data::mapping::type::__class::AbstractList::CLASS_ID, &ResultMapper::readRowsAsList<oatpp::AbstractList>);
68-
setReadRowsMethod(data::mapping::type::__class::AbstractUnorderedSet::CLASS_ID, &ResultMapper::readRowsAsList<oatpp::AbstractUnorderedSet>);
66+
setReadRowsMethod(data::mapping::type::__class::AbstractVector::CLASS_ID, &ResultMapper::readRowsAsCollection);
67+
setReadRowsMethod(data::mapping::type::__class::AbstractList::CLASS_ID, &ResultMapper::readRowsAsCollection);
68+
setReadRowsMethod(data::mapping::type::__class::AbstractUnorderedSet::CLASS_ID, &ResultMapper::readRowsAsCollection);
6969

7070
}
7171

7272
}
7373

7474
void ResultMapper::setReadOneRowMethod(const data::mapping::type::ClassId& classId, ReadOneRowMethod method) {
7575
const v_uint32 id = classId.id;
76-
if(id < m_readOneRowMethods.size()) {
77-
m_readOneRowMethods[id] = method;
78-
} else {
79-
throw std::runtime_error("[oatpp::postgresql::mapping::ResultMapper::setReadOneRowMethod()]: Error. Unknown classId");
76+
if(id >= m_readOneRowMethods.size()) {
77+
m_readOneRowMethods.resize(id + 1, nullptr);
8078
}
79+
m_readOneRowMethods[id] = method;
8180
}
8281

8382
void ResultMapper::setReadRowsMethod(const data::mapping::type::ClassId& classId, ReadRowsMethod method) {
8483
const v_uint32 id = classId.id;
85-
if(id < m_readRowsMethods.size()) {
86-
m_readRowsMethods[id] = method;
87-
} else {
88-
throw std::runtime_error("[oatpp::postgresql::mapping::ResultMapper::setReadRowsMethod()]: Error. Unknown classId");
84+
if(id >= m_readRowsMethods.size()) {
85+
m_readRowsMethods.resize(id + 1, nullptr);
8986
}
87+
m_readRowsMethods[id] = method;
9088
}
9189

92-
oatpp::Void ResultMapper::readRowAsObject(ResultMapper* _this, ResultData* dbData, const Type* type, v_int64 rowIndex) {
90+
oatpp::Void ResultMapper::readOneRowAsCollection(ResultMapper* _this, ResultData* dbData, const Type* type, v_int64 rowIndex) {
91+
92+
auto dispatcher = static_cast<const data::mapping::type::__class::Collection::PolymorphicDispatcher*>(type->polymorphicDispatcher);
93+
auto collection = dispatcher->createObject();
94+
95+
const Type* itemType = *type->params.begin();
96+
97+
for(v_int32 i = 0; i < dbData->colCount; i ++) {
98+
mapping::Deserializer::InData inData(dbData->dbResult, rowIndex, i, dbData->typeResolver);
99+
dispatcher->addItem(collection, _this->m_deserializer.deserialize(inData, itemType));
100+
}
101+
102+
return collection;
103+
104+
}
105+
106+
oatpp::Void ResultMapper::readOneRowAsMap(ResultMapper* _this, ResultData* dbData, const Type* type, v_int64 rowIndex) {
107+
108+
auto dispatcher = static_cast<const data::mapping::type::__class::Map::PolymorphicDispatcher*>(type->polymorphicDispatcher);
109+
auto map = dispatcher->createObject();
110+
111+
const Type* keyType = dispatcher->getKeyType();
112+
if(keyType->classId.id != oatpp::data::mapping::type::__class::String::CLASS_ID.id){
113+
throw std::runtime_error("[oatpp::postgresql::mapping::ResultMapper::readOneRowAsMap()]: Invalid map key. Key should be String");
114+
}
115+
116+
const Type* valueType = map.getValueType();
117+
for(v_int32 i = 0; i < dbData->colCount; i ++) {
118+
mapping::Deserializer::InData inData(dbData->dbResult, rowIndex, i, dbData->typeResolver);
119+
dispatcher->addItem(map, dbData->colNames[i], _this->m_deserializer.deserialize(inData, valueType));
120+
}
121+
122+
return map;
123+
124+
}
125+
126+
oatpp::Void ResultMapper::readOneRowAsObject(ResultMapper* _this, ResultData* dbData, const Type* type, v_int64 rowIndex) {
93127

94128
auto dispatcher = static_cast<const data::mapping::type::__class::AbstractObject::PolymorphicDispatcher*>(type->polymorphicDispatcher);
95129
auto object = dispatcher->createObject();
@@ -118,6 +152,28 @@ oatpp::Void ResultMapper::readRowAsObject(ResultMapper* _this, ResultData* dbDat
118152

119153
}
120154

155+
oatpp::Void ResultMapper::readRowsAsCollection(ResultMapper* _this, ResultData* dbData, const Type* type, v_int64 count) {
156+
157+
auto dispatcher = static_cast<const data::mapping::type::__class::Collection::PolymorphicDispatcher*>(type->polymorphicDispatcher);
158+
auto collection = dispatcher->createObject();
159+
160+
const Type* itemType = dispatcher->getItemType();
161+
162+
auto leftCount = dbData->rowCount - dbData->rowIndex;
163+
auto wantToRead = count;
164+
if(wantToRead > leftCount) {
165+
wantToRead = leftCount;
166+
}
167+
168+
for(v_int64 i = 0; i < wantToRead; i++) {
169+
dispatcher->addItem(collection, _this->readOneRow(dbData, itemType, dbData->rowIndex));
170+
++ dbData->rowIndex;
171+
}
172+
173+
return collection;
174+
175+
}
176+
121177
oatpp::Void ResultMapper::readOneRow(ResultData* dbData, const Type* type, v_int64 rowIndex) {
122178

123179
auto id = type->classId.id;

0 commit comments

Comments
 (0)