From 029f84e5f25cd5de7c2c4590fbc044b1e3043416 Mon Sep 17 00:00:00 2001 From: TeoV Date: Thu, 7 Jan 2021 17:03:38 +0200 Subject: [PATCH] Encode and Decode decimal.Big structure as slice of bytes in mongo --- engine/storage_mongo_datadb.go | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/engine/storage_mongo_datadb.go b/engine/storage_mongo_datadb.go index 2771a8606..dcc59027c 100644 --- a/engine/storage_mongo_datadb.go +++ b/engine/storage_mongo_datadb.go @@ -134,20 +134,24 @@ func DecimalEncoder(ec bsoncodec.EncodeContext, vw bsonrw.ValueWriter, val refle if !ok { return fmt.Errorf("cannot cast <%+v> to ", val.Interface()) } - return vw.WriteString(d.String()) + sls, err := d.MarshalText() + if err != nil { + return err + } + return vw.WriteBinary(sls) } func DecimalDecoder(ec bsoncodec.DecodeContext, vw bsonrw.ValueReader, val reflect.Value) error { if !val.CanSet() || val.Type() != decimalType { return bsoncodec.ValueEncoderError{Name: "DecimalDecoder", Kinds: []reflect.Kind{reflect.Struct}, Received: val} } - str, err := vw.ReadString() + data, _, err := vw.ReadBinary() if err != nil { return err } - dBig, ok := new(decimal.Big).SetString(str) - if !ok { - return fmt.Errorf("cannot set string: <%s> to decimal.Big", str) + dBig := new(decimal.Big) + if err := dBig.UnmarshalText(data); err != nil { + return err } val.Set(reflect.ValueOf(utils.Decimal{dBig})) return nil