github.com/seeker-insurance/kit@v0.0.13/db/psql/parse.go (about)

     1  package psql
     2  
     3  import (
     4  	"bytes"
     5  	"fmt"
     6  	"html/template"
     7  	"strings"
     8  
     9  	"github.com/seeker-insurance/kit/assets"
    10  )
    11  
    12  type QueryParser struct {
    13  	fileData  []byte
    14  	variables map[string]interface{}
    15  }
    16  
    17  // Get is a shortcut for r.Parse(), passing nil as data.
    18  func (qp QueryParser) Get(name string) (string, error) {
    19  	return qp.Parse(name, nil)
    20  }
    21  
    22  func (qp QueryParser) Parse(name string, data interface{}) (string, error) {
    23  	t := template.Must(template.New("").Parse(string(qp.fileData)))
    24  
    25  	var b bytes.Buffer
    26  	err := t.ExecuteTemplate(&b, name, data)
    27  	if err != nil {
    28  		return "", err
    29  	}
    30  
    31  	return b.String(), nil
    32  }
    33  
    34  func (qp QueryParser) ParseWithValueHolders(name string, numfields int, numEntities int) (string, error) {
    35  	return qp.Parse(name, map[string]interface{}{"ValueHolders": namedPqParams(numfields, numEntities)})
    36  }
    37  
    38  func (qp *QueryParser) SetFileFromBindata(path string) error {
    39  	fileData, err := assets.Get(path)
    40  	if err != nil {
    41  		return err
    42  	}
    43  
    44  	qp.fileData = fileData
    45  	return nil
    46  }
    47  
    48  //Builds named params in the format Postgres wants them:  ($1, $2, $3), ($4, $5, $6)...
    49  func namedPqParams(numFields int, numEntities int) string {
    50  	paramGroups := make([]string, 0, numEntities)
    51  	params := make([]string, 0, numFields)
    52  	numTotalParams := numEntities * numFields
    53  
    54  	for i := 0; i < numTotalParams; i++ {
    55  		params = append(params, fmt.Sprintf("$%v", i+1))
    56  
    57  		//when we reach the number of fields, group the params
    58  		if (i+1)%numFields == 0 {
    59  			paramGroup := fmt.Sprintf("(%s)", strings.Join(params, ","))
    60  			paramGroups = append(paramGroups, paramGroup)
    61  			params = make([]string, 0, numFields)
    62  		}
    63  	}
    64  	return strings.Join(paramGroups, ",")
    65  }