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 }