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 }