@@ -19,11 +19,15 @@ import (
1919)
2020
2121type SessionManager struct {
22- factory factory.Factory
22+ factory factory.Factory
23+ ParserFactory ParserFactory
2324}
2425
2526func NewSessionManager (factory factory.Factory ) * SessionManager {
26- return & SessionManager {factory : factory }
27+ return & SessionManager {
28+ factory : factory ,
29+ ParserFactory : DynamicParserFactory ,
30+ }
2731}
2832
2933type Runner interface {
@@ -41,10 +45,11 @@ type Runner interface {
4145}
4246
4347type Session struct {
44- ctx context.Context
45- log logging.LogFunc
46- session session.SqlSession
47- driver string
48+ ctx context.Context
49+ log logging.LogFunc
50+ session session.SqlSession
51+ driver string
52+ ParserFactory ParserFactory
4853}
4954
5055type BaseRunner struct {
@@ -79,13 +84,19 @@ type DeleteRunner struct {
7984//使用一个session操作数据库
8085func (this * SessionManager ) NewSession () * Session {
8186 return & Session {
82- ctx : context .Background (),
83- log : this .factory .LogFunc (),
84- session : this .factory .CreateSession (),
85- driver : this .factory .GetDataSource ().DriverName (),
87+ ctx : context .Background (),
88+ log : this .factory .LogFunc (),
89+ session : this .factory .CreateSession (),
90+ driver : this .factory .GetDataSource ().DriverName (),
91+ ParserFactory : this .ParserFactory ,
8692 }
8793}
8894
95+ //修改sql解析器创建者
96+ func (this * SessionManager ) SetParserFactory (fac ParserFactory ) {
97+ this .ParserFactory = fac
98+ }
99+
89100func (this * Session ) SetContext (ctx context.Context ) * Session {
90101 this .ctx = ctx
91102 return this
@@ -95,6 +106,11 @@ func (this *Session) GetContext() context.Context {
95106 return this .ctx
96107}
97108
109+ //修改sql解析器创建者
110+ func (this * Session ) SetParserFactory (fac ParserFactory ) {
111+ this .ParserFactory = fac
112+ }
113+
98114//开启事务执行语句
99115//返回nil则提交,返回error回滚
100116//抛出异常错误触发回滚
@@ -115,19 +131,19 @@ func (this *Session) Tx(txFunc func(session *Session) error) {
115131}
116132
117133func (this * Session ) Select (sql string ) Runner {
118- return this .createSelect (FindSqlParser (sql ))
134+ return this .createSelect (this . findSqlParser (sql ))
119135}
120136
121137func (this * Session ) Update (sql string ) Runner {
122- return this .createUpdate (FindSqlParser (sql ))
138+ return this .createUpdate (this . findSqlParser (sql ))
123139}
124140
125141func (this * Session ) Delete (sql string ) Runner {
126- return this .createDelete (FindSqlParser (sql ))
142+ return this .createDelete (this . findSqlParser (sql ))
127143}
128144
129145func (this * Session ) Insert (sql string ) Runner {
130- return this .createInsert (FindSqlParser (sql ))
146+ return this .createInsert (this . findSqlParser (sql ))
131147}
132148
133149func (this * BaseRunner ) Param (params ... interface {}) Runner {
@@ -143,6 +159,11 @@ func (this *BaseRunner) Param(params ...interface{}) Runner {
143159 // }
144160 //}
145161
162+ if this .sqlParser == nil {
163+ this .log (logging .WARN , errors .PARSE_PARSER_NIL_ERROR .Error ())
164+ return this
165+ }
166+
146167 md , err := this .sqlParser .ParseMetadata (this .driver , params ... )
147168
148169 if err == nil {
@@ -152,7 +173,7 @@ func (this *BaseRunner) Param(params ...interface{}) Runner {
152173 this .log (logging .WARN , "sql action not match expect %s get %s" , this .action , md .Action )
153174 }
154175 } else {
155- this .log (logging .WARN , "%s" , err .Error ())
176+ this .log (logging .WARN , err .Error ())
156177 }
157178 return this .this
158179}
@@ -232,7 +253,7 @@ func (this *BaseRunner) LastInsertId() int64 {
232253 return - 1
233254}
234255
235- func (this * Session )createSelect (parser sqlparser.SqlParser ) Runner {
256+ func (this * Session ) createSelect (parser sqlparser.SqlParser ) Runner {
236257 ret := & SelectRunner {}
237258 ret .action = sqlparser .SELECT
238259 ret .log = this .log
@@ -244,7 +265,7 @@ func (this *Session)createSelect(parser sqlparser.SqlParser) Runner {
244265 return ret
245266}
246267
247- func (this * Session )createUpdate (parser sqlparser.SqlParser ) Runner {
268+ func (this * Session ) createUpdate (parser sqlparser.SqlParser ) Runner {
248269 ret := & UpdateRunner {}
249270 ret .action = sqlparser .UPDATE
250271 ret .log = this .log
@@ -256,7 +277,7 @@ func (this *Session)createUpdate(parser sqlparser.SqlParser) Runner {
256277 return ret
257278}
258279
259- func (this * Session )createDelete (parser sqlparser.SqlParser ) Runner {
280+ func (this * Session ) createDelete (parser sqlparser.SqlParser ) Runner {
260281 ret := & DeleteRunner {}
261282 ret .action = sqlparser .DELETE
262283 ret .log = this .log
@@ -268,7 +289,7 @@ func (this *Session)createDelete(parser sqlparser.SqlParser) Runner {
268289 return ret
269290}
270291
271- func (this * Session )createInsert (parser sqlparser.SqlParser ) Runner {
292+ func (this * Session ) createInsert (parser sqlparser.SqlParser ) Runner {
272293 ret := & InsertRunner {}
273294 ret .action = sqlparser .INSERT
274295 ret .log = this .log
@@ -279,3 +300,21 @@ func (this *Session)createInsert(parser sqlparser.SqlParser) Runner {
279300 ret .this = ret
280301 return ret
281302}
303+
304+ func (this * Session ) findSqlParser (sqlId string ) sqlparser.SqlParser {
305+ ret , ok := FindDynamicSqlParser (sqlId )
306+ if ! ok {
307+ ret , ok = FindTemplateSqlParser (sqlId )
308+ }
309+ //FIXME: 当没有查找到sqlId对应的sql语句,则尝试使用sqlId直接操作数据库
310+ //该设计可能需要设计一个更合理的方式
311+ if ! ok {
312+ d , err := this .ParserFactory (sqlId )
313+ if err != nil {
314+ this .log (logging .WARN , err .Error ())
315+ return nil
316+ }
317+ return d
318+ }
319+ return ret
320+ }
0 commit comments