51
51
#include " Firestore/core/src/nanopb/writer.h"
52
52
#include " Firestore/core/src/timestamp_internal.h"
53
53
#include " Firestore/core/src/util/hard_assert.h"
54
+ #include " Firestore/core/src/util/status.h"
55
+ #include " Firestore/core/src/util/statusor.h"
54
56
#include " Firestore/core/src/util/string_format.h"
55
57
#include " absl/algorithm/container.h"
56
58
@@ -106,6 +108,7 @@ using nanopb::SafeReadBoolean;
106
108
using nanopb::Writer;
107
109
using remote::WatchChange;
108
110
using util::Status;
111
+ using util::StatusOr;
109
112
using util::StringFormat;
110
113
111
114
pb_bytes_array_t * Serializer::EncodeString (const std::string& str) {
@@ -158,6 +161,10 @@ Filter InvalidFilter() {
158
161
return FieldFilter::Create ({}, {}, {});
159
162
}
160
163
164
+ FieldPath InvalidFieldPath () {
165
+ return FieldPath::EmptyPath ();
166
+ }
167
+
161
168
} // namespace
162
169
163
170
Serializer::Serializer (DatabaseId database_id)
@@ -659,7 +666,7 @@ Mutation Serializer::DecodeMutation(
659
666
ObjectValue value = DecodeFields (reader, mutation.update .fields_count ,
660
667
mutation.update .fields );
661
668
if (mutation.has_update_mask ) {
662
- FieldMask mask = DecodeFieldMask (mutation.update_mask );
669
+ FieldMask mask = DecodeFieldMask (reader, mutation.update_mask );
663
670
return PatchMutation (std::move (key), std::move (value), std::move (mask),
664
671
std::move (precondition));
665
672
} else {
@@ -775,10 +782,10 @@ google_firestore_v1_DocumentMask Serializer::EncodeFieldMask(
775
782
776
783
/* static */
777
784
FieldMask Serializer::DecodeFieldMask (
778
- const google_firestore_v1_DocumentMask& mask) {
785
+ nanopb::Reader* reader, const google_firestore_v1_DocumentMask& mask) {
779
786
std::set<FieldPath> fields;
780
787
for (size_t i = 0 ; i < mask.field_paths_count ; i++) {
781
- fields.insert (DecodeFieldPath (mask.field_paths [i]));
788
+ fields.insert (DecodeFieldPath (reader, mask.field_paths [i]));
782
789
}
783
790
return FieldMask (std::move (fields));
784
791
}
@@ -828,21 +835,22 @@ Serializer::EncodeFieldTransform(const FieldTransform& field_transform) const {
828
835
FieldTransform Serializer::DecodeFieldTransform (
829
836
nanopb::Reader* reader,
830
837
const google_firestore_v1_DocumentTransform_FieldTransform& proto) const {
838
+ FieldPath field = DecodeFieldPath (reader, proto.field_path );
839
+
831
840
switch (proto.which_transform_type ) {
832
841
case google_firestore_v1_DocumentTransform_FieldTransform_set_to_server_value_tag: { // NOLINT
833
842
HARD_ASSERT (
834
843
proto.set_to_server_value ==
835
844
google_firestore_v1_DocumentTransform_FieldTransform_ServerValue_REQUEST_TIME, // NOLINT
836
845
" Unknown transform setToServerValue: %s" , proto.set_to_server_value );
837
846
838
- return FieldTransform (DecodeFieldPath (proto.field_path ),
839
- ServerTimestampTransform ());
847
+ return FieldTransform (std::move (field), ServerTimestampTransform ());
840
848
}
841
849
842
850
case google_firestore_v1_DocumentTransform_FieldTransform_append_missing_elements_tag: { // NOLINT
843
851
std::vector<FieldValue> elements =
844
852
DecodeArray (reader, proto.append_missing_elements );
845
- return FieldTransform (DecodeFieldPath (proto. field_path ),
853
+ return FieldTransform (std::move (field ),
846
854
ArrayTransform (TransformOperation::Type::ArrayUnion,
847
855
std::move (elements)));
848
856
}
@@ -851,14 +859,14 @@ FieldTransform Serializer::DecodeFieldTransform(
851
859
std::vector<FieldValue> elements =
852
860
DecodeArray (reader, proto.remove_all_from_array );
853
861
return FieldTransform (
854
- DecodeFieldPath (proto. field_path ),
862
+ std::move (field ),
855
863
ArrayTransform (TransformOperation::Type::ArrayRemove,
856
864
std::move (elements)));
857
865
}
858
866
859
867
case google_firestore_v1_DocumentTransform_FieldTransform_increment_tag: {
860
868
FieldValue operand = DecodeFieldValue (reader, proto.increment );
861
- return FieldTransform (DecodeFieldPath (proto. field_path ),
869
+ return FieldTransform (std::move (field ),
862
870
NumericIncrementTransform (std::move (operand)));
863
871
}
864
872
}
@@ -1145,8 +1153,7 @@ google_firestore_v1_StructuredQuery_Filter Serializer::EncodeSingularFilter(
1145
1153
Filter Serializer::DecodeFieldFilter (
1146
1154
nanopb::Reader* reader,
1147
1155
const google_firestore_v1_StructuredQuery_FieldFilter& field_filter) const {
1148
- FieldPath field_path =
1149
- FieldPath::FromServerFormat (DecodeString (field_filter.field .field_path ));
1156
+ FieldPath field_path = DecodeFieldPath (reader, field_filter.field .field_path );
1150
1157
Filter::Operator op = DecodeFieldFilterOperator (reader, field_filter.op );
1151
1158
FieldValue value = DecodeFieldValue (reader, field_filter.value );
1152
1159
@@ -1161,8 +1168,7 @@ Filter Serializer::DecodeUnaryFilter(
1161
1168
" Unexpected UnaryFilter.which_operand_type: %s" ,
1162
1169
unary.which_operand_type );
1163
1170
1164
- auto field =
1165
- FieldPath::FromServerFormat (DecodeString (unary.field .field_path ));
1171
+ FieldPath field = DecodeFieldPath (reader, unary.field .field_path );
1166
1172
1167
1173
switch (unary.op ) {
1168
1174
case google_firestore_v1_StructuredQuery_UnaryFilter_Operator_IS_NULL:
@@ -1344,8 +1350,7 @@ OrderByList Serializer::DecodeOrderBys(
1344
1350
OrderBy Serializer::DecodeOrderBy (
1345
1351
nanopb::Reader* reader,
1346
1352
const google_firestore_v1_StructuredQuery_Order& order_by) const {
1347
- auto field_path =
1348
- FieldPath::FromServerFormat (DecodeString (order_by.field .field_path ));
1353
+ auto field_path = DecodeFieldPath (reader, order_by.field .field_path );
1349
1354
1350
1355
Direction direction;
1351
1356
switch (order_by.direction ) {
@@ -1403,9 +1408,15 @@ pb_bytes_array_t* Serializer::EncodeFieldPath(const FieldPath& field_path) {
1403
1408
}
1404
1409
1405
1410
/* static */
1406
- FieldPath Serializer::DecodeFieldPath (const pb_bytes_array_t * field_path) {
1411
+ FieldPath Serializer::DecodeFieldPath (nanopb::Reader* reader,
1412
+ const pb_bytes_array_t * field_path) {
1407
1413
absl::string_view str = MakeStringView (field_path);
1408
- return FieldPath::FromServerFormatView (str);
1414
+ StatusOr<FieldPath> decoded_path = FieldPath::FromServerFormatView (str);
1415
+ if (!decoded_path.ok ()) {
1416
+ reader->set_status (decoded_path.status ());
1417
+ return InvalidFieldPath ();
1418
+ }
1419
+ return decoded_path.ConsumeValueOrDie ();
1409
1420
}
1410
1421
1411
1422
google_protobuf_Timestamp Serializer::EncodeVersion (
0 commit comments