// Package `tracking` defines a generic track (sort of record) type // and a container type that allows storing of tracks in a SQL database. package tracking import ( "encoding/json" "time" lib "git.sr.ht/~cco/go-scopes" "git.sr.ht/~cco/go-scopes/storage" sql "git.sr.ht/~cco/go-scopes/storage" ) type Track struct { TrackId uint Head map[string]string TimeStamp *time.Time Data lib.Data Container *container } type container struct { tableName string headFields []string indexes [][]string storage *sql.Storage } func Container(db *sql.Storage) *container { return &container{ tableName: "tracks", headFields: []string{"taskId", "userName"}, indexes: [][]string{[]string{"taskId", "userName"}, []string{"userName"}}, storage: db, } } func Insert(cont *container, tr Track) int64 { var columns []string var values []any for _, k := range cont.headFields { columns = append(columns, k) values = append(values, tr.Head[k]) } columns = append(columns, "Data") b, _ := json.Marshal(tr.Data) values = append(values, b) db := cont.storage data := map[string]interface{}{ "schema": db.Schema, "tablename": cont.tableName, "columns": columns, } sql := storage.BuildSql(SqlInsert, data) if n, err := db.Exec(sql, values...); err == nil { return n } return 0 } func Create(cont *container) *container { db := cont.storage data := map[string]interface{}{ "schema": db.Schema, "tablename": cont.tableName, "headFields": cont.headFields, "indexes": cont.indexes, "params": db.Params, } sql := storage.BuildSql(SqlCreate, data) //println(sql) _, err := db.Exec(sql) if err == nil { return cont } return nil }