From 545f30f5cc085f4c99c7004bf999a2cf05b56a42 Mon Sep 17 00:00:00 2001 From: Bo-Yi Wu Date: Sun, 22 Jul 2018 22:43:48 +0800 Subject: [PATCH 1/3] just return error instead. (#1046) --- migrate/migrate.go | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/migrate/migrate.go b/migrate/migrate.go index 21c90e70..dc4cd1b5 100644 --- a/migrate/migrate.go +++ b/migrate/migrate.go @@ -88,10 +88,7 @@ func (m *Migrate) Migrate() error { } if m.initSchema != nil && m.isFirstRun() { - if err := m.runInitSchema(); err != nil { - return err - } - return nil + return m.runInitSchema() } for _, migration := range m.migrations { From 4b224e882327a1d331c30c90d5c29d6a68dae69d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=96=87=E5=BC=BA?= Date: Thu, 26 Jul 2018 20:05:25 +0800 Subject: [PATCH 2/3] Fix genUpdateColumns() should not ignore soft delete column when unscoped (#1051) --- session_update.go | 2 +- session_update_test.go | 48 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 1 deletion(-) diff --git a/session_update.go b/session_update.go index 84c7e7fe..42dfaacd 100644 --- a/session_update.go +++ b/session_update.go @@ -443,7 +443,7 @@ func (session *Session) genUpdateColumns(bean interface{}) ([]string, []interfac } } - if col.IsDeleted || col.IsCreated { + if (col.IsDeleted && !session.statement.unscoped) || col.IsCreated { continue } diff --git a/session_update_test.go b/session_update_test.go index 8d5b4587..2a7005ee 100644 --- a/session_update_test.go +++ b/session_update_test.go @@ -1133,6 +1133,54 @@ func TestCreatedUpdated2(t *testing.T) { assert.True(t, s2.UpdateAt.Unix() > s2.CreateAt.Unix()) } +func TestDeletedUpdate(t *testing.T) { + assert.NoError(t, prepareEngine()) + + type DeletedUpdatedStruct struct { + Id int64 + Name string + DeletedAt time.Time `xorm:"deleted"` + } + + assertSync(t, new(DeletedUpdatedStruct)) + + var s = DeletedUpdatedStruct{ + Name: "test", + } + cnt, err := testEngine.Insert(&s) + assert.NoError(t, err) + assert.EqualValues(t, 1, cnt) + + cnt, err = testEngine.ID(s.Id).Delete(&DeletedUpdatedStruct{}) + assert.NoError(t, err) + assert.EqualValues(t, 1, cnt) + + s.DeletedAt = time.Time{} + cnt, err = testEngine.Unscoped().Nullable("deleted_at").Update(&s) + assert.NoError(t, err) + assert.EqualValues(t, 1, cnt) + + var s1 DeletedUpdatedStruct + has, err := testEngine.ID(s.Id).Get(&s1) + assert.EqualValues(t, true, has) + + cnt, err = testEngine.ID(s.Id).Delete(&DeletedUpdatedStruct{}) + assert.NoError(t, err) + assert.EqualValues(t, 1, cnt) + + cnt, err = testEngine.ID(s.Id).Cols("deleted_at").Update(&DeletedUpdatedStruct{}) + assert.EqualValues(t, "No content found to be updated", err.Error()) + assert.EqualValues(t, 0, cnt) + + cnt, err = testEngine.ID(s.Id).Unscoped().Cols("deleted_at").Update(&DeletedUpdatedStruct{}) + assert.NoError(t, err) + assert.EqualValues(t, 1, cnt) + + var s2 DeletedUpdatedStruct + has, err = testEngine.ID(s.Id).Get(&s2) + assert.EqualValues(t, true, has) +} + func TestUpdateMapCondition(t *testing.T) { assert.NoError(t, prepareEngine()) From 4ce90f9a62d8f656b6dd55d80404cf3cf8b1894e Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Thu, 9 Aug 2018 13:09:54 +0800 Subject: [PATCH 3/3] Exec support builder (#1064) --- engine.go | 4 ++-- interface.go | 2 +- session_query.go | 12 +----------- session_raw.go | 26 +++++++++++++++++++++++++- 4 files changed, 29 insertions(+), 15 deletions(-) diff --git a/engine.go b/engine.go index 846889c3..7a521007 100644 --- a/engine.go +++ b/engine.go @@ -1333,10 +1333,10 @@ func (engine *Engine) DropIndexes(bean interface{}) error { } // Exec raw sql -func (engine *Engine) Exec(sql string, args ...interface{}) (sql.Result, error) { +func (engine *Engine) Exec(sqlorArgs ...interface{}) (sql.Result, error) { session := engine.NewSession() defer session.Close() - return session.Exec(sql, args...) + return session.Exec(sqlorArgs...) } // Query a raw sql and return records as []map[string][]byte diff --git a/interface.go b/interface.go index 0bc12ba0..0985372d 100644 --- a/interface.go +++ b/interface.go @@ -27,7 +27,7 @@ type Interface interface { Delete(interface{}) (int64, error) Distinct(columns ...string) *Session DropIndexes(bean interface{}) error - Exec(string, ...interface{}) (sql.Result, error) + Exec(sqlOrAgrs ...interface{}) (sql.Result, error) Exist(bean ...interface{}) (bool, error) Find(interface{}, ...interface{}) error FindAndCount(interface{}, ...interface{}) (int64, error) diff --git a/session_query.go b/session_query.go index 5c9aeb39..7ddd08f1 100644 --- a/session_query.go +++ b/session_query.go @@ -17,17 +17,7 @@ import ( func (session *Session) genQuerySQL(sqlorArgs ...interface{}) (string, []interface{}, error) { if len(sqlorArgs) > 0 { - switch sqlorArgs[0].(type) { - case string: - return sqlorArgs[0].(string), sqlorArgs[1:], nil - case *builder.Builder: - return sqlorArgs[0].(*builder.Builder).ToSQL() - case builder.Builder: - bd := sqlorArgs[0].(builder.Builder) - return bd.ToSQL() - default: - return "", nil, ErrUnSupportedType - } + return convertSQLOrArgs(sqlorArgs...) } if session.statement.RawSQL != "" { diff --git a/session_raw.go b/session_raw.go index 69bf9b3c..47823d67 100644 --- a/session_raw.go +++ b/session_raw.go @@ -9,6 +9,7 @@ import ( "reflect" "time" + "github.com/go-xorm/builder" "github.com/go-xorm/core" ) @@ -193,11 +194,34 @@ func (session *Session) exec(sqlStr string, args ...interface{}) (sql.Result, er return session.DB().Exec(sqlStr, args...) } +func convertSQLOrArgs(sqlorArgs ...interface{}) (string, []interface{}, error) { + switch sqlorArgs[0].(type) { + case string: + return sqlorArgs[0].(string), sqlorArgs[1:], nil + case *builder.Builder: + return sqlorArgs[0].(*builder.Builder).ToSQL() + case builder.Builder: + bd := sqlorArgs[0].(builder.Builder) + return bd.ToSQL() + } + + return "", nil, ErrUnSupportedType +} + // Exec raw sql -func (session *Session) Exec(sqlStr string, args ...interface{}) (sql.Result, error) { +func (session *Session) Exec(sqlorArgs ...interface{}) (sql.Result, error) { if session.isAutoClose { defer session.Close() } + if len(sqlorArgs) == 0 { + return nil, ErrUnSupportedType + } + + sqlStr, args, err := convertSQLOrArgs(sqlorArgs...) + if err != nil { + return nil, err + } + return session.exec(sqlStr, args...) }