add deleted condition for Update operation (#1249)

This commit is contained in:
Wendell Sun 2019-03-13 19:02:41 +08:00 committed by BetaCat
parent c790592482
commit 1c2d47e0da
2 changed files with 73 additions and 16 deletions

View File

@ -244,23 +244,39 @@ func (session *Session) Update(bean interface{}, condiBean ...interface{}) (int6
} }
var autoCond builder.Cond var autoCond builder.Cond
if !session.statement.noAutoCondition && len(condiBean) > 0 { if !session.statement.noAutoCondition {
if c, ok := condiBean[0].(map[string]interface{}); ok { condBeanIsStruct := false
autoCond = builder.Eq(c) if len(condiBean) > 0 {
} else { if c, ok := condiBean[0].(map[string]interface{}); ok {
ct := reflect.TypeOf(condiBean[0]) autoCond = builder.Eq(c)
k := ct.Kind()
if k == reflect.Ptr {
k = ct.Elem().Kind()
}
if k == reflect.Struct {
var err error
autoCond, err = session.statement.buildConds(session.statement.RefTable, condiBean[0], true, true, false, true, false)
if err != nil {
return 0, err
}
} else { } else {
return 0, ErrConditionType ct := reflect.TypeOf(condiBean[0])
k := ct.Kind()
if k == reflect.Ptr {
k = ct.Elem().Kind()
}
if k == reflect.Struct {
var err error
autoCond, err = session.statement.buildConds(session.statement.RefTable, condiBean[0], true, true, false, true, false)
if err != nil {
return 0, err
}
condBeanIsStruct = true
} else {
return 0, ErrConditionType
}
}
}
if !condBeanIsStruct && table != nil {
if col := table.DeletedColumn(); col != nil && !session.statement.unscoped { // tag "deleted" is enabled
autoCond1 := session.engine.CondDeleted(session.engine.Quote(col.Name))
if autoCond == nil {
autoCond = autoCond1
} else {
autoCond = autoCond.And(autoCond1)
}
} }
} }
} }

View File

@ -1349,3 +1349,44 @@ func TestWhereCondErrorWhenUpdate(t *testing.T) {
assert.Error(t, err) assert.Error(t, err)
assert.EqualValues(t, ErrConditionType, err) assert.EqualValues(t, ErrConditionType, err)
} }
func TestUpdateDeleted(t *testing.T) {
assert.NoError(t, prepareEngine())
type UpdateDeletedStruct struct {
Id int64
Name string
DeletedAt time.Time `xorm:"deleted"`
}
assertSync(t, new(UpdateDeletedStruct))
var s = UpdateDeletedStruct{
Name: "test",
}
cnt, err := testEngine.Insert(&s)
assert.NoError(t, err)
assert.EqualValues(t, 1, cnt)
cnt, err = testEngine.ID(s.Id).Delete(&UpdateDeletedStruct{})
assert.NoError(t, err)
assert.EqualValues(t, 1, cnt)
cnt, err = testEngine.ID(s.Id).Update(&UpdateDeletedStruct{
Name: "test1",
})
assert.NoError(t, err)
assert.EqualValues(t, 0, cnt)
cnt, err = testEngine.Table(&UpdateDeletedStruct{}).ID(s.Id).Update(map[string]interface{}{
"name": "test1",
})
assert.NoError(t, err)
assert.EqualValues(t, 0, cnt)
cnt, err = testEngine.ID(s.Id).Unscoped().Update(&UpdateDeletedStruct{
Name: "test1",
})
assert.NoError(t, err)
assert.EqualValues(t, 1, cnt)
}