work in progress: tracking - creaate table 'tracks'

This commit is contained in:
Helmut Merz 2024-03-24 09:54:32 +01:00
parent 3923d49666
commit 1b83cd227f
6 changed files with 61 additions and 27 deletions

View file

@ -92,15 +92,15 @@ func (db *Storage) Query(process rowsProc, q string, args ...interface{}) error
//log.Debug().Str("query", q).Msg(info)
rows, err := db.DB.Query(q, args...)
if err != nil {
return db.logErr(err, info, q)
return db.LogErr(err, info, q)
}
for rows.Next() {
if err := process(rows); err != nil {
return db.logErr(err, info, q)
return db.LogErr(err, info, q)
}
}
if err := rows.Err(); err != nil {
return db.logErr(err, info, q)
return db.LogErr(err, info, q)
}
return nil
}
@ -110,7 +110,7 @@ func (db *Storage) Exec(q string, args ...interface{}) (int64, error) {
//log.Debug().Str("query", q).Msg(info)
res, err := db.DB.Exec(q, args...)
if err != nil {
db.logErr(err, info, q)
db.LogErr(err, info, q)
return 0, err
}
nrows, _ := res.RowsAffected()
@ -125,7 +125,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, "sql.Storage.RunScript", path)
}
_, err = db.Exec(string(b))
return err
@ -134,7 +134,7 @@ 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, "sql.Storage.ParseTemplate", q)
return nil
}
return t
@ -144,7 +144,7 @@ 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)
db.LogErr(fmt.Errorf("template not found"), info, qname)
return ""
}
if db.Cfg.Schema != "" {
@ -154,13 +154,13 @@ func (db *Storage) BuildQuery(qname, tname string) string {
data := map[string]interface{}{"table": tname}
err := t.Execute(&out, data)
if err != nil {
db.logErr(err, info, fmt.Sprintf("%+v", t))
db.LogErr(err, info, fmt.Sprintf("%+v", t))
return ""
}
return out.String()
}
func (db *Storage) logErr(err error, info, inp string) error {
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

View file

@ -1,15 +1,17 @@
package tracking
const Sql_table = `
create table {{ .tablename }} (
const sql_table = `
{{- $tablename := .tablename -}}
create table {{ $tablename }} (
trackid {{ .idType }} primary key,
{{- range .headFields -}}{{ . }} text,
{{ range .headFields -}}{{ . }} text,
{{ end -}}
timestamp timestamptz default current_timestamp,
data {{ .jsonType -}}
);
{{ range $i, $cols := .indexes }}
create index idx_{{ .i }} on {{ .tablename }} ({{ .cols }});
{{- range $i, $cols := .indexes }}
create index idx_{{ $i }} on {{ $tablename }} ({{ $cols }});
{{- end }}
create index idx_timestamp on {{ .tablename }} (timestamp);`
create index idx_timestamp on {{ .tablename }} (timestamp);
`

View file

@ -3,30 +3,60 @@
package tracking
import (
"fmt"
"strings"
"time"
lib "git.sr.ht/~cco/go-scopes"
sql "git.sr.ht/~cco/go-scopes/storage"
)
type Track struct {
type track struct {
TrackId uint
Head map[string]string
TimeStamp *time.Time
Data lib.Payload
Container *Container
Container *container
}
type Container struct {
type container struct {
headFields []string
indexes [][]string
indexes []string
storage *sql.Storage
}
func MakeContainer(st *sql.Storage) Container {
return Container{
func Container(db *sql.Storage) *container {
return &container{
headFields: []string{"taskId", "userName"},
indexes: [][]string{[]string{"taskId", "userName"}, []string{"userName"}},
storage: st,
//indexes: [][]string{[]string{"taskId", "userName"}, []string{"userName"}},
indexes: []string{"taskid, username", "username"},
storage: db,
}
}
func Create(cont *container) *container {
db := cont.storage
t := db.ParseTemplate(sql_table)
var out strings.Builder
data := map[string]interface{}{
"tablename": "tracks",
"headFields": cont.headFields,
"indexes": cont.indexes,
"idType": "integer",
"jsonType": "json",
}
err := t.Execute(&out, data)
if err != nil {
db.LogErr(err, "storage.tracking.Create", fmt.Sprintf("%+v", t))
return nil
}
sql := out.String()
println(sql)
_, err = db.Exec(sql)
if err != nil {
println(err)
db.LogErr(err, "storage.tracking.Create", fmt.Sprintf("%+v", t))
return nil
}
return cont
}

View file

@ -16,7 +16,7 @@ func TestMatrixApp(tb *tbase.T) {
t := testing.SetUpApp(tb, etc.ConfigMx())
t.Run("app-matrix", MxTest)
t.TearDownApp("matrix")
t.AssertEqual(t.LogCheck(logfile, true), 13)
t.AssertEqual(t.LogCheck(logfile, false), 13)
}
func MxTest(t *testing.T) {

View file

@ -19,7 +19,7 @@ func TestScopesApp(tb *tbase.T) {
t.Run("send", SendTest)
t.Run("client", ClientTest)
t.TearDownApp("")
t.AssertEqual(t.LogCheck("", true), 18)
t.AssertEqual(t.LogCheck("", false), 18)
}
func AppTest(t *testing.T) {

View file

@ -68,17 +68,19 @@ func MessageTest(t *testing.T, cfg *sql.Cfg, db *sql.Storage) {
}
func TrackingTest(t *testing.T, cfg *sql.Cfg, db *sql.Storage) {
_ = tracking.Sql_table
_ = tracking.MakeContainer(db)
cont := tracking.Container(db)
tracking.Create(cont)
}
func resetSqlite(db *sql.Storage) {
db.DropTable("test")
db.DropTable("tracks")
db.Exec(sqlite_create_table)
}
func resetPgsql(db *sql.Storage) {
db.DropTable("test")
db.DropTable("tracks")
db.Exec(pgsql_create_table)
}