github.com/pf-qiu/concourse/v6@v6.7.3-0.20201207032516-1f455d73275f/atc/db/resource_config_version.go (about) 1 package db 2 3 import ( 4 "database/sql" 5 "encoding/json" 6 7 sq "github.com/Masterminds/squirrel" 8 "github.com/pf-qiu/concourse/v6/atc" 9 "go.opentelemetry.io/otel/api/propagation" 10 ) 11 12 //go:generate counterfeiter . ResourceConfigVersion 13 14 type ResourceConfigVersion interface { 15 ID() int 16 Version() Version 17 Metadata() ResourceConfigMetadataFields 18 CheckOrder() int 19 SpanContext() propagation.HTTPSupplier 20 21 Reload() (bool, error) 22 } 23 24 type ResourceConfigVersions []ResourceConfigVersion 25 26 type ResourceConfigMetadataField struct { 27 Name string 28 Value string 29 } 30 31 type ResourceConfigMetadataFields []ResourceConfigMetadataField 32 33 func NewResourceConfigMetadataFields(atcm []atc.MetadataField) ResourceConfigMetadataFields { 34 metadata := make([]ResourceConfigMetadataField, len(atcm)) 35 for i, md := range atcm { 36 metadata[i] = ResourceConfigMetadataField{ 37 Name: md.Name, 38 Value: md.Value, 39 } 40 } 41 42 return metadata 43 } 44 45 func (rmf ResourceConfigMetadataFields) ToATCMetadata() []atc.MetadataField { 46 metadata := make([]atc.MetadataField, len(rmf)) 47 for i, md := range rmf { 48 metadata[i] = atc.MetadataField{ 49 Name: md.Name, 50 Value: md.Value, 51 } 52 } 53 54 return metadata 55 } 56 57 type Version map[string]string 58 59 type resourceConfigVersion struct { 60 id int 61 version Version 62 metadata ResourceConfigMetadataFields 63 checkOrder int 64 spanContext SpanContext 65 66 conn Conn 67 } 68 69 var resourceConfigVersionQuery = psql.Select(` 70 v.id, 71 v.version, 72 v.metadata, 73 v.check_order, 74 v.span_context 75 `). 76 From("resource_config_versions v") 77 78 func (r *resourceConfigVersion) ID() int { return r.id } 79 func (r *resourceConfigVersion) Version() Version { return r.version } 80 func (r *resourceConfigVersion) Metadata() ResourceConfigMetadataFields { return r.metadata } 81 func (r *resourceConfigVersion) CheckOrder() int { return r.checkOrder } 82 func (r *resourceConfigVersion) SpanContext() propagation.HTTPSupplier { 83 return r.spanContext 84 } 85 86 func (r *resourceConfigVersion) Reload() (bool, error) { 87 row := resourceConfigVersionQuery.Where(sq.Eq{"v.id": r.id}). 88 RunWith(r.conn). 89 QueryRow() 90 91 err := scanResourceConfigVersion(r, row) 92 if err != nil { 93 if err == sql.ErrNoRows { 94 return false, nil 95 } 96 return false, err 97 } 98 99 return true, nil 100 } 101 102 func scanResourceConfigVersion(r *resourceConfigVersion, scan scannable) error { 103 var version, metadata, spanContext sql.NullString 104 105 err := scan.Scan(&r.id, &version, &metadata, &r.checkOrder, &spanContext) 106 if err != nil { 107 return err 108 } 109 110 if version.Valid { 111 err = json.Unmarshal([]byte(version.String), &r.version) 112 if err != nil { 113 return err 114 } 115 } 116 117 if metadata.Valid { 118 err = json.Unmarshal([]byte(metadata.String), &r.metadata) 119 if err != nil { 120 return err 121 } 122 } 123 124 if spanContext.Valid { 125 err = json.Unmarshal([]byte(spanContext.String), &r.spanContext) 126 if err != nil { 127 return err 128 } 129 } 130 131 return nil 132 }