-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathfetch.go
50 lines (43 loc) · 1.13 KB
/
fetch.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
package y
import sq "github.com/Masterminds/squirrel"
// Finder loads a collection from a database
type Finder struct {
proxy *Proxy
builder sq.SelectBuilder
}
// Qualify updates select builder
func (f *Finder) Qualify(q Qualifier) *Finder {
f.builder = q(f.builder)
return f
}
// Load fetches an object from db and loads in self proxy
func (f *Finder) Load(db sq.BaseRunner) error {
row := f.builder.RunWith(db).QueryRow()
ptrs := f.proxy.schema.ptrs()
f.proxy.schema.set(ptrs, f.proxy.v)
return row.Scan(ptrs...)
}
// Fetch make a query and creates a collection
func (f *Finder) Fetch(db sq.BaseRunner) (*Collection, error) {
rows, err := f.builder.RunWith(db).Query()
if err != nil {
return nil, err
}
defer rows.Close()
c := f.proxy.blankCollection()
ptrs := f.proxy.schema.ptrs()
for rows.Next() {
v := f.proxy.schema.create()
f.proxy.schema.set(ptrs, v)
rows.Scan(ptrs...)
v.addTo(c)
}
return c, nil
}
func makeFinder(p *Proxy, b sq.SelectBuilder) *Finder {
return &Finder{p, b}
}
// Fetch loads a collection of objects
func Fetch(db sq.BaseRunner, v interface{}) (*Collection, error) {
return New(v).Fetch(db)
}