diff --git a/helpers.go b/helpers.go index fcf3c21e..71b29074 100644 --- a/helpers.go +++ b/helpers.go @@ -3,6 +3,7 @@ package xorm import ( "fmt" "reflect" + "sort" "strconv" "strings" "time" @@ -56,24 +57,20 @@ func structName(v reflect.Type) string { } func sliceEq(left, right []string) bool { - for _, l := range left { - var find bool - for _, r := range right { - if l == r { - find = true - break - } - } - if !find { + if len(left) != len(right) { + return false + } + sort.Sort(sort.StringSlice(left)) + sort.Sort(sort.StringSlice(right)) + for i := 0; i < len(left); i++ { + if left[i] != right[i] { return false } } - return true } func value2Bytes(rawValue *reflect.Value) (data []byte, err error) { - aa := reflect.TypeOf((*rawValue).Interface()) vv := reflect.ValueOf((*rawValue).Interface()) diff --git a/session.go b/session.go index ccebc79d..68cd8d22 100644 --- a/session.go +++ b/session.go @@ -1442,13 +1442,13 @@ func (session *Session) row2Bean(rows *core.Rows, fields []string, fieldsCount i return err } - b, hasBeforeSet := bean.(BeforeSetProcessor) + if b, hasBeforeSet := bean.(BeforeSetProcessor); hasBeforeSet { + for ii, key := range fields { + b.BeforeSet(key, Cell(scanResults[ii].(*interface{}))) + } + } for ii, key := range fields { - if hasBeforeSet { - b.BeforeSet(fields[ii], Cell(scanResults[ii].(*interface{}))) - } - if fieldValue := session.getField(&dataStruct, key, table); fieldValue != nil { rawValue := reflect.Indirect(reflect.ValueOf(scanResults[ii])) @@ -2061,6 +2061,10 @@ func (session *Session) bytes2Value(col *core.Column, fieldValue *reflect.Value, return structConvert.FromDB(data) } + if structConvert, ok := fieldValue.Interface().(core.Conversion); ok { + return structConvert.FromDB(data) + } + var v interface{} key := col.Name fieldType := fieldValue.Type()