Skip to content

Commit

Permalink
fix postgres and oracle fmt placeholder
Browse files Browse the repository at this point in the history
  • Loading branch information
edison committed Jun 3, 2020
1 parent a788f01 commit a4b3389
Show file tree
Hide file tree
Showing 11 changed files with 80 additions and 19 deletions.
8 changes: 7 additions & 1 deletion ast/NodeConfigHolder.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,13 @@
package ast


type NodeConfigHolder struct {
Proxy ExpressionEngine
Convert SqlArgTypeConvert
Proxy ExpressionEngine
}

func (it *NodeConfigHolder) GetSqlArgTypeConvert() SqlArgTypeConvert {
return it.Convert
}

func (it *NodeConfigHolder) GetExpressionEngineProxy() ExpressionEngine {
Expand Down
2 changes: 1 addition & 1 deletion ast/NodeString.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ func (it *NodeString) Eval(env map[string]interface{}, arg_array *[]interface{},
var data = it.value
var err error
if it.expressMap != nil {
data, err = Replace(it.expressMap, data, env, it.holder.GetExpressionEngineProxy(), arg_array, stmtConvert)
data, err = Replace(it.expressMap, data, it.holder.Convert, env, it.holder.GetExpressionEngineProxy(), arg_array, stmtConvert)
if err != nil {
return nil, err
}
Expand Down
3 changes: 2 additions & 1 deletion ast/RegexReplaceArg.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import (
)

//执行替换操作
func Replace(findStrs []string, data string, arg map[string]interface{}, engine ExpressionEngine, arg_array *[]interface{}, indexConvert stmt.StmtIndexConvert) (string, error) {
func Replace(findStrs []string, data string, typeConvert SqlArgTypeConvert, arg map[string]interface{}, engine ExpressionEngine, arg_array *[]interface{}, indexConvert stmt.StmtIndexConvert) (string, error) {
for index, findStr := range findStrs {

//find param arg
Expand All @@ -26,6 +26,7 @@ func Replace(findStrs []string, data string, arg map[string]interface{}, engine
*arg_array = append(*arg_array, evalData)
}
//replace index
indexConvert.Inc()
data = strings.Replace(data, "#{"+findStr+"}", indexConvert.Convert(index), -1)
}
return data, nil
Expand Down
10 changes: 9 additions & 1 deletion stmt/MysqlStmtIndexConvertImpl.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,14 @@ package stmt
type MysqlStmtIndexConvertImpl struct {
}

func (it *MysqlStmtIndexConvertImpl) Convert(index int) string {
func (it *MysqlStmtIndexConvertImpl) Convert() string {
return " ? "
}

func (it *MysqlStmtIndexConvertImpl)Inc() {

}

func (it *MysqlStmtIndexConvertImpl)Get()int {
return 0
}
2 changes: 1 addition & 1 deletion stmt/MysqlStmtIndexConvertImpl_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import "testing"

func TestMysqlStmtIndexConvertImpl_Convert(t *testing.T) {
var convert = MysqlStmtIndexConvertImpl{}
if " ? " != convert.Convert(0) {
if " ? " != convert.Convert() {
panic("TestMysqlStmtIndexConvertImpl_Convert fail")
}
}
23 changes: 20 additions & 3 deletions stmt/OracleStmtIndexConvertImpl.go
Original file line number Diff line number Diff line change
@@ -1,10 +1,27 @@
package stmt

import "fmt"
import (
"fmt"
"sync"
)

type OracleStmtIndexConvertImpl struct {
sync.RWMutex
Counter int
}

func (it *OracleStmtIndexConvertImpl) Convert(index int) string {
return fmt.Sprint(" :val", index+1, " ")
func (it *OracleStmtIndexConvertImpl) Convert() string {
return fmt.Sprint(" :val", it.Get(), " ")
}

func (it *OracleStmtIndexConvertImpl) Inc() {
it.Lock()
defer it.Unlock()
it.Counter++
}

func (it *OracleStmtIndexConvertImpl) Get() int {
it.RLock()
defer it.RUnlock()
return it.Counter
}
5 changes: 3 additions & 2 deletions stmt/OracleStmtIndexConvertImpl_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,9 @@ package stmt
import "testing"

func TestOracleStmtIndexConvertImpl_Convert(t *testing.T) {
var convert = OracleStmtIndexConvertImpl{}
if " :val1 " != convert.Convert(0) {
var convert = &OracleStmtIndexConvertImpl{}
convert.Inc()
if " :val1 " != convert.Convert() {
panic("TestOracleStmtIndexConvertImpl_Convert fail")
}
}
23 changes: 20 additions & 3 deletions stmt/PostgreStmtIndexConvertImpl.go
Original file line number Diff line number Diff line change
@@ -1,10 +1,27 @@
package stmt

import "fmt"
import (
"fmt"
"sync"
)

type PostgreStmtIndexConvertImpl struct {
sync.RWMutex
Counter int
}

func (it *PostgreStmtIndexConvertImpl) Convert(index int) string {
return fmt.Sprint(" $", index+1, " ")
func (p *PostgreStmtIndexConvertImpl) Inc() {
p.Lock()
defer p.Unlock()
p.Counter++
}

func (p *PostgreStmtIndexConvertImpl) Get() int {
p.RLock()
defer p.RUnlock()
return p.Counter
}

func (p *PostgreStmtIndexConvertImpl) Convert() string {
return fmt.Sprint(" $", p.Get(), " ")
}
6 changes: 4 additions & 2 deletions stmt/PostgreStmtIndexConvertImpl_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,10 @@ package stmt
import "testing"

func TestPostgreStmtIndexConvertImpl_Convert(t *testing.T) {
var convert = PostgreStmtIndexConvertImpl{}
if " $1 " != convert.Convert(0) {
var convert = &PostgreStmtIndexConvertImpl{}
convert.Inc()
convert.Inc()
if " $2 " != convert.Convert() {
panic("TestPostgreStmtIndexConvertImpl_Convert fail")
}
}
4 changes: 3 additions & 1 deletion stmt/StmtIndexConvert.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,7 @@ package stmt
// oracle : input 0 -> :val1
// sqlite: input 0 -> " ? "
type StmtIndexConvert interface {
Convert(index int) string
Convert() string
Inc()
Get()int
}
13 changes: 10 additions & 3 deletions stmt/StmtIndexConvertFactory.go
Original file line number Diff line number Diff line change
@@ -1,16 +1,23 @@
package stmt

import "fmt"
import (
"fmt"
"sync"
)

// build a stmt convert
func BuildStmtConvert(driverType string) (StmtIndexConvert, error) {
switch driverType {
case "mysql", "mymysql", "mssql", "sqlite3":
return &MysqlStmtIndexConvertImpl{}, nil
case "postgres":
return &PostgreStmtIndexConvertImpl{}, nil
return &PostgreStmtIndexConvertImpl{
sync.RWMutex{},
0,
}, nil
case "oci8":
return &OracleStmtIndexConvertImpl{}, nil
return &OracleStmtIndexConvertImpl{sync.RWMutex{},
0}, nil
default:
panic(fmt.Sprint("[GoMybatis] un support dbName:", driverType, " only support: ", "mysql,", "mymysql,", "mssql,", "sqlite3,", "postgres,", "oci8"))
}
Expand Down

0 comments on commit a4b3389

Please sign in to comment.