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  }