filter.go 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. package core
  2. import (
  3. "fmt"
  4. "strings"
  5. )
  6. // Filter is an interface to filter SQL
  7. type Filter interface {
  8. Do(sql string, dialect Dialect, table *Table) string
  9. }
  10. // QuoteFilter filter SQL replace ` to database's own quote character
  11. type QuoteFilter struct {
  12. }
  13. func (s *QuoteFilter) Do(sql string, dialect Dialect, table *Table) string {
  14. return strings.Replace(sql, "`", dialect.QuoteStr(), -1)
  15. }
  16. // IdFilter filter SQL replace (id) to primary key column name
  17. type IdFilter struct {
  18. }
  19. type Quoter struct {
  20. dialect Dialect
  21. }
  22. func NewQuoter(dialect Dialect) *Quoter {
  23. return &Quoter{dialect}
  24. }
  25. func (q *Quoter) Quote(content string) string {
  26. return q.dialect.QuoteStr() + content + q.dialect.QuoteStr()
  27. }
  28. func (i *IdFilter) Do(sql string, dialect Dialect, table *Table) string {
  29. quoter := NewQuoter(dialect)
  30. if table != nil && len(table.PrimaryKeys) == 1 {
  31. sql = strings.Replace(sql, "`(id)`", quoter.Quote(table.PrimaryKeys[0]), -1)
  32. sql = strings.Replace(sql, quoter.Quote("(id)"), quoter.Quote(table.PrimaryKeys[0]), -1)
  33. return strings.Replace(sql, "(id)", quoter.Quote(table.PrimaryKeys[0]), -1)
  34. }
  35. return sql
  36. }
  37. // SeqFilter filter SQL replace ?, ? ... to $1, $2 ...
  38. type SeqFilter struct {
  39. Prefix string
  40. Start int
  41. }
  42. func (s *SeqFilter) Do(sql string, dialect Dialect, table *Table) string {
  43. segs := strings.Split(sql, "?")
  44. size := len(segs)
  45. res := ""
  46. for i, c := range segs {
  47. if i < size-1 {
  48. res += c + fmt.Sprintf("%s%v", s.Prefix, i+s.Start)
  49. }
  50. }
  51. res += segs[size-1]
  52. return res
  53. }