detect the scan type according type
This commit is contained in:
parent
baa3fdb549
commit
23a143717c
|
@ -611,8 +611,10 @@ func asKind(vv reflect.Value, tp reflect.Type) (interface{}, error) {
|
||||||
}
|
}
|
||||||
return v, nil
|
return v, nil
|
||||||
}
|
}
|
||||||
|
default:
|
||||||
|
return vv.Interface(), nil
|
||||||
}
|
}
|
||||||
return nil, fmt.Errorf("unsupported primary key type: %v, %v", tp, vv)
|
return nil, fmt.Errorf("asKind unsupported type: %v, %v", tp, vv)
|
||||||
}
|
}
|
||||||
|
|
||||||
func asBool(bs []byte) (bool, error) {
|
func asBool(bs []byte) (bool, error) {
|
||||||
|
|
|
@ -24,6 +24,7 @@ type Column struct {
|
||||||
TableName string
|
TableName string
|
||||||
FieldName string // Available only when parsed from a struct
|
FieldName string // Available only when parsed from a struct
|
||||||
FieldIndex []int // Available only when parsed from a struct
|
FieldIndex []int // Available only when parsed from a struct
|
||||||
|
Type reflect.Type // Available only when parsed from a struct
|
||||||
SQLType SQLType
|
SQLType SQLType
|
||||||
IsJSON bool
|
IsJSON bool
|
||||||
Length int
|
Length int
|
||||||
|
|
11
session.go
11
session.go
|
@ -449,11 +449,6 @@ func (session *Session) row2Slice(rows *core.Rows, types []*sql.ColumnType, fiel
|
||||||
return scanResults, nil
|
return scanResults, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
|
||||||
scannerTypePlaceHolder sql.Scanner
|
|
||||||
scannerType = reflect.TypeOf(&scannerTypePlaceHolder).Elem()
|
|
||||||
)
|
|
||||||
|
|
||||||
// convertAssign converts an interface src to dst reflect.Value fieldValue
|
// convertAssign converts an interface src to dst reflect.Value fieldValue
|
||||||
func (session *Session) convertAssign(fieldValue *reflect.Value, columnName string, src interface{}, table *schemas.Table, pk *schemas.PK, idx int) error {
|
func (session *Session) convertAssign(fieldValue *reflect.Value, columnName string, src interface{}, table *schemas.Table, pk *schemas.PK, idx int) error {
|
||||||
if fieldValue == nil {
|
if fieldValue == nil {
|
||||||
|
@ -469,6 +464,10 @@ func (session *Session) convertAssign(fieldValue *reflect.Value, columnName stri
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if fieldValue.Kind() == reflect.Ptr && fieldValue.IsNil() {
|
||||||
|
fieldValue.Set(reflect.New(fieldValue.Type().Elem()))
|
||||||
|
}
|
||||||
|
|
||||||
fmt.Printf("----- %v <------ %v \n", fieldValue.Type(), rawValue.Type())
|
fmt.Printf("----- %v <------ %v \n", fieldValue.Type(), rawValue.Type())
|
||||||
if fieldValue.Type() == rawValue.Type() {
|
if fieldValue.Type() == rawValue.Type() {
|
||||||
fieldValue.Set(rawValue)
|
fieldValue.Set(rawValue)
|
||||||
|
@ -518,7 +517,7 @@ func (session *Session) convertAssign(fieldValue *reflect.Value, columnName stri
|
||||||
case *sql.NullString:
|
case *sql.NullString:
|
||||||
if t.Valid {
|
if t.Valid {
|
||||||
if fieldValue.IsNil() {
|
if fieldValue.IsNil() {
|
||||||
fieldValue.Set(reflect.New(fieldValue.Type().Elem()))
|
//fieldValue.Set(reflect.New(fieldValue.Type().Elem()))
|
||||||
structConvert = fieldValue.Interface().(convert.Conversion)
|
structConvert = fieldValue.Interface().(convert.Conversion)
|
||||||
}
|
}
|
||||||
if err := structConvert.FromDB([]byte(t.String)); err != nil {
|
if err := structConvert.FromDB([]byte(t.String)); err != nil {
|
||||||
|
|
|
@ -298,16 +298,36 @@ func (session *Session) getVars(rows *core.Rows, types []*sql.ColumnType, fields
|
||||||
}
|
}
|
||||||
|
|
||||||
func (session *Session) getStruct(rows *core.Rows, types []*sql.ColumnType, fields []string, table *schemas.Table, bean interface{}) (bool, error) {
|
func (session *Session) getStruct(rows *core.Rows, types []*sql.ColumnType, fields []string, table *schemas.Table, bean interface{}) (bool, error) {
|
||||||
fields, err := rows.Columns()
|
var scanResults = make([]interface{}, 0, len(types))
|
||||||
|
for i, tp := range types {
|
||||||
|
col := table.GetColumn(fields[i])
|
||||||
|
if col == nil {
|
||||||
|
return true, fmt.Errorf("cannot find column named %v from columns %v", fields[i], table.ColumnsSeq())
|
||||||
|
}
|
||||||
|
if col.Type.Implements(scannerType) {
|
||||||
|
scanResults = append(scanResults, &sql.RawBytes{})
|
||||||
|
} else if col.Type.Implements(conversionType) {
|
||||||
|
scanResults = append(scanResults, &sql.RawBytes{})
|
||||||
|
} else {
|
||||||
|
v, err := session.engine.driver.GenScanResult(tp.DatabaseTypeName())
|
||||||
|
if err != nil {
|
||||||
|
return true, err
|
||||||
|
}
|
||||||
|
scanResults = append(scanResults, v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, closure := range session.beforeClosures {
|
||||||
|
closure(bean)
|
||||||
|
}
|
||||||
|
|
||||||
|
err := session.engine.scan(rows, types, scanResults...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// WARN: Alougth rows return true, but get fields failed
|
|
||||||
return true, err
|
return true, err
|
||||||
}
|
}
|
||||||
|
|
||||||
scanResults, err := session.row2Slice(rows, fields, bean)
|
executeBeforeSet(bean, fields, scanResults)
|
||||||
if err != nil {
|
|
||||||
return false, err
|
|
||||||
}
|
|
||||||
// close it before convert data
|
// close it before convert data
|
||||||
rows.Close()
|
rows.Close()
|
||||||
|
|
||||||
|
|
|
@ -271,7 +271,6 @@ func (parser *Parser) Parse(v reflect.Value) (*schemas.Table, error) {
|
||||||
if t.Kind() == reflect.Ptr {
|
if t.Kind() == reflect.Ptr {
|
||||||
t = t.Elem()
|
t = t.Elem()
|
||||||
v = v.Elem()
|
v = v.Elem()
|
||||||
fmt.Println("======3333", v)
|
|
||||||
}
|
}
|
||||||
if t.Kind() != reflect.Struct {
|
if t.Kind() != reflect.Struct {
|
||||||
return nil, ErrUnsupportedType
|
return nil, ErrUnsupportedType
|
||||||
|
|
Loading…
Reference in New Issue