Support pointers to type aliases

Example:

type MyInt int

type MyStruct struct {
     i1 MyInt   // already works
     i2 *int    // already works
     i3 *MyInt  // didn't work before this commit
}
This commit is contained in:
Victor Gaydov 2016-04-28 13:30:38 +03:00
parent 5d205cad0e
commit 2f1f32ff17
1 changed files with 46 additions and 43 deletions

View File

@ -2568,107 +2568,99 @@ func (session *Session) bytes2Value(col *core.Column, fieldValue *reflect.Value,
case reflect.Ptr: case reflect.Ptr:
// !nashtsai! TODO merge duplicated codes above // !nashtsai! TODO merge duplicated codes above
//typeStr := fieldType.String() //typeStr := fieldType.String()
switch fieldType { switch fieldType.Elem().Kind() {
// case "*string": // case "*string":
case core.PtrStringType: case core.StringType.Kind():
x := string(data) x := string(data)
fieldValue.Set(reflect.ValueOf(&x)) fieldValue.Set(reflect.ValueOf(&x).Convert(fieldType))
// case "*bool": // case "*bool":
case core.PtrBoolType: case core.BoolType.Kind():
d := string(data) d := string(data)
v, err := strconv.ParseBool(d) v, err := strconv.ParseBool(d)
if err != nil { if err != nil {
return fmt.Errorf("arg %v as bool: %s", key, err.Error()) return fmt.Errorf("arg %v as bool: %s", key, err.Error())
} }
fieldValue.Set(reflect.ValueOf(&v)) fieldValue.Set(reflect.ValueOf(&v).Convert(fieldType))
// case "*complex64": // case "*complex64":
case core.PtrComplex64Type: case core.Complex64Type.Kind():
var x complex64 var x complex64
err := json.Unmarshal(data, &x) err := json.Unmarshal(data, &x)
if err != nil { if err != nil {
session.Engine.logger.Error(err) session.Engine.logger.Error(err)
return err return err
} }
fieldValue.Set(reflect.ValueOf(&x)) fieldValue.Set(reflect.ValueOf(&x).Convert(fieldType))
// case "*complex128": // case "*complex128":
case core.PtrComplex128Type: case core.Complex128Type.Kind():
var x complex128 var x complex128
err := json.Unmarshal(data, &x) err := json.Unmarshal(data, &x)
if err != nil { if err != nil {
session.Engine.logger.Error(err) session.Engine.logger.Error(err)
return err return err
} }
fieldValue.Set(reflect.ValueOf(&x)) fieldValue.Set(reflect.ValueOf(&x).Convert(fieldType))
// case "*float64": // case "*float64":
case core.PtrFloat64Type: case core.Float64Type.Kind():
x, err := strconv.ParseFloat(string(data), 64) x, err := strconv.ParseFloat(string(data), 64)
if err != nil { if err != nil {
return fmt.Errorf("arg %v as float64: %s", key, err.Error()) return fmt.Errorf("arg %v as float64: %s", key, err.Error())
} }
fieldValue.Set(reflect.ValueOf(&x)) fieldValue.Set(reflect.ValueOf(&x).Convert(fieldType))
// case "*float32": // case "*float32":
case core.PtrFloat32Type: case core.Float32Type.Kind():
var x float32 var x float32
x1, err := strconv.ParseFloat(string(data), 32) x1, err := strconv.ParseFloat(string(data), 32)
if err != nil { if err != nil {
return fmt.Errorf("arg %v as float32: %s", key, err.Error()) return fmt.Errorf("arg %v as float32: %s", key, err.Error())
} }
x = float32(x1) x = float32(x1)
fieldValue.Set(reflect.ValueOf(&x)) fieldValue.Set(reflect.ValueOf(&x).Convert(fieldType))
// case "*time.Time":
case core.PtrTimeType:
x, err := session.byte2Time(col, data)
if err != nil {
return err
}
v = x
fieldValue.Set(reflect.ValueOf(&x))
// case "*uint64": // case "*uint64":
case core.PtrUint64Type: case core.Uint64Type.Kind():
var x uint64 var x uint64
x, err := strconv.ParseUint(string(data), 10, 64) x, err := strconv.ParseUint(string(data), 10, 64)
if err != nil { if err != nil {
return fmt.Errorf("arg %v as int: %s", key, err.Error()) return fmt.Errorf("arg %v as int: %s", key, err.Error())
} }
fieldValue.Set(reflect.ValueOf(&x)) fieldValue.Set(reflect.ValueOf(&x).Convert(fieldType))
// case "*uint": // case "*uint":
case core.PtrUintType: case core.UintType.Kind():
var x uint var x uint
x1, err := strconv.ParseUint(string(data), 10, 64) x1, err := strconv.ParseUint(string(data), 10, 64)
if err != nil { if err != nil {
return fmt.Errorf("arg %v as int: %s", key, err.Error()) return fmt.Errorf("arg %v as int: %s", key, err.Error())
} }
x = uint(x1) x = uint(x1)
fieldValue.Set(reflect.ValueOf(&x)) fieldValue.Set(reflect.ValueOf(&x).Convert(fieldType))
// case "*uint32": // case "*uint32":
case core.PtrUint32Type: case core.Uint32Type.Kind():
var x uint32 var x uint32
x1, err := strconv.ParseUint(string(data), 10, 64) x1, err := strconv.ParseUint(string(data), 10, 64)
if err != nil { if err != nil {
return fmt.Errorf("arg %v as int: %s", key, err.Error()) return fmt.Errorf("arg %v as int: %s", key, err.Error())
} }
x = uint32(x1) x = uint32(x1)
fieldValue.Set(reflect.ValueOf(&x)) fieldValue.Set(reflect.ValueOf(&x).Convert(fieldType))
// case "*uint8": // case "*uint8":
case core.PtrUint8Type: case core.Uint8Type.Kind():
var x uint8 var x uint8
x1, err := strconv.ParseUint(string(data), 10, 64) x1, err := strconv.ParseUint(string(data), 10, 64)
if err != nil { if err != nil {
return fmt.Errorf("arg %v as int: %s", key, err.Error()) return fmt.Errorf("arg %v as int: %s", key, err.Error())
} }
x = uint8(x1) x = uint8(x1)
fieldValue.Set(reflect.ValueOf(&x)) fieldValue.Set(reflect.ValueOf(&x).Convert(fieldType))
// case "*uint16": // case "*uint16":
case core.PtrUint16Type: case core.Uint16Type.Kind():
var x uint16 var x uint16
x1, err := strconv.ParseUint(string(data), 10, 64) x1, err := strconv.ParseUint(string(data), 10, 64)
if err != nil { if err != nil {
return fmt.Errorf("arg %v as int: %s", key, err.Error()) return fmt.Errorf("arg %v as int: %s", key, err.Error())
} }
x = uint16(x1) x = uint16(x1)
fieldValue.Set(reflect.ValueOf(&x)) fieldValue.Set(reflect.ValueOf(&x).Convert(fieldType))
// case "*int64": // case "*int64":
case core.PtrInt64Type: case core.Int64Type.Kind():
sdata := string(data) sdata := string(data)
var x int64 var x int64
var err error var err error
@ -2690,9 +2682,9 @@ func (session *Session) bytes2Value(col *core.Column, fieldValue *reflect.Value,
if err != nil { if err != nil {
return fmt.Errorf("arg %v as int: %s", key, err.Error()) return fmt.Errorf("arg %v as int: %s", key, err.Error())
} }
fieldValue.Set(reflect.ValueOf(&x)) fieldValue.Set(reflect.ValueOf(&x).Convert(fieldType))
// case "*int": // case "*int":
case core.PtrIntType: case core.IntType.Kind():
sdata := string(data) sdata := string(data)
var x int var x int
var x1 int64 var x1 int64
@ -2718,9 +2710,9 @@ func (session *Session) bytes2Value(col *core.Column, fieldValue *reflect.Value,
if err != nil { if err != nil {
return fmt.Errorf("arg %v as int: %s", key, err.Error()) return fmt.Errorf("arg %v as int: %s", key, err.Error())
} }
fieldValue.Set(reflect.ValueOf(&x)) fieldValue.Set(reflect.ValueOf(&x).Convert(fieldType))
// case "*int32": // case "*int32":
case core.PtrInt32Type: case core.Int32Type.Kind():
sdata := string(data) sdata := string(data)
var x int32 var x int32
var x1 int64 var x1 int64
@ -2746,9 +2738,9 @@ func (session *Session) bytes2Value(col *core.Column, fieldValue *reflect.Value,
if err != nil { if err != nil {
return fmt.Errorf("arg %v as int: %s", key, err.Error()) return fmt.Errorf("arg %v as int: %s", key, err.Error())
} }
fieldValue.Set(reflect.ValueOf(&x)) fieldValue.Set(reflect.ValueOf(&x).Convert(fieldType))
// case "*int8": // case "*int8":
case core.PtrInt8Type: case core.Int8Type.Kind():
sdata := string(data) sdata := string(data)
var x int8 var x int8
var x1 int64 var x1 int64
@ -2774,9 +2766,9 @@ func (session *Session) bytes2Value(col *core.Column, fieldValue *reflect.Value,
if err != nil { if err != nil {
return fmt.Errorf("arg %v as int: %s", key, err.Error()) return fmt.Errorf("arg %v as int: %s", key, err.Error())
} }
fieldValue.Set(reflect.ValueOf(&x)) fieldValue.Set(reflect.ValueOf(&x).Convert(fieldType))
// case "*int16": // case "*int16":
case core.PtrInt16Type: case core.Int16Type.Kind():
sdata := string(data) sdata := string(data)
var x int16 var x int16
var x1 int64 var x1 int64
@ -2802,9 +2794,19 @@ func (session *Session) bytes2Value(col *core.Column, fieldValue *reflect.Value,
if err != nil { if err != nil {
return fmt.Errorf("arg %v as int: %s", key, err.Error()) return fmt.Errorf("arg %v as int: %s", key, err.Error())
} }
fieldValue.Set(reflect.ValueOf(&x)) fieldValue.Set(reflect.ValueOf(&x).Convert(fieldType))
default: // case "*SomeStruct":
if fieldType.Elem().Kind() == reflect.Struct { case reflect.Struct:
switch fieldType {
// case "*.time.Time":
case core.PtrTimeType:
x, err := session.byte2Time(col, data)
if err != nil {
return err
}
v = x
fieldValue.Set(reflect.ValueOf(&x))
default:
if session.Statement.UseCascade { if session.Statement.UseCascade {
structInter := reflect.New(fieldType.Elem()) structInter := reflect.New(fieldType.Elem())
table := session.Engine.autoMapType(structInter.Elem()) table := session.Engine.autoMapType(structInter.Elem())
@ -2842,6 +2844,7 @@ func (session *Session) bytes2Value(col *core.Column, fieldValue *reflect.Value,
return fmt.Errorf("unsupported struct type in Scan: %s", fieldValue.Type().String()) return fmt.Errorf("unsupported struct type in Scan: %s", fieldValue.Type().String())
} }
} }
default:
return fmt.Errorf("unsupported type in Scan: %s", fieldValue.Type().String()) return fmt.Errorf("unsupported type in Scan: %s", fieldValue.Type().String())
} }
default: default: