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:
parent
dbd45f3f8e
commit
6f46e68425
|
@ -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(>s)
|
||||||
|
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))
|
||||||
|
}
|
||||||
|
|
8
scan.go
8
scan.go
|
@ -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,
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue