storage/sql: allow dynamic setting of table name (including schema) via template

This commit is contained in:
Helmut Merz 2023-08-22 14:10:27 +02:00
parent 064c442d4a
commit afa1c3e860
2 changed files with 25 additions and 6 deletions

View file

@ -1,18 +1,16 @@
package msgstore
import (
"fmt"
lib "git.sr.ht/~cco/go-scopes"
"git.sr.ht/~cco/go-scopes/storage/sql"
)
func Store(db *sql.Storage, msg lib.Message) {
q := fmt.Sprintf(sql_insert_msg, "messages")
q := db.SetTable(sql_insert_msg, "messages")
db.Exec(q, msg.Domain(), msg.Action(), msg.Class(), msg.Item(), msg.Payload())
}
const (
sql_insert_msg = `insert into %s (domain, action, class, item, payload)
sql_insert_msg = `insert into {{ .table }} (domain, action, class, item, payload)
values ($1, $2, $3, $4, $5)`
)

View file

@ -4,6 +4,8 @@ import (
"database/sql"
"fmt"
"os"
"strings"
"text/template"
"git.sr.ht/~cco/go-scopes/logging/log"
)
@ -117,8 +119,27 @@ func (db *Storage) RunScript(path string) error {
return err
}
func (db *Storage) logErr(err error, info, q string) error {
log.Error(err).Str("query", q).Msg(info)
func (db *Storage) SetTable(q, tname string) string {
t, err := template.New("sql").Parse(q)
if err != nil {
db.logErr(err, "sql.Storage.SetTable", q)
return q
}
if db.Cfg.Schema != "" {
tname = db.Cfg.Schema + "." + tname
}
var out strings.Builder
data := map[string]interface{}{"table": tname}
err = t.Execute(&out, data)
if err != nil {
db.logErr(err, "sql.Storage.SetTable", q)
return q
}
return out.String()
}
func (db *Storage) logErr(err error, info, inp string) error {
log.Error(err).Str("input", inp).Msg(info)
db.Errors = append(db.Errors, err)
return err
}