Skip to content

Commit 9a8cbf8

Browse files
committed
修复table名称转Camel的错误
1 parent 1c92075 commit 9a8cbf8

File tree

8 files changed

+247
-97
lines changed

8 files changed

+247
-97
lines changed

pkg/common/utils.go

Lines changed: 5 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@
88

99
package common
1010

11-
import "strings"
11+
import (
12+
"github.com/xfali/gobatis-cmd/pkg/stringutils"
13+
)
1214

1315
func Newline() string {
1416
return "\n"
@@ -32,43 +34,10 @@ func Column2DynamicName(tableName, column string) string {
3234

3335
// snake string, XxYy to xx_yy , XxYY to xx_yy
3436
func Camel2snake(s string) string {
35-
data := make([]byte, 0, len(s)*2)
36-
j := false
37-
num := len(s)
38-
for i := 0; i < num; i++ {
39-
d := s[i]
40-
if i > 0 && d >= 'A' && d <= 'Z' && j {
41-
data = append(data, '_')
42-
}
43-
if d != '_' {
44-
j = true
45-
}
46-
data = append(data, d)
47-
}
48-
return strings.ToLower(string(data))
37+
return stringutils.Camel2snake(s)
4938
}
5039

5140
// camel string, xx_yy to XxYy
5241
func Snake2camel(s string) string {
53-
data := make([]byte, 0, len(s))
54-
j := false
55-
k := false
56-
num := len(s) - 1
57-
for i := 0; i <= num; i++ {
58-
d := s[i]
59-
if k == false && d >= 'A' && d <= 'Z' {
60-
k = true
61-
}
62-
if d >= 'a' && d <= 'z' && (j || k == false) {
63-
d = d - 32
64-
j = false
65-
k = true
66-
}
67-
if k && d == '_' && num > i && s[i+1] >= 'a' && s[i+1] <= 'z' {
68-
j = true
69-
continue
70-
}
71-
data = append(data, d)
72-
}
73-
return string(data)
42+
return stringutils.Snake2camel(s)
7443
}

pkg/generator/gen_model.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414
"github.com/xfali/gobatis-cmd/pkg/config"
1515
"github.com/xfali/gobatis-cmd/pkg/io"
1616
"github.com/xfali/gobatis-cmd/pkg/mapping"
17+
"path/filepath"
1718
"strings"
1819
"time"
1920
)
@@ -36,8 +37,9 @@ func GenModel(config config.Config, tableName string, model []common.ModelInfo)
3637
if fileName == "" {
3738
fileName = strings.ToLower(tableName) + ".go"
3839
}
39-
exist := io.IsPathExists(modelDir + fileName)
40-
modelFile, err := io.OpenAppend(modelDir + fileName)
40+
dst := filepath.Join(modelDir, fileName)
41+
exist := io.IsPathExists(dst)
42+
modelFile, err := io.OpenAppend(dst)
4143
if err == nil {
4244
defer modelFile.Close()
4345

pkg/generator/gen_proxy_v2.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313
"github.com/xfali/gobatis-cmd/pkg/common"
1414
"github.com/xfali/gobatis-cmd/pkg/config"
1515
"github.com/xfali/gobatis-cmd/pkg/io"
16+
"path/filepath"
1617
"strings"
1718
"time"
1819
)
@@ -22,7 +23,7 @@ func GenV2Proxy(config config.Config, tableName string, models []common.ModelInf
2223
if !io.IsPathExists(mapperDir) {
2324
io.Mkdir(mapperDir)
2425
}
25-
mapperFile, err := io.OpenAppend(mapperDir + strings.ToLower(tableName) + "_proxy.go")
26+
mapperFile, err := io.OpenAppend(filepath.Join(mapperDir, strings.ToLower(tableName) + "_proxy.go"))
2627
if err == nil {
2728
defer mapperFile.Close()
2829

pkg/generator/gen_template.go

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414
"github.com/xfali/gobatis-cmd/pkg/config"
1515
"github.com/xfali/gobatis-cmd/pkg/io"
1616
"github.com/xfali/gobatis-cmd/pkg/mapping"
17+
"path/filepath"
1718
"strings"
1819
"time"
1920
)
@@ -22,11 +23,11 @@ func GenTemplate(config config.Config, tableName string, model []common.ModelInf
2223
if config.Keyword {
2324
common.SelectKeywordFormatter(config.Driver)
2425
}
25-
targetDir := config.Path + "template/"
26+
targetDir := filepath.Join(config.Path, "template/")
2627
if !io.IsPathExists(targetDir) {
2728
io.Mkdir(targetDir)
2829
}
29-
targetFile, err := io.OpenAppend(targetDir + strings.ToLower(tableName) + "_mapper.tmpl")
30+
targetFile, err := io.OpenAppend(filepath.Join(targetDir, strings.ToLower(tableName)+"_mapper.tmpl"))
3031
if err == nil {
3132
defer targetFile.Close()
3233

@@ -70,19 +71,19 @@ func buildTmplMapper(builder *strings.Builder, config config.Config, tableName s
7071
builder.WriteString(common.Newline())
7172
builder.WriteString(common.Newline())
7273

73-
//select count
74-
builder.WriteString(fmt.Sprintf(`{{define "select%sCount"}}`, modelName))
75-
builder.WriteString(common.Newline())
74+
//select count
75+
builder.WriteString(fmt.Sprintf(`{{define "select%sCount"}}`, modelName))
76+
builder.WriteString(common.Newline())
7677

77-
builder.WriteString(fmt.Sprintf(`SELECT COUNT(*) FROM %s`, tableName))
78-
builder.WriteString(common.Newline())
78+
builder.WriteString(fmt.Sprintf(`SELECT COUNT(*) FROM %s`, tableName))
79+
builder.WriteString(common.Newline())
7980

80-
builder.WriteString(genTmplWhere(modelName, model))
81-
builder.WriteString(common.Newline())
81+
builder.WriteString(genTmplWhere(modelName, model))
82+
builder.WriteString(common.Newline())
8283

83-
builder.WriteString(`{{end}}`)
84-
builder.WriteString(common.Newline())
85-
builder.WriteString(common.Newline())
84+
builder.WriteString(`{{end}}`)
85+
builder.WriteString(common.Newline())
86+
builder.WriteString(common.Newline())
8687

8788
//insert
8889
builder.WriteString(fmt.Sprintf(`{{define "insert%s"}}`, modelName))

pkg/generator/gen_xml.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@ import (
1414
"github.com/xfali/gobatis-cmd/pkg/config"
1515
"github.com/xfali/gobatis-cmd/pkg/io"
1616
"github.com/xfali/gobatis-cmd/pkg/mapping"
17-
"strings"
17+
"path/filepath"
18+
"strings"
1819
"time"
1920
)
2021

@@ -23,11 +24,11 @@ func GenXml(config config.Config, tableName string, model []common.ModelInfo) {
2324
common.SelectKeywordFormatter(config.Driver)
2425
}
2526
if config.MapperFile == "xml" {
26-
xmlDir := config.Path + "xml/"
27+
xmlDir := filepath.Join(config.Path, "xml/")
2728
if !io.IsPathExists(xmlDir) {
2829
io.Mkdir(xmlDir)
2930
}
30-
xmlFile, err := io.OpenAppend(xmlDir + strings.ToLower(tableName) + "_mapper.xml")
31+
xmlFile, err := io.OpenAppend(filepath.Join(xmlDir, strings.ToLower(tableName) + "_mapper.xml"))
3132
if err == nil {
3233
defer xmlFile.Close()
3334

@@ -41,7 +42,7 @@ func GenXml(config config.Config, tableName string, model []common.ModelInfo) {
4142
if !io.IsPathExists(xmlDir) {
4243
io.Mkdir(xmlDir)
4344
}
44-
xmlFile, err := io.OpenAppend(xmlDir + strings.ToLower(tableName) + "_mapper.go")
45+
xmlFile, err := io.OpenAppend(filepath.Join(xmlDir, strings.ToLower(tableName) + "_mapper.go"))
4546
if err == nil {
4647
defer xmlFile.Close()
4748

pkg/stringutils/string_test.go

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
// Copyright (C) 2020-2021, Xiongfa Li.
2+
// @author xiongfa.li
3+
// @version V1.0
4+
// Description:
5+
6+
package stringutils
7+
8+
import (
9+
"testing"
10+
)
11+
12+
func TestSnake2Camel(t *testing.T) {
13+
t.Run("compute_node", func(t *testing.T) {
14+
s := Snake2camel("compute_node")
15+
if s != "ComputeNode" {
16+
t.Fatal("expect ComputeNode got: ", s)
17+
}
18+
})
19+
t.Run("COMPUTE_NODE", func(t *testing.T) {
20+
s := Snake2camel("COMPUTE_NODE")
21+
if s != "ComputeNode" {
22+
t.Fatal("expect ComputeNode got: ", s)
23+
}
24+
})
25+
26+
t.Run("COmpute_NODE", func(t *testing.T) {
27+
s := Snake2camel("COmpute_NODE")
28+
if s != "ComputeNode" {
29+
t.Fatal("expect ComputeNode got: ", s)
30+
}
31+
})
32+
33+
t.Run("COmuteNODE", func(t *testing.T) {
34+
s := Snake2camel("COmuteNODE")
35+
if s != "COmuteNODE" {
36+
t.Fatal("expect COmuteNODE got: ", s)
37+
}
38+
})
39+
40+
t.Run("__compute_nOde", func(t *testing.T) {
41+
s := Snake2camel("__compute_nOde")
42+
if s != "ComputeNode" {
43+
t.Fatal("expect ComputeNode got: ", s)
44+
}
45+
})
46+
47+
t.Run("__compute__nOde", func(t *testing.T) {
48+
s := Snake2camel("__compute__nOde")
49+
if s != "ComputeNode" {
50+
t.Fatal("expect ComputeNode got: ", s)
51+
}
52+
})
53+
54+
t.Run("computeNode", func(t *testing.T) {
55+
s := Snake2camel("computeNode")
56+
if s != "ComputeNode" {
57+
t.Fatal("expect ComputeNode got: ", s)
58+
}
59+
})
60+
61+
t.Run("_computeNode_", func(t *testing.T) {
62+
s := Snake2camel("_computeNode_")
63+
if s != "ComputeNode" {
64+
t.Fatal("expect ComputeNode got: ", s)
65+
}
66+
})
67+
68+
t.Run("ComputeNode", func(t *testing.T) {
69+
s := Snake2camel("ComputeNode")
70+
if s != "ComputeNode" {
71+
t.Fatal("expect ComputeNode got: ", s)
72+
}
73+
})
74+
75+
t.Run("ComputeNode_detail", func(t *testing.T) {
76+
s := Snake2camel("ComputeNode_detail")
77+
if s != "ComputeNodeDetail" {
78+
t.Fatal("expect ComputeNode got: ", s)
79+
}
80+
})
81+
82+
t.Run("_computeNode_detail_", func(t *testing.T) {
83+
s := Snake2camel("_computeNode_detail_")
84+
if s != "ComputeNodeDetail" {
85+
t.Fatal("expect ComputeNode got: ", s)
86+
}
87+
})
88+
89+
t.Run("_compute_Node_detail_", func(t *testing.T) {
90+
s := Snake2camel("_compute_Node_detail_")
91+
if s != "ComputeNodeDetail" {
92+
t.Fatal("expect ComputeNode got: ", s)
93+
}
94+
})
95+
96+
t.Run("_compute_node_detail_", func(t *testing.T) {
97+
s := Snake2camel("_compute_node_detail_")
98+
if s != "ComputeNodeDetail" {
99+
t.Fatal("expect ComputeNode got: ", s)
100+
}
101+
})
102+
}

pkg/stringutils/utils.go

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
/**
2+
* Copyright (C) 2019, Xiongfa Li.
3+
* All right reserved.
4+
* @author xiongfa.li
5+
* @version V1.0
6+
* Description:
7+
*/
8+
9+
package stringutils
10+
11+
import (
12+
"bytes"
13+
"strings"
14+
)
15+
16+
// snake string, XxYy to xx_yy , XxYY to xx_yy
17+
func Camel2snake(s string) string {
18+
data := make([]byte, 0, len(s)*2)
19+
j := false
20+
num := len(s)
21+
for i := 0; i < num; i++ {
22+
d := s[i]
23+
if i > 0 && d >= 'A' && d <= 'Z' && j {
24+
data = append(data, '_')
25+
}
26+
if d != '_' {
27+
j = true
28+
}
29+
data = append(data, d)
30+
}
31+
return strings.ToLower(string(data))
32+
}
33+
34+
// camel string, xx_yy to XxYy
35+
func Snake2camel(s string) string {
36+
s = strings.Trim(s, "_")
37+
if strings.Index(s, "_") != -1 {
38+
return Snake2camel3(s)
39+
} else {
40+
d := []byte(s)
41+
if len(d) > 0 {
42+
if d[0] >= 'a' && d[0] <= 'z' {
43+
d[0] -= 32
44+
return string(d)
45+
}
46+
}
47+
}
48+
return s
49+
}
50+
51+
func Snake2camel2(s string) string {
52+
data := make([]byte, 0, len(s))
53+
j := false
54+
k := false
55+
num := len(s) - 1
56+
for i := 0; i <= num; i++ {
57+
d := s[i]
58+
if k == false && d >= 'A' && d <= 'Z' {
59+
k = true
60+
}
61+
if d >= 'a' && d <= 'z' && (j || k == false) {
62+
d = d - 32
63+
j = false
64+
k = true
65+
}
66+
if k && d == '_' && num > i && s[i+1] >= 'a' && s[i+1] <= 'z' {
67+
j = true
68+
continue
69+
}
70+
data = append(data, d)
71+
}
72+
return string(data)
73+
}
74+
75+
func Snake2camel3(s string) string {
76+
strs := strings.Split(s, "_")
77+
buf := bytes.Buffer{}
78+
buf.Grow(len(s))
79+
for _, v := range strs {
80+
if v == "" {
81+
continue
82+
}
83+
// 第一个字符必须大写
84+
d := v[0]
85+
if d >= 'a' && d <= 'z' {
86+
d -= 32
87+
}
88+
buf.WriteByte(d)
89+
low := false
90+
for i := 1; i < len(v); i++ {
91+
d := v[i]
92+
// 中间夹杂小写
93+
if d >= 'a' && d <= 'z' {
94+
low = true
95+
} else if d >= 'A' && d <= 'Z' && !low {
96+
// 大写且中间没有经过小写,则表明是连续大写,则改写为小写
97+
buf.WriteByte(d + 32)
98+
continue
99+
}
100+
buf.WriteByte(d)
101+
}
102+
}
103+
return buf.String()
104+
}

0 commit comments

Comments
 (0)