45 lines
915 B
Go
45 lines
915 B
Go
package database
|
|
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
"strings"
|
|
"sync"
|
|
"text/template"
|
|
)
|
|
|
|
var queriesCache sync.Map
|
|
|
|
func BuildQuery(text string, data map[string]interface{}) (string, []interface{}, error) {
|
|
var t *template.Template
|
|
v, ok := queriesCache.Load(text)
|
|
if !ok {
|
|
var err error
|
|
t, err = template.New("query").Parse(text)
|
|
if err != nil {
|
|
return "", nil, fmt.Errorf("could not parse sql query template: %w", err)
|
|
}
|
|
|
|
queriesCache.Store(text, t)
|
|
} else {
|
|
t = v.(*template.Template)
|
|
}
|
|
|
|
var wr bytes.Buffer
|
|
if err := t.Execute(&wr, data); err != nil {
|
|
return "", nil, fmt.Errorf("could not apply sql query data: %w", err)
|
|
}
|
|
|
|
query := wr.String()
|
|
var args []interface{}
|
|
for key, val := range data {
|
|
if !strings.Contains(query, "@"+key) {
|
|
continue
|
|
}
|
|
|
|
args = append(args, val)
|
|
query = strings.Replace(query, "@"+key, fmt.Sprintf("$%d", len(args)), -1)
|
|
}
|
|
return query, args, nil
|
|
}
|