completed value2Interface implementation for Ptr type

This commit is contained in:
Nash Tsai 2013-12-06 15:20:25 +08:00
parent f44f70acd8
commit dfcf1d7498
2 changed files with 30 additions and 21 deletions

View File

@ -1729,14 +1729,14 @@ func (session *Session) bytes2Value(col *Column, fieldValue *reflect.Value, data
switch typeStr { switch typeStr {
case "*string": case "*string":
x := string(data) x := string(data)
fieldValue.Set(reflect.ValueOf(x).Addr()) fieldValue.Set(reflect.ValueOf(&x))
case "*bool": case "*bool":
d := string(data) d := string(data)
v, err := strconv.ParseBool(d) v, err := strconv.ParseBool(d)
if err != nil { if err != nil {
return errors.New("arg " + key + " as bool: " + err.Error()) return errors.New("arg " + key + " as bool: " + err.Error())
} }
fieldValue.Set(reflect.ValueOf(v).Addr()) fieldValue.Set(reflect.ValueOf(&v))
case "*complex64": case "*complex64":
var x complex64 var x complex64
err := json.Unmarshal(data, &x) err := json.Unmarshal(data, &x)
@ -1744,7 +1744,7 @@ func (session *Session) bytes2Value(col *Column, fieldValue *reflect.Value, data
session.Engine.LogSQL(err) session.Engine.LogSQL(err)
return err return err
} }
fieldValue.Set(reflect.ValueOf(x).Addr()) fieldValue.Set(reflect.ValueOf(&x))
case "*complex128": case "*complex128":
var x complex128 var x complex128
err := json.Unmarshal(data, &x) err := json.Unmarshal(data, &x)
@ -1752,13 +1752,13 @@ func (session *Session) bytes2Value(col *Column, fieldValue *reflect.Value, data
session.Engine.LogSQL(err) session.Engine.LogSQL(err)
return err return err
} }
fieldValue.Set(reflect.ValueOf(x).Addr()) fieldValue.Set(reflect.ValueOf(&x))
case "*float64": case "*float64":
x, err := strconv.ParseFloat(string(data), 64) x, err := strconv.ParseFloat(string(data), 64)
if err != nil { if err != nil {
return errors.New("arg " + key + " as float64: " + err.Error()) return errors.New("arg " + key + " as float64: " + err.Error())
} }
fieldValue.Set(reflect.ValueOf(x).Addr()) fieldValue.Set(reflect.ValueOf(&x))
case "*float32": case "*float32":
var x float32 var x float32
x1, err := strconv.ParseFloat(string(data), 32) x1, err := strconv.ParseFloat(string(data), 32)
@ -1766,7 +1766,7 @@ func (session *Session) bytes2Value(col *Column, fieldValue *reflect.Value, data
return errors.New("arg " + key + " as float32: " + err.Error()) return errors.New("arg " + key + " as float32: " + err.Error())
} }
x = float32(x1) x = float32(x1)
fieldValue.Set(reflect.ValueOf(x).Addr()) fieldValue.Set(reflect.ValueOf(&x))
case "*time.Time": case "*time.Time":
sdata := strings.TrimSpace(string(data)) sdata := strings.TrimSpace(string(data))
var x time.Time var x time.Time
@ -1803,14 +1803,14 @@ func (session *Session) bytes2Value(col *Column, fieldValue *reflect.Value, data
} }
v = x v = x
fieldValue.Set(reflect.ValueOf(v).Addr()) fieldValue.Set(reflect.ValueOf(&x))
case "*uint64": case "*uint64":
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 errors.New("arg " + key + " as int: " + err.Error()) return errors.New("arg " + key + " as int: " + err.Error())
} }
fieldValue.Set(reflect.ValueOf(x).Addr()) fieldValue.Set(reflect.ValueOf(&x))
case "*uint": case "*uint":
var x uint var x uint
x1, err := strconv.ParseUint(string(data), 10, 64) x1, err := strconv.ParseUint(string(data), 10, 64)
@ -1818,7 +1818,7 @@ func (session *Session) bytes2Value(col *Column, fieldValue *reflect.Value, data
return errors.New("arg " + key + " as int: " + err.Error()) return errors.New("arg " + key + " as int: " + err.Error())
} }
x = uint(x1) x = uint(x1)
fieldValue.Set(reflect.ValueOf(x).Addr()) fieldValue.Set(reflect.ValueOf(&x))
case "*uint32": case "*uint32":
var x uint32 var x uint32
x1, err := strconv.ParseUint(string(data), 10, 64) x1, err := strconv.ParseUint(string(data), 10, 64)
@ -1826,7 +1826,7 @@ func (session *Session) bytes2Value(col *Column, fieldValue *reflect.Value, data
return errors.New("arg " + key + " as int: " + err.Error()) return errors.New("arg " + key + " as int: " + err.Error())
} }
x = uint32(x1) x = uint32(x1)
fieldValue.Set(reflect.ValueOf(x).Addr()) fieldValue.Set(reflect.ValueOf(&x))
case "*uint8": case "*uint8":
var x uint8 var x uint8
x1, err := strconv.ParseUint(string(data), 10, 64) x1, err := strconv.ParseUint(string(data), 10, 64)
@ -1834,7 +1834,7 @@ func (session *Session) bytes2Value(col *Column, fieldValue *reflect.Value, data
return errors.New("arg " + key + " as int: " + err.Error()) return errors.New("arg " + key + " as int: " + err.Error())
} }
x = uint8(x1) x = uint8(x1)
fieldValue.Set(reflect.ValueOf(x).Addr()) fieldValue.Set(reflect.ValueOf(&x))
case "*uint16": case "*uint16":
var x uint16 var x uint16
x1, err := strconv.ParseUint(string(data), 10, 64) x1, err := strconv.ParseUint(string(data), 10, 64)
@ -1842,7 +1842,7 @@ func (session *Session) bytes2Value(col *Column, fieldValue *reflect.Value, data
return errors.New("arg " + key + " as int: " + err.Error()) return errors.New("arg " + key + " as int: " + err.Error())
} }
x = uint16(x1) x = uint16(x1)
fieldValue.Set(reflect.ValueOf(x).Addr()) fieldValue.Set(reflect.ValueOf(&x))
case "*int64": case "*int64":
sdata := string(data) sdata := string(data)
var x int64 var x int64
@ -1866,7 +1866,7 @@ func (session *Session) bytes2Value(col *Column, fieldValue *reflect.Value, data
if err != nil { if err != nil {
return errors.New("arg " + key + " as int: " + err.Error()) return errors.New("arg " + key + " as int: " + err.Error())
} }
fieldValue.Set(reflect.ValueOf(x).Addr()) fieldValue.Set(reflect.ValueOf(&x))
case "*int": case "*int":
sdata := string(data) sdata := string(data)
var x int var x int
@ -1894,7 +1894,7 @@ func (session *Session) bytes2Value(col *Column, fieldValue *reflect.Value, data
if err != nil { if err != nil {
return errors.New("arg " + key + " as int: " + err.Error()) return errors.New("arg " + key + " as int: " + err.Error())
} }
fieldValue.Set(reflect.ValueOf(x).Addr()) fieldValue.Set(reflect.ValueOf(&x))
case "*int32": case "*int32":
sdata := string(data) sdata := string(data)
var x int32 var x int32
@ -1922,7 +1922,7 @@ func (session *Session) bytes2Value(col *Column, fieldValue *reflect.Value, data
if err != nil { if err != nil {
return errors.New("arg " + key + " as int: " + err.Error()) return errors.New("arg " + key + " as int: " + err.Error())
} }
fieldValue.Set(reflect.ValueOf(x).Addr()) fieldValue.Set(reflect.ValueOf(&x))
case "*int8": case "*int8":
sdata := string(data) sdata := string(data)
var x int8 var x int8
@ -1950,7 +1950,7 @@ func (session *Session) bytes2Value(col *Column, fieldValue *reflect.Value, data
if err != nil { if err != nil {
return errors.New("arg " + key + " as int: " + err.Error()) return errors.New("arg " + key + " as int: " + err.Error())
} }
fieldValue.Set(reflect.ValueOf(x).Addr()) fieldValue.Set(reflect.ValueOf(&x))
case "*int16": case "*int16":
sdata := string(data) sdata := string(data)
var x int16 var x int16
@ -1978,9 +1978,10 @@ func (session *Session) bytes2Value(col *Column, fieldValue *reflect.Value, data
if err != nil { if err != nil {
return errors.New("arg " + key + " as int: " + err.Error()) return errors.New("arg " + key + " as int: " + err.Error())
} }
fieldValue.Set(reflect.ValueOf(x).Addr()) fieldValue.Set(reflect.ValueOf(&x))
default:
return errors.New("unsupported type in Scan: " + reflect.TypeOf(v).String())
} }
fallthrough
default: default:
return errors.New("unsupported type in Scan: " + reflect.TypeOf(v).String()) return errors.New("unsupported type in Scan: " + reflect.TypeOf(v).String())
} }
@ -2116,13 +2117,20 @@ func (session *Session) value2Interface(col *Column, fieldValue reflect.Value) (
} }
return fieldValue.Elem().Interface(), nil return fieldValue.Elem().Interface(), nil
} }
} else if typeStr == "*int64" || typeStr == "*uint64" || intTypes.Search(typeStr) < len(intTypes) { } else if typeStr == "*int64" || intTypes.Search(typeStr) < len(intTypes) {
if fieldValue.IsNil() { if fieldValue.IsNil() {
return nil, nil return nil, nil
} else { } else {
return fieldValue.Elem().Int(), nil return fieldValue.Elem().Int(), nil
} }
} else if typeStr == "*uint64" || uintTypes.Search(typeStr) < len(uintTypes) {
if fieldValue.IsNil() {
return nil, nil
} else {
return fieldValue.Elem().Uint(), nil
} }
}
fallthrough fallthrough
default: default:
return fieldValue.Interface(), nil return fieldValue.Interface(), nil

View File

@ -111,7 +111,8 @@ var (
BigSerial: true, BigSerial: true,
} }
intTypes = sort.StringSlice{"*int", "*int16", "*int32 ", "*int8 ", "*uint", "*uint16", "*uint32", "*uint8"} intTypes = sort.StringSlice{"*int", "*int16", "*int32 ", "*int8 "}
uintTypes = sort.StringSlice{"*uint", "*uint16", "*uint32", "*uint8"}
) )
var b byte var b byte
@ -170,7 +171,7 @@ func ptrType2SQLType(t reflect.Type) (st SQLType, has bool) {
st = SQLType{BigInt, 0, 0} st = SQLType{BigInt, 0, 0}
} else if typeStr == "*time.Time" { } else if typeStr == "*time.Time" {
st = SQLType{DateTime, 0, 0} st = SQLType{DateTime, 0, 0}
} else if intTypes.Search(typeStr) < len(intTypes) { } else if intTypes.Search(typeStr) < len(intTypes) || uintTypes.Search(typeStr) < len(uintTypes) {
st = SQLType{Int, 0, 0} st = SQLType{Int, 0, 0}
} else { } else {
has = false has = false