Fix bug of ToDB when update on a nil pointer (#1786)
Fix test Fix bug Fix bug Add test for insert nil struct field Fix test Fix bug of ToDB when update on a nil pointer Reviewed-on: https://gitea.com/xorm/xorm/pulls/1786
This commit is contained in:
parent
b422930617
commit
1b200bdcba
|
@ -188,6 +188,9 @@ func TestForUpdate(t *testing.T) {
|
|||
|
||||
// lock is NOT used
|
||||
wg.Add(1)
|
||||
|
||||
wg2 := &sync.WaitGroup{}
|
||||
wg2.Add(1)
|
||||
go func() {
|
||||
f3 := new(ForUpdate)
|
||||
session3.Where("id = ?", 1)
|
||||
|
@ -201,10 +204,10 @@ func TestForUpdate(t *testing.T) {
|
|||
t.Errorf("read lock failed")
|
||||
}
|
||||
wg.Done()
|
||||
wg2.Done()
|
||||
}()
|
||||
|
||||
// wait for go rountines
|
||||
time.Sleep(50 * time.Millisecond)
|
||||
wg2.Wait()
|
||||
|
||||
f := new(ForUpdate)
|
||||
f.Name = "updated by session1"
|
||||
|
@ -1350,3 +1353,50 @@ func TestUpdateMultiplePK(t *testing.T) {
|
|||
_, err = testEngine.ID(&MySlice{test.Id, test.Name}).Update(test)
|
||||
assert.NoError(t, err)
|
||||
}
|
||||
|
||||
type TestFieldType1 struct {
|
||||
cb []byte
|
||||
}
|
||||
|
||||
func (a *TestFieldType1) FromDB(src []byte) error {
|
||||
a.cb = src
|
||||
return nil
|
||||
}
|
||||
|
||||
func (a TestFieldType1) ToDB() ([]byte, error) {
|
||||
return a.cb, nil
|
||||
}
|
||||
|
||||
type TestTable1 struct {
|
||||
Id int64
|
||||
Field1 *TestFieldType1 `xorm:"text"`
|
||||
UpdateTime time.Time
|
||||
}
|
||||
|
||||
func TestNilFromDB(t *testing.T) {
|
||||
assert.NoError(t, PrepareEngine())
|
||||
assertSync(t, new(TestTable1))
|
||||
|
||||
cnt, err := testEngine.Insert(&TestTable1{
|
||||
Field1: &TestFieldType1{
|
||||
cb: []byte("string"),
|
||||
},
|
||||
UpdateTime: time.Now(),
|
||||
})
|
||||
assert.NoError(t, err)
|
||||
assert.EqualValues(t, 1, cnt)
|
||||
|
||||
cnt, err = testEngine.Update(TestTable1{
|
||||
UpdateTime: time.Now().Add(time.Second),
|
||||
}, TestTable1{
|
||||
Id: 1,
|
||||
})
|
||||
assert.NoError(t, err)
|
||||
assert.EqualValues(t, 1, cnt)
|
||||
|
||||
cnt, err = testEngine.Insert(&TestTable1{
|
||||
UpdateTime: time.Now(),
|
||||
})
|
||||
assert.NoError(t, err)
|
||||
assert.EqualValues(t, 1, cnt)
|
||||
}
|
||||
|
|
|
@ -130,7 +130,7 @@ func (statement *Statement) BuildUpdates(tableValue reflect.Value,
|
|||
}
|
||||
}
|
||||
|
||||
if structConvert, ok := fieldValue.Interface().(convert.Conversion); ok {
|
||||
if structConvert, ok := fieldValue.Interface().(convert.Conversion); ok && !fieldValue.IsNil() {
|
||||
data, err := structConvert.ToDB()
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
|
|
|
@ -36,6 +36,8 @@ func (statement *Statement) Value2Interface(col *schemas.Column, fieldValue refl
|
|||
}
|
||||
}
|
||||
|
||||
isNil := fieldValue.Kind() == reflect.Ptr && fieldValue.IsNil()
|
||||
if !isNil {
|
||||
if fieldConvert, ok := fieldValue.Interface().(convert.Conversion); ok {
|
||||
data, err := fieldConvert.ToDB()
|
||||
if err != nil {
|
||||
|
@ -49,6 +51,7 @@ func (statement *Statement) Value2Interface(col *schemas.Column, fieldValue refl
|
|||
}
|
||||
return string(data), nil
|
||||
}
|
||||
}
|
||||
|
||||
fieldType := fieldValue.Type()
|
||||
k := fieldType.Kind()
|
||||
|
|
Loading…
Reference in New Issue