bugs fixed
This commit is contained in:
parent
675f6f5f83
commit
b742ca6f3b
19
base_test.go
19
base_test.go
|
@ -152,7 +152,7 @@ func insertTwoTable(engine *Engine, t *testing.T) {
|
|||
|
||||
func update(engine *Engine, t *testing.T) {
|
||||
// update by id
|
||||
user := Userinfo{Username: "xxx"}
|
||||
user := Userinfo{Username: "xxx", Height: 1.2}
|
||||
_, err := engine.Id(1).Update(&user)
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
|
@ -640,13 +640,28 @@ type MyUInt uint
|
|||
type MyFloat float64
|
||||
type MyString string
|
||||
|
||||
func (s MyString) FromDB(data []byte) error {
|
||||
s = MyString(string(data))
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s MyString) ToDB() ([]byte, error) {
|
||||
return []byte(string(s)), nil
|
||||
}
|
||||
|
||||
type MyStruct struct {
|
||||
Type MyInt
|
||||
U MyUInt
|
||||
F MyFloat
|
||||
//S MyString
|
||||
//IA []MyInt
|
||||
//UA []MyUInt
|
||||
//FA []MyFloat
|
||||
//SA []MyString
|
||||
//NameArray []string
|
||||
Name string
|
||||
UI uint
|
||||
//UIA []uint
|
||||
UI uint
|
||||
}
|
||||
|
||||
func testCustomType(engine *Engine, t *testing.T) {
|
||||
|
|
41
session.go
41
session.go
|
@ -206,7 +206,19 @@ func (session *Session) scanMapIntoStruct(obj interface{}, objMap map[string][]b
|
|||
switch structField.Type().Kind() {
|
||||
case reflect.Slice:
|
||||
v = data
|
||||
structField.Set(reflect.ValueOf(v))
|
||||
vv := reflect.ValueOf(v)
|
||||
if structField.Type().String() == "[]byte" {
|
||||
fmt.Println("...[]byte...")
|
||||
}
|
||||
if vv.Type().Kind() == reflect.Slice {
|
||||
for i := 0; i < vv.Len(); i++ {
|
||||
//vv.Index(i)
|
||||
structField = reflect.AppendSlice(structField, vv)
|
||||
//reflect.Append(structField, vv.Index(i))
|
||||
}
|
||||
} else {
|
||||
return errors.New(fmt.Sprintf("unsupported from other %v to %v", vv.Type().Kind(), structField.Type().Kind()))
|
||||
}
|
||||
case reflect.Array:
|
||||
if structField.Type().Elem() == reflect.TypeOf(b) {
|
||||
v = data
|
||||
|
@ -825,6 +837,17 @@ func (session *Session) InsertMulti(rowsSlicePtr interface{}) (int64, error) {
|
|||
}
|
||||
|
||||
func (session *Session) value2Interface(fieldValue reflect.Value) (interface{}, error) {
|
||||
if fieldValue.CanAddr() {
|
||||
if fieldConvert, ok := fieldValue.Addr().Interface().(Conversion); ok {
|
||||
data, err := fieldConvert.ToDB()
|
||||
if err != nil {
|
||||
return 0, err
|
||||
} else {
|
||||
return string(data), nil
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if fieldValue.Type().Kind() == reflect.Bool {
|
||||
if fieldValue.Bool() {
|
||||
return 1, nil
|
||||
|
@ -834,17 +857,6 @@ func (session *Session) value2Interface(fieldValue reflect.Value) (interface{},
|
|||
} else if fieldValue.Type().String() == "time.Time" {
|
||||
return fieldValue.Interface(), nil
|
||||
} else if fieldValue.Type().Kind() == reflect.Struct {
|
||||
if fieldValue.CanAddr() {
|
||||
if fieldConvert, ok := fieldValue.Addr().Interface().(Conversion); ok {
|
||||
data, err := fieldConvert.ToDB()
|
||||
if err != nil {
|
||||
return 0, err
|
||||
} else {
|
||||
return string(data), nil
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if fieldTable, ok := session.Engine.Tables[fieldValue.Type()]; ok {
|
||||
if fieldTable.PrimaryKey != "" {
|
||||
pkField := reflect.Indirect(fieldValue).FieldByName(fieldTable.PKColumn().FieldName)
|
||||
|
@ -855,6 +867,11 @@ func (session *Session) value2Interface(fieldValue reflect.Value) (interface{},
|
|||
} else {
|
||||
return 0, errors.New(fmt.Sprintf("Unsupported type %v", fieldValue.Type()))
|
||||
}
|
||||
} else if fieldValue.Type().Kind() == reflect.Array ||
|
||||
fieldValue.Type().Kind() == reflect.Slice {
|
||||
data := fmt.Sprintf("%v", fieldValue.Interface())
|
||||
fmt.Println(data, "--------")
|
||||
return data, nil
|
||||
} else {
|
||||
return fieldValue.Interface(), nil
|
||||
}
|
||||
|
|
10
statement.go
10
statement.go
|
@ -93,10 +93,18 @@ func BuildConditions(engine *Engine, table *Table, bean interface{}) ([]string,
|
|||
if fieldValue.String() == "" {
|
||||
continue
|
||||
}
|
||||
case reflect.Int, reflect.Int32, reflect.Int64:
|
||||
case reflect.Int8, reflect.Int16, reflect.Int, reflect.Int32, reflect.Int64:
|
||||
if fieldValue.Int() == 0 {
|
||||
continue
|
||||
}
|
||||
case reflect.Float32, reflect.Float64:
|
||||
if fieldValue.Float() == 0.0 {
|
||||
continue
|
||||
}
|
||||
case reflect.Uint8, reflect.Uint16, reflect.Uint, reflect.Uint32, reflect.Uint64:
|
||||
if fieldValue.Uint() == 0 {
|
||||
continue
|
||||
}
|
||||
case reflect.Struct:
|
||||
if fieldType == reflect.TypeOf(time.Now()) {
|
||||
t := fieldValue.Interface().(time.Time)
|
||||
|
|
Loading…
Reference in New Issue