From 1c2d47e0da970d1b3214cd57e6ab9e9b81556ab2 Mon Sep 17 00:00:00 2001 From: Wendell Sun Date: Wed, 13 Mar 2019 19:02:41 +0800 Subject: [PATCH] add deleted condition for Update operation (#1249) --- session_update.go | 48 ++++++++++++++++++++++++++++-------------- session_update_test.go | 41 ++++++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+), 16 deletions(-) diff --git a/session_update.go b/session_update.go index 6bd16aaf..1c20556c 100644 --- a/session_update.go +++ b/session_update.go @@ -244,23 +244,39 @@ func (session *Session) Update(bean interface{}, condiBean ...interface{}) (int6 } var autoCond builder.Cond - if !session.statement.noAutoCondition && len(condiBean) > 0 { - if c, ok := condiBean[0].(map[string]interface{}); ok { - autoCond = builder.Eq(c) - } else { - 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 - } + if !session.statement.noAutoCondition { + condBeanIsStruct := false + if len(condiBean) > 0 { + if c, ok := condiBean[0].(map[string]interface{}); ok { + autoCond = builder.Eq(c) } 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) + } } } } diff --git a/session_update_test.go b/session_update_test.go index 480fc5fc..3dab8a12 100644 --- a/session_update_test.go +++ b/session_update_test.go @@ -1349,3 +1349,44 @@ func TestWhereCondErrorWhenUpdate(t *testing.T) { assert.Error(t, 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) +}