Compare commits

..

2 Commits

Author SHA1 Message Date
Pavel Merzlyakov 219428c7f6 reading float32 from float64 without error 2024-03-15 16:36:12 +03:00
Sergey Polygalin 9324aeae5f Add string key for changed fields 2023-12-17 11:42:39 +03:00
3 changed files with 63 additions and 0 deletions

View File

@ -1,12 +1,18 @@
package meta package meta
import "bytes"
type ChangedFields struct { type ChangedFields struct {
fieldNames map[string]struct{} fieldNames map[string]struct{}
fieldsKey *bytes.Buffer
} }
func NewChangedFields(fieldCount int) ChangedFields { func NewChangedFields(fieldCount int) ChangedFields {
keyBuffer := bytes.NewBuffer(make([]byte, 0, fieldCount*2))
cf := ChangedFields{ cf := ChangedFields{
fieldNames: make(map[string]struct{}, fieldCount), fieldNames: make(map[string]struct{}, fieldCount),
fieldsKey: keyBuffer,
} }
return cf return cf
} }
@ -32,7 +38,12 @@ func (cf *ChangedFields) SetChanged(fields ...string) {
} }
for _, field := range fields { for _, field := range fields {
if _, exists := cf.fieldNames[field]; exists {
continue
}
cf.fieldNames[field] = struct{}{} cf.fieldNames[field] = struct{}{}
cf.fieldsKey.WriteString(field)
} }
} }
@ -43,3 +54,7 @@ func (cf ChangedFields) Empty() bool {
func (cf ChangedFields) IsNil() bool { func (cf ChangedFields) IsNil() bool {
return cf.fieldNames == nil return cf.fieldNames == nil
} }
func (cf ChangedFields) GetFieldsKey() string {
return cf.fieldsKey.String()
}

33
changed_fields_test.go Normal file
View File

@ -0,0 +1,33 @@
package meta
import (
"testing"
"github.com/stretchr/testify/assert"
)
func TestChangedFields(t *testing.T) {
t.Run("#SetChanged", func(t *testing.T) {
changedFields := NewChangedFields(3)
expectedFieldsMap := map[string]struct{}{
"a": {},
"b": {},
"c": {},
}
changedFields.SetChanged("a", "b", "c", "a")
assert.Equal(t, expectedFieldsMap, changedFields.fieldNames)
})
t.Run("#GetFieldsKey", func(t *testing.T) {
changedFields := NewChangedFields(3)
changedFields.SetChanged("b", "c", "a")
expectedKey := "bca"
actualKey := changedFields.GetFieldsKey()
assert.Equal(t, expectedKey, actualKey)
})
}

View File

@ -255,6 +255,21 @@ func decodeBool(dec *msgpack.Decoder, v *bool) error {
} }
func decodeFloat32(dec *msgpack.Decoder, v *float32) error { func decodeFloat32(dec *msgpack.Decoder, v *float32) error {
code, err := dec.PeekCode()
if err != nil {
return errors.WithStack(err)
}
if code == msgpcode.Double {
var tmp float64
if err := decodeFloat64(dec, &tmp); err != nil {
return err
}
*v = float32(tmp)
return nil
}
tmp, err := dec.DecodeFloat32() tmp, err := dec.DecodeFloat32()
if err != nil { if err != nil {
return errors.WithStack(err) return errors.WithStack(err)