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
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
}

View file

@ -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)