12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- // Copyright 2019 The Xorm Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style
- // license that can be found in the LICENSE file.
-
- package dialects
-
- import (
- "fmt"
- "strings"
- )
-
- // Filter is an interface to filter SQL
- type Filter interface {
- Do(sql string) string
- }
-
- // SeqFilter filter SQL replace ?, ? ... to $1, $2 ...
- type SeqFilter struct {
- Prefix string
- Start int
- }
-
- func convertQuestionMark(sql, prefix string, start int) string {
- var buf strings.Builder
- var beginSingleQuote bool
- var isLineComment bool
- var isComment bool
- var isMaybeLineComment bool
- var isMaybeComment bool
- var isMaybeCommentEnd bool
- var index = start
- for _, c := range sql {
- if !beginSingleQuote && !isLineComment && !isComment && c == '?' {
- buf.WriteString(fmt.Sprintf("%s%v", prefix, index))
- index++
- } else {
- if isMaybeLineComment {
- if c == '-' {
- isLineComment = true
- }
- isMaybeLineComment = false
- } else if isMaybeComment {
- if c == '*' {
- isComment = true
- }
- isMaybeComment = false
- } else if isMaybeCommentEnd {
- if c == '/' {
- isComment = false
- }
- isMaybeCommentEnd = false
- } else if isLineComment {
- if c == '\n' {
- isLineComment = false
- }
- } else if isComment {
- if c == '*' {
- isMaybeCommentEnd = true
- }
- } else if !beginSingleQuote && c == '-' {
- isMaybeLineComment = true
- } else if !beginSingleQuote && c == '/' {
- isMaybeComment = true
- } else if c == '\'' {
- beginSingleQuote = !beginSingleQuote
- }
- buf.WriteRune(c)
- }
- }
- return buf.String()
- }
-
- // Do implements Filter
- func (s *SeqFilter) Do(sql string) string {
- return convertQuestionMark(sql, s.Prefix, s.Start)
- }
|