Skip to content

Commit ebfad69

Browse files
authored
Merge pull request #4 from oatpp/implement_datetime_datatype
Types: Add DateTime support.
2 parents ce4634f + 2ad0e01 commit ebfad69

File tree

6 files changed

+69
-1
lines changed

6 files changed

+69
-1
lines changed

src/oatpp-mongo/bson/Types.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ namespace __class {
3232
const ClassId InlineDocument::CLASS_ID("oatpp::mongo::InlineDocument");
3333
const ClassId InlineArray::CLASS_ID("oatpp::mongo::InlineArray");
3434
const ClassId ObjectId::CLASS_ID("oatpp::mongo::ObjectId");
35+
const ClassId DateTime::CLASS_ID("oatpp::mongo::DateTime");
3536

3637
}
3738

src/oatpp-mongo/bson/Types.hpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,17 @@ namespace __class {
187187

188188
};
189189

190+
class DateTime {
191+
public:
192+
static const ClassId CLASS_ID;
193+
194+
static Type *getType() {
195+
static Type type(CLASS_ID, nullptr);
196+
return &type;
197+
}
198+
199+
};
200+
190201
}
191202

192203
/**
@@ -206,6 +217,11 @@ typedef oatpp::data::mapping::type::ObjectWrapper<oatpp::base::StrBuffer, __clas
206217
*/
207218
typedef oatpp::data::mapping::type::Primitive<type::ObjectId, __class::ObjectId> ObjectId;
208219

220+
/**
221+
* DateTime is an ObjectWrapper over `v_int64` and __class::DateTime.
222+
*/
223+
typedef oatpp::data::mapping::type::Primitive<v_int64, __class::DateTime> DateTime;
224+
209225
}}}
210226

211227
#endif // oatpp_mongo_bson_Types_hpp

src/oatpp-mongo/bson/mapping/Deserializer.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,8 @@ Deserializer::Deserializer(const std::shared_ptr<Config>& config)
7474

7575
setDeserializerMethod(oatpp::mongo::bson::__class::ObjectId::CLASS_ID, &Deserializer::deserializeObjectId);
7676

77+
setDeserializerMethod(oatpp::mongo::bson::__class::DateTime::CLASS_ID, &Deserializer::deserializeDateTime);
78+
7779
}
7880

7981
void Deserializer::setDeserializerMethod(const data::mapping::type::ClassId& classId, DeserializerMethod method) {
@@ -199,6 +201,29 @@ oatpp::Void Deserializer::deserializeBoolean(Deserializer* deserializer,
199201

200202
}
201203

204+
oatpp::Void Deserializer::deserializeDateTime(Deserializer* deserializer,
205+
parser::Caret& caret,
206+
const Type* const type,
207+
v_char8 bsonTypeCode)
208+
{
209+
(void) deserializer;
210+
(void) type;
211+
212+
switch(bsonTypeCode) {
213+
214+
case TypeCode::NULL_VALUE:
215+
return oatpp::Void(DateTime::Class::getType());
216+
217+
case TypeCode::DATE_TIME:
218+
return DateTime(Utils::readInt64(caret));
219+
220+
default:
221+
caret.setError("[oatpp::mongo::bson::mapping::Deserializer::deserializeDateTime()]: Error. Type-code doesn't match DateTime.");
222+
return oatpp::Void(DateTime::Class::getType());
223+
224+
}
225+
}
226+
202227
oatpp::Void Deserializer::deserializeString(Deserializer* deserializer,
203228
parser::Caret& caret,
204229
const Type* const type,

src/oatpp-mongo/bson/mapping/Deserializer.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,7 @@ class Deserializer {
268268
}
269269

270270
static oatpp::Void deserializeBoolean(Deserializer* deserializer, parser::Caret& caret, const Type* const type, v_char8 bsonTypeCode);
271+
static oatpp::Void deserializeDateTime(Deserializer* deserializer, parser::Caret& caret, const Type* const type, v_char8 bsonTypeCode);
271272
static oatpp::Void deserializeString(Deserializer* deserializer, parser::Caret& caret, const Type* const type, v_char8 bsonTypeCode);
272273

273274
static oatpp::Void deserializeInlineDocs(Deserializer* deserializer, parser::Caret& caret, const Type* const type, v_char8 bsonTypeCode);

src/oatpp-mongo/bson/mapping/Serializer.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,8 @@ Serializer::Serializer(const std::shared_ptr<Config>& config)
7575

7676
setSerializerMethod(oatpp::mongo::bson::__class::ObjectId::CLASS_ID, &Serializer::serializeObjectId);
7777

78+
setSerializerMethod(oatpp::mongo::bson::__class::DateTime::CLASS_ID, &Serializer::serializeDateTime);
79+
7880
}
7981

8082
void Serializer::setSerializerMethod(const data::mapping::type::ClassId& classId, SerializerMethod method) {
@@ -86,6 +88,25 @@ void Serializer::setSerializerMethod(const data::mapping::type::ClassId& classId
8688
}
8789
}
8890

91+
void Serializer::serializeDateTime(Serializer* serializer,
92+
data::stream::ConsistentOutputStream* stream,
93+
const data::share::StringKeyLabel& key,
94+
const oatpp::Void& polymorph)
95+
{
96+
(void) serializer;
97+
98+
if(!key) {
99+
throw std::runtime_error("[oatpp::mongo::bson::mapping::Serializer::serializeDateTime()]: Error. The key can't be null.");
100+
}
101+
102+
if(polymorph) {
103+
bson::Utils::writeKey(stream, TypeCode::DATE_TIME, key);
104+
bson::Utils::writeInt64(stream, *static_cast<v_int64*>(polymorph.get()));
105+
} else {
106+
bson::Utils::writeKey(stream, TypeCode::NULL_VALUE, key);
107+
}
108+
}
109+
89110
void Serializer::serializeString(Serializer* serializer,
90111
data::stream::ConsistentOutputStream* stream,
91112
const data::share::StringKeyLabel& key,

src/oatpp-mongo/bson/mapping/Serializer.hpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,6 @@ class Serializer {
104104
}
105105

106106
if(polymorph) {
107-
auto str = static_cast<oatpp::base::StrBuffer *>(polymorph.get());
108107
bson::Utils::writePrimitive(stream, key, * static_cast<typename T::ObjectType*>(polymorph.get()));
109108
} else {
110109
bson::Utils::writeKey(stream, TypeCode::NULL_VALUE, key);
@@ -181,6 +180,11 @@ class Serializer {
181180

182181
}
183182

183+
static void serializeDateTime(Serializer* serializer,
184+
data::stream::ConsistentOutputStream* stream,
185+
const data::share::StringKeyLabel& key,
186+
const oatpp::Void& polymorph);
187+
184188
static void serializeString(Serializer* serializer,
185189
data::stream::ConsistentOutputStream* stream,
186190
const data::share::StringKeyLabel& key,

0 commit comments

Comments
 (0)