aboutsummaryrefslogtreecommitdiff
path: root/libgo/go/database/sql/convert.go
diff options
context:
space:
mode:
Diffstat (limited to 'libgo/go/database/sql/convert.go')
-rw-r--r--libgo/go/database/sql/convert.go38
1 files changed, 33 insertions, 5 deletions
diff --git a/libgo/go/database/sql/convert.go b/libgo/go/database/sql/convert.go
index c0b38a2..740fd9d 100644
--- a/libgo/go/database/sql/convert.go
+++ b/libgo/go/database/sql/convert.go
@@ -12,6 +12,7 @@ import (
"fmt"
"reflect"
"strconv"
+ "time"
)
var errNilPtr = errors.New("destination pointer is nil") // embedded in descriptive error
@@ -127,6 +128,18 @@ func convertAssign(dest, src interface{}) error {
*d = s
return nil
}
+ case time.Time:
+ switch d := dest.(type) {
+ case *string:
+ *d = s.Format(time.RFC3339Nano)
+ return nil
+ case *[]byte:
+ if d == nil {
+ return errNilPtr
+ }
+ *d = []byte(s.Format(time.RFC3339Nano))
+ return nil
+ }
case nil:
switch d := dest.(type) {
case *interface{}:
@@ -203,11 +216,16 @@ func convertAssign(dest, src interface{}) error {
}
dv := reflect.Indirect(dpv)
- if dv.Kind() == sv.Kind() {
+ if sv.IsValid() && sv.Type().AssignableTo(dv.Type()) {
dv.Set(sv)
return nil
}
+ if dv.Kind() == sv.Kind() && sv.Type().ConvertibleTo(dv.Type()) {
+ dv.Set(sv.Convert(dv.Type()))
+ return nil
+ }
+
switch dv.Kind() {
case reflect.Ptr:
if src == nil {
@@ -221,7 +239,8 @@ func convertAssign(dest, src interface{}) error {
s := asString(src)
i64, err := strconv.ParseInt(s, 10, dv.Type().Bits())
if err != nil {
- return fmt.Errorf("converting string %q to a %s: %v", s, dv.Kind(), err)
+ err = strconvErr(err)
+ return fmt.Errorf("converting driver.Value type %T (%q) to a %s: %v", src, s, dv.Kind(), err)
}
dv.SetInt(i64)
return nil
@@ -229,7 +248,8 @@ func convertAssign(dest, src interface{}) error {
s := asString(src)
u64, err := strconv.ParseUint(s, 10, dv.Type().Bits())
if err != nil {
- return fmt.Errorf("converting string %q to a %s: %v", s, dv.Kind(), err)
+ err = strconvErr(err)
+ return fmt.Errorf("converting driver.Value type %T (%q) to a %s: %v", src, s, dv.Kind(), err)
}
dv.SetUint(u64)
return nil
@@ -237,13 +257,21 @@ func convertAssign(dest, src interface{}) error {
s := asString(src)
f64, err := strconv.ParseFloat(s, dv.Type().Bits())
if err != nil {
- return fmt.Errorf("converting string %q to a %s: %v", s, dv.Kind(), err)
+ err = strconvErr(err)
+ return fmt.Errorf("converting driver.Value type %T (%q) to a %s: %v", src, s, dv.Kind(), err)
}
dv.SetFloat(f64)
return nil
}
- return fmt.Errorf("unsupported driver -> Scan pair: %T -> %T", src, dest)
+ return fmt.Errorf("unsupported Scan, storing driver.Value type %T into type %T", src, dest)
+}
+
+func strconvErr(err error) error {
+ if ne, ok := err.(*strconv.NumError); ok {
+ return ne.Err
+ }
+ return err
}
func cloneBytes(b []byte) []byte {