This commit is contained in:
Lunny Xiao 2021-07-03 12:07:49 +08:00
parent 87f3dec0c0
commit d2a5cd7660
3 changed files with 59 additions and 27 deletions

48
convert/interface.go Normal file
View File

@ -0,0 +1,48 @@
// Copyright 2021 The Xorm Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package convert
import (
"database/sql"
"fmt"
"time"
)
func Interface2Interface(userLocation *time.Location, v interface{}) (interface{}, error) {
if v == nil {
return nil, nil
}
switch vv := v.(type) {
case *int64:
return *vv, nil
case *int8:
return *vv, nil
case *sql.NullString:
return vv.String, nil
case *sql.RawBytes:
if len([]byte(*vv)) > 0 {
return []byte(*vv), nil
}
return nil, nil
case *sql.NullInt32:
return vv.Int32, nil
case *sql.NullInt64:
return vv.Int64, nil
case *sql.NullFloat64:
return vv.Float64, nil
case *sql.NullBool:
if vv.Valid {
return vv.Bool, nil
}
return nil, nil
case *sql.NullTime:
if vv.Valid {
return vv.Time.In(userLocation).Format("2006-01-02 15:04:05"), nil
}
return "", nil
default:
return "", fmt.Errorf("convert assign string unsupported type: %#v", vv)
}
}

View File

@ -1384,18 +1384,21 @@ func (p *pqDriver) GenScanResult(colType string) (interface{}, error) {
case "BIGINT": case "BIGINT":
var s sql.NullInt64 var s sql.NullInt64
return &s, nil return &s, nil
case "TINYINT", "INT": case "TINYINT", "INT", "INT8", "INT4":
var s sql.NullInt32 var s sql.NullInt32
return &s, nil return &s, nil
case "FLOAT": case "FLOAT", "FLOAT4":
var s sql.NullFloat64 var s sql.NullFloat64
return &s, nil return &s, nil
case "DATETIME": case "DATETIME", "TIMESTAMP":
var s sql.NullTime var s sql.NullTime
return &s, nil return &s, nil
case "BIT": case "BIT":
var s sql.RawBytes var s sql.RawBytes
return &s, nil return &s, nil
case "BOOL":
var s sql.NullBool
return &s, nil
default: default:
fmt.Printf("unknow postgres database type: %v\n", colType) fmt.Printf("unknow postgres database type: %v\n", colType)
var r sql.RawBytes var r sql.RawBytes

29
scan.go
View File

@ -6,8 +6,8 @@ package xorm
import ( import (
"database/sql" "database/sql"
"fmt"
"xorm.io/xorm/convert"
"xorm.io/xorm/core" "xorm.io/xorm/core"
"xorm.io/xorm/dialects" "xorm.io/xorm/dialects"
) )
@ -86,30 +86,11 @@ func (engine *Engine) row2mapInterface(rows *core.Rows, types []*sql.ColumnType,
} }
for ii, key := range fields { for ii, key := range fields {
switch t := scanResultContainers[ii].(type) { res, err := convert.Interface2Interface(engine.TZLocation, scanResultContainers[ii])
case *sql.NullInt32: if err != nil {
resultsMap[key] = t.Int32 return nil, err
case *sql.NullInt64:
resultsMap[key] = t.Int64
case *sql.NullFloat64:
resultsMap[key] = t.Float64
case *sql.NullString:
resultsMap[key] = t.String
case *sql.NullTime:
if t.Valid {
resultsMap[key] = t.Time.In(engine.TZLocation).Format("2006-01-02 15:04:05")
} else {
resultsMap[key] = nil
}
case *sql.RawBytes:
if t == nil {
resultsMap[key] = nil
} else {
resultsMap[key] = []byte(*t)
}
default:
return nil, fmt.Errorf("unknow type: %v", t)
} }
resultsMap[key] = res
} }
return resultsMap, nil return resultsMap, nil
} }