add deleted condition for Update operation (#1249)
This commit is contained in:
parent
c790592482
commit
1c2d47e0da
|
@ -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)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue