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 }