query specification improvements; add Query() method
This commit is contained in:
parent
43dfd41e5d
commit
ac84a0d4d9
2 changed files with 28 additions and 7 deletions
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Add table
Reference in a new issue