Skip to content

Commit

Permalink
fmt.Sprint() to strconv.Format (#3354)
Browse files Browse the repository at this point in the history
  • Loading branch information
aimuz committed Sep 1, 2020
1 parent d1e17d5 commit 9a101c8
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 8 deletions.
14 changes: 7 additions & 7 deletions logger/sql.go
Expand Up @@ -3,6 +3,7 @@ package logger
import (
"database/sql/driver"
"fmt"
"gorm.io/gorm/utils"
"reflect"
"regexp"
"strconv"
Expand All @@ -24,13 +25,12 @@ var convertableTypes = []reflect.Type{reflect.TypeOf(time.Time{}), reflect.TypeO

func ExplainSQL(sql string, numericPlaceholder *regexp.Regexp, escaper string, avars ...interface{}) string {
var convertParams func(interface{}, int)
var vars = make([]interface{}, len(avars))
copy(vars, avars)
var vars = make([]string, len(avars))

convertParams = func(v interface{}, idx int) {
switch v := v.(type) {
case bool:
vars[idx] = fmt.Sprint(v)
vars[idx] = strconv.FormatBool(v)
case time.Time:
if v.IsZero() {
vars[idx] = escaper + "0000-00-00 00:00:00" + escaper
Expand All @@ -44,7 +44,7 @@ func ExplainSQL(sql string, numericPlaceholder *regexp.Regexp, escaper string, a
vars[idx] = escaper + "<binary>" + escaper
}
case int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64:
vars[idx] = fmt.Sprintf("%d", v)
vars[idx] = utils.ToString(v)
case float64, float32:
vars[idx] = fmt.Sprintf("%.6f", v)
case string:
Expand All @@ -70,18 +70,18 @@ func ExplainSQL(sql string, numericPlaceholder *regexp.Regexp, escaper string, a
}
}

for idx, v := range vars {
for idx, v := range avars {
convertParams(v, idx)
}

if numericPlaceholder == nil {
for _, v := range vars {
sql = strings.Replace(sql, "?", v.(string), 1)
sql = strings.Replace(sql, "?", v, 1)
}
} else {
sql = numericPlaceholder.ReplaceAllString(sql, "$$$1$$")
for idx, v := range vars {
sql = strings.Replace(sql, "$"+strconv.Itoa(idx+1)+"$", v.(string), 1)
sql = strings.Replace(sql, "$"+strconv.Itoa(idx+1)+"$", v, 1)
}
}

Expand Down
2 changes: 1 addition & 1 deletion schema/field.go
Expand Up @@ -671,7 +671,7 @@ func (field *Field) setupValuerAndSetter() {
case []byte:
field.ReflectValueOf(value).SetString(string(data))
case int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64:
field.ReflectValueOf(value).SetString(fmt.Sprint(data))
field.ReflectValueOf(value).SetString(utils.ToString(data))
case float64, float32:
field.ReflectValueOf(value).SetString(fmt.Sprintf("%."+strconv.Itoa(field.Precision)+"f", data))
default:
Expand Down
28 changes: 28 additions & 0 deletions utils/utils.go
Expand Up @@ -83,3 +83,31 @@ func AssertEqual(src, dst interface{}) bool {
}
return true
}

func ToString(value interface{}) string {
switch v := value.(type) {
case string:
return v
case int:
return strconv.FormatInt(int64(v), 10)
case int8:
return strconv.FormatInt(int64(v), 10)
case int16:
return strconv.FormatInt(int64(v), 10)
case int32:
return strconv.FormatInt(int64(v), 10)
case int64:
return strconv.FormatInt(v, 10)
case uint:
return strconv.FormatUint(uint64(v), 10)
case uint8:
return strconv.FormatUint(uint64(v), 10)
case uint16:
return strconv.FormatUint(uint64(v), 10)
case uint32:
return strconv.FormatUint(uint64(v), 10)
case uint64:
return strconv.FormatUint(v, 10)
}
return ""
}

0 comments on commit 9a101c8

Please sign in to comment.