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 }