From 5a47ac4347952e166920fc0278b52f8aa9551c8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B1=9F=E6=9E=97=E9=94=A6?= Date: Wed, 28 Jan 2015 13:23:01 +0800 Subject: [PATCH 1/2] implement Expr() --- engine.go | 7 +++++++ session.go | 11 +++++++++++ statement.go | 19 +++++++++++++++++++ 3 files changed, 37 insertions(+) diff --git a/engine.go b/engine.go index 3b8a9013..97a17957 100644 --- a/engine.go +++ b/engine.go @@ -558,6 +558,13 @@ func (engine *Engine) Decr(column string, arg ...interface{}) *Session { return session.Decr(column, arg...) } +// Method Expr provides a update string like "column = {expression}" +func (engine *Engine) Expr(column string, expression string) *Session { + session := engine.NewSession() + session.IsAutoClose = true + return session.Expr(column, expression) +} + // Temporarily change the Get, Find, Update's table func (engine *Engine) Table(tableNameOrBean interface{}) *Session { session := engine.NewSession() diff --git a/session.go b/session.go index 8c3de345..c179bbd0 100644 --- a/session.go +++ b/session.go @@ -158,6 +158,12 @@ func (session *Session) Decr(column string, arg ...interface{}) *Session { return session } +// Method Expr provides a query string like "column = {expression}" +func (session *Session) Expr(column string, expression string) *Session { + session.Statement.Expr(column, expression) + return session +} + // Method Cols provides some columns to special func (session *Session) Cols(columns ...string) *Session { session.Statement.Cols(columns...) @@ -3237,6 +3243,11 @@ func (session *Session) Update(bean interface{}, condiBean ...interface{}) (int6 colNames = append(colNames, session.Engine.Quote(v.colName)+" = "+session.Engine.Quote(v.colName)+" - ?") args = append(args, v.arg) } + //for update action to like "column = expression" + exprColumns := session.Statement.getExpr() + for _, v := range exprColumns { + colNames = append(colNames, session.Engine.Quote(v.colName)+" = "+v.expr) + } var condiColNames []string var condiArgs []interface{} diff --git a/statement.go b/statement.go index 486150e5..1261869e 100644 --- a/statement.go +++ b/statement.go @@ -26,6 +26,11 @@ type decrParam struct { arg interface{} } +type exprParam struct { + colName string + expr string +} + // statement save all the sql info for executing SQL type Statement struct { RefTable *core.Table @@ -63,6 +68,7 @@ type Statement struct { inColumns map[string]*inParam incrColumns map[string]incrParam decrColumns map[string]decrParam + exprColumns map[string]exprParam } // init @@ -98,6 +104,7 @@ func (statement *Statement) Init() { statement.inColumns = make(map[string]*inParam) statement.incrColumns = make(map[string]incrParam) statement.decrColumns = make(map[string]decrParam) + statement.exprColumns = make(map[string]exprParam) } // add the raw sql statement @@ -716,6 +723,13 @@ func (statement *Statement) Decr(column string, arg ...interface{}) *Statement { return statement } +// Generate "Update ... Set column = {expression}" statment +func (statement *Statement) Expr(column string, expression string) *Statement { + k := strings.ToLower(column) + statement.exprColumns[k] = exprParam{column, expression} + return statement +} + // Generate "Update ... Set column = column + arg" statment func (statement *Statement) getInc() map[string]incrParam { return statement.incrColumns @@ -726,6 +740,11 @@ func (statement *Statement) getDec() map[string]decrParam { return statement.decrColumns } +// Generate "Update ... Set column = {expression}" statment +func (statement *Statement) getExpr() map[string]exprParam { + return statement.exprColumns +} + // Generate "Where column IN (?) " statment func (statement *Statement) In(column string, args ...interface{}) *Statement { k := strings.ToLower(column) From 5b2b0091decae24147fefa30cf2eadccc8f8e770 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B1=9F=E6=9E=97=E9=94=A6?= Date: Wed, 28 Jan 2015 14:10:45 +0800 Subject: [PATCH 2/2] Expr() => SetExpr() --- engine.go | 6 +++--- session.go | 6 +++--- statement.go | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/engine.go b/engine.go index 97a17957..6903f497 100644 --- a/engine.go +++ b/engine.go @@ -558,11 +558,11 @@ func (engine *Engine) Decr(column string, arg ...interface{}) *Session { return session.Decr(column, arg...) } -// Method Expr provides a update string like "column = {expression}" -func (engine *Engine) Expr(column string, expression string) *Session { +// Method SetExpr provides a update string like "column = {expression}" +func (engine *Engine) SetExpr(column string, expression string) *Session { session := engine.NewSession() session.IsAutoClose = true - return session.Expr(column, expression) + return session.SetExpr(column, expression) } // Temporarily change the Get, Find, Update's table diff --git a/session.go b/session.go index c179bbd0..d0ec905a 100644 --- a/session.go +++ b/session.go @@ -158,9 +158,9 @@ func (session *Session) Decr(column string, arg ...interface{}) *Session { return session } -// Method Expr provides a query string like "column = {expression}" -func (session *Session) Expr(column string, expression string) *Session { - session.Statement.Expr(column, expression) +// Method SetExpr provides a query string like "column = {expression}" +func (session *Session) SetExpr(column string, expression string) *Session { + session.Statement.SetExpr(column, expression) return session } diff --git a/statement.go b/statement.go index 1261869e..2c021cce 100644 --- a/statement.go +++ b/statement.go @@ -724,7 +724,7 @@ func (statement *Statement) Decr(column string, arg ...interface{}) *Statement { } // Generate "Update ... Set column = {expression}" statment -func (statement *Statement) Expr(column string, expression string) *Statement { +func (statement *Statement) SetExpr(column string, expression string) *Statement { k := strings.ToLower(column) statement.exprColumns[k] = exprParam{column, expression} return statement