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  }