work in progress: storage: Messages

This commit is contained in:
Helmut Merz 2024-03-27 19:14:20 +01:00
parent 372e254619
commit 5669e3f37d
3 changed files with 72 additions and 39 deletions

View file

@ -3,18 +3,32 @@ package message
import (
lib "git.sr.ht/~cco/go-scopes"
sql "git.sr.ht/~cco/go-scopes/storage"
"git.sr.ht/~cco/go-scopes/storage/tracking"
)
func Messages(db *sql.Storage) *tracking.Container {
return &tracking.Container{
TableName: "messages",
HeadFields: []string{"domain", "action", "class", "item"},
Indexes: [][]string{
[]string{"domain", "action", "class", "item"},
[]string{"domain", "class", "item"},
},
Storage: db,
}
}
// message store action handler
func Store(act lib.Action) bool {
db := lib.GetState[*sql.Storage](act.Context())
StoreDB(db, act.Message())
return true
}
// var Store = func(db *sql.Storage, msg lib.Message) {
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())
//q := db.BuildQuery("insert_msg", "messages")
//db.Exec(q, msg.Domain(), msg.Action(), msg.Class(), msg.Item(), msg.Payload())
}
func init() {

View file

@ -13,20 +13,25 @@ import (
sql "git.sr.ht/~cco/go-scopes/storage"
)
type ItemFactory func() Track
type ItemFactory func(TrackTemplate) Track
type Track interface {
TrackId() lib.Ident
Head() lib.StrMap
Data() lib.Map
TimeStamp() *time.Time
}
type Container interface {
New(lib.StrSlice, lib.Map)
CreateTable()
//Update(TrackTemplate)
}
type BaseTrack = track
type BaseContainer = container
type TrackTemplate struct {
TrackId lib.Ident
Head lib.StrMap
TimeStamp *time.Time
Data lib.Map
Container *Container
}
// basic track implementation
@ -35,38 +40,46 @@ type track struct {
head lib.StrMap
timeStamp *time.Time
data lib.Map
container *container
container *Container
}
func (tr *track) TrackId() lib.Ident {
return tr.trackId
}
func (tr *track) Head() lib.StrMap {
return tr.head
}
func (tr *track) Data() lib.Map {
return tr.data
}
func (tr *track) TimeStamp() *time.Time {
return tr.timeStamp
}
// basic container implementation
type container struct {
tableName string
headFields []string
indexes [][]string
storage *sql.Storage
type Container struct {
TableName string
HeadFields []string
Indexes [][]string
Storage *sql.Storage
}
func Tracks(db *sql.Storage) *container {
return &container{
tableName: "tracks",
headFields: []string{"taskId", "userName"},
indexes: [][]string{[]string{"taskId", "userName"}, []string{"userName"}},
storage: db,
func Tracks(db *sql.Storage) *Container {
return &Container{
TableName: "tracks",
HeadFields: []string{"taskId", "userName"},
Indexes: [][]string{[]string{"taskId", "userName"}, []string{"userName"}},
Storage: db,
}
}
func (cont *container) New(headValues lib.StrSlice, data lib.Map) Track {
func (cont *Container) New(headValues lib.StrSlice, data lib.Map) Track {
head := lib.StrMap{}
for i, k := range cont.headFields {
for i, k := range cont.HeadFields {
head[k] = headValues[i]
}
tr := &track{head: head, data: data}
@ -74,20 +87,20 @@ func (cont *container) New(headValues lib.StrSlice, data lib.Map) Track {
return tr
}
func (cont *container) insert(tr *track) lib.Ident {
func (cont *Container) insert(tr *track) lib.Ident {
var columns []string
var values []any
for _, k := range cont.headFields {
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
db := cont.Storage
data := lib.Map{
"schema": db.Schema,
"tablename": cont.tableName,
"tablename": cont.TableName,
"columns": columns,
}
sql := storage.BuildSql(SqlInsert, data)
@ -121,13 +134,13 @@ func ParseDateTime(inp string) *time.Time {
return nil
}
func (cont *container) CreateTable() {
db := cont.storage
func (cont *Container) CreateTable() {
db := cont.Storage
data := lib.Map{
"schema": db.Schema,
"tablename": cont.tableName,
"headFields": cont.headFields,
"indexes": cont.indexes,
"tablename": cont.TableName,
"headFields": cont.HeadFields,
"indexes": cont.Indexes,
"params": db.Params,
}
sql := storage.BuildSql(SqlCreate, data)

View file

@ -1,16 +1,15 @@
package scopes
import (
"fmt"
tbase "testing"
"time"
lib "git.sr.ht/~cco/go-scopes"
"git.sr.ht/~cco/go-scopes/common/testing"
"git.sr.ht/~cco/go-scopes/core/message"
sql "git.sr.ht/~cco/go-scopes/storage"
"git.sr.ht/~cco/go-scopes/storage/db/pgsql"
_ "git.sr.ht/~cco/go-scopes/storage/db/sqlite"
msgstore "git.sr.ht/~cco/go-scopes/storage/message"
"git.sr.ht/~cco/go-scopes/storage/message"
"git.sr.ht/~cco/go-scopes/storage/tracking"
"git.sr.ht/~cco/go-scopes/tests/etc"
)
@ -71,23 +70,30 @@ func TrackingTest(t *testing.T, cfg *sql.Cfg, db *sql.Storage) {
cont.CreateTable()
track := cont.New(lib.StrSlice{"t01", "john"}, lib.Map{})
t.AssertEqual(track.TrackId(), lib.Ident(1))
fmt.Printf("%+v\n", track.TimeStamp())
t.AssertEqual(track.TimeStamp().Year(), time.Now().Year())
//fmt.Printf("%+v\n", track.TimeStamp())
}
func MessageTest(t *testing.T, cfg *sql.Cfg, db *sql.Storage) {
msg := message.SimpleMessage("data")
msgstore.StoreDB(db, msg)
//msg := message.SimpleMessage("data")
//msgstore.StoreDB(db, msg)
cont := message.Messages(db)
cont.CreateTable()
//msg := cont.New(lib.StrSlice("", "data"), lib.Map{})
//t.AssertEqual(msg.TrackId(), lib.Ident(1))
}
func resetSqlite(db *sql.Storage) {
db.DropTable("test")
db.DropTable("tracks")
db.DropTable("messages")
db.Exec(sqlite_create_table)
}
func resetPgsql(db *sql.Storage) {
db.DropTable("test")
db.DropTable("testing.tracks")
db.DropTable("testing.messages")
db.Exec(pgsql_create_table)
}