github.com/pf-qiu/concourse/v6@v6.7.3-0.20201207032516-1f455d73275f/atc/db/pipeline_factory.go (about) 1 package db 2 3 import ( 4 sq "github.com/Masterminds/squirrel" 5 "github.com/pf-qiu/concourse/v6/atc/db/lock" 6 ) 7 8 //go:generate counterfeiter . PipelineFactory 9 10 type PipelineFactory interface { 11 VisiblePipelines([]string) ([]Pipeline, error) 12 AllPipelines() ([]Pipeline, error) 13 PipelinesToSchedule() ([]Pipeline, error) 14 } 15 16 type pipelineFactory struct { 17 conn Conn 18 lockFactory lock.LockFactory 19 } 20 21 func NewPipelineFactory(conn Conn, lockFactory lock.LockFactory) PipelineFactory { 22 return &pipelineFactory{ 23 conn: conn, 24 lockFactory: lockFactory, 25 } 26 } 27 28 func (f *pipelineFactory) VisiblePipelines(teamNames []string) ([]Pipeline, error) { 29 tx, err := f.conn.Begin() 30 if err != nil { 31 return nil, err 32 } 33 34 defer Rollback(tx) 35 36 rows, err := pipelinesQuery. 37 Where(sq.Eq{"t.name": teamNames}). 38 OrderBy("t.name ASC", "ordering ASC"). 39 RunWith(tx). 40 Query() 41 if err != nil { 42 return nil, err 43 } 44 45 currentTeamPipelines, err := scanPipelines(f.conn, f.lockFactory, rows) 46 if err != nil { 47 return nil, err 48 } 49 50 rows, err = pipelinesQuery. 51 Where(sq.NotEq{"t.name": teamNames}). 52 Where(sq.Eq{"public": true}). 53 OrderBy("t.name ASC", "ordering ASC"). 54 RunWith(tx). 55 Query() 56 if err != nil { 57 return nil, err 58 } 59 60 otherTeamPublicPipelines, err := scanPipelines(f.conn, f.lockFactory, rows) 61 if err != nil { 62 return nil, err 63 } 64 65 err = tx.Commit() 66 if err != nil { 67 return nil, err 68 } 69 70 return append(currentTeamPipelines, otherTeamPublicPipelines...), nil 71 } 72 73 func (f *pipelineFactory) AllPipelines() ([]Pipeline, error) { 74 rows, err := pipelinesQuery. 75 OrderBy("t.name ASC", "ordering ASC"). 76 RunWith(f.conn). 77 Query() 78 if err != nil { 79 return nil, err 80 } 81 82 return scanPipelines(f.conn, f.lockFactory, rows) 83 } 84 85 func (f *pipelineFactory) PipelinesToSchedule() ([]Pipeline, error) { 86 rows, err := pipelinesQuery. 87 Join("jobs j ON j.pipeline_id = p.id"). 88 Where(sq.Expr("j.schedule_requested > j.last_scheduled")). 89 RunWith(f.conn). 90 Query() 91 if err != nil { 92 return nil, err 93 } 94 95 return scanPipelines(f.conn, f.lockFactory, rows) 96 }