query specification improvements; add Query() method

This commit is contained in:
Helmut Merz 2024-04-12 17:13:22 +02:00
parent 43dfd41e5d
commit ac84a0d4d9
2 changed files with 28 additions and 7 deletions

View file

@ -19,7 +19,6 @@ type Storage struct {
*Cfg *Cfg
Schema string Schema string
Params map[string]string Params map[string]string
Sql *template.Template
Errors []error Errors []error
} }
@ -39,8 +38,6 @@ type scpcon[T any] interface {
scp scp
} }
var SqlSources = ""
func Open(cfg *Cfg) *Storage { func Open(cfg *Cfg) *Storage {
db, err := sql.Open(cfg.Driver, cfg.Connstr) db, err := sql.Open(cfg.Driver, cfg.Connstr)
if err != nil { if err != nil {
@ -53,7 +50,6 @@ func Open(cfg *Cfg) *Storage {
Schema: cfg.Schema, Schema: cfg.Schema,
Params: map[string]string{}, Params: map[string]string{},
} }
storage.Sql = storage.ParseTemplate(SqlSources)
return &storage return &storage
} }

View file

@ -109,6 +109,14 @@ type ordSpec struct {
Desc bool 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) { func (spec *querySpec) setup(cont *Container) {
if cont.Storage.Schema == "" { if cont.Storage.Schema == "" {
spec.Table = cont.TableName spec.Table = cont.TableName
@ -125,10 +133,10 @@ func (spec *querySpec) setup(cont *Container) {
} }
} }
for _, c := range spec.Qucols { for _, c := range spec.Qucols {
spec.Quspecs = append(spec.Quspecs, struct{ Col, Op string }{c, "="}) spec.AddQu(c, "=")
} }
for _, c := range spec.Ordcols { 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, Headvals: hv,
Limit: 1, Limit: 1,
} }
quSpec.Ordspecs = append(quSpec.Ordspecs, ordSpec{"timestamp", true}) quSpec.AddOrd("timestamp", true)
return cont.QueryOne(quSpec) return cont.QueryOne(quSpec)
} }
@ -162,6 +170,23 @@ func (cont *Container) QueryOne(quSpec *querySpec) *Track {
return tr 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 { func (cont *Container) NewTrack(h []string, data lib.Map) *Track {
tr := cont.ItemFactory(cont, h...) tr := cont.ItemFactory(cont, h...)
//tr.SetData(data) //tr.SetData(data)