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

     1  package db
     2  
     3  import (
     4  	"database/sql"
     5  
     6  	sq "github.com/Masterminds/squirrel"
     7  )
     8  
     9  type usedTaskCache struct {
    10  	id       int
    11  	jobID    int
    12  	stepName string
    13  	path     string
    14  }
    15  
    16  type UsedTaskCache interface {
    17  	ID() int
    18  
    19  	JobID() int
    20  	StepName() string
    21  	Path() string
    22  }
    23  
    24  func (tc *usedTaskCache) ID() int          { return tc.id }
    25  func (tc *usedTaskCache) JobID() int       { return tc.jobID }
    26  func (tc *usedTaskCache) StepName() string { return tc.stepName }
    27  func (tc *usedTaskCache) Path() string     { return tc.path }
    28  
    29  func (f usedTaskCache) findOrCreate(tx Tx) (UsedTaskCache, error) {
    30  	utc, found, err := f.find(tx)
    31  	if err != nil {
    32  		return nil, err
    33  	}
    34  
    35  	if !found {
    36  		var id int
    37  		err = psql.Insert("task_caches").
    38  			Columns(
    39  				"job_id",
    40  				"step_name",
    41  				"path",
    42  			).
    43  			Values(
    44  				f.jobID,
    45  				f.stepName,
    46  				f.path,
    47  			).
    48  			Suffix(`
    49  					ON CONFLICT (job_id, step_name, path) DO UPDATE SET
    50  						job_id = ?
    51  					RETURNING id
    52  				`, f.jobID).
    53  			RunWith(tx).
    54  			QueryRow().
    55  			Scan(&id)
    56  		if err != nil {
    57  			return nil, err
    58  		}
    59  
    60  		return &usedTaskCache{
    61  			id:       id,
    62  			jobID:    f.jobID,
    63  			stepName: f.stepName,
    64  			path:     f.path,
    65  		}, nil
    66  	}
    67  
    68  	return utc, nil
    69  }
    70  
    71  func (f usedTaskCache) find(runner sq.Runner) (UsedTaskCache, bool, error) {
    72  	var id int
    73  	err := psql.Select("id").
    74  		From("task_caches").
    75  		Where(sq.Eq{
    76  			"job_id":    f.jobID,
    77  			"step_name": f.stepName,
    78  			"path":      f.path,
    79  		}).
    80  		RunWith(runner).
    81  		QueryRow().
    82  		Scan(&id)
    83  	if err != nil {
    84  		if err == sql.ErrNoRows {
    85  			return nil, false, nil
    86  		}
    87  
    88  		return nil, false, err
    89  	}
    90  
    91  	return &usedTaskCache{
    92  		id:       id,
    93  		jobID:    f.jobID,
    94  		stepName: f.stepName,
    95  		path:     f.path,
    96  	}, true, nil
    97  
    98  }