static container definition, + more minor improvements
This commit is contained in:
parent
149520ff21
commit
d7bcaf2559
3 changed files with 61 additions and 57 deletions
|
@ -14,28 +14,21 @@ func Message(tr tracking.Track) *message {
|
|||
return &message{tr}
|
||||
}
|
||||
|
||||
func MakeMessage(t *tracking.TrackTemplate) tracking.Track {
|
||||
func MakeMessage(t *tracking.TrackTemplate, c *tracking.Container) tracking.Track {
|
||||
if t.Head["domain"] == "" {
|
||||
t.Head["domain"] = "scopes"
|
||||
}
|
||||
return tracking.MakeTrack(t)
|
||||
return tracking.MakeTrack(t, c)
|
||||
}
|
||||
|
||||
func (msg *message) Domain() string {
|
||||
return msg.Head()["domain"]
|
||||
}
|
||||
|
||||
// message container
|
||||
|
||||
func Messages(db *sql.Storage) *tracking.Container {
|
||||
return &tracking.Container{
|
||||
ItemFactory: MakeMessage,
|
||||
TableName: "messages",
|
||||
HeadFields: []string{"domain", "action", "class", "item"},
|
||||
Indexes: [][]string{
|
||||
[]string{"domain", "action", "class", "item"},
|
||||
[]string{"domain", "class", "item"},
|
||||
},
|
||||
Storage: db,
|
||||
}
|
||||
return &tracking.Container{container_definition, db}
|
||||
}
|
||||
|
||||
func New(cont *tracking.Container, headValues lib.StrSlice, data lib.Map) *message {
|
||||
|
@ -51,12 +44,30 @@ func Store(act lib.Action) bool {
|
|||
}
|
||||
|
||||
func StoreDB(db *sql.Storage, msg lib.Message) {
|
||||
//q := db.BuildQuery("insert_msg", "messages")
|
||||
//db.Exec(q, msg.Domain(), msg.Action(), msg.Class(), msg.Item(), msg.Payload())
|
||||
cont := Messages(db)
|
||||
t := tracking.TrackTemplate{
|
||||
Head: lib.StrMap{
|
||||
"Domain": msg.Domain(),
|
||||
"Action": msg.Action(),
|
||||
"Class": msg.Class(),
|
||||
"Item": msg.Item(),
|
||||
},
|
||||
}
|
||||
cont.Save(&t)
|
||||
}
|
||||
|
||||
// container definition
|
||||
|
||||
var container_definition *tracking.ContDef
|
||||
|
||||
func init() {
|
||||
sql.SqlSources += `{{ define "insert_msg" -}}
|
||||
insert into {{ .table }} (domain, action, class, item, payload)
|
||||
values ($1, $2, $3, $4, $5) {{- end }}`
|
||||
container_definition = &tracking.ContDef{
|
||||
ItemFactory: MakeMessage,
|
||||
TableName: "messages",
|
||||
HeadFields: []string{"domain", "action", "class", "item"},
|
||||
Indexes: [][]string{
|
||||
[]string{"domain", "action", "class", "item"},
|
||||
[]string{"domain", "class", "item"},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
|
|
@ -4,7 +4,6 @@ import (
|
|||
"database/sql"
|
||||
"fmt"
|
||||
"os"
|
||||
"strings"
|
||||
"text/template"
|
||||
|
||||
lib "git.sr.ht/~cco/go-scopes"
|
||||
|
@ -135,7 +134,7 @@ func (db *Storage) DropTable(tn string) error {
|
|||
func (db *Storage) RunScript(path string) error {
|
||||
b, err := os.ReadFile(path)
|
||||
if err != nil {
|
||||
return db.LogErr(err, "sql.Storage.RunScript", path)
|
||||
return db.LogErr(err, "storage.RunScript", path)
|
||||
}
|
||||
_, err = db.Exec(string(b))
|
||||
return err
|
||||
|
@ -144,32 +143,12 @@ func (db *Storage) RunScript(path string) error {
|
|||
func (db *Storage) ParseTemplate(q string) *template.Template {
|
||||
t, err := template.New("sql").Parse(q)
|
||||
if err != nil {
|
||||
db.LogErr(err, "sql.Storage.ParseTemplate", q)
|
||||
db.LogErr(err, "storage.ParseTemplate", q)
|
||||
return nil
|
||||
}
|
||||
return t
|
||||
}
|
||||
|
||||
func (db *Storage) BuildQuery(qname, tname string) string {
|
||||
info := "sql.Storage.SetTable"
|
||||
t := db.Sql.Lookup(qname)
|
||||
if t == nil {
|
||||
db.LogErr(fmt.Errorf("template not found"), info, qname)
|
||||
return ""
|
||||
}
|
||||
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, info, fmt.Sprintf("%+v", t))
|
||||
return ""
|
||||
}
|
||||
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)
|
||||
|
|
|
@ -13,7 +13,7 @@ import (
|
|||
sql "git.sr.ht/~cco/go-scopes/storage"
|
||||
)
|
||||
|
||||
type ItemFactory func(*TrackTemplate) Track
|
||||
type ItemFactory func(*TrackTemplate, *Container) Track
|
||||
|
||||
type Track interface {
|
||||
TrackId() lib.Ident
|
||||
|
@ -30,7 +30,6 @@ type TrackTemplate struct {
|
|||
Head lib.StrMap
|
||||
TimeStamp *time.Time
|
||||
Data lib.Map
|
||||
Container *Container
|
||||
}
|
||||
|
||||
// basic track implementation
|
||||
|
@ -43,8 +42,8 @@ type track struct {
|
|||
container *Container
|
||||
}
|
||||
|
||||
func MakeTrack(t *TrackTemplate) Track {
|
||||
return &track{t.TrackId, t.Head, t.TimeStamp, t.Data, t.Container}
|
||||
func MakeTrack(t *TrackTemplate, cont *Container) Track {
|
||||
return &track{t.TrackId, t.Head, t.TimeStamp, t.Data, cont}
|
||||
}
|
||||
|
||||
func (tr *track) TrackId() lib.Ident {
|
||||
|
@ -76,29 +75,24 @@ func (tr *track) Update(t *TrackTemplate) {
|
|||
if t.Data != nil {
|
||||
tr.data = t.Data
|
||||
}
|
||||
if t.Container != nil {
|
||||
tr.container = t.Container
|
||||
}
|
||||
}
|
||||
|
||||
// basic container implementation
|
||||
|
||||
type Container struct {
|
||||
type ContDef struct {
|
||||
ItemFactory ItemFactory
|
||||
TableName string
|
||||
HeadFields []string
|
||||
Indexes [][]string
|
||||
}
|
||||
|
||||
type Container struct {
|
||||
*ContDef
|
||||
Storage *sql.Storage
|
||||
}
|
||||
|
||||
func Tracks(db *sql.Storage) *Container {
|
||||
return &Container{
|
||||
ItemFactory: MakeTrack,
|
||||
TableName: "tracks",
|
||||
HeadFields: []string{"taskId", "userName"},
|
||||
Indexes: [][]string{[]string{"taskId", "userName"}, []string{"userName"}},
|
||||
Storage: db,
|
||||
}
|
||||
return &Container{container_definition, db}
|
||||
}
|
||||
|
||||
func (cont *Container) NewTrack(headValues lib.StrSlice, data lib.Map) Track {
|
||||
|
@ -110,11 +104,15 @@ func (cont *Container) NewTrack(headValues lib.StrSlice, data lib.Map) Track {
|
|||
head[k] = headValues[i]
|
||||
}
|
||||
//tr := &track{head: head, data: data}
|
||||
tr := cont.ItemFactory(&TrackTemplate{Head: head, Data: data, Container: cont})
|
||||
tr := cont.ItemFactory(&TrackTemplate{Head: head, Data: data}, cont)
|
||||
cont.insert(tr)
|
||||
return tr
|
||||
}
|
||||
|
||||
func (cont *Container) Save(t *TrackTemplate) lib.Ident {
|
||||
return 0
|
||||
}
|
||||
|
||||
func (cont *Container) insert(tr Track) lib.Ident {
|
||||
var columns []string
|
||||
var values []any
|
||||
|
@ -175,3 +173,19 @@ func (cont *Container) CreateTable() {
|
|||
panic(err)
|
||||
}
|
||||
}
|
||||
|
||||
// container definition
|
||||
|
||||
var container_definition *ContDef
|
||||
|
||||
func init() {
|
||||
container_definition = &ContDef{
|
||||
ItemFactory: MakeTrack,
|
||||
TableName: "tracks",
|
||||
HeadFields: []string{"taskId", "userName"},
|
||||
Indexes: [][]string{
|
||||
[]string{"taskId", "userName"},
|
||||
[]string{"userName"},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue