forked from concourse/concourse
/
resource_factory.go
93 lines (76 loc) · 1.92 KB
/
resource_factory.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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
package db
import (
"database/sql"
sq "github.com/Masterminds/squirrel"
"github.com/pf-qiu/concourse/v6/atc/db/lock"
)
//go:generate counterfeiter . ResourceFactory
type ResourceFactory interface {
Resource(int) (Resource, bool, error)
VisibleResources([]string) ([]Resource, error)
AllResources() ([]Resource, error)
}
type resourceFactory struct {
conn Conn
lockFactory lock.LockFactory
}
func NewResourceFactory(conn Conn, lockFactory lock.LockFactory) ResourceFactory {
return &resourceFactory{
conn: conn,
lockFactory: lockFactory,
}
}
func (r *resourceFactory) Resource(resourceID int) (Resource, bool, error) {
resource := newEmptyResource(r.conn, r.lockFactory)
row := resourcesQuery.
Where(sq.Eq{"r.id": resourceID}).
RunWith(r.conn).
QueryRow()
err := scanResource(resource, row)
if err != nil {
if err == sql.ErrNoRows {
return nil, false, nil
}
return nil, false, err
}
return resource, true, nil
}
func (r *resourceFactory) VisibleResources(teamNames []string) ([]Resource, error) {
rows, err := resourcesQuery.
Where(sq.Or{
sq.Eq{"t.name": teamNames},
sq.And{
sq.NotEq{"t.name": teamNames},
sq.Eq{"p.public": true},
},
}).
OrderBy("r.id ASC").
RunWith(r.conn).
Query()
if err != nil {
return nil, err
}
return scanResources(rows, r.conn, r.lockFactory)
}
func (r *resourceFactory) AllResources() ([]Resource, error) {
rows, err := resourcesQuery.
OrderBy("r.id ASC").
RunWith(r.conn).
Query()
if err != nil {
return nil, err
}
return scanResources(rows, r.conn, r.lockFactory)
}
func scanResources(resourceRows *sql.Rows, conn Conn, lockFactory lock.LockFactory) ([]Resource, error) {
var resources []Resource
for resourceRows.Next() {
resource := newEmptyResource(conn, lockFactory)
err := scanResource(resource, resourceRows)
if err != nil {
return nil, err
}
resources = append(resources, resource)
}
return resources, nil
}