diff --git a/storage/message/message.go b/storage/message/message.go index 204d6e4..2e8add8 100644 --- a/storage/message/message.go +++ b/storage/message/message.go @@ -7,14 +7,14 @@ import ( ) type message struct { - *tracking.Track + *tracking.BaseTrack } -func Message(tr *tracking.Track) tracking.Adapted { +func Message(tr *tracking.BaseTrack) tracking.Adapted { return &message{tr} } -func MakeMessage(c *tracking.Container, h ...string) *tracking.Track { +func MakeMessage(c *tracking.Container, h ...string) *tracking.BaseTrack { h = append(h, "") // make sure at least domain is there if h[0] == "" { h[0] = "scopes" @@ -22,6 +22,10 @@ func MakeMessage(c *tracking.Container, h ...string) *tracking.Track { return tracking.MakeTrack(c, h...).SetAdapterFactory(Message) } +func (msg *message) Base() *tracking.BaseTrack { + return msg.BaseTrack +} + func (msg *message) Domain() string { return msg.Head()["domain"] } diff --git a/storage/tracking/tracking.go b/storage/tracking/tracking.go index 77ac1a3..0dec71a 100644 --- a/storage/tracking/tracking.go +++ b/storage/tracking/tracking.go @@ -17,14 +17,14 @@ import ( ) type ContFactory func(*sql.Storage) *Container -type ItemFactory func(*Container, ...string) *Track +type ItemFactory func(*Container, ...string) *track type Adapted interface{} -type AdapterFactory func(*Track) Adapted +type AdapterFactory func(*track) Adapted // basic track implementation -type Track struct { +type track struct { trackId lib.Ident head lib.StrMap timeStamp *time.Time @@ -33,42 +33,48 @@ type Track struct { adapter AdapterFactory } -func MakeTrack(cont *Container, h ...string) *Track { - tr := Track{ +type BaseTrack = track + +func MakeTrack(cont *Container, h ...string) *track { + tr := track{ head: lib.StrMap{}, data: lib.Map{}, container: cont, - adapter: func(tr *Track) Adapted { return tr }, + adapter: func(tr *track) Adapted { return tr }, } tr.SetHead(h...) return &tr } -func (tr *Track) TrackId() lib.Ident { +func (tr *track) Base() *BaseTrack { + return tr +} + +func (tr *track) TrackId() lib.Ident { return tr.trackId } -func (tr *Track) Head() lib.StrMap { +func (tr *track) Head() lib.StrMap { return tr.head } -func (tr *Track) TimeStamp() *time.Time { +func (tr *track) TimeStamp() *time.Time { return tr.timeStamp } -func (tr *Track) Data() lib.Map { +func (tr *track) Data() lib.Map { return tr.data } -func (tr *Track) Container() *Container { +func (tr *track) Container() *Container { return tr.container } -func (tr *Track) Uid() string { +func (tr *track) Uid() string { return fmt.Sprintf("%s-%d", tr.container.Prefix, tr.trackId) } -func (tr *Track) SetHead(h ...string) { +func (tr *track) SetHead(h ...string) { for i, k := range tr.container.HeadFields { if i >= len(h) { break @@ -79,15 +85,15 @@ func (tr *Track) SetHead(h ...string) { } } -func (tr *Track) SetTimeStamp(ts *time.Time) { +func (tr *track) SetTimeStamp(ts *time.Time) { tr.timeStamp = ts } -func (tr *Track) SetData(data lib.Map) { +func (tr *track) SetData(data lib.Map) { tr.data = data } -func (tr *Track) ScanP(rows *sql.Rows) error { +func (tr *track) ScanP(rows *sql.Rows) error { tr.head = lib.StrMap{} var d []any for range tr.container.HeadFields { @@ -111,12 +117,12 @@ func (tr *Track) ScanP(rows *sql.Rows) error { return err } -func (tr *Track) SetAdapterFactory(af AdapterFactory) *Track { +func (tr *track) SetAdapterFactory(af AdapterFactory) *track { tr.adapter = af return tr } -func Adapt[T Adapted](tr *Track) T { +func Adapt[T Adapted](tr *track) T { return tr.adapter(tr).(T) } @@ -191,7 +197,7 @@ func (spec *querySpec) setup(cont *Container) { spec.Cont = cont } -func (cont *Container) Get(id lib.Ident) *Track { +func (cont *Container) Get(id lib.Ident) *track { quSpec := &querySpec{ Qucols: lib.StrSlice{"trackid"}, Quvals: []any{id}, @@ -199,7 +205,7 @@ func (cont *Container) Get(id lib.Ident) *Track { return cont.QueryOne(quSpec) } -func (cont *Container) QueryLast(hv ...string) *Track { +func (cont *Container) QueryLast(hv ...string) *track { quSpec := &querySpec{ Headvals: hv, Limit: 1, @@ -208,8 +214,8 @@ func (cont *Container) QueryLast(hv ...string) *Track { return cont.QueryOne(quSpec) } -func (cont *Container) QueryOne(quSpec *querySpec) *Track { - var tr *Track +func (cont *Container) QueryOne(quSpec *querySpec) *track { + var tr *track proc := func(r *sql.Rows) error { tr = cont.ItemFactory(cont) return tr.ScanP(r) @@ -220,8 +226,8 @@ func (cont *Container) QueryOne(quSpec *querySpec) *Track { return tr } -func (cont *Container) Query(quSpec *querySpec) []*Track { - var trs []*Track +func (cont *Container) Query(quSpec *querySpec) []*track { + var trs []*track proc := func(r *sql.Rows) error { tr := cont.ItemFactory(cont) err := tr.ScanP(r) @@ -236,18 +242,18 @@ func (cont *Container) Query(quSpec *querySpec) []*Track { return trs } -func (cont *Container) NewTrack(h []string, data lib.Map) *Track { +func (cont *Container) NewTrack(h []string, data lib.Map) *track { tr := cont.ItemFactory(cont, h...) tr.data = data cont.Insert(tr) return tr } -func (cont *Container) Save(tr *Track) *Track { +func (cont *Container) Save(tr *track) *track { return tr } -func (cont *Container) Insert(tr *Track) *Track { +func (cont *Container) Insert(tr *track) *track { quSpec := &querySpec{ Scols: append(cont.HeadFields, "Data"), } @@ -271,7 +277,7 @@ func (cont *Container) Insert(tr *Track) *Track { return nil } -func (cont *Container) Update(tr *Track) *Track { +func (cont *Container) Update(tr *track) *track { if tr.timeStamp == nil { ts := time.Now() tr.timeStamp = &ts @@ -333,7 +339,7 @@ func GetContainerDef(p string) *ContDef { return container_registry[p] } -func Get(db *sql.Storage, uid string) *Track { +func Get(db *sql.Storage, uid string) *track { parts := strings.Split(uid, "-") cd := GetContainerDef(parts[0]) cont := cd.ContFactory(db)