Skip to content

Commit 8ce3bb7

Browse files
committed
modify parser manager and add postgresql test
1 parent c0eb3be commit 8ce3bb7

File tree

7 files changed

+207
-85
lines changed

7 files changed

+207
-85
lines changed

parsing/dynamics.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ func (m *DynamicData) ReplaceWithMap(objParams map[string]interface{}) string {
6969
return ret
7070
}
7171

72-
func (m *DynamicData) ParseMetadata(driverName string, params ...interface{})(*sqlparser.Metadata, error) {
72+
func (m *DynamicData) ParseMetadata(driverName string, params ...interface{}) (*sqlparser.Metadata, error) {
7373
paramMap := reflection.ParseParams(params...)
7474
sqlStr := m.ReplaceWithMap(paramMap)
7575
return sqlparser.ParseWithParamMap(driverName, sqlStr, paramMap)

parsing/template/parse.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ func (m *Manager) RegisterFile(file string) error {
118118
return nil
119119
}
120120

121-
func (m *Manager) FindSql(sqlId string) (*Parser, bool) {
121+
func (m *Manager) FindSqlParser(sqlId string) (*Parser, bool) {
122122
m.lock.Lock()
123123
defer m.lock.Unlock()
124124

parsing/xml/manager.go

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
// Copyright (C) 2019-2020, Xiongfa Li.
2+
// @author xiongfa.li
3+
// @version V1.0
4+
// Description:
5+
6+
package xml
7+
8+
import (
9+
"github.com/xfali/gobatis/errors"
10+
"github.com/xfali/gobatis/logging"
11+
"github.com/xfali/gobatis/parsing"
12+
"github.com/xfali/gobatis/parsing/sqlparser"
13+
"sync"
14+
)
15+
16+
type Manager struct {
17+
sqlMap map[string]*parsing.DynamicData
18+
lock sync.Mutex
19+
}
20+
21+
func NewManager() *Manager {
22+
return &Manager{
23+
sqlMap: map[string]*parsing.DynamicData{},
24+
}
25+
}
26+
27+
func (m *Manager) RegisterData(data []byte) error {
28+
m.lock.Lock()
29+
defer m.lock.Unlock()
30+
31+
mapper, err := Parse(data)
32+
if err != nil {
33+
logging.Warn("register mapper data failed: %s err: %v\n", string(data), err)
34+
return err
35+
}
36+
37+
return m.formatMapper(mapper)
38+
}
39+
40+
func (m *Manager) RegisterFile(file string) error {
41+
m.lock.Lock()
42+
defer m.lock.Unlock()
43+
44+
mapper, err := ParseFile(file)
45+
if err != nil {
46+
logging.Warn("register mapper file failed: %s err: %v\n", file, err)
47+
return err
48+
}
49+
50+
return m.formatMapper(mapper)
51+
}
52+
53+
func (m *Manager) formatMapper(mapper *Mapper) error {
54+
ret := mapper.Format()
55+
for k, v := range ret {
56+
if _, ok := m.sqlMap[k]; ok {
57+
return errors.SQL_ID_DUPLICATES
58+
} else {
59+
m.sqlMap[k] = v
60+
}
61+
}
62+
return nil
63+
}
64+
65+
func (m *Manager) FindSqlParser(sqlId string) (sqlparser.SqlParser, bool) {
66+
m.lock.Lock()
67+
defer m.lock.Unlock()
68+
69+
v, ok := m.sqlMap[sqlId]
70+
return v, ok
71+
}
72+
73+
func (m *Manager) RegisterSql(sqlId string, sql string) error {
74+
m.lock.Lock()
75+
defer m.lock.Unlock()
76+
77+
if _, ok := m.sqlMap[sqlId]; ok {
78+
return errors.SQL_ID_DUPLICATES
79+
} else {
80+
dd := &parsing.DynamicData{OriginData: sql}
81+
m.sqlMap[sqlId] = dd
82+
}
83+
return nil
84+
}
85+
86+
func (m *Manager) UnregisterSql(sqlId string) {
87+
m.lock.Lock()
88+
defer m.lock.Unlock()
89+
90+
delete(m.sqlMap, sqlId)
91+
}

sqlmanager.go

Lines changed: 23 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -9,94 +9,40 @@
99
package gobatis
1010

1111
import (
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-
2618
type sqlManager struct {
27-
dynamicSqlMgr *dynamicSqlManager
19+
dynamicSqlMgr *xml.Manager
2820
templateSqlMgr *template.Manager
2921
}
3022

3123
var g_sql_mgr = sqlManager{
32-
dynamicSqlMgr: &dynamicSqlManager{sqlMap: map[string]*parsing.DynamicData{}},
24+
dynamicSqlMgr: xml.NewManager(),
3325
templateSqlMgr: template.NewManager(),
3426
}
3527

3628
func 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

4932
func 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

5636
func 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

6940
func 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

10248
func 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
}

sqlrunner.go

Lines changed: 4 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import (
1313
"github.com/xfali/gobatis/errors"
1414
"github.com/xfali/gobatis/factory"
1515
"github.com/xfali/gobatis/logging"
16-
"github.com/xfali/gobatis/parsing"
1716
"github.com/xfali/gobatis/parsing/sqlparser"
1817
"github.com/xfali/gobatis/reflection"
1918
"github.com/xfali/gobatis/session"
@@ -77,19 +76,6 @@ type DeleteRunner struct {
7776
BaseRunner
7877
}
7978

80-
func getSql(sqlId string) sqlparser.SqlParser {
81-
ret, ok := FindDynamicSql(sqlId)
82-
if !ok {
83-
ret, ok = FindTemplateSql(sqlId)
84-
}
85-
//FIXME: 当没有查找到sqlId对应的sql语句,则尝试使用sqlId直接操作数据库
86-
//该设计可能需要设计一个更合理的方式
87-
if !ok {
88-
return &parsing.DynamicData{OriginData: sqlId}
89-
}
90-
return ret
91-
}
92-
9379
//使用一个session操作数据库
9480
func (this *SessionManager) NewSession() *Session {
9581
return &Session{
@@ -129,19 +115,19 @@ func (this *Session) Tx(txFunc func(session *Session) error) {
129115
}
130116

131117
func (this *Session) Select(sql string) Runner {
132-
return this.createSelect(getSql(sql))
118+
return this.createSelect(FindSqlParser(sql))
133119
}
134120

135121
func (this *Session) Update(sql string) Runner {
136-
return this.createUpdate(getSql(sql))
122+
return this.createUpdate(FindSqlParser(sql))
137123
}
138124

139125
func (this *Session) Delete(sql string) Runner {
140-
return this.createDelete(getSql(sql))
126+
return this.createDelete(FindSqlParser(sql))
141127
}
142128

143129
func (this *Session) Insert(sql string) Runner {
144-
return this.createInsert(getSql(sql))
130+
return this.createInsert(FindSqlParser(sql))
145131
}
146132

147133
func (this *BaseRunner) Param(params ...interface{}) Runner {

test/postgresql/postgresql.xml

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
<mapper namespace="test_package.TestTable">
2+
<sql id="columns_id">id,username,password</sql>
3+
4+
<select id="selectTestTable">
5+
SELECT <include refid="columns_id"> </include> FROM test_table
6+
<where>
7+
<if test="{TestTable.id} != nil and {TestTable.id} != 0">AND id = #{TestTable.id} </if>
8+
<if test="{TestTable.username} != nil">AND username = #{TestTable.username} </if>
9+
<if test="{TestTable.password} != nil">AND password = #{TestTable.password} </if>
10+
</where>
11+
</select>
12+
13+
<select id="selectTestTableCount">
14+
SELECT COUNT(*) FROM test_table
15+
<where>
16+
<if test="{TestTable.id} != nil and {TestTable.id} != 0">AND id = #{TestTable.id} </if>
17+
<if test="{TestTable.username} != nil">AND username = #{TestTable.username} </if>
18+
<if test="{TestTable.password} != nil">AND password = #{TestTable.password} </if>
19+
</where>
20+
</select>
21+
22+
<insert id="insertTestTable">
23+
INSERT INTO test_table (id,username,password)
24+
VALUES(
25+
#{TestTable.id},
26+
#{TestTable.username},
27+
#{TestTable.password}
28+
)
29+
</insert>
30+
31+
<update id="updateTestTable">
32+
UPDATE test_table
33+
<set>
34+
<if test="{TestTable.username} != nil"> username = #{TestTable.username} </if>
35+
<if test="{TestTable.password} != nil"> password = #{TestTable.password} </if>
36+
</set>
37+
WHERE id = #{TestTable.id}
38+
</update>
39+
40+
<delete id="deleteTestTable">
41+
DELETE FROM test_table
42+
<where>
43+
<if test="{TestTable.id} != nil and {TestTable.id} != 0">AND id = #{TestTable.id} </if>
44+
<if test="{TestTable.username} != nil">AND username = #{TestTable.username} </if>
45+
<if test="{TestTable.password} != nil">AND password = #{TestTable.password} </if>
46+
</where>
47+
</delete>
48+
</mapper>

test/postgresql/session_test.go

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import (
1010
"testing"
1111
)
1212

13-
func TestSession(t *testing.T) {
13+
func TestSessionTpl(t *testing.T) {
1414
gobatis.RegisterTemplateFile("./postgresql.tpl")
1515
var param = TestTable{Id: 1, Username: "user", Password: "pw"}
1616
t.Run("select", func(t *testing.T) {
@@ -47,3 +47,41 @@ func TestSession(t *testing.T) {
4747
t.Log(ret)
4848
})
4949
}
50+
51+
func TestSessionXml(t *testing.T) {
52+
gobatis.RegisterMapperFile("./postgresql.xml")
53+
var param = TestTable{Id: 1, Username: "user", Password: "pw"}
54+
t.Run("select", func(t *testing.T) {
55+
mgr := gobatis.NewSessionManager(connect())
56+
sess := mgr.NewSession()
57+
var ret []TestTable
58+
sess.Select("selectTestTable").Param(param).Result(&ret)
59+
t.Log(ret)
60+
})
61+
62+
t.Run("insert", func(t *testing.T) {
63+
mgr := gobatis.NewSessionManager(connect())
64+
sess := mgr.NewSession()
65+
var ret int
66+
err := sess.Insert("insertTestTable").Param(param).Result(&ret)
67+
t.Log(err)
68+
t.Log(ret)
69+
})
70+
71+
t.Run("update", func(t *testing.T) {
72+
mgr := gobatis.NewSessionManager(connect())
73+
sess := mgr.NewSession()
74+
var ret int
75+
err := sess.Update("updateTestTable").Param(TestTable{Id: 1, Username: "user2", Password: "pw2"}).Result(&ret)
76+
t.Log(err)
77+
t.Log(ret)
78+
})
79+
80+
t.Run("delete", func(t *testing.T) {
81+
mgr := gobatis.NewSessionManager(connect())
82+
sess := mgr.NewSession()
83+
var ret int
84+
sess.Delete("deleteTestTable").Param(TestTable{Id: 1}).Result(&ret)
85+
t.Log(ret)
86+
})
87+
}

0 commit comments

Comments
 (0)