diff options
author | Mark Benvenuto <mark.benvenuto@mongodb.com> | 2017-05-01 13:10:07 -0400 |
---|---|---|
committer | Mark Benvenuto <mark.benvenuto@mongodb.com> | 2017-05-01 13:10:07 -0400 |
commit | db53b03f5c1420b9bcade637873522f1847f9e3f (patch) | |
tree | 8872e0b06d93315344cfa86c3ae14c9688c05d6e /buildscripts/idl | |
parent | 3aa8750877642f7985c1bd0da4bbb753a5161100 (diff) | |
download | mongo-db53b03f5c1420b9bcade637873522f1847f9e3f.tar.gz |
SERVER-28985 Change IDL serialization contract for objects
Diffstat (limited to 'buildscripts/idl')
-rw-r--r-- | buildscripts/idl/idl/cpp_types.py | 7 | ||||
-rw-r--r-- | buildscripts/idl/idl/generator.py | 23 |
2 files changed, 22 insertions, 8 deletions
diff --git a/buildscripts/idl/idl/cpp_types.py b/buildscripts/idl/idl/cpp_types.py index f1ef9ec2f9e..0673ef5e683 100644 --- a/buildscripts/idl/idl/cpp_types.py +++ b/buildscripts/idl/idl/cpp_types.py @@ -497,11 +497,14 @@ class _ObjectBsonCppTypeBase(BsonCppTypeBase): def has_serializer(self): # type: () -> bool - return False + return self._field.serializer is not None def gen_serializer_expression(self, indented_writer, expression): # type: (writer.IndentedTextWriter, unicode) -> unicode - raise NotImplementedError() + indented_writer.write_line( + common.template_args( + 'const BSONObj localObject = ${expression}.serialize();', expression=expression)) + return "localObject" # For some fields, we want to support custom serialization but defer most of the serialization to diff --git a/buildscripts/idl/idl/generator.py b/buildscripts/idl/idl/generator.py index 19f3b5f783b..bd4a7d30594 100644 --- a/buildscripts/idl/idl/generator.py +++ b/buildscripts/idl/idl/generator.py @@ -576,6 +576,23 @@ class _CppSourceFileWriter(_CppFileWriterBase): template_params['expression'] = expression self._writer.write_template('builder->append("${field_name}", ${expression});') + elif field.bson_serialization_type[0] == 'any': + # Any types are special + # Array variants - we pass an array builder + # Non-array variants - we pass the field name they should use, and a BSONObjBuilder. + method_name = writer.get_method_name(field.serializer) + template_params['method_name'] = method_name + + if field.array: + self._writer.write_template( + 'BSONArrayBuilder arrayBuilder(builder->subarrayStart("${field_name}"));') + with self._block('for (const auto& item : ${access_member}) {', '}'): + # Call a method like class::method(BSONArrayBuilder*) + self._writer.write_template('item.${method_name}(&arrayBuilder);') + else: + # Call a method like class::method(StringData, BSONObjBuilder*) + self._writer.write_template( + '${access_member}.${method_name}("${field_name}", builder);') else: method_name = writer.get_method_name(field.serializer) template_params['method_name'] = method_name @@ -643,12 +660,6 @@ class _CppSourceFileWriter(_CppFileWriterBase): with self._block(optional_block_start, '}'): if not field.struct_type: - # Is this a scalar bson C++ type? - bson_cpp_type = cpp_types.get_bson_cpp_type(field) - - needs_custom_serializer = field.serializer or ( - bson_cpp_type and bson_cpp_type.has_serializer()) - if needs_custom_serializer: self._gen_serializer_method_custom(field) else: |