This commit is contained in:
Lunny Xiao 2022-05-30 17:57:44 +08:00
parent 261e604c14
commit 5711ab9918
3 changed files with 31 additions and 6 deletions

View File

@ -4,7 +4,27 @@
package statements package statements
import "xorm.io/builder" import (
"xorm.io/builder"
"xorm.io/xorm/schemas"
)
type QuoteReplacer struct {
*builder.BytesWriter
quoter schemas.Quoter
}
func (q *QuoteReplacer) Write(p []byte) (n int, err error) {
c := q.quoter.Replace(string(p))
return q.BytesWriter.Builder.WriteString(c)
}
func (statement *Statement) quoteReplacer(w *builder.BytesWriter) *QuoteReplacer {
return &QuoteReplacer{
BytesWriter: w,
quoter: statement.dialect.Quoter(),
}
}
// Where add Where statement // Where add Where statement
func (statement *Statement) Where(query interface{}, args ...interface{}) *Statement { func (statement *Statement) Where(query interface{}, args ...interface{}) *Statement {
@ -15,7 +35,7 @@ func (statement *Statement) Where(query interface{}, args ...interface{}) *State
func (statement *Statement) And(query interface{}, args ...interface{}) *Statement { func (statement *Statement) And(query interface{}, args ...interface{}) *Statement {
switch qr := query.(type) { switch qr := query.(type) {
case string: case string:
cond := builder.Expr(qr, args...) cond := builder.Expr(statement.ReplaceQuote(qr), args...)
statement.cond = statement.cond.And(cond) statement.cond = statement.cond.And(cond)
case map[string]interface{}: case map[string]interface{}:
cond := make(builder.Eq) cond := make(builder.Eq)

View File

@ -231,7 +231,7 @@ func (statement *Statement) genSelectSQL(columnStr string, needLimit, needOrderB
} }
condWriter := builder.NewWriter() condWriter := builder.NewWriter()
if err := statement.cond.WriteTo(condWriter); err != nil { if err := statement.cond.WriteTo(statement.quoteReplacer(condWriter)); err != nil {
return "", nil, err return "", nil, err
} }
@ -282,7 +282,7 @@ func (statement *Statement) genSelectSQL(columnStr string, needLimit, needOrderB
if _, err := fmt.Fprint(mssqlCondi, whereStr); err != nil { if _, err := fmt.Fprint(mssqlCondi, whereStr); err != nil {
return "", nil, err return "", nil, err
} }
if err := utils.WriteBuilder(mssqlCondi, condWriter); err != nil { if err := utils.WriteBuilder(mssqlCondi, statement.quoteReplacer(condWriter)); err != nil {
return "", nil, err return "", nil, err
} }
} }
@ -311,7 +311,7 @@ func (statement *Statement) genSelectSQL(columnStr string, needLimit, needOrderB
if _, err := fmt.Fprint(buf, whereStr); err != nil { if _, err := fmt.Fprint(buf, whereStr); err != nil {
return "", nil, err return "", nil, err
} }
if err := utils.WriteBuilder(buf, condWriter); err != nil { if err := utils.WriteBuilder(buf, statement.quoteReplacer(condWriter)); err != nil {
return "", nil, err return "", nil, err
} }
} }

View File

@ -10,8 +10,13 @@ import (
"xorm.io/builder" "xorm.io/builder"
) )
type BuildReader interface {
String() string
Args() []interface{}
}
// WriteBuilder writes writers to one // WriteBuilder writes writers to one
func WriteBuilder(w *builder.BytesWriter, inputs ...*builder.BytesWriter) error { func WriteBuilder(w *builder.BytesWriter, inputs ...BuildReader) error {
for _, input := range inputs { for _, input := range inputs {
if _, err := fmt.Fprint(w, input.String()); err != nil { if _, err := fmt.Fprint(w, input.String()); err != nil {
return err return err