Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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)

AltStyle によって変換されたページ (->オリジナル) /