Skip to content

Commit

Permalink
add prepare sql support
Browse files Browse the repository at this point in the history
  • Loading branch information
zhuxiujia committed Feb 15, 2020
1 parent f0fe189 commit 7dbaceb
Show file tree
Hide file tree
Showing 21 changed files with 107 additions and 62 deletions.
1 change: 0 additions & 1 deletion ExpressionEngineProxy.go
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,6 @@ func (it *ExpressionEngineProxy) LexerCacheable() bool {

//执行
func (it *ExpressionEngineProxy) LexerAndEval(expression string, arg interface{}) (interface{}, error) {

var funcItem = arg.(map[string]interface{})["func_"+expression]
if funcItem != nil {
var f = funcItem.(func(arg map[string]interface{}) interface{})
Expand Down
16 changes: 10 additions & 6 deletions GoMybatis.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package GoMybatis

import (
"bytes"
"fmt"
"github.com/zhuxiujia/GoMybatis/ast"
"github.com/zhuxiujia/GoMybatis/lib/github.com/beevik/etree"
"github.com/zhuxiujia/GoMybatis/utils"
Expand Down Expand Up @@ -328,7 +329,7 @@ func exeMethodByXml(elementType ElementType, beanName string, sessionEngine Sess
var session Session
var sql string
var err error
session, sql, err = buildSql(proxyArg, nodes, sessionEngine.SqlBuilder())
session, sql, arg_array, err := buildSql(proxyArg, nodes, sessionEngine.SqlBuilder())
if err != nil {
return err
}
Expand Down Expand Up @@ -359,8 +360,9 @@ func exeMethodByXml(elementType ElementType, beanName string, sessionEngine Sess
//is select and have return value
if sessionEngine.LogEnable() {
sessionEngine.LogSystem().SendLog("[GoMybatis] [", session.Id(), "] Query ==> "+sql)
sessionEngine.LogSystem().SendLog("[GoMybatis] [", session.Id(), "] Param ==> "+fmt.Sprint(arg_array))
}
res, err := session.Query(sql)
res, err := session.QueryPrepare(sql, arg_array...)
defer func() {
if sessionEngine.LogEnable() {
var RowsAffected = "0"
Expand All @@ -383,8 +385,9 @@ func exeMethodByXml(elementType ElementType, beanName string, sessionEngine Sess
} else {
if sessionEngine.LogEnable() {
sessionEngine.LogSystem().SendLog("[GoMybatis] [", session.Id(), "] Exec ==> "+sql)
sessionEngine.LogSystem().SendLog("[GoMybatis] [", session.Id(), "] Param ==> "+fmt.Sprint(arg_array))
}
var res, err = session.Exec(sql)
var res, err = session.ExecPrepare(sql, arg_array...)
defer func() {
if sessionEngine.LogEnable() {
var RowsAffected = "0"
Expand Down Expand Up @@ -416,7 +419,8 @@ func closeSession(factory *SessionFactory, session Session) {
session.Close()
}

func buildSql(proxyArg ProxyArg, nodes []ast.Node, sqlBuilder SqlBuilder) (Session, string, error) {
func buildSql(proxyArg ProxyArg, nodes []ast.Node, sqlBuilder SqlBuilder) (Session, string, []interface{}, error) {
var array_arg = []interface{}{}
var session Session
var paramMap = make(map[string]interface{})
var tagArgsLen = proxyArg.TagArgsLen
Expand Down Expand Up @@ -464,8 +468,8 @@ func buildSql(proxyArg ProxyArg, nodes []ast.Node, sqlBuilder SqlBuilder) (Sessi
paramMap = scanStructArgFields(proxyArg.Args[customIndex], tag)
}

result, err := sqlBuilder.BuildSql(paramMap, nodes)
return session, result, err
result, err := sqlBuilder.BuildSql(paramMap, nodes, &array_arg)
return session, result, array_arg, err
}

//scan params
Expand Down
7 changes: 3 additions & 4 deletions GoMybatisSqlBuilder.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ type GoMybatisSqlBuilder struct {
sqlArgTypeConvert ast.SqlArgTypeConvert
expressionEngineProxy ExpressionEngineProxy
enableLog bool
nodeParser ast.NodeParser
nodeParser ast.NodeParser
}

func (it *GoMybatisSqlBuilder) ExpressionEngineProxy() *ExpressionEngineProxy {
Expand All @@ -31,9 +31,9 @@ func (it GoMybatisSqlBuilder) New(SqlArgTypeConvert ast.SqlArgTypeConvert, expre
return it
}

func (it *GoMybatisSqlBuilder) BuildSql(paramMap map[string]interface{}, nodes []ast.Node) (string, error) {
func (it *GoMybatisSqlBuilder) BuildSql(paramMap map[string]interface{}, nodes []ast.Node, arg_array *[]interface{}) (string, error) {
//抽象语法树节点构建
var sql, err = ast.DoChildNodes(nodes, paramMap)
var sql, err = ast.DoChildNodes(nodes, paramMap, arg_array)
if err != nil {
return "", err
}
Expand All @@ -48,7 +48,6 @@ func (it *GoMybatisSqlBuilder) EnableLog() bool {
return it.enableLog
}


func (it *GoMybatisSqlBuilder) NodeParser() ast.NodeParser {
return it.nodeParser
}
19 changes: 13 additions & 6 deletions GoMybatisSqlBuilder_test.go
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
package GoMybatis

import (
"fmt"
"github.com/zhuxiujia/GoMybatis/engines"
"github.com/zhuxiujia/GoMybatis/example"
"github.com/zhuxiujia/GoMybatis/lib/github.com/Knetic/govaluate"
"github.com/zhuxiujia/GoMybatis/lib/github.com/beevik/etree"
"github.com/zhuxiujia/GoMybatis/utils"
"fmt"
"testing"
"time"
)
Expand Down Expand Up @@ -62,7 +62,8 @@ func Benchmark_SqlBuilder(b *testing.B) {

b.StartTimer()
for i := 0; i < b.N; i++ {
_, e := builder.BuildSql(paramMap, nodes)
var array = []interface{}{}
_, e := builder.BuildSql(paramMap, nodes, &array)
if e != nil {
b.Fatal(e)
}
Expand Down Expand Up @@ -106,7 +107,8 @@ func Test_SqlBuilder_Tps(t *testing.T) {
var startTime = time.Now()
for i := 0; i < 100000; i++ {
//var sql, e =
_, e := builder.BuildSql(paramMap, nodes)
var array = []interface{}{}
_, e := builder.BuildSql(paramMap, nodes, &array)
if e != nil {
t.Fatal(e)
}
Expand Down Expand Up @@ -201,7 +203,10 @@ func TestGoMybatisSqlBuilder_BuildSql(t *testing.T) {
paramMap["endTime"] = nil
paramMap["page"] = 0
paramMap["size"] = 0
var sql, err = builder.BuildSql(paramMap, nodes)

var array = []interface{}{}

var sql, err = builder.BuildSql(paramMap, nodes, &array)
if err != nil {
t.Fatal(err)
}
Expand Down Expand Up @@ -256,7 +261,8 @@ func Benchmark_SqlBuilder_If_Element(b *testing.B) {

b.StartTimer()
for i := 0; i < b.N; i++ {
builder.BuildSql(paramMap, nodes)
var array = []interface{}{}
builder.BuildSql(paramMap, nodes, &array)
}
}

Expand Down Expand Up @@ -309,7 +315,8 @@ func Benchmark_SqlBuilder_Nested(b *testing.B) {

b.StartTimer()
for i := 0; i < b.N; i++ {
_, e := builder.BuildSql(paramMap, nodes)
var array = []interface{}{}
_, e := builder.BuildSql(paramMap, nodes, &array)
if e != nil {
b.Fatal(e)
}
Expand Down
6 changes: 5 additions & 1 deletion GoMybatisTempleteDecoder_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,11 @@ func (it *TempleteSession) QueryPrepare(sqlorArgs string, args ...interface{}) (
return nil, nil
}
func (it *TempleteSession) ExecPrepare(sqlorArgs string, args ...interface{}) (*Result, error) {
return nil, nil
var result = Result{
LastInsertId: 1,
RowsAffected: 1,
}
return &result, nil
}

func (it *TempleteSession) Rollback() error {
Expand Down
21 changes: 17 additions & 4 deletions LocalSession.go
Original file line number Diff line number Diff line change
Expand Up @@ -345,16 +345,23 @@ func (it *LocalSession) QueryPrepare(sqlPrepare string, args ...interface{}) ([]
if err != nil {
return nil, err
}
rows, err = stmt.Query(args)
rows, err = stmt.Query(args...)
err = it.dbErrorPack(err)
if err != nil {
return nil, err
}
} else {
stmt, err := it.db.Prepare(sqlPrepare)
err = it.dbErrorPack(err)
if err != nil {
return nil, err
}
rows, err = stmt.Query(args)

rows, err = stmt.Query(args...)
err = it.dbErrorPack(err)
if err != nil {
return nil, err
}
}
if rows != nil {
defer rows.Close()
Expand Down Expand Up @@ -384,16 +391,22 @@ func (it *LocalSession) ExecPrepare(sqlPrepare string, args ...interface{}) (*Re
if err != nil {
return nil, err
}
result, err = stmt.Exec(args)
result, err = stmt.Exec(args...)
err = it.dbErrorPack(err)
if err != nil {
return nil, err
}
} else {
stmt, err := it.db.Prepare(sqlPrepare)
err = it.dbErrorPack(err)
if err != nil {
return nil, err
}
result, err = stmt.Exec(args)
result, err = stmt.Exec(args...)
err = it.dbErrorPack(err)
if err != nil {
return nil, err
}
}
if err != nil {
return nil, err
Expand Down
4 changes: 2 additions & 2 deletions SessionFactorySession.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,13 +33,13 @@ func (it *SessionFactorySession) QueryPrepare(sqlorArgs string, args ...interfac
if it.Session == nil {
return nil, utils.NewError("SessionFactorySession", " can not run Id(),it.Session == nil")
}
return it.Session.QueryPrepare(sqlorArgs, args)
return it.Session.QueryPrepare(sqlorArgs, args...)
}
func (it *SessionFactorySession) ExecPrepare(sqlorArgs string, args ...interface{}) (*Result, error) {
if it.Session == nil {
return nil, utils.NewError("SessionFactorySession", " can not run Exec(),it.Session == nil")
}
return it.Session.ExecPrepare(sqlorArgs, args)
return it.Session.ExecPrepare(sqlorArgs, args...)
}

func (it *SessionFactorySession) Rollback() error {
Expand Down
2 changes: 1 addition & 1 deletion SqlBuilder.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import "github.com/zhuxiujia/GoMybatis/ast"

//sql文本构建
type SqlBuilder interface {
BuildSql(paramMap map[string]interface{}, nodes []ast.Node) (string, error)
BuildSql(paramMap map[string]interface{}, nodes []ast.Node, arg_array *[]interface{}) (string, error)
ExpressionEngineProxy() *ExpressionEngineProxy
SqlArgTypeConvert() ast.SqlArgTypeConvert
SetEnableLog(enable bool)
Expand Down
6 changes: 3 additions & 3 deletions ast/Node.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,17 +7,17 @@ import (
//sql构建抽象语法树节点
type Node interface {
Type() NodeType
Eval(env map[string]interface{}) ([]byte, error)
Eval(env map[string]interface{}, arg_array *[]interface{}) ([]byte, error)
}

//执行子所有节点
func DoChildNodes(childNodes []Node, env map[string]interface{}) ([]byte, error) {
func DoChildNodes(childNodes []Node, env map[string]interface{}, arg_array *[]interface{}) ([]byte, error) {
if childNodes == nil {
return nil, nil
}
var sql bytes.Buffer
for _, v := range childNodes {
var r, e = v.Eval(env)
var r, e = v.Eval(env, arg_array)
if e != nil {
return nil, e
}
Expand Down
4 changes: 1 addition & 3 deletions ast/NodeBind.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
package ast



type NodeBind struct {
t NodeType

Expand All @@ -15,7 +13,7 @@ func (it *NodeBind) Type() NodeType {
return NBind
}

func (it *NodeBind) Eval(env map[string]interface{}) ([]byte, error) {
func (it *NodeBind) Eval(env map[string]interface{}, arg_array *[]interface{}) ([]byte, error) {
if it.name == "" {
panic(`[GoMybatis] element <bind name = ""> name can not be nil!`)
}
Expand Down
8 changes: 3 additions & 5 deletions ast/NodeChoose.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package ast


type NodeChoose struct {
t NodeType
whenNodes []Node
Expand All @@ -11,19 +10,18 @@ func (it *NodeChoose) Type() NodeType {
return NChoose
}

func (it *NodeChoose) Eval(env map[string]interface{}) ([]byte, error) {
func (it *NodeChoose) Eval(env map[string]interface{}, arg_array *[]interface{}) ([]byte, error) {
if it.whenNodes == nil && it.otherwiseNode == nil {
return nil, nil
}
for _, v := range it.whenNodes {
var r, e = v.Eval(env)
var r, e = v.Eval(env, arg_array)
if e != nil {
return nil, e
}
if r != nil {
return r, nil
}
}
return it.otherwiseNode.Eval(env)
return it.otherwiseNode.Eval(env, arg_array)
}

9 changes: 4 additions & 5 deletions ast/NodeForEach.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ func (it *NodeForEach) Type() NodeType {
return NForEach
}

func (it *NodeForEach) Eval(env map[string]interface{}) ([]byte, error) {
func (it *NodeForEach) Eval(env map[string]interface{}, arg_array *[]interface{}) ([]byte, error) {
if it.collection == "" {
panic(`[GoMybatis] collection value can not be "" in <foreach collection=""> !`)
}
Expand Down Expand Up @@ -57,7 +57,7 @@ func (it *NodeForEach) Eval(env map[string]interface{}) ([]byte, error) {
tempArgMap[it.item] = collectionItem.Interface()
}
tempArgMap[it.index] = key
var r, err = DoChildNodes(it.childs, tempArgMap)
var r, err = DoChildNodes(it.childs, tempArgMap, arg_array)
if err != nil {
return nil, err
}
Expand All @@ -78,7 +78,7 @@ func (it *NodeForEach) Eval(env map[string]interface{}) ([]byte, error) {
if it.index != "" {
tempArgMap[it.index] = i
}
var r, err = DoChildNodes(it.childs, tempArgMap)
var r, err = DoChildNodes(it.childs, tempArgMap, arg_array)
if err != nil {
return nil, err
}
Expand All @@ -96,8 +96,7 @@ func (it *NodeForEach) Eval(env map[string]interface{}) ([]byte, error) {
newTempSql.WriteString(it.open)
newTempSql.Write(tempSqlString)
newTempSql.WriteString(it.close)
var newTempSqlBytes=newTempSql.Bytes()
var newTempSqlBytes = newTempSql.Bytes()
newTempSql.Reset()
return newTempSqlBytes, nil
}

4 changes: 2 additions & 2 deletions ast/NodeIf.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ func (it *NodeIf) Type() NodeType {
return NIf
}

func (it *NodeIf) Eval(env map[string]interface{}) ([]byte, error) {
func (it *NodeIf) Eval(env map[string]interface{}, arg_array *[]interface{}) ([]byte, error) {
if it.holder == nil {
return nil, nil
}
Expand All @@ -24,7 +24,7 @@ func (it *NodeIf) Eval(env map[string]interface{}) ([]byte, error) {
err = utils.NewError("GoMybatisSqlBuilder", "[GoMybatis] <test `", it.test, `> fail,`, err.Error())
}
if result.(bool) {
return DoChildNodes(it.childs, env)
return DoChildNodes(it.childs, env, arg_array)
}
return nil, nil
}
4 changes: 2 additions & 2 deletions ast/NodeInclude.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ func (it *NodeInclude) Type() NodeType {
return NInclude
}

func (it *NodeInclude) Eval(env map[string]interface{}) ([]byte, error) {
var sql, err = DoChildNodes(it.childs, env)
func (it *NodeInclude) Eval(env map[string]interface{}, arg_array *[]interface{}) ([]byte, error) {
var sql, err = DoChildNodes(it.childs, env, arg_array)
return sql, err
}
Loading

0 comments on commit 7dbaceb

Please sign in to comment.