experimental: build query functionality using templates
This commit is contained in:
parent
afa1c3e860
commit
3c81a179cc
2 changed files with 29 additions and 12 deletions
|
@ -1,16 +1,29 @@
|
|||
package msgstore
|
||||
|
||||
import (
|
||||
"text/template"
|
||||
|
||||
lib "git.sr.ht/~cco/go-scopes"
|
||||
"git.sr.ht/~cco/go-scopes/storage/sql"
|
||||
)
|
||||
|
||||
func Store(db *sql.Storage, msg lib.Message) {
|
||||
q := db.SetTable(sql_insert_msg, "messages")
|
||||
var Store = func(db *sql.Storage, msg lib.Message) {
|
||||
q := buildQuery(db, "insert_msg", "messages")
|
||||
db.Exec(q, msg.Domain(), msg.Action(), msg.Class(), msg.Item(), msg.Payload())
|
||||
}
|
||||
|
||||
const (
|
||||
sql_insert_msg = `insert into {{ .table }} (domain, action, class, item, payload)
|
||||
values ($1, $2, $3, $4, $5)`
|
||||
)
|
||||
func buildQuery(db *sql.Storage, qname, tname string) string {
|
||||
t, ok := sql_templates[qname]
|
||||
if !ok {
|
||||
t = db.ParseTemplate(sql_sources[qname])
|
||||
sql_templates[qname] = t
|
||||
}
|
||||
return db.SetTable(t, tname)
|
||||
}
|
||||
|
||||
var sql_templates = map[string]*template.Template{}
|
||||
|
||||
var sql_sources = map[string]string{
|
||||
"insert_msg": `insert into {{ .table }} (domain, action, class, item, payload)
|
||||
values ($1, $2, $3, $4, $5)`,
|
||||
}
|
||||
|
|
|
@ -119,21 +119,25 @@ func (db *Storage) RunScript(path string) error {
|
|||
return err
|
||||
}
|
||||
|
||||
func (db *Storage) SetTable(q, tname string) string {
|
||||
func (db *Storage) ParseTemplate(q string) *template.Template {
|
||||
t, err := template.New("sql").Parse(q)
|
||||
if err != nil {
|
||||
db.logErr(err, "sql.Storage.SetTable", q)
|
||||
return q
|
||||
db.logErr(err, "sql.Storage.ParseTemplate", q)
|
||||
return nil
|
||||
}
|
||||
return t
|
||||
}
|
||||
|
||||
func (db *Storage) SetTable(t *template.Template, tname string) string {
|
||||
if db.Cfg.Schema != "" {
|
||||
tname = db.Cfg.Schema + "." + tname
|
||||
}
|
||||
var out strings.Builder
|
||||
data := map[string]interface{}{"table": tname}
|
||||
err = t.Execute(&out, data)
|
||||
err := t.Execute(&out, data)
|
||||
if err != nil {
|
||||
db.logErr(err, "sql.Storage.SetTable", q)
|
||||
return q
|
||||
db.logErr(err, "sql.Storage.SetTable", fmt.Sprintf("%+v", t))
|
||||
return ""
|
||||
}
|
||||
return out.String()
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue