99package gobatis
1010
1111import (
12- "github.com/xfali/gobatis/errors"
13- "github.com/xfali/gobatis/logging"
1412 "github.com/xfali/gobatis/parsing"
1513 "github.com/xfali/gobatis/parsing/sqlparser"
1614 "github.com/xfali/gobatis/parsing/template"
1715 "github.com/xfali/gobatis/parsing/xml"
18- "sync"
1916)
2017
21- type dynamicSqlManager struct {
22- sqlMap map [string ]* parsing.DynamicData
23- lock sync.Mutex
24- }
25-
2618type sqlManager struct {
27- dynamicSqlMgr * dynamicSqlManager
19+ dynamicSqlMgr * xml. Manager
2820 templateSqlMgr * template.Manager
2921}
3022
3123var g_sql_mgr = sqlManager {
32- dynamicSqlMgr : & dynamicSqlManager { sqlMap : map [ string ] * parsing. DynamicData {}} ,
24+ dynamicSqlMgr : xml . NewManager () ,
3325 templateSqlMgr : template .NewManager (),
3426}
3527
3628func RegisterSql (sqlId string , sql string ) error {
37- g_sql_mgr .dynamicSqlMgr .lock .Lock ()
38- defer g_sql_mgr .dynamicSqlMgr .lock .Unlock ()
39-
40- if _ , ok := g_sql_mgr .dynamicSqlMgr .sqlMap [sqlId ]; ok {
41- return errors .SQL_ID_DUPLICATES
42- } else {
43- dd := & parsing.DynamicData {OriginData : sql }
44- g_sql_mgr .dynamicSqlMgr .sqlMap [sqlId ] = dd
45- }
46- return nil
29+ return g_sql_mgr .dynamicSqlMgr .RegisterSql (sqlId , sql )
4730}
4831
4932func UnregisterSql (sqlId string ) {
50- g_sql_mgr .dynamicSqlMgr .lock .Lock ()
51- defer g_sql_mgr .dynamicSqlMgr .lock .Unlock ()
52-
53- delete (g_sql_mgr .dynamicSqlMgr .sqlMap , sqlId )
33+ g_sql_mgr .dynamicSqlMgr .UnregisterSql (sqlId )
5434}
5535
5636func RegisterMapperData (data []byte ) error {
57- g_sql_mgr .dynamicSqlMgr .lock .Lock ()
58- defer g_sql_mgr .dynamicSqlMgr .lock .Unlock ()
59-
60- mapper , err := xml .Parse (data )
61- if err != nil {
62- logging .Warn ("register mapper data failed: %s err: %v\n " , string (data ), err )
63- return err
64- }
65-
66- return formatMapper (mapper )
37+ return g_sql_mgr .dynamicSqlMgr .RegisterData (data )
6738}
6839
6940func RegisterMapperFile (file string ) error {
70- g_sql_mgr .dynamicSqlMgr .lock .Lock ()
71- defer g_sql_mgr .dynamicSqlMgr .lock .Unlock ()
72-
73- mapper , err := xml .ParseFile (file )
74- if err != nil {
75- logging .Warn ("register mapper file failed: %s err: %v\n " , file , err )
76- return err
77- }
78-
79- return formatMapper (mapper )
41+ return g_sql_mgr .dynamicSqlMgr .RegisterFile (file )
8042}
8143
82- func formatMapper (mapper * xml.Mapper ) error {
83- ret := mapper .Format ()
84- for k , v := range ret {
85- if _ , ok := g_sql_mgr .dynamicSqlMgr .sqlMap [k ]; ok {
86- return errors .SQL_ID_DUPLICATES
87- } else {
88- g_sql_mgr .dynamicSqlMgr .sqlMap [k ] = v
89- }
90- }
91- return nil
92- }
93-
94- func FindDynamicSql (sqlId string ) (sqlparser.SqlParser , bool ) {
95- g_sql_mgr .dynamicSqlMgr .lock .Lock ()
96- defer g_sql_mgr .dynamicSqlMgr .lock .Unlock ()
97-
98- v , ok := g_sql_mgr .dynamicSqlMgr .sqlMap [sqlId ]
99- return v , ok
44+ func FindDynamicSqlParser (sqlId string ) (sqlparser.SqlParser , bool ) {
45+ return g_sql_mgr .dynamicSqlMgr .FindSqlParser (sqlId )
10046}
10147
10248func RegisterTemplateData (data []byte ) error {
@@ -107,6 +53,19 @@ func RegisterTemplateFile(file string) error {
10753 return g_sql_mgr .templateSqlMgr .RegisterFile (file )
10854}
10955
110- func FindTemplateSql (sqlId string ) (sqlparser.SqlParser , bool ) {
111- return g_sql_mgr .templateSqlMgr .FindSql (sqlId )
56+ func FindTemplateSqlParser (sqlId string ) (sqlparser.SqlParser , bool ) {
57+ return g_sql_mgr .templateSqlMgr .FindSqlParser (sqlId )
58+ }
59+
60+ func FindSqlParser (sqlId string ) sqlparser.SqlParser {
61+ ret , ok := FindDynamicSqlParser (sqlId )
62+ if ! ok {
63+ ret , ok = FindTemplateSqlParser (sqlId )
64+ }
65+ //FIXME: 当没有查找到sqlId对应的sql语句,则尝试使用sqlId直接操作数据库
66+ //该设计可能需要设计一个更合理的方式
67+ if ! ok {
68+ return & parsing.DynamicData {OriginData : sqlId }
69+ }
70+ return ret
11271}
0 commit comments