45 lines
		
	
	
		
			885 B
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			45 lines
		
	
	
		
			885 B
		
	
	
	
		
			Go
		
	
	
	
	
	
| package db
 | |
| 
 | |
| import (
 | |
| 	"bytes"
 | |
| 	"fmt"
 | |
| 	"strings"
 | |
| 	"sync"
 | |
| 	"text/template"
 | |
| )
 | |
| 
 | |
| var queriesCache sync.Map
 | |
| 
 | |
| func BuildQuery(text string, data map[string]any) (string, []any, 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()
 | |
| 	args := []any{}
 | |
| 	for key, val := range data {
 | |
| 		if !strings.Contains(query, "@"+key) {
 | |
| 			continue
 | |
| 		}
 | |
| 
 | |
| 		args = append(args, val)
 | |
| 		query = strings.ReplaceAll(query, "@"+key, fmt.Sprintf("$%d", len(args)))
 | |
| 	}
 | |
| 	return query, args, nil
 | |
| }
 |