From d9eb2f5f36409ce2c014fd7f44cd123d1d8e32c8 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Sat, 9 Sep 2017 18:56:59 +0800 Subject: [PATCH] Fix find bit (#712) * fix find bit * fix error on mysql --- convert.go | 12 ++++++++++++ session.go | 2 +- session_convert.go | 3 +-- session_find_test.go | 30 +++++++++++++++++++++++++++--- 4 files changed, 41 insertions(+), 6 deletions(-) diff --git a/convert.go b/convert.go index fbd24b5b..0504bef1 100644 --- a/convert.go +++ b/convert.go @@ -334,3 +334,15 @@ func convertInt(v interface{}) (int64, error) { } return 0, fmt.Errorf("unsupported type: %v", v) } + +func asBool(bs []byte) (bool, error) { + if len(bs) == 0 { + return false, nil + } + if bs[0] == 0x00 { + return false, nil + } else if bs[0] == 0x01 { + return true, nil + } + return strconv.ParseBool(string(bs)) +} diff --git a/session.go b/session.go index 8a8d5af6..c69ac9e5 100644 --- a/session.go +++ b/session.go @@ -303,6 +303,7 @@ func (session *Session) rows2Beans(rows *core.Rows, fields []string, fieldsCount var newValue = newElemFunc(fields) bean := newValue.Interface() dataStruct := rValue(bean) + // handle beforeClosures scanResults, err := session.row2Slice(rows, fields, fieldsCount, bean) if err != nil { @@ -312,7 +313,6 @@ func (session *Session) rows2Beans(rows *core.Rows, fields []string, fieldsCount if err != nil { return err } - err = sliceValueSetFunc(&newValue, pk) if err != nil { return err diff --git a/session_convert.go b/session_convert.go index fc244e60..f2c949ba 100644 --- a/session_convert.go +++ b/session_convert.go @@ -144,8 +144,7 @@ func (session *Session) bytes2Value(col *core.Column, fieldValue *reflect.Value, case reflect.String: fieldValue.SetString(string(data)) case reflect.Bool: - d := string(data) - v, err := strconv.ParseBool(d) + v, err := asBool(data) if err != nil { return fmt.Errorf("arg %v as bool: %s", key, err.Error()) } diff --git a/session_find_test.go b/session_find_test.go index 25928da9..9739bc44 100644 --- a/session_find_test.go +++ b/session_find_test.go @@ -457,10 +457,34 @@ func TestFindMapPtrString(t *testing.T) { userinfo := testEngine.TableMapper.Obj2Table("Userinfo") var ids []map[string]*string err := testEngine.Table(userinfo).Desc("id").Find(&ids) - if err != nil { - t.Fatal(err) - } + assert.NoError(t, err) for _, record := range ids { fmt.Println(record) } } + +func TestFindBit(t *testing.T) { + type FindBitStruct struct { + Id int64 + Msg bool `xorm:"bit"` + } + + assert.NoError(t, prepareEngine()) + assertSync(t, new(FindBitStruct)) + + cnt, err := testEngine.Insert([]FindBitStruct{ + { + Msg: false, + }, + { + Msg: true, + }, + }) + assert.NoError(t, err) + assert.EqualValues(t, 2, cnt) + + var results = make([]FindBitStruct, 0, 2) + err = testEngine.Find(&results) + assert.NoError(t, err) + assert.EqualValues(t, 2, len(results)) +}