From 6c38dc234fd3c6ce84f0adeb9696ab2fb39c11ed Mon Sep 17 00:00:00 2001 From: Deluan Date: Fri, 15 Nov 2024 19:38:59 +0200 Subject: [PATCH] refactor: change toSQL to use ReplaceAllStringFunc, to cause less static allocations Signed-off-by: Deluan --- persistence/sql_base_repository.go | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/persistence/sql_base_repository.go b/persistence/sql_base_repository.go index 9b8aefbad..5f7e5fcf7 100644 --- a/persistence/sql_base_repository.go +++ b/persistence/sql_base_repository.go @@ -6,6 +6,7 @@ import ( "errors" "fmt" "reflect" + "regexp" "strings" "time" @@ -220,19 +221,23 @@ func (r sqlRepository) executeSQL(sq Sqlizer) (int64, error) { return res.RowsAffected() } +var placeholderRegex = regexp.MustCompile(`\?`) + func (r sqlRepository) toSQL(sq Sqlizer) (string, dbx.Params, error) { query, args, err := sq.ToSql() if err != nil { return "", nil, err } // Replace query placeholders with named params - params := dbx.Params{} - for i, arg := range args { - p := fmt.Sprintf("p%d", i) - query = strings.Replace(query, "?", "{:"+p+"}", 1) - params[p] = arg - } - return query, params, nil + params := make(dbx.Params, len(args)) + counter := 0 + result := placeholderRegex.ReplaceAllStringFunc(query, func(_ string) string { + p := fmt.Sprintf("p%d", counter) + params[p] = args[counter] + counter++ + return "{:" + p + "}" + }) + return result, params, nil } func (r sqlRepository) queryOne(sq Sqlizer, response interface{}) error {