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

     1  package migration
     2  
     3  import (
     4  	"errors"
     5  	"regexp"
     6  	"strconv"
     7  	"strings"
     8  )
     9  
    10  var migrationDirection = regexp.MustCompile(`\.(up|down)\.`)
    11  var goMigrationFuncName = regexp.MustCompile(`(Up|Down)_[0-9]*`)
    12  
    13  var ErrCouldNotParseDirection = errors.New("could not parse direction for migration")
    14  
    15  type Parser struct {
    16  	bindata Bindata
    17  }
    18  
    19  func NewParser(bindata Bindata) *Parser {
    20  	return &Parser{
    21  		bindata: bindata,
    22  	}
    23  }
    24  
    25  func (p *Parser) ParseMigrationFilename(fileName string) (migration, error) {
    26  	var (
    27  		migration migration
    28  		err       error
    29  	)
    30  
    31  	migration.Direction, err = determineDirection(fileName)
    32  	if err != nil {
    33  		return migration, err
    34  	}
    35  
    36  	migration.Version, err = schemaVersion(fileName)
    37  	if err != nil {
    38  		return migration, err
    39  	}
    40  
    41  	return migration, nil
    42  }
    43  
    44  func (p *Parser) ParseFileToMigration(migrationName string) (migration, error) {
    45  	var migrationContents string
    46  
    47  	migration, err := p.ParseMigrationFilename(migrationName)
    48  	if err != nil {
    49  		return migration, err
    50  	}
    51  
    52  	migrationBytes, err := p.bindata.Asset(migrationName)
    53  	if err != nil {
    54  		return migration, err
    55  	}
    56  
    57  	migrationContents = string(migrationBytes)
    58  	migration.Strategy = determineMigrationStrategy(migrationName, migrationContents)
    59  
    60  	switch migration.Strategy {
    61  	case GoMigration:
    62  		migration.Name = goMigrationFuncName.FindString(migrationContents)
    63  	case SQLMigration:
    64  		migration.Name = migrationName
    65  		migration.Statements = migrationContents
    66  	}
    67  
    68  	return migration, nil
    69  }
    70  
    71  func schemaVersion(assetName string) (int, error) {
    72  	regex := regexp.MustCompile("(\\d+)")
    73  	match := regex.FindStringSubmatch(assetName)
    74  	return strconv.Atoi(match[1])
    75  }
    76  
    77  func determineDirection(migrationName string) (string, error) {
    78  	matches := migrationDirection.FindStringSubmatch(migrationName)
    79  	if len(matches) < 2 {
    80  		return "", ErrCouldNotParseDirection
    81  	}
    82  
    83  	return matches[1], nil
    84  }
    85  
    86  func determineMigrationStrategy(migrationName string, migrationContents string) Strategy {
    87  	if strings.HasSuffix(migrationName, ".go") {
    88  		return GoMigration
    89  	} else {
    90  		return SQLMigration
    91  	}
    92  }