From 6ce954a791a73abc8d32765e2695ed153e120c47 Mon Sep 17 00:00:00 2001 From: rsgowman Date: Thu, 22 Feb 2018 09:42:40 -0500 Subject: Serialize (and deserialize) int64 values (#818) (#829) --- .../src/firebase/firestore/model/field_value.cc | 12 +++++------ .../src/firebase/firestore/model/field_value.h | 8 +++++++- .../src/firebase/firestore/remote/serializer.cc | 24 ++++++++++++++++++++++ 3 files changed, 37 insertions(+), 7 deletions(-) (limited to 'Firestore/core/src') diff --git a/Firestore/core/src/firebase/firestore/model/field_value.cc b/Firestore/core/src/firebase/firestore/model/field_value.cc index 012a90d..03cf1d4 100644 --- a/Firestore/core/src/firebase/firestore/model/field_value.cc +++ b/Firestore/core/src/firebase/firestore/model/field_value.cc @@ -45,9 +45,9 @@ namespace { */ bool Comparable(Type lhs, Type rhs) { switch (lhs) { - case Type::Long: + case Type::Integer: case Type::Double: - return rhs == Type::Long || rhs == Type::Double; + return rhs == Type::Integer || rhs == Type::Double; case Type::Timestamp: case Type::ServerTimestamp: return rhs == Type::Timestamp || rhs == Type::ServerTimestamp; @@ -78,7 +78,7 @@ FieldValue& FieldValue::operator=(const FieldValue& value) { case Type::Boolean: boolean_value_ = value.boolean_value_; break; - case Type::Long: + case Type::Integer: integer_value_ = value.integer_value_; break; case Type::Double: @@ -179,7 +179,7 @@ const FieldValue& FieldValue::NanValue() { FieldValue FieldValue::IntegerValue(int64_t value) { FieldValue result; - result.SwitchTo(Type::Long); + result.SwitchTo(Type::Integer); result.integer_value_ = value; return result; } @@ -304,8 +304,8 @@ bool operator<(const FieldValue& lhs, const FieldValue& rhs) { return false; case Type::Boolean: return Comparator()(lhs.boolean_value_, rhs.boolean_value_); - case Type::Long: - if (rhs.type() == Type::Long) { + case Type::Integer: + if (rhs.type() == Type::Integer) { return Comparator()(lhs.integer_value_, rhs.integer_value_); } else { return util::CompareMixedNumber(rhs.double_value_, diff --git a/Firestore/core/src/firebase/firestore/model/field_value.h b/Firestore/core/src/firebase/firestore/model/field_value.h index e547be3..15945b9 100644 --- a/Firestore/core/src/firebase/firestore/model/field_value.h +++ b/Firestore/core/src/firebase/firestore/model/field_value.h @@ -28,6 +28,7 @@ #include "Firestore/core/src/firebase/firestore/model/database_id.h" #include "Firestore/core/src/firebase/firestore/model/document_key.h" #include "Firestore/core/src/firebase/firestore/model/timestamp.h" +#include "Firestore/core/src/firebase/firestore/util/firebase_assert.h" namespace firebase { namespace firestore { @@ -63,7 +64,7 @@ class FieldValue { enum class Type { Null, // Null Boolean, // Boolean - Long, // Number type starts here + Integer, // Number type starts here Double, Timestamp, // Timestamp type starts here ServerTimestamp, @@ -95,6 +96,11 @@ class FieldValue { return tag_; } + int64_t integer_value() const { + FIREBASE_ASSERT(tag_ == Type::Integer); + return integer_value_; + } + /** factory methods. */ static const FieldValue& NullValue(); static const FieldValue& TrueValue(); diff --git a/Firestore/core/src/firebase/firestore/remote/serializer.cc b/Firestore/core/src/firebase/firestore/remote/serializer.cc index fda257b..396608b 100644 --- a/Firestore/core/src/firebase/firestore/remote/serializer.cc +++ b/Firestore/core/src/firebase/firestore/remote/serializer.cc @@ -98,6 +98,15 @@ bool DecodeBool(pb_istream_t* stream) { } } +void EncodeInteger(pb_ostream_t* stream, int64_t integer_value) { + return EncodeVarint(stream, google_firestore_v1beta1_Value_integer_value_tag, + integer_value); +} + +int64_t DecodeInteger(pb_istream_t* stream) { + return DecodeVarint(stream); +} + } // namespace using firebase::firestore::model::FieldValue; @@ -118,6 +127,9 @@ Serializer::TypedValue Serializer::EncodeFieldValue( proto_value.value.boolean_value = false; } break; + case FieldValue::Type::Integer: + proto_value.value.integer_value = field_value.integer_value(); + break; default: // TODO(rsgowman): implement the other types abort(); @@ -141,6 +153,10 @@ void Serializer::EncodeTypedValue(const TypedValue& value, EncodeBool(&stream, value.value.boolean_value); break; + case FieldValue::Type::Integer: + EncodeInteger(&stream, value.value.integer_value); + break; + default: // TODO(rsgowman): implement the other types abort(); @@ -156,6 +172,8 @@ FieldValue Serializer::DecodeFieldValue( return FieldValue::NullValue(); case FieldValue::Type::Boolean: return FieldValue::BooleanValue(value_proto.value.boolean_value); + case FieldValue::Type::Integer: + return FieldValue::IntegerValue(value_proto.value.integer_value); default: // TODO(rsgowman): implement the other types abort(); @@ -185,6 +203,10 @@ Serializer::TypedValue Serializer::DecodeTypedValue(const uint8_t* bytes, result.type = FieldValue::Type::Boolean; result.value.boolean_value = DecodeBool(&stream); break; + case google_firestore_v1beta1_Value_integer_value_tag: + result.type = FieldValue::Type::Integer; + result.value.integer_value = DecodeInteger(&stream); + break; default: // TODO(rsgowman): figure out error handling @@ -209,6 +231,8 @@ bool operator==(const Serializer::TypedValue& lhs, return true; case FieldValue::Type::Boolean: return lhs.value.boolean_value == rhs.value.boolean_value; + case FieldValue::Type::Integer: + return lhs.value.integer_value == rhs.value.integer_value; default: // TODO(rsgowman): implement the other types abort(); -- cgit v1.2.3