From 3c81a179ccafe68ad04c3bb3d0a2c454da798fd7 Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Thu, 24 Aug 2023 09:32:11 +0200 Subject: [PATCH] experimental: build query functionality using templates --- storage/msgstore/msgstore.go | 25 +++++++++++++++++++------ storage/sql/sql.go | 16 ++++++++++------ 2 files changed, 29 insertions(+), 12 deletions(-) diff --git a/storage/msgstore/msgstore.go b/storage/msgstore/msgstore.go index 91a09e6..829dbae 100644 --- a/storage/msgstore/msgstore.go +++ b/storage/msgstore/msgstore.go @@ -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)`, +} diff --git a/storage/sql/sql.go b/storage/sql/sql.go index c36c428..b4a1ce3 100644 --- a/storage/sql/sql.go +++ b/storage/sql/sql.go @@ -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() }