Skip to content
This repository was archived by the owner on Sep 7, 2021. It is now read-only.
This repository is currently being migrated. It's locked while the migration is in progress.

Commit c5837c2

Browse files
committed
add quote policy methods for engine interface
1 parent cac7688 commit c5837c2

File tree

10 files changed

+119
-24
lines changed

10 files changed

+119
-24
lines changed

dialect_mssql.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -281,7 +281,7 @@ func (db *mssql) SupportInsertMany() bool {
281281
}
282282

283283
func (db *mssql) IsReserved(name string) bool {
284-
_, ok := mssqlReservedWords[name]
284+
_, ok := mssqlReservedWords[strings.ToUpper(name)]
285285
return ok
286286
}
287287

dialect_mysql.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -270,7 +270,7 @@ func (db *mysql) SupportInsertMany() bool {
270270
}
271271

272272
func (db *mysql) IsReserved(name string) bool {
273-
_, ok := mysqlReservedWords[name]
273+
_, ok := mysqlReservedWords[strings.ToUpper(name)]
274274
return ok
275275
}
276276

dialect_oracle.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -547,7 +547,7 @@ func (db *oracle) SupportInsertMany() bool {
547547
}
548548

549549
func (db *oracle) IsReserved(name string) bool {
550-
_, ok := oracleReservedWords[name]
550+
_, ok := oracleReservedWords[strings.ToUpper(name)]
551551
return ok
552552
}
553553

dialect_postgres.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -854,7 +854,7 @@ func (db *postgres) SupportInsertMany() bool {
854854
}
855855

856856
func (db *postgres) IsReserved(name string) bool {
857-
_, ok := postgresReservedWords[name]
857+
_, ok := postgresReservedWords[strings.ToUpper(name)]
858858
return ok
859859
}
860860

dialect_sqlite3.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,7 @@ func (db *sqlite3) SupportInsertMany() bool {
194194
}
195195

196196
func (db *sqlite3) IsReserved(name string) bool {
197-
_, ok := sqlite3ReservedWords[name]
197+
_, ok := sqlite3ReservedWords[strings.ToUpper(name)]
198198
return ok
199199
}
200200

engine_quote.go

Lines changed: 37 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"fmt"
99
"strings"
1010

11+
"xorm.io/builder"
1112
"xorm.io/core"
1213
)
1314

@@ -26,6 +27,7 @@ type Quoter interface {
2627
Quotes() (byte, byte)
2728
QuotePolicy() QuotePolicy
2829
IsReserved(string) bool
30+
WriteTo(w *builder.BytesWriter, value string) error
2931
}
3032

3133
type quoter struct {
@@ -53,6 +55,29 @@ func (q *quoter) IsReserved(value string) bool {
5355
return q.dialect.IsReserved(value)
5456
}
5557

58+
func (q *quoter) needQuote(value string) bool {
59+
return q.quotePolicy == QuoteAddAlways || (q.quotePolicy == QuoteAddReserved && q.IsReserved(value))
60+
}
61+
62+
func (q *quoter) WriteTo(w *builder.BytesWriter, name string) error {
63+
leftQuote, rightQuote := q.Quotes()
64+
needQuote := q.needQuote(name)
65+
if needQuote && name[0] != '`' {
66+
if err := w.WriteByte(leftQuote); err != nil {
67+
return err
68+
}
69+
}
70+
if _, err := w.WriteString(name); err != nil {
71+
return err
72+
}
73+
if needQuote && name[len(name)-1] != '`' {
74+
if err := w.WriteByte(rightQuote); err != nil {
75+
return err
76+
}
77+
}
78+
return nil
79+
}
80+
5681
func quoteColumns(quoter Quoter, columnStr string) string {
5782
columns := strings.Split(columnStr, ",")
5883
return quoteJoin(quoter, columns)
@@ -96,13 +121,21 @@ func (engine *Engine) IsReserved(value string) bool {
96121
return engine.dialect.IsReserved(value)
97122
}
98123

124+
// SetTableQuotePolicy set table quote policy
125+
func (engine *Engine) SetTableQuotePolicy(policy QuotePolicy) {
126+
engine.tableQuoter = newQuoter(engine.dialect, policy)
127+
}
128+
129+
// SetColumnQuotePolicy set column quote policy
130+
func (engine *Engine) SetColumnQuotePolicy(policy QuotePolicy) {
131+
engine.colQuoter = newQuoter(engine.dialect, policy)
132+
}
133+
99134
// quoteTo quotes string and writes into the buffer
100135
func quoteTo(quoter Quoter, buf *strings.Builder, value string) {
101136
left, right := quoter.Quotes()
102-
if quoter.QuotePolicy() == QuoteAddAlways {
103-
realQuoteTo(left, right, buf, value)
104-
return
105-
} else if quoter.QuotePolicy() == QuoteAddReserved && quoter.IsReserved(value) {
137+
if (quoter.QuotePolicy() == QuoteAddAlways) ||
138+
(quoter.QuotePolicy() == QuoteAddReserved && quoter.IsReserved(value)) {
106139
realQuoteTo(left, right, buf, value)
107140
return
108141
}

engine_quote_test.go

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,3 +18,73 @@ func TestQuoteColumns(t *testing.T) {
1818

1919
assert.EqualValues(t, "[f1], [f2], [f3]", quoteJoinFunc(cols, quoteFunc, ","))
2020
}
21+
22+
func TestChangeQuotePolicy(t *testing.T) {
23+
assert.NoError(t, prepareEngine())
24+
25+
type ChangeQuotePolicy struct {
26+
Id int64
27+
Name string
28+
}
29+
30+
testEngine.SetColumnQuotePolicy(QuoteNoAdd)
31+
assertSync(t, new(ChangeQuotePolicy))
32+
33+
var obj1 = ChangeQuotePolicy{
34+
Name: "obj1",
35+
}
36+
_, err := testEngine.Insert(&obj1)
37+
assert.NoError(t, err)
38+
39+
var obj2 ChangeQuotePolicy
40+
_, err = testEngine.ID(obj1.Id).Get(&obj2)
41+
assert.NoError(t, err)
42+
43+
var objs []ChangeQuotePolicy
44+
err = testEngine.Find(&objs)
45+
assert.NoError(t, err)
46+
47+
_, err = testEngine.ID(obj1.Id).Update(&ChangeQuotePolicy{
48+
Name: "obj2",
49+
})
50+
assert.NoError(t, err)
51+
52+
_, err = testEngine.ID(obj1.Id).Delete(new(ChangeQuotePolicy))
53+
assert.NoError(t, err)
54+
}
55+
56+
func TestChangeQuotePolicy2(t *testing.T) {
57+
assert.NoError(t, prepareEngine())
58+
59+
type ChangeQuotePolicy2 struct {
60+
Id int64
61+
Name string
62+
User string
63+
Index int
64+
}
65+
66+
testEngine.SetColumnQuotePolicy(QuoteAddReserved)
67+
assertSync(t, new(ChangeQuotePolicy2))
68+
69+
var obj1 = ChangeQuotePolicy2{
70+
Name: "obj1",
71+
}
72+
_, err := testEngine.Insert(&obj1)
73+
assert.NoError(t, err)
74+
75+
var obj2 ChangeQuotePolicy2
76+
_, err = testEngine.ID(obj1.Id).Get(&obj2)
77+
assert.NoError(t, err)
78+
79+
var objs []ChangeQuotePolicy2
80+
err = testEngine.Find(&objs)
81+
assert.NoError(t, err)
82+
83+
_, err = testEngine.ID(obj1.Id).Update(&ChangeQuotePolicy2{
84+
Name: "obj2",
85+
})
86+
assert.NoError(t, err)
87+
88+
_, err = testEngine.ID(obj1.Id).Delete(new(ChangeQuotePolicy2))
89+
assert.NoError(t, err)
90+
}

interface.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ type EngineInterface interface {
9191
NoAutoTime() *Session
9292
Quote(string, bool) string
9393
SetCacher(string, core.Cacher)
94+
SetColumnQuotePolicy(policy QuotePolicy)
9495
SetConnMaxLifetime(time.Duration)
9596
SetDefaultCacher(core.Cacher)
9697
SetLogger(logger core.ILogger)
@@ -99,6 +100,7 @@ type EngineInterface interface {
99100
SetMaxOpenConns(int)
100101
SetMaxIdleConns(int)
101102
SetSchema(string)
103+
SetTableQuotePolicy(policy QuotePolicy)
102104
SetTZDatabase(tz *time.Location)
103105
SetTZLocation(tz *time.Location)
104106
ShowExecTime(...bool)

session_insert.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -377,7 +377,7 @@ func (session *Session) innerInsert(bean interface{}) (int64, error) {
377377
return 0, err
378378
}
379379

380-
if err := writeStrings(buf, append(colNames, exprs.colNames...), "`", "`"); err != nil {
380+
if err := writeStrings(buf, append(colNames, exprs.colNames...), session.engine.colQuoter); err != nil {
381381
return 0, err
382382
}
383383

@@ -735,7 +735,7 @@ func (session *Session) insertMapInterface(m map[string]interface{}) (int64, err
735735
return 0, err
736736
}
737737

738-
if err := writeStrings(w, append(columns, exprs.colNames...), "`", "`"); err != nil {
738+
if err := writeStrings(w, append(columns, exprs.colNames...), session.engine.colQuoter); err != nil {
739739
return 0, err
740740
}
741741

@@ -821,7 +821,7 @@ func (session *Session) insertMapString(m map[string]string) (int64, error) {
821821
return 0, err
822822
}
823823

824-
if err := writeStrings(w, append(columns, exprs.colNames...), "`", "`"); err != nil {
824+
if err := writeStrings(w, append(columns, exprs.colNames...), session.engine.colQuoter); err != nil {
825825
return 0, err
826826
}
827827

statement_args.go

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -145,21 +145,11 @@ func (statement *Statement) writeArgs(w *builder.BytesWriter, args []interface{}
145145
return nil
146146
}
147147

148-
func writeStrings(w *builder.BytesWriter, cols []string, leftQuote, rightQuote string) error {
148+
func writeStrings(w *builder.BytesWriter, cols []string, quoter Quoter) error {
149149
for i, colName := range cols {
150-
if len(leftQuote) > 0 && colName[0] != '`' {
151-
if _, err := w.WriteString(leftQuote); err != nil {
152-
return err
153-
}
154-
}
155-
if _, err := w.WriteString(colName); err != nil {
150+
if err := quoter.WriteTo(w, colName); err != nil {
156151
return err
157152
}
158-
if len(rightQuote) > 0 && colName[len(colName)-1] != '`' {
159-
if _, err := w.WriteString(rightQuote); err != nil {
160-
return err
161-
}
162-
}
163153
if i+1 != len(cols) {
164154
if _, err := w.WriteString(","); err != nil {
165155
return err

0 commit comments

Comments
 (0)