package container
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"reflect"
|
|
)
|
|
|
|
type NewTransactionBroker struct {
|
|
// 调用器
|
|
caller Caller
|
|
// 会话
|
|
session *Session
|
|
}
|
|
|
|
func (broker *NewTransactionBroker) Call(in []reflect.Value) []reflect.Value {
|
|
// 从接口获取方法,Receiver不算作入参
|
|
if len(in) < 1 {
|
|
// Todo Log
|
|
return []reflect.Value{reflect.ValueOf(errors.New(fmt.Sprintf("参数长度错误!")))}
|
|
}
|
|
firstParameter := in[0]
|
|
switch firstParameter.Kind() {
|
|
case reflect.Ptr:
|
|
if firstParameter.Type() != xormSessionType {
|
|
// Todo Log
|
|
return []reflect.Value{reflect.ValueOf(errors.New(fmt.Sprintf("第一个参数类型不正确!")))}
|
|
}
|
|
if !firstParameter.IsNil() {
|
|
// Todo Log
|
|
return []reflect.Value{reflect.ValueOf(errors.New(fmt.Sprintf("第一个参数已经赋值!")))}
|
|
}
|
|
break
|
|
case reflect.Invalid:
|
|
break
|
|
default:
|
|
// Todo Log
|
|
return []reflect.Value{reflect.ValueOf(errors.New(fmt.Sprintf("第一个参数类型不正确!")))}
|
|
}
|
|
transactionHandler, err := broker.session.transactionHandlerFactory.Create()
|
|
if err != nil {
|
|
return []reflect.Value{reflect.ValueOf(err)}
|
|
}
|
|
defer transactionHandler.Close()
|
|
in[0] = reflect.ValueOf(transactionHandler.Session())
|
|
if err := transactionHandler.Begin(); err != nil {
|
|
// Todo Log
|
|
return []reflect.Value{reflect.ValueOf(err)}
|
|
}
|
|
out := broker.caller(in)
|
|
lastReturnValue := out[len(out)-1]
|
|
if lastReturnValue.Kind() == reflect.Invalid {
|
|
if err := transactionHandler.Commit(); err != nil {
|
|
// Todo Log
|
|
return []reflect.Value{reflect.ValueOf(err)}
|
|
}
|
|
}
|
|
return out
|
|
}
|