Support Get time.Time (#1933)

Fix #1107

Reviewed-on: https://gitea.com/xorm/xorm/pulls/1933
Co-authored-by: Lunny Xiao <xiaolunwen@gmail.com>
Co-committed-by: Lunny Xiao <xiaolunwen@gmail.com>
This commit is contained in:
Lunny Xiao 2021-07-11 09:30:33 +08:00
parent dbd45f3f8e
commit 6f46e68425
3 changed files with 40 additions and 4 deletions

View File

@ -904,3 +904,24 @@ func TestGetDecimal(t *testing.T) {
//assert.True(t, m.Cmp(gf.Money) == 0, "%v != %v", m.String(), gf.Money.String()) //assert.True(t, m.Cmp(gf.Money) == 0, "%v != %v", m.String(), gf.Money.String())
} }
} }
func TestGetTime(t *testing.T) {
type GetTimeStruct struct {
Id int64
CreateTime time.Time
}
assert.NoError(t, PrepareEngine())
assertSync(t, new(GetTimeStruct))
var gts = GetTimeStruct{
CreateTime: time.Now(),
}
_, err := testEngine.Insert(&gts)
assert.NoError(t, err)
var gn time.Time
has, err := testEngine.Table("get_time_struct").Cols(colMapper.Obj2Table("CreateTime")).Get(&gn)
assert.NoError(t, err)
assert.True(t, has)
assert.EqualValues(t, gts.CreateTime.Format(time.RFC3339), gn.Format(time.RFC3339))
}

View File

@ -22,7 +22,9 @@ func genScanResultsByBeanNullable(bean interface{}) (interface{}, bool, error) {
case *sql.NullInt64, *sql.NullBool, *sql.NullFloat64, *sql.NullString, *sql.RawBytes: case *sql.NullInt64, *sql.NullBool, *sql.NullFloat64, *sql.NullString, *sql.RawBytes:
return t, false, nil return t, false, nil
case *time.Time: case *time.Time:
return &sql.NullTime{}, true, nil return &sql.NullString{}, true, nil
case *sql.NullTime:
return &sql.NullString{}, true, nil
case *string: case *string:
return &sql.NullString{}, true, nil return &sql.NullString{}, true, nil
case *int, *int8, *int16, *int32: case *int, *int8, *int16, *int32:
@ -75,8 +77,8 @@ func genScanResultsByBean(bean interface{}) (interface{}, bool, error) {
*float32, *float64, *float32, *float64,
*bool: *bool:
return t, false, nil return t, false, nil
case *time.Time: case *time.Time, *sql.NullTime:
return &sql.NullTime{}, true, nil return &sql.NullString{}, true, nil
case sql.NullInt64, sql.NullBool, sql.NullFloat64, sql.NullString, case sql.NullInt64, sql.NullBool, sql.NullFloat64, sql.NullString,
time.Time, time.Time,
string, string,

View File

@ -35,6 +35,19 @@ func (session *Session) Get(bean interface{}) (bool, error) {
return session.get(bean) return session.get(bean)
} }
func isPtrOfTime(v interface{}) bool {
if _, ok := v.(*time.Time); ok {
return true
}
el := reflect.ValueOf(v).Elem()
if el.Kind() != reflect.Struct {
return false
}
return el.Type().ConvertibleTo(schemas.TimeType)
}
func (session *Session) get(bean interface{}) (bool, error) { func (session *Session) get(bean interface{}) (bool, error) {
defer session.resetStatement() defer session.resetStatement()
@ -51,7 +64,7 @@ func (session *Session) get(bean interface{}) (bool, error) {
return false, ErrObjectIsNil return false, ErrObjectIsNil
} }
if beanValue.Elem().Kind() == reflect.Struct { if beanValue.Elem().Kind() == reflect.Struct && !isPtrOfTime(bean) {
if err := session.statement.SetRefBean(bean); err != nil { if err := session.statement.SetRefBean(bean); err != nil {
return false, err return false, err
} }