github.com/pf-qiu/concourse/v6@v6.7.3-0.20201207032516-1f455d73275f/atc/db/worker_resource_cache.go (about)

     1  package db
     2  
     3  import (
     4  	"database/sql"
     5  	"errors"
     6  
     7  	sq "github.com/Masterminds/squirrel"
     8  )
     9  
    10  type WorkerResourceCache struct {
    11  	WorkerName    string
    12  	ResourceCache UsedResourceCache
    13  }
    14  
    15  type UsedWorkerResourceCache struct {
    16  	ID int
    17  }
    18  
    19  var ErrWorkerBaseResourceTypeDisappeared = errors.New("worker base resource type disappeared")
    20  
    21  func (workerResourceCache WorkerResourceCache) FindOrCreate(tx Tx) (*UsedWorkerResourceCache, error) {
    22  	baseResourceType := workerResourceCache.ResourceCache.BaseResourceType()
    23  	usedWorkerBaseResourceType, found, err := WorkerBaseResourceType{
    24  		Name:       baseResourceType.Name,
    25  		WorkerName: workerResourceCache.WorkerName,
    26  	}.Find(tx)
    27  	if err != nil {
    28  		return nil, err
    29  	}
    30  
    31  	if !found {
    32  		return nil, ErrWorkerBaseResourceTypeDisappeared
    33  	}
    34  
    35  	id, found, err := workerResourceCache.find(tx, usedWorkerBaseResourceType)
    36  	if err != nil {
    37  		return nil, err
    38  	}
    39  
    40  	if found {
    41  		return &UsedWorkerResourceCache{
    42  			ID: id,
    43  		}, nil
    44  	}
    45  
    46  	err = psql.Insert("worker_resource_caches").
    47  		Columns(
    48  			"resource_cache_id",
    49  			"worker_base_resource_type_id",
    50  		).
    51  		Values(
    52  			workerResourceCache.ResourceCache.ID(),
    53  			usedWorkerBaseResourceType.ID,
    54  		).
    55  		Suffix(`
    56  			ON CONFLICT (resource_cache_id, worker_base_resource_type_id) DO UPDATE SET
    57  				resource_cache_id = ?,
    58  				worker_base_resource_type_id = ?
    59  			RETURNING id
    60  		`, workerResourceCache.ResourceCache.ID(), usedWorkerBaseResourceType.ID).
    61  		RunWith(tx).
    62  		QueryRow().
    63  		Scan(&id)
    64  	if err != nil {
    65  		return nil, err
    66  	}
    67  
    68  	return &UsedWorkerResourceCache{
    69  		ID: id,
    70  	}, nil
    71  }
    72  
    73  func (workerResourceCache WorkerResourceCache) Find(runner sq.Runner) (*UsedWorkerResourceCache, bool, error) {
    74  	baseResourceType := workerResourceCache.ResourceCache.BaseResourceType()
    75  	usedWorkerBaseResourceType, found, err := WorkerBaseResourceType{
    76  		Name:       baseResourceType.Name,
    77  		WorkerName: workerResourceCache.WorkerName,
    78  	}.Find(runner)
    79  	if err != nil {
    80  		return nil, false, err
    81  	}
    82  
    83  	if !found {
    84  		return nil, false, nil
    85  	}
    86  
    87  	id, found, err := workerResourceCache.find(runner, usedWorkerBaseResourceType)
    88  	if err != nil {
    89  		return nil, false, err
    90  	}
    91  
    92  	if found {
    93  		return &UsedWorkerResourceCache{
    94  			ID: id,
    95  		}, true, nil
    96  	}
    97  
    98  	return nil, false, nil
    99  }
   100  
   101  func (workerResourceCache WorkerResourceCache) find(runner sq.Runner, usedWorkerBaseResourceType *UsedWorkerBaseResourceType) (int, bool, error) {
   102  	var id int
   103  
   104  	err := psql.Select("id").
   105  		From("worker_resource_caches").
   106  		Where(sq.Eq{
   107  			"resource_cache_id":            workerResourceCache.ResourceCache.ID(),
   108  			"worker_base_resource_type_id": usedWorkerBaseResourceType.ID,
   109  		}).
   110  		Suffix("FOR SHARE").
   111  		RunWith(runner).
   112  		QueryRow().
   113  		Scan(&id)
   114  	if err != nil {
   115  		if err == sql.ErrNoRows {
   116  			return 0, false, nil
   117  		}
   118  
   119  		return 0, false, err
   120  	}
   121  
   122  	return id, true, nil
   123  }