github.com/artisanhe/tools@v1.0.1-0.20210607022958-19a8fef2eb04/sqlx/utils.go (about) 1 package sqlx 2 3 import ( 4 "database/sql/driver" 5 "reflect" 6 "regexp" 7 8 "github.com/artisanhe/tools/sqlx/builder" 9 ) 10 11 var queryRegexp = regexp.MustCompile(`(\$\d+)|\?`) 12 13 func flattenArgs(query string, args ...interface{}) (finalQuery string, finalArgs []interface{}) { 14 index := 0 15 finalQuery = queryRegexp.ReplaceAllStringFunc(query, func(i string) string { 16 arg := args[index] 17 index++ 18 19 if canExpr, ok := arg.(builder.CanExpr); ok { 20 e := canExpr.Expr() 21 resolvedQuery, resolvedArgs := flattenArgs(e.Query, e.Args...) 22 finalArgs = append(finalArgs, resolvedArgs...) 23 return resolvedQuery 24 } 25 26 if _, isValuer := arg.(driver.Valuer); !isValuer { 27 if _, isBytes := arg.([]byte); !isBytes { 28 if reflect.TypeOf(arg).Kind() == reflect.Slice { 29 sliceRv := reflect.ValueOf(arg) 30 length := sliceRv.Len() 31 for i := 0; i < length; i++ { 32 finalArgs = append(finalArgs, sliceRv.Index(i).Interface()) 33 } 34 return builder.HolderRepeat(length) 35 } 36 } 37 } 38 39 finalArgs = append(finalArgs, arg) 40 return i 41 }) 42 return 43 } 44 45 func stringIndexOf(slice []string, target string) int { 46 for idx, item := range slice { 47 if item == target { 48 return idx 49 } 50 } 51 return -1 52 }