50 lines
1.3 KiB
Go
50 lines
1.3 KiB
Go
package xorm
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
)
|
|
|
|
// Filter is an interface to filter SQL
|
|
type Filter interface {
|
|
Do(sql string, session *Session) string
|
|
}
|
|
|
|
// PgSeqFilter filter SQL replace ?, ? ... to $1, $2 ...
|
|
type PgSeqFilter struct {
|
|
}
|
|
|
|
func (s *PgSeqFilter) Do(sql string, session *Session) string {
|
|
segs := strings.Split(sql, "?")
|
|
size := len(segs)
|
|
res := ""
|
|
for i, c := range segs {
|
|
if i < size-1 {
|
|
res += c + fmt.Sprintf("$%v", i+1)
|
|
}
|
|
}
|
|
res += segs[size-1]
|
|
return res
|
|
}
|
|
|
|
// QuoteFilter filter SQL replace ` to database's own quote character
|
|
type QuoteFilter struct {
|
|
}
|
|
|
|
func (s *QuoteFilter) Do(sql string, session *Session) string {
|
|
return strings.Replace(sql, "`", session.Engine.QuoteStr(), -1)
|
|
}
|
|
|
|
// IdFilter filter SQL replace (id) to primary key column name
|
|
type IdFilter struct {
|
|
}
|
|
|
|
func (i *IdFilter) Do(sql string, session *Session) string {
|
|
if session.Statement.RefTable != nil && session.Statement.RefTable.PrimaryKey != "" {
|
|
sql = strings.Replace(sql, "`(id)`", session.Engine.Quote(session.Statement.RefTable.PrimaryKey), -1)
|
|
sql = strings.Replace(sql, session.Engine.Quote("(id)"), session.Engine.Quote(session.Statement.RefTable.PrimaryKey), -1)
|
|
return strings.Replace(sql, "(id)", session.Engine.Quote(session.Statement.RefTable.PrimaryKey), -1)
|
|
}
|
|
return sql
|
|
}
|