diff --git a/storage/tracking/sql_code.go b/storage/tracking/sql_code.go index 481c972..1a61934 100644 --- a/storage/tracking/sql_code.go +++ b/storage/tracking/sql_code.go @@ -38,7 +38,7 @@ insert into {{ $tablename }} ( {{- range $j, $c := .columns -}} {{- if ne $j 0 -}}, {{ end }}${{ add1 $j }} {{- end -}}) -` + returning trackid` ) var SqlCreate, SqlInsert *template.Template diff --git a/storage/tracking/tracking.go b/storage/tracking/tracking.go index f10bafa..06e1642 100644 --- a/storage/tracking/tracking.go +++ b/storage/tracking/tracking.go @@ -11,12 +11,16 @@ import ( 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 track struct { + trackId uint + head map[string]string + timeStamp *time.Time + data lib.Data + container *container +} + +func (tr *track) TrackId() uint { + return tr.trackId } type container struct { @@ -26,7 +30,14 @@ type container struct { storage *sql.Storage } -func Container(db *sql.Storage) *container { +func SimpleTrack(taskId, userName string, data lib.Map) track { + return track{ + head: map[string]string{"taskId": taskId, "userName": userName}, + data: data, + } +} + +func SimpleContainer(db *sql.Storage) *container { return &container{ tableName: "tracks", headFields: []string{"taskId", "userName"}, @@ -35,15 +46,15 @@ func Container(db *sql.Storage) *container { } } -func Insert(cont *container, tr Track) int64 { +func (cont *container) Insert(tr *track) uint { var columns []string var values []any for _, k := range cont.headFields { columns = append(columns, k) - values = append(values, tr.Head[k]) + values = append(values, tr.head[k]) } columns = append(columns, "Data") - b, _ := json.Marshal(tr.Data) + b, _ := json.Marshal(tr.data) values = append(values, b) db := cont.storage data := map[string]interface{}{ @@ -52,13 +63,16 @@ func Insert(cont *container, tr Track) int64 { "columns": columns, } sql := storage.BuildSql(SqlInsert, data) - if n, err := db.Exec(sql, values...); err == nil { - return n + if res := storage.QueryCol[uint](db, sql, values...); res != nil { + trid := res[0] + tr.trackId = trid + tr.container = cont + return trid } return 0 } -func Create(cont *container) *container { +func (cont *container) CreateTable() *container { db := cont.storage data := map[string]interface{}{ "schema": db.Schema, diff --git a/tests/storage_test.go b/tests/storage_test.go index 7284d07..2f1922a 100644 --- a/tests/storage_test.go +++ b/tests/storage_test.go @@ -70,7 +70,7 @@ func TrackingTest(t *testing.T, cfg *sql.Cfg, db *sql.Storage) { cont.CreateTable() track := tracking.SimpleTrack("t01", "john", lib.Map{}) cont.Insert(&track) - t.AssertEqual(track.TrackId, uint(1)) + t.AssertEqual(track.TrackId(), uint(1)) } func MessageTest(t *testing.T, cfg *sql.Cfg, db *sql.Storage) {