diff --git a/GoMybatis.go b/GoMybatis.go index 79303c8..af02891 100644 --- a/GoMybatis.go +++ b/GoMybatis.go @@ -10,30 +10,60 @@ import ( //如果使用WriteMapperByEngine(),则内建默认的SessionFactory var DefaultSessionFactory *SessionFactory -//根据sessionEngine写入到mapperPtr -func WriteMapperByEngine(value reflect.Value, xml []byte, sessionEngine *SessionEngine, enableLog bool) { +var DefaultExpressionTypeConvert ExpressionTypeConvert + +var DefaultSqlArgTypeConvert SqlArgTypeConvert + +var DefaultExpressionEngine ExpressionEngine + +var DefaultSqlBuilder SqlBuilder + +var DefaultSqlResultDecoder SqlResultDecoder + +var DefaultLog Log + +//推荐默认使用单例传入 +//根据sessionEngine写入到mapperPtr,value:指向mapper指针反射对象,xml:xml数据,sessionEngine:session引擎,enableLog:是否允许日志输出,log:日志实现 +func WriteMapperByEngine(value reflect.Value, xml []byte, sessionEngine *SessionEngine, enableLog bool, log Log) { if value.Kind() != reflect.Ptr { panic("UseMapper: UseMapper arg must be a pointer") } - var factory = SessionFactory{}.New(sessionEngine) if DefaultSessionFactory == nil { + var factory = SessionFactory{}.New(sessionEngine) DefaultSessionFactory = &factory } - var expressConvert=GoMybatisExpressionTypeConvert{} - var sqlConvert=GoMybatisSqlArgTypeConvert{} - var expressionEngine = ExpressionEngineProxy{}.New(&ExpressionEngineExpr{},true) - var sqlBuilder=GoMybatisSqlBuilder{}.New(expressConvert,sqlConvert, expressionEngine,&LogStandard{},enableLog) - var decoder = GoMybatisSqlResultDecoder{} - WriteMapper(value, xml, DefaultSessionFactory, decoder,sqlBuilder,enableLog) + if DefaultExpressionTypeConvert == nil { + DefaultExpressionTypeConvert = GoMybatisExpressionTypeConvert{} + } + if DefaultSqlArgTypeConvert == nil { + DefaultSqlArgTypeConvert = GoMybatisSqlArgTypeConvert{} + } + if DefaultExpressionEngine == nil { + DefaultExpressionEngine = &ExpressionEngineExpr{} + } + var expressionEngineProxy = ExpressionEngineProxy{}.New(DefaultExpressionEngine, true) + if log == nil { + DefaultLog = &LogStandard{} + } else { + DefaultLog = log + } + if DefaultSqlBuilder == nil { + DefaultSqlBuilder = GoMybatisSqlBuilder{}.New(DefaultExpressionTypeConvert, DefaultSqlArgTypeConvert, expressionEngineProxy, DefaultLog, enableLog) + } + if DefaultSqlResultDecoder == nil { + DefaultSqlResultDecoder = GoMybatisSqlResultDecoder{} + } + WriteMapper(value, xml, DefaultSessionFactory, DefaultSqlResultDecoder, DefaultSqlBuilder, enableLog) } -//根据sessionEngine写入到mapperPtr -func WriteMapperPtrByEngine(ptr interface{}, xml []byte, sessionEngine *SessionEngine, enableLog bool) { +//推荐默认使用单例传入 +//根据sessionEngine写入到mapperPtr,ptr:指向mapper指针,xml:xml数据,sessionEngine:session引擎,enableLog:是否允许日志输出,log:日志实现 +func WriteMapperPtrByEngine(ptr interface{}, xml []byte, sessionEngine *SessionEngine, enableLog bool, log Log) { v := reflect.ValueOf(ptr) if v.Kind() != reflect.Ptr { panic("UseMapper: UseMapper arg must be a pointer") } - WriteMapperByEngine(v, xml, sessionEngine, enableLog) + WriteMapperByEngine(v, xml, sessionEngine, enableLog, log) } //写入方法内容,例如 @@ -48,7 +78,7 @@ func WriteMapperPtrByEngine(ptr interface{}, xml []byte, sessionEngine *SessionE //func的结构体参数无需指定mapperParams的tag,框架会自动扫描它的属性,封装为map处理掉 //使用WriteMapper函数设置代理后即可正常使用。 func WriteMapper(bean reflect.Value, xml []byte, sessionFactory *SessionFactory, decoder SqlResultDecoder, sqlBuilder SqlBuilder, enableLog bool) { - beanCheck(bean,sqlBuilder) + beanCheck(bean, sqlBuilder) var mapperTree = LoadMapperXml(xml) //make a map[method]xml var methodXmlMap = makeMethodXmlMap(bean, mapperTree) @@ -91,7 +121,7 @@ func WriteMapper(bean reflect.Value, xml []byte, sessionFactory *SessionFactory, } //check beans -func beanCheck(value reflect.Value,builder SqlBuilder) { +func beanCheck(value reflect.Value, builder SqlBuilder) { var t = value.Type() if t.Kind() == reflect.Ptr { t = t.Elem() @@ -105,7 +135,7 @@ func beanCheck(value reflect.Value,builder SqlBuilder) { var customLen = 0 for argIndex := 0; argIndex < fieldItem.Type.NumIn(); argIndex++ { var inType = fieldItem.Type.In(argIndex) - if builder.ExpressionEngineProxy().Name()=="ExpressionEngineGovaluate" && inType.Kind() == reflect.Ptr && inType.String() != GoMybatis_Session_Ptr { + if builder.ExpressionEngineProxy().Name() == "ExpressionEngineGovaluate" && inType.Kind() == reflect.Ptr && inType.String() != GoMybatis_Session_Ptr { panic(`[GoMybats] ` + fieldItem.Name + `() arg = ` + inType.String() + ` can not be a ptr ! must delete '*'!`) } if isCustomStruct(inType) { diff --git a/GoMybatisEngine_test.go b/GoMybatisEngine_test.go index fefe76c..f13367e 100644 --- a/GoMybatisEngine_test.go +++ b/GoMybatisEngine_test.go @@ -206,6 +206,6 @@ func InitMapperByLocalSession() ExampleActivityMapperImpl { `) var exampleActivityMapperImpl ExampleActivityMapperImpl //设置对应的mapper xml文件,禁止输出日志 - WriteMapperPtrByEngine(&exampleActivityMapperImpl, bytes, engine, false) + WriteMapperPtrByEngine(&exampleActivityMapperImpl, bytes, engine, false,nil) return exampleActivityMapperImpl } diff --git a/Log.go b/Log.go index 7fbc82f..4a1d890 100644 --- a/Log.go +++ b/Log.go @@ -1,5 +1,6 @@ package GoMybatis type Log interface { - Println(messages []byte) + QueueLen() int//日志消息队列长度 + Println(messages []byte)//日志输出方法实现 } diff --git a/LogStandard.go b/LogStandard.go index 6be9e23..da77ffa 100644 --- a/LogStandard.go +++ b/LogStandard.go @@ -3,9 +3,15 @@ package GoMybatis import "log" type LogStandard struct { - PrintlnFunc func(v []byte) + PrintlnFunc func(messages []byte)//日志输出方法实现 } +//日志消息队列长度 +func (this *LogStandard) QueueLen() int { + //默认50万个日志消息缓存队列 + return 500000 +} +//日志输出方法实现 func (this *LogStandard) Println(v []byte) { if this.PrintlnFunc != nil { this.PrintlnFunc(v) diff --git a/LogSystem.go b/LogSystem.go index 19161fb..4a896fc 100644 --- a/LogSystem.go +++ b/LogSystem.go @@ -3,25 +3,16 @@ package GoMybatis import ( "bytes" "github.com/zhuxiujia/GoMybatis/utils" - "time" -) - -type LogMode int - -const ( - Log_Mode_async LogMode = iota //异步,非实时 - Log_Mode_Real_Time //同步,实时 ) type LogSystem struct { log Log logChan chan []byte started bool - mode LogMode } //logImpl:日志实现类,queueLen:消息队列缓冲长度 -func (this LogSystem) New(logImpl Log, queueLen int, mode LogMode) (LogSystem, error) { +func (this LogSystem) New(logImpl Log, queueLen int) (LogSystem, error) { if this.started == true { return this, utils.NewError("LogSystem", "log system is started!") } @@ -30,8 +21,6 @@ func (this LogSystem) New(logImpl Log, queueLen int, mode LogMode) (LogSystem, e } this.logChan = make(chan []byte, queueLen) this.log = logImpl - this.mode = mode - //启动接受者 go this.receiver() this.started = true @@ -61,12 +50,6 @@ func (this *LogSystem) SendLog(logs ...string) error { //日志接受者 func (this *LogSystem) receiver() error { for { - if this.mode == Log_Mode_async { - //非实时,加延迟,出让cpu时间片,否则日志占用cpu过多将拖慢系统 - time.Sleep(50 * time.Millisecond) - } else if this.mode == Log_Mode_Real_Time { - //实时,直接执行操作 - } logs := <-this.logChan this.log.Println(logs) } diff --git a/LogSystem_test.go b/LogSystem_test.go index 753015d..c6e59fe 100644 --- a/LogSystem_test.go +++ b/LogSystem_test.go @@ -14,7 +14,7 @@ func TestLogSystem_SendLog(t *testing.T) { endChan <- 1 }, } - var system, err = LogSystem{}.New(&stdLog, 1000000, Log_Mode_async) + var system, err = LogSystem{}.New(&stdLog, 1000000) if err != nil { t.Fatal(err) } @@ -35,7 +35,7 @@ func TestLogSystem_Close(t *testing.T) { endChan <- 1 }, } - var system, err = LogSystem{}.New(&stdLog, 1000000, Log_Mode_async) + var system, err = LogSystem{}.New(&stdLog, 1000000) if err != nil { t.Fatal(err) } diff --git a/SqlBuilder.go b/SqlBuilder.go index 3171f5c..4a0118e 100644 --- a/SqlBuilder.go +++ b/SqlBuilder.go @@ -41,7 +41,7 @@ func (this GoMybatisSqlBuilder) New(ExpressionTypeConvert ExpressionTypeConvert, this.expressionEngineProxy = expressionEngine this.enableLog = enableLog if enableLog { - var logSystem, err = LogSystem{}.New(log, 1000, Log_Mode_async) + var logSystem, err = LogSystem{}.New(log, log.QueueLen()) if err != nil { panic(err) } diff --git a/example/Example_test.go b/example/Example_test.go index 79f11b7..2923c7f 100644 --- a/example/Example_test.go +++ b/example/Example_test.go @@ -48,7 +48,7 @@ func init() { bytes, _ := ioutil.ReadAll(file) //设置对应的mapper xml文件 - GoMybatis.WriteMapperPtrByEngine(&exampleActivityMapper, bytes, engine, true) + GoMybatis.WriteMapperPtrByEngine(&exampleActivityMapper, bytes, engine, true,nil) } //插入