Skip to content

Commit

Permalink
add callback chan
Browse files Browse the repository at this point in the history
  • Loading branch information
zhuxiujia committed Apr 18, 2019
1 parent 391e48d commit 06e5596
Show file tree
Hide file tree
Showing 4 changed files with 53 additions and 37 deletions.
40 changes: 18 additions & 22 deletions GoMybatis.go
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ func WriteMapper(bean reflect.Value, xml []byte, sessionFactory *SessionFactory,
var returnTypeMap = makeReturnTypeMap(bean.Elem().Type())
var beanName = bean.Type().PkgPath() + bean.Type().String()

UseMapperValue(bean, func(funcField reflect.StructField) func(args []reflect.Value, tagArgs []TagArg) []reflect.Value {
UseMapperValue(bean, func(funcField reflect.StructField) func(arg ProxyArg) []reflect.Value {
//构建期
var funcName = funcField.Name
var returnType = returnTypeMap[funcName]
Expand All @@ -80,7 +80,7 @@ func WriteMapper(bean reflect.Value, xml []byte, sessionFactory *SessionFactory,

//执行期
if funcName == NewSessionFunc {
var proxyFunc = func(args []reflect.Value, tagArgs []TagArg) []reflect.Value {
var proxyFunc = func(arg ProxyArg) []reflect.Value {
var returnValue *reflect.Value = nil
//build return Type
if returnType.ReturnOutType != nil {
Expand All @@ -100,7 +100,7 @@ func WriteMapper(bean reflect.Value, xml []byte, sessionFactory *SessionFactory,
}
return proxyFunc
} else {
var proxyFunc = func(args []reflect.Value, tagArgs []TagArg) []reflect.Value {
var proxyFunc = func(arg ProxyArg) []reflect.Value {
var returnValue *reflect.Value = nil
//build return Type
if returnType.ReturnOutType != nil {
Expand All @@ -114,7 +114,7 @@ func WriteMapper(bean reflect.Value, xml []byte, sessionFactory *SessionFactory,
returnValue = &returnV
}
//exe sql
var e = exeMethodByXml(mapper.xml.Tag, beanName, sessionFactory, tagArgs, args, mapper.nodes, resultMap, returnValue, decoder, sqlBuilder,callBackChain)
var e = exeMethodByXml(mapper.xml.Tag, beanName, sessionFactory, arg, mapper.nodes, resultMap, returnValue, decoder, sqlBuilder,callBackChain)
return buildReturnValues(returnType, returnValue, e)
}
return proxyFunc
Expand Down Expand Up @@ -318,12 +318,12 @@ func findMapperXml(mapperTree map[string]etree.Token, methodName string) *etree.
return nil
}

func exeMethodByXml(elementType ElementType, beanName string, sessionFactory *SessionFactory, tagParamMap []TagArg, args []reflect.Value, nodes []ast.Node, resultMap map[string]*ResultProperty, returnValue *reflect.Value, decoder SqlResultDecoder, sqlBuilder SqlBuilder, callBackChain []*CallBack) error {
func exeMethodByXml(elementType ElementType, beanName string, sessionFactory *SessionFactory, proxyArg ProxyArg, nodes []ast.Node, resultMap map[string]*ResultProperty, returnValue *reflect.Value, decoder SqlResultDecoder, sqlBuilder SqlBuilder, callBackChain []*CallBack) error {
//TODO CallBack and Session must Location in build step!
var session Session
var sql string
var err error
session, sql, err = buildSql(tagParamMap, args, nodes, sqlBuilder)
session, sql, err = buildSql(proxyArg, nodes, sqlBuilder)
if err != nil {
return err
}
Expand All @@ -343,15 +343,15 @@ func exeMethodByXml(elementType ElementType, beanName string, sessionFactory *Se
if callBackChain != nil {
for _, item := range callBackChain {
if item != nil && item.BeforeQuery != nil {
item.BeforeQuery(args, &sql)
item.BeforeQuery(proxyArg.Args, &sql)
}
}
}
results, err := session.Query(sql)
if callBackChain != nil {
for _, item := range callBackChain {
if item != nil && item.AfterQuery != nil {
item.AfterQuery(args, sql, &results, &err)
item.AfterQuery(proxyArg.Args, sql, &results, &err)
}
}
}
Expand All @@ -366,15 +366,15 @@ func exeMethodByXml(elementType ElementType, beanName string, sessionFactory *Se
if callBackChain != nil {
for _, item := range callBackChain {
if item != nil && item.BeforeExec != nil {
item.BeforeExec(args, &sql)
item.BeforeExec(proxyArg.Args, &sql)
}
}
}
var res, err = session.Exec(sql)
if callBackChain != nil {
for _, item := range callBackChain {
if item != nil && item.AfterExec != nil {
item.AfterExec(args, sql, res, &err)
item.AfterExec(proxyArg.Args, sql, res, &err)
}
}
}
Expand All @@ -396,14 +396,14 @@ func closeSession(factory *SessionFactory, session Session) {
session.Close()
}

func buildSql(tagArgs []TagArg, args []reflect.Value, nodes []ast.Node, sqlBuilder SqlBuilder) (Session, string, error) {
func buildSql(proxyArg ProxyArg, nodes []ast.Node, sqlBuilder SqlBuilder) (Session, string, error) {
var session Session
var paramMap = make(map[string]interface{})
var tagArgsLen = len(tagArgs)
var argsLen = len(args) //参数长度,除session参数外。
var tagArgsLen = proxyArg.TagArgsLen
var argsLen = proxyArg.ArgsLen //参数长度,除session参数外。
var customLen = 0
var customIndex = -1
for argIndex, arg := range args {
for argIndex, arg := range proxyArg.Args {
var argInterface = arg.Interface()
if arg.Kind() == reflect.Ptr && arg.IsNil() == false && argInterface != nil && arg.Type().String() == GoMybatis_Session_Ptr {
session = *(argInterface.(*Session))
Expand All @@ -424,23 +424,19 @@ func buildSql(tagArgs []TagArg, args []reflect.Value, nodes []ast.Node, sqlBuild
tagArgsLen--
}
}
if tagArgsLen > 0 && argIndex < tagArgsLen && tagArgs[argIndex].Name != "" {
if tagArgsLen > 0 && argIndex < tagArgsLen && proxyArg.TagArgs[argIndex].Name != "" {
//插入2份参数,兼容大小写不敏感的参数
var lowerKey = utils.LowerFieldFirstName(tagArgs[argIndex].Name)
var upperKey = utils.UpperFieldFirstName(tagArgs[argIndex].Name)
var lowerKey = utils.LowerFieldFirstName(proxyArg.TagArgs[argIndex].Name)
var upperKey = utils.UpperFieldFirstName(proxyArg.TagArgs[argIndex].Name)
paramMap[lowerKey] = argInterface
paramMap[upperKey] = argInterface
//paramMap["type_"+lowerKey] = arg.Type()
//paramMap["type_"+upperKey] = arg.Type()
} else {
paramMap[DefaultOneArg] = argInterface
//paramMap["type_"+DefaultOneArg] = arg.Type()

}
}
if customLen == 1 && customIndex != -1 {
//只有一个结构体参数,需要展开它的成员变量 加入到map
paramMap = scanStructArgFields(args[customIndex], nil)
paramMap = scanStructArgFields(proxyArg.Args[customIndex], nil)
}

result, err := sqlBuilder.BuildSql(paramMap, nodes)
Expand Down
10 changes: 5 additions & 5 deletions GoMybatisProxy.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ type TagArg struct {
}

// UseService 可写入每个函数代理方法
func UseMapper(mapper interface{}, buildFunc func(funcField reflect.StructField) func(args []reflect.Value, tagArgs []TagArg) []reflect.Value) {
func UseMapper(mapper interface{}, buildFunc func(funcField reflect.StructField) func(arg ProxyArg) []reflect.Value) {
v := reflect.ValueOf(mapper)
if v.Kind() != reflect.Ptr {
panic("UseMapper: UseMapper arg must be a pointer")
Expand All @@ -20,11 +20,11 @@ func UseMapper(mapper interface{}, buildFunc func(funcField reflect.StructField)
}

// UseService 可写入每个函数代理方法
func UseMapperValue(mapperValue reflect.Value, buildFunc func(funcField reflect.StructField) func(args []reflect.Value, tagArgs []TagArg) []reflect.Value) {
func UseMapperValue(mapperValue reflect.Value, buildFunc func(funcField reflect.StructField) func(arg ProxyArg) []reflect.Value) {
buildMapper(mapperValue, buildFunc)
}

func buildMapper(v reflect.Value, buildFunc func(funcField reflect.StructField) func(args []reflect.Value, tagArgs []TagArg) []reflect.Value) {
func buildMapper(v reflect.Value, buildFunc func(funcField reflect.StructField) func(arg ProxyArg) []reflect.Value) {
if v.Kind() == reflect.Ptr {
v = v.Elem()
}
Expand Down Expand Up @@ -63,7 +63,7 @@ func buildMapper(v reflect.Value, buildFunc func(funcField reflect.StructField)
}
}

func buildRemoteMethod(source reflect.Value,f reflect.Value, ft reflect.Type, sf reflect.StructField, proxyFunc func(args []reflect.Value, tagArgs []TagArg) []reflect.Value) {
func buildRemoteMethod(source reflect.Value,f reflect.Value, ft reflect.Type, sf reflect.StructField, proxyFunc func(arg ProxyArg) []reflect.Value) {
var tagParams []string
var mapperParams = sf.Tag.Get(`mapperParams`)
if mapperParams != `` {
Expand All @@ -88,7 +88,7 @@ func buildRemoteMethod(source reflect.Value,f reflect.Value, ft reflect.Type, sf
panic(`[GoMybatisProxy] method fail! the tag "mapperParams" length != args length ! filed = ` + sf.Name)
}
var fn = func(args []reflect.Value) (results []reflect.Value) {
proxyResults := proxyFunc(args, tagArgs)
proxyResults := proxyFunc(ProxyArg{}.New(tagArgs,args))
for _, returnV := range proxyResults {
results = append(results, returnV)
}
Expand Down
20 changes: 10 additions & 10 deletions GoMybatisProxy_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,17 +12,17 @@ type TestMapper struct {

func TestUseMapperValue(t *testing.T) {
var test = TestMapper{}
UseMapperValue(reflect.ValueOf(&test), func(funcField reflect.StructField) func(args []reflect.Value, tagArgs []TagArg) []reflect.Value {
return func(args []reflect.Value, tagArgs []TagArg) []reflect.Value {
if len(args) <= 0 {
UseMapperValue(reflect.ValueOf(&test), func(funcField reflect.StructField) func(arg ProxyArg) []reflect.Value {
return func(arg ProxyArg) []reflect.Value {
if len(arg.Args) <= 0 {
t.Fatal("UseMapper() args len = 0")
}
if len(tagArgs) <= 0 {
if len(arg.TagArgs) <= 0 {
t.Fatal("UseMapper() tagArgs len = 0")
}
var e error
var returns = make([]reflect.Value, 0)
returns = append(returns, reflect.ValueOf("yes return string="+args[0].Interface().(string)))
returns = append(returns, reflect.ValueOf("yes return string="+arg.Args[0].Interface().(string)))
returns = append(returns, reflect.Zero(reflect.TypeOf(&e).Elem()))
return returns
}
Expand All @@ -37,17 +37,17 @@ func TestUseMapperValue(t *testing.T) {

func TestUseMapper(t *testing.T) {
var test = TestMapper{}
UseMapper(&test, func(funcField reflect.StructField) func(args []reflect.Value, tagArgs []TagArg) []reflect.Value {
return func(args []reflect.Value, tagArgs []TagArg) []reflect.Value {
if len(args) <= 0 {
UseMapper(&test, func(funcField reflect.StructField) func(arg ProxyArg) []reflect.Value {
return func(arg ProxyArg) []reflect.Value {
if len(arg.Args) <= 0 {
t.Fatal("UseMapper() args len = 0")
}
if len(tagArgs) <= 0 {
if len(arg.TagArgs) <= 0 {
t.Fatal("UseMapper() tagArgs len = 0")
}
var e error
var returns = make([]reflect.Value, 0)
returns = append(returns, reflect.ValueOf("yes return string="+args[0].Interface().(string)))
returns = append(returns, reflect.ValueOf("yes return string="+arg.Args[0].Interface().(string)))
returns = append(returns, reflect.Zero(reflect.TypeOf(&e).Elem()))
return returns
}
Expand Down
20 changes: 20 additions & 0 deletions ProxyArg.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package GoMybatis

import "reflect"

//代理数据
type ProxyArg struct {
TagArgs []TagArg
TagArgsLen int
Args []reflect.Value
ArgsLen int
}

func (it ProxyArg)New(tagArgs []TagArg,args []reflect.Value) ProxyArg {
return ProxyArg{
TagArgs:tagArgs,
Args:args,
TagArgsLen: len(tagArgs),
ArgsLen: len(args),
}
}

0 comments on commit 06e5596

Please sign in to comment.