github.com/pf-qiu/concourse/v6@v6.7.3-0.20201207032516-1f455d73275f/atc/db/resource_factory.go (about) 1 package db 2 3 import ( 4 "database/sql" 5 6 sq "github.com/Masterminds/squirrel" 7 "github.com/pf-qiu/concourse/v6/atc/db/lock" 8 ) 9 10 //go:generate counterfeiter . ResourceFactory 11 12 type ResourceFactory interface { 13 Resource(int) (Resource, bool, error) 14 VisibleResources([]string) ([]Resource, error) 15 AllResources() ([]Resource, error) 16 } 17 18 type resourceFactory struct { 19 conn Conn 20 lockFactory lock.LockFactory 21 } 22 23 func NewResourceFactory(conn Conn, lockFactory lock.LockFactory) ResourceFactory { 24 return &resourceFactory{ 25 conn: conn, 26 lockFactory: lockFactory, 27 } 28 } 29 30 func (r *resourceFactory) Resource(resourceID int) (Resource, bool, error) { 31 resource := newEmptyResource(r.conn, r.lockFactory) 32 row := resourcesQuery. 33 Where(sq.Eq{"r.id": resourceID}). 34 RunWith(r.conn). 35 QueryRow() 36 37 err := scanResource(resource, row) 38 if err != nil { 39 if err == sql.ErrNoRows { 40 return nil, false, nil 41 } 42 return nil, false, err 43 } 44 45 return resource, true, nil 46 } 47 48 func (r *resourceFactory) VisibleResources(teamNames []string) ([]Resource, error) { 49 rows, err := resourcesQuery. 50 Where(sq.Or{ 51 sq.Eq{"t.name": teamNames}, 52 sq.And{ 53 sq.NotEq{"t.name": teamNames}, 54 sq.Eq{"p.public": true}, 55 }, 56 }). 57 OrderBy("r.id ASC"). 58 RunWith(r.conn). 59 Query() 60 if err != nil { 61 return nil, err 62 } 63 64 return scanResources(rows, r.conn, r.lockFactory) 65 } 66 67 func (r *resourceFactory) AllResources() ([]Resource, error) { 68 rows, err := resourcesQuery. 69 OrderBy("r.id ASC"). 70 RunWith(r.conn). 71 Query() 72 if err != nil { 73 return nil, err 74 } 75 76 return scanResources(rows, r.conn, r.lockFactory) 77 } 78 79 func scanResources(resourceRows *sql.Rows, conn Conn, lockFactory lock.LockFactory) ([]Resource, error) { 80 var resources []Resource 81 82 for resourceRows.Next() { 83 resource := newEmptyResource(conn, lockFactory) 84 err := scanResource(resource, resourceRows) 85 if err != nil { 86 return nil, err 87 } 88 89 resources = append(resources, resource) 90 } 91 92 return resources, nil 93 }