diff --git a/storage/tracking/sql_code.go b/storage/tracking/sql_code.go index 27ea571..832b911 100644 --- a/storage/tracking/sql_code.go +++ b/storage/tracking/sql_code.go @@ -8,9 +8,10 @@ import ( const ( sql_table = ` -{{- $json := or .Params.jsonType "json" -}} +{{- $params := .Cont.Storage.Params -}} +{{- $json := or $params.jsonType "json" -}} create table if not exists {{ .Table }} ( - trackid {{ or .Params.idType "integer" }} primary key, + trackid {{ or $params.idType "integer" }} primary key, {{ range .Cont.HeadFields -}}{{ toLower . }} text default '', {{ end -}} timestamp timestamptz default current_timestamp, @@ -38,6 +39,8 @@ insert into {{ .Table }} ( {{- end -}}) returning trackid, timestamp` + sql_update = `` + sql_select = ` select {{ range $j, $c := .Scols -}} {{- if ne $j 0 -}}, {{ end }}{{ toLower $c }}{{- end }} @@ -55,10 +58,11 @@ select {{ range $j, $c := .Scols -}} ` ) -var SqlCreate, SqlInsert, SqlSelect *template.Template +var SqlCreate, SqlInsert, SqlUpdate, SqlSelect *template.Template func init() { SqlCreate = storage.Template("create_table", sql_table) SqlInsert = storage.Template("insert_track", sql_insert) + SqlUpdate = storage.Template("update_track", sql_update) SqlSelect = storage.Template("select_track", sql_select) } diff --git a/storage/tracking/tracking.go b/storage/tracking/tracking.go index 4994faa..019819e 100644 --- a/storage/tracking/tracking.go +++ b/storage/tracking/tracking.go @@ -43,6 +43,15 @@ func MakeTrack(cont *Container, h ...string) *Track { return &tr } +func (tr *Track) AsSlice() []any { + var sl []any + for _, k := range tr.container.HeadFields { + sl = append(sl, tr.Head[k]) + } + sl = append(sl, tr.TimeStamp, tr.Data) + return sl +} + func (tr *Track) SetHead(h ...string) { for i, k := range tr.container.HeadFields { if i >= len(h) { @@ -141,7 +150,6 @@ func (spec *querySpec) setup(cont *Container) { spec.AddOrd(c, false) } spec.Cont = cont - spec.Params = cont.Storage.Params } func (cont *Container) Get(id lib.Ident) *Track { @@ -196,11 +204,11 @@ func (cont *Container) NewTrack(h []string, data lib.Map) *Track { return tr } -func (cont *Container) Save(t *Track) lib.Ident { - return 0 +func (cont *Container) Save(tr *Track) *Track { + return tr } -func (cont *Container) Insert(tr *Track) lib.Ident { +func (cont *Container) Insert(tr *Track) *Track { quSpec := &querySpec{ Scols: append(cont.HeadFields, "Data"), } @@ -219,9 +227,22 @@ func (cont *Container) Insert(tr *Track) lib.Ident { return err } if err := cont.Storage.Query(proc, sql, values...); err == nil { - return tr.trackId + return tr } - return 0 + return nil +} + +func (cont *Container) Update(tr *Track) *Track { + quSpec := &querySpec{ + Qucols: lib.StrSlice{"trackid"}, + } + quSpec.setup(cont) + sql := storage.BuildSql(SqlUpdate, quSpec) + n, _ := cont.Storage.Exec(sql, append(tr.AsSlice(), tr.trackId)...) + if n == 1 { + return tr + } + return nil } func ParseDateTime(inp string) *time.Time {