pgx/sanitize.go

63 lines
1.6 KiB
Go

package pgx
import (
"encoding/hex"
"reflect"
"regexp"
"strconv"
"strings"
)
var literalPattern *regexp.Regexp = regexp.MustCompile(`\$\d+`)
func (c *Connection) QuoteString(input string) (output string) {
output = "'" + strings.Replace(input, "'", "''", -1) + "'"
return
}
func (c *Connection) QuoteIdentifier(input string) (output string) {
output = `"` + strings.Replace(input, `"`, `""`, -1) + `"`
return
}
func (c *Connection) SanitizeSql(sql string, args ...interface{}) (output string) {
replacer := func(match string) (replacement string) {
n, _ := strconv.ParseInt(match[1:], 10, 0)
switch arg := args[n-1].(type) {
case string:
return c.QuoteString(arg)
case int:
return strconv.FormatInt(int64(arg), 10)
case int8:
return strconv.FormatInt(int64(arg), 10)
case int16:
return strconv.FormatInt(int64(arg), 10)
case int32:
return strconv.FormatInt(int64(arg), 10)
case int64:
return strconv.FormatInt(int64(arg), 10)
case uint:
return strconv.FormatUint(uint64(arg), 10)
case uint8:
return strconv.FormatUint(uint64(arg), 10)
case uint16:
return strconv.FormatUint(uint64(arg), 10)
case uint32:
return strconv.FormatUint(uint64(arg), 10)
case uint64:
return strconv.FormatUint(uint64(arg), 10)
case float32:
return strconv.FormatFloat(float64(arg), 'f', -1, 32)
case float64:
return strconv.FormatFloat(arg, 'f', -1, 64)
case []byte:
return `E'\\x` + hex.EncodeToString(arg) + `'`
default:
panic("Unable to sanitize type: " + reflect.TypeOf(arg).String())
}
}
output = literalPattern.ReplaceAllStringFunc(sql, replacer)
return
}