@@ -73,86 +73,106 @@ std::string encodeMaybeDotted(std::string fieldname) {
7373 return path;
7474}
7575
76- void insertElementRecursive (std::string fn, bson::BSONObj const & obj, Reference<IReadWriteContext> cx) {
76+ int insertElementRecursive (std::string fn, bson::BSONObj const & obj, Reference<IReadWriteContext> cx) {
7777 if (fn[0 ] == ' $' )
7878 throw fieldname_with_dollar ();
7979 std::string kp = encodeMaybeDotted (fn);
80+
81+ int nrFDBKeys = 1 ;
8082 cx->set (kp, DataValue::subObject ().encode_value ());
83+
8184 auto scx = cx->getSubContext (kp);
8285 for (auto i = obj.begin (); i.more ();) {
8386 auto e = i.next ();
84- insertElementRecursive (e, scx);
87+ nrFDBKeys += insertElementRecursive (e, scx);
8588 }
89+
90+ return nrFDBKeys;
8691}
8792
88- void insertElementRecursive (std::string fn, bson::BSONArray const & arr, Reference<IReadWriteContext> cx) {
93+ int insertElementRecursive (std::string fn, bson::BSONArray const & arr, Reference<IReadWriteContext> cx) {
8994 if (fn[0 ] == ' $' )
9095 throw fieldname_with_dollar ();
96+
9197 std::string kp = encodeMaybeDotted (fn);
98+ int nrFDBKeys = 1 ;
99+
92100 cx->set (kp, DataValue::arrayOfLength (arr.nFields ()).encode_value ());
101+
93102 auto scx = cx->getSubContext (kp);
94103 for (auto i = arr.begin (); i.more ();) {
95104 bson::BSONElement e = i.next ();
96- insertElementRecursive (e, scx);
105+ nrFDBKeys += insertElementRecursive (e, scx);
97106 }
107+
108+ return nrFDBKeys;
98109}
99110
100- void insertElementRecursive (std::string fn, bson::BSONElement const & elem, Reference<IReadWriteContext> cx) {
111+ int insertElementRecursive (std::string fn, bson::BSONElement const & elem, Reference<IReadWriteContext> cx) {
101112 if (fn[0 ] == ' $' )
102113 throw fieldname_with_dollar ();
114+
103115 std::string kp = encodeMaybeDotted (fn);
104116 if (!elem.isABSONObj ()) {
105117 cx->set (kp, DataValue (elem).encode_value ());
106- } else {
107- if (elem.type () == bson::BSONType::Array) {
108- insertElementRecursive (fn, bson::BSONArray (elem.Obj ()), cx);
109- } else {
110- insertElementRecursive (fn, elem.Obj (), cx);
111- }
118+ return 1 ;
112119 }
120+
121+ if (elem.type () == bson::BSONType::Array)
122+ return insertElementRecursive (fn, bson::BSONArray (elem.Obj ()), cx);
123+
124+ return insertElementRecursive (fn, elem.Obj (), cx);
113125}
114126
115- void insertElementRecursive (bson::BSONElement const & elem, Reference<IReadWriteContext> cx) {
127+ int insertElementRecursive (bson::BSONElement const & elem, Reference<IReadWriteContext> cx) {
116128 std::string fn = elem.fieldName ();
117129 if (std::all_of (fn.begin (), fn.end (), ::isdigit)) {
118130 const char * c_fn = fn.c_str ();
119- insertElementRecursive (atoi (c_fn), elem, cx);
120- } else {
121- insertElementRecursive (fn, elem, cx);
131+ return insertElementRecursive (atoi (c_fn), elem, cx);
122132 }
133+
134+ return insertElementRecursive (fn, elem, cx);
123135}
124136
125- void insertElementRecursive (int fn, bson::BSONElement const & elem, Reference<IReadWriteContext> cx) {
137+ int insertElementRecursive (int fn, bson::BSONElement const & elem, Reference<IReadWriteContext> cx) {
126138 std::string kp = DataValue (fn).encode_key_part ();
127139 if (!elem.isABSONObj ()) {
128140 cx->set (kp, DataValue (elem).encode_value ());
129- } else {
130- if (elem.type () == bson::BSONType::Array) {
131- insertElementRecursive (fn, bson::BSONArray (elem.Obj ()), cx);
132- } else {
133- insertElementRecursive (fn, elem.Obj (), cx);
134- }
141+ return 1 ;
135142 }
143+
144+ if (elem.type () == bson::BSONType::Array)
145+ return insertElementRecursive (fn, bson::BSONArray (elem.Obj ()), cx);
146+
147+ return insertElementRecursive (fn, elem.Obj (), cx);
136148}
137149
138- void insertElementRecursive (int fn, bson::BSONObj const & obj, Reference<IReadWriteContext> cx) {
150+ int insertElementRecursive (int fn, bson::BSONObj const & obj, Reference<IReadWriteContext> cx) {
139151 std::string kp = DataValue (fn).encode_key_part ();
152+ int nrFDBKeys = 1 ;
153+
140154 cx->set (kp, DataValue::subObject ().encode_value ());
155+
141156 auto scx = cx->getSubContext (kp);
142157 for (auto i = obj.begin (); i.more ();) {
143158 auto e = i.next ();
144- insertElementRecursive (e, scx);
159+ nrFDBKeys += insertElementRecursive (e, scx);
145160 }
161+ return nrFDBKeys;
146162}
147163
148- void insertElementRecursive (int fn, bson::BSONArray const & arr, Reference<IReadWriteContext> cx) {
164+ int insertElementRecursive (int fn, bson::BSONArray const & arr, Reference<IReadWriteContext> cx) {
149165 std::string kp = DataValue (fn).encode_key_part ();
166+ int nrFDBKeys = 1 ;
167+
150168 cx->set (kp, DataValue::arrayOfLength (arr.nFields ()).encode_value ());
169+
151170 auto scx = cx->getSubContext (kp);
152171 for (auto i = arr.begin (); i.more ();) {
153172 bson::BSONElement e = i.next ();
154- insertElementRecursive (e, scx);
173+ nrFDBKeys += insertElementRecursive (e, scx);
155174 }
175+ return nrFDBKeys;
156176}
157177
158178ACTOR Future<Void> ensureValidObject (Reference<IReadWriteContext> cx,
0 commit comments