work in progress: tracking - creaate table 'tracks'
This commit is contained in:
parent
3923d49666
commit
1b83cd227f
6 changed files with 61 additions and 27 deletions
|
@ -92,15 +92,15 @@ func (db *Storage) Query(process rowsProc, q string, args ...interface{}) error
|
||||||
//log.Debug().Str("query", q).Msg(info)
|
//log.Debug().Str("query", q).Msg(info)
|
||||||
rows, err := db.DB.Query(q, args...)
|
rows, err := db.DB.Query(q, args...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return db.logErr(err, info, q)
|
return db.LogErr(err, info, q)
|
||||||
}
|
}
|
||||||
for rows.Next() {
|
for rows.Next() {
|
||||||
if err := process(rows); err != nil {
|
if err := process(rows); err != nil {
|
||||||
return db.logErr(err, info, q)
|
return db.LogErr(err, info, q)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if err := rows.Err(); err != nil {
|
if err := rows.Err(); err != nil {
|
||||||
return db.logErr(err, info, q)
|
return db.LogErr(err, info, q)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -110,7 +110,7 @@ func (db *Storage) Exec(q string, args ...interface{}) (int64, error) {
|
||||||
//log.Debug().Str("query", q).Msg(info)
|
//log.Debug().Str("query", q).Msg(info)
|
||||||
res, err := db.DB.Exec(q, args...)
|
res, err := db.DB.Exec(q, args...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
db.logErr(err, info, q)
|
db.LogErr(err, info, q)
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
nrows, _ := res.RowsAffected()
|
nrows, _ := res.RowsAffected()
|
||||||
|
@ -125,7 +125,7 @@ func (db *Storage) DropTable(tn string) error {
|
||||||
func (db *Storage) RunScript(path string) error {
|
func (db *Storage) RunScript(path string) error {
|
||||||
b, err := os.ReadFile(path)
|
b, err := os.ReadFile(path)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return db.logErr(err, "sql.Storage.RunScript", path)
|
return db.LogErr(err, "sql.Storage.RunScript", path)
|
||||||
}
|
}
|
||||||
_, err = db.Exec(string(b))
|
_, err = db.Exec(string(b))
|
||||||
return err
|
return err
|
||||||
|
@ -134,7 +134,7 @@ func (db *Storage) RunScript(path string) error {
|
||||||
func (db *Storage) ParseTemplate(q string) *template.Template {
|
func (db *Storage) ParseTemplate(q string) *template.Template {
|
||||||
t, err := template.New("sql").Parse(q)
|
t, err := template.New("sql").Parse(q)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
db.logErr(err, "sql.Storage.ParseTemplate", q)
|
db.LogErr(err, "sql.Storage.ParseTemplate", q)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
return t
|
return t
|
||||||
|
@ -144,7 +144,7 @@ func (db *Storage) BuildQuery(qname, tname string) string {
|
||||||
info := "sql.Storage.SetTable"
|
info := "sql.Storage.SetTable"
|
||||||
t := db.Sql.Lookup(qname)
|
t := db.Sql.Lookup(qname)
|
||||||
if t == nil {
|
if t == nil {
|
||||||
db.logErr(fmt.Errorf("template not found"), info, qname)
|
db.LogErr(fmt.Errorf("template not found"), info, qname)
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
if db.Cfg.Schema != "" {
|
if db.Cfg.Schema != "" {
|
||||||
|
@ -154,13 +154,13 @@ func (db *Storage) BuildQuery(qname, tname string) string {
|
||||||
data := map[string]interface{}{"table": tname}
|
data := map[string]interface{}{"table": tname}
|
||||||
err := t.Execute(&out, data)
|
err := t.Execute(&out, data)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
db.logErr(err, info, fmt.Sprintf("%+v", t))
|
db.LogErr(err, info, fmt.Sprintf("%+v", t))
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
return out.String()
|
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)
|
log.Error(err).Str("input", inp).Msg(info)
|
||||||
db.Errors = append(db.Errors, err)
|
db.Errors = append(db.Errors, err)
|
||||||
return err
|
return err
|
||||||
|
|
|
@ -1,15 +1,17 @@
|
||||||
package tracking
|
package tracking
|
||||||
|
|
||||||
const Sql_table = `
|
const sql_table = `
|
||||||
create table {{ .tablename }} (
|
{{- $tablename := .tablename -}}
|
||||||
|
create table {{ $tablename }} (
|
||||||
trackid {{ .idType }} primary key,
|
trackid {{ .idType }} primary key,
|
||||||
{{- range .headFields -}}{{ . }} text,
|
{{ range .headFields -}}{{ . }} text,
|
||||||
{{ end -}}
|
{{ end -}}
|
||||||
timestamp timestamptz default current_timestamp,
|
timestamp timestamptz default current_timestamp,
|
||||||
data {{ .jsonType -}}
|
data {{ .jsonType -}}
|
||||||
);
|
);
|
||||||
|
|
||||||
{{ range $i, $cols := .indexes }}
|
{{- range $i, $cols := .indexes }}
|
||||||
create index idx_{{ .i }} on {{ .tablename }} ({{ .cols }});
|
create index idx_{{ $i }} on {{ $tablename }} ({{ $cols }});
|
||||||
{{- end }}
|
{{- end }}
|
||||||
create index idx_timestamp on {{ .tablename }} (timestamp);`
|
create index idx_timestamp on {{ .tablename }} (timestamp);
|
||||||
|
`
|
||||||
|
|
|
@ -3,30 +3,60 @@
|
||||||
package tracking
|
package tracking
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
lib "git.sr.ht/~cco/go-scopes"
|
lib "git.sr.ht/~cco/go-scopes"
|
||||||
sql "git.sr.ht/~cco/go-scopes/storage"
|
sql "git.sr.ht/~cco/go-scopes/storage"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Track struct {
|
type track struct {
|
||||||
TrackId uint
|
TrackId uint
|
||||||
Head map[string]string
|
Head map[string]string
|
||||||
TimeStamp *time.Time
|
TimeStamp *time.Time
|
||||||
Data lib.Payload
|
Data lib.Payload
|
||||||
Container *Container
|
Container *container
|
||||||
}
|
}
|
||||||
|
|
||||||
type Container struct {
|
type container struct {
|
||||||
headFields []string
|
headFields []string
|
||||||
indexes [][]string
|
indexes []string
|
||||||
storage *sql.Storage
|
storage *sql.Storage
|
||||||
}
|
}
|
||||||
|
|
||||||
func MakeContainer(st *sql.Storage) Container {
|
func Container(db *sql.Storage) *container {
|
||||||
return Container{
|
return &container{
|
||||||
headFields: []string{"taskId", "userName"},
|
headFields: []string{"taskId", "userName"},
|
||||||
indexes: [][]string{[]string{"taskId", "userName"}, []string{"userName"}},
|
//indexes: [][]string{[]string{"taskId", "userName"}, []string{"userName"}},
|
||||||
storage: st,
|
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
|
||||||
|
}
|
||||||
|
|
|
@ -16,7 +16,7 @@ func TestMatrixApp(tb *tbase.T) {
|
||||||
t := testing.SetUpApp(tb, etc.ConfigMx())
|
t := testing.SetUpApp(tb, etc.ConfigMx())
|
||||||
t.Run("app-matrix", MxTest)
|
t.Run("app-matrix", MxTest)
|
||||||
t.TearDownApp("matrix")
|
t.TearDownApp("matrix")
|
||||||
t.AssertEqual(t.LogCheck(logfile, true), 13)
|
t.AssertEqual(t.LogCheck(logfile, false), 13)
|
||||||
}
|
}
|
||||||
|
|
||||||
func MxTest(t *testing.T) {
|
func MxTest(t *testing.T) {
|
||||||
|
|
|
@ -19,7 +19,7 @@ func TestScopesApp(tb *tbase.T) {
|
||||||
t.Run("send", SendTest)
|
t.Run("send", SendTest)
|
||||||
t.Run("client", ClientTest)
|
t.Run("client", ClientTest)
|
||||||
t.TearDownApp("")
|
t.TearDownApp("")
|
||||||
t.AssertEqual(t.LogCheck("", true), 18)
|
t.AssertEqual(t.LogCheck("", false), 18)
|
||||||
}
|
}
|
||||||
|
|
||||||
func AppTest(t *testing.T) {
|
func AppTest(t *testing.T) {
|
||||||
|
|
|
@ -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) {
|
func TrackingTest(t *testing.T, cfg *sql.Cfg, db *sql.Storage) {
|
||||||
_ = tracking.Sql_table
|
cont := tracking.Container(db)
|
||||||
_ = tracking.MakeContainer(db)
|
tracking.Create(cont)
|
||||||
}
|
}
|
||||||
|
|
||||||
func resetSqlite(db *sql.Storage) {
|
func resetSqlite(db *sql.Storage) {
|
||||||
db.DropTable("test")
|
db.DropTable("test")
|
||||||
|
db.DropTable("tracks")
|
||||||
db.Exec(sqlite_create_table)
|
db.Exec(sqlite_create_table)
|
||||||
}
|
}
|
||||||
|
|
||||||
func resetPgsql(db *sql.Storage) {
|
func resetPgsql(db *sql.Storage) {
|
||||||
db.DropTable("test")
|
db.DropTable("test")
|
||||||
|
db.DropTable("tracks")
|
||||||
db.Exec(pgsql_create_table)
|
db.Exec(pgsql_create_table)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue