summaryrefslogtreecommitdiff
path: root/buildscripts/idl
diff options
context:
space:
mode:
authorMark Benvenuto <mark.benvenuto@mongodb.com>2017-05-01 13:10:07 -0400
committerMark Benvenuto <mark.benvenuto@mongodb.com>2017-05-01 13:10:07 -0400
commitdb53b03f5c1420b9bcade637873522f1847f9e3f (patch)
tree8872e0b06d93315344cfa86c3ae14c9688c05d6e /buildscripts/idl
parent3aa8750877642f7985c1bd0da4bbb753a5161100 (diff)
downloadmongo-db53b03f5c1420b9bcade637873522f1847f9e3f.tar.gz
SERVER-28985 Change IDL serialization contract for objects
Diffstat (limited to 'buildscripts/idl')
-rw-r--r--buildscripts/idl/idl/cpp_types.py7
-rw-r--r--buildscripts/idl/idl/generator.py23
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: