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  }