diff --git a/storage/storage.go b/storage/storage.go index 1cb5ad8..8d8aed5 100644 --- a/storage/storage.go +++ b/storage/storage.go @@ -19,7 +19,6 @@ type Storage struct { *Cfg Schema string Params map[string]string - Sql *template.Template Errors []error } @@ -39,8 +38,6 @@ type scpcon[T any] interface { scp } -var SqlSources = "" - func Open(cfg *Cfg) *Storage { db, err := sql.Open(cfg.Driver, cfg.Connstr) if err != nil { @@ -53,7 +50,6 @@ func Open(cfg *Cfg) *Storage { Schema: cfg.Schema, Params: map[string]string{}, } - storage.Sql = storage.ParseTemplate(SqlSources) return &storage } diff --git a/storage/tracking/tracking.go b/storage/tracking/tracking.go index 04592c5..9117388 100644 --- a/storage/tracking/tracking.go +++ b/storage/tracking/tracking.go @@ -109,6 +109,14 @@ type ordSpec struct { Desc bool } +func (spec *querySpec) AddQu(col, op string) { + spec.Quspecs = append(spec.Quspecs, struct{ Col, Op string }{col, op}) +} + +func (spec *querySpec) AddOrd(col string, desc bool) { + spec.Ordspecs = append(spec.Ordspecs, ordSpec{col, desc}) +} + func (spec *querySpec) setup(cont *Container) { if cont.Storage.Schema == "" { spec.Table = cont.TableName @@ -125,10 +133,10 @@ func (spec *querySpec) setup(cont *Container) { } } for _, c := range spec.Qucols { - spec.Quspecs = append(spec.Quspecs, struct{ Col, Op string }{c, "="}) + spec.AddQu(c, "=") } for _, c := range spec.Ordcols { - spec.Ordspecs = append(spec.Ordspecs, ordSpec{c, false}) + spec.AddOrd(c, false) } } @@ -145,7 +153,7 @@ func (cont *Container) QueryLast(hv ...string) *Track { Headvals: hv, Limit: 1, } - quSpec.Ordspecs = append(quSpec.Ordspecs, ordSpec{"timestamp", true}) + quSpec.AddOrd("timestamp", true) return cont.QueryOne(quSpec) } @@ -162,6 +170,23 @@ func (cont *Container) QueryOne(quSpec *querySpec) *Track { return tr } +func (cont *Container) Query(quSpec *querySpec) []*Track { + db := cont.Storage + var trs []*Track + proc := func(r *sql.Rows) error { + tr := cont.ItemFactory(cont) + err := tr.ScanP(r) + if err == nil { + trs = append(trs, tr) + } + return err + } + quSpec.setup(cont) + sql := storage.BuildSql(SqlSelect, quSpec) + db.Query(proc, sql, quSpec.Quvals...) + return trs +} + func (cont *Container) NewTrack(h []string, data lib.Map) *Track { tr := cont.ItemFactory(cont, h...) //tr.SetData(data)