77 "fmt"
88 "io"
99 "net/http"
10+ "os"
1011 "path"
1112 "regexp"
1213 "sort"
@@ -120,59 +121,13 @@ func SetIgnoreUnknown(v bool) {
120121 migSet .IgnoreUnknown = v
121122}
122123
123- type MigrationData struct {
124- Up []string
125- Down []string
126- DisableTransactionUp bool
127- DisableTransactionDown bool
128- }
129-
130- type migrationFile struct {
131- dir http.FileSystem
132- root string
133- baseName string
134- }
135-
136124type Migration struct {
137- Id string
125+ Id string
126+ Up []string
127+ Down []string
138128
139- // data may be nil if not parsed yet.
140- data * MigrationData
141- // file is information of migration file, which is used to parse later.
142- // file may be nil if migration file has already been parsed when Migration is initialized.
143- file * migrationFile
144- }
145-
146- // Data parses migration file if not yet, and returns *MigrationData
147- func (m * Migration ) Data () (* MigrationData , error ) {
148- if m .data != nil {
149- return m .data , nil
150- }
151- err := m .loadFile ()
152- if err != nil {
153- return nil , err
154- }
155- return m .data , nil
156- }
157-
158- func (m * Migration ) loadFile () error {
159- if m .file == nil {
160- return fmt .Errorf ("Error m.file must not be nil when call loadFile" )
161- }
162- root := m .file .root
163- name := m .file .baseName
164- file , err := m .file .dir .Open (path .Join (root , name ))
165- if err != nil {
166- return fmt .Errorf ("Error while opening %s: %s" , name , err )
167- }
168- defer func () { _ = file .Close () }()
169-
170- migrationData , err := ParseMigration (name , file )
171- if err != nil {
172- return fmt .Errorf ("Error while parsing %s: %s" , name , err )
173- }
174- m .data = migrationData
175- return nil
129+ DisableTransactionUp bool
130+ DisableTransactionDown bool
176131}
177132
178133func (m Migration ) Less (other * Migration ) bool {
@@ -311,14 +266,11 @@ func findMigrations(dir http.FileSystem, root string) ([]*Migration, error) {
311266
312267 for _ , info := range files {
313268 if strings .HasSuffix (info .Name (), ".sql" ) {
314- migration := & Migration {
315- Id : info .Name (),
316- file : & migrationFile {
317- dir : dir ,
318- root : root ,
319- baseName : info .Name (),
320- },
269+ migration , err := migrationFromFile (dir , root , info )
270+ if err != nil {
271+ return nil , err
321272 }
273+
322274 migrations = append (migrations , migration )
323275 }
324276 }
@@ -329,6 +281,21 @@ func findMigrations(dir http.FileSystem, root string) ([]*Migration, error) {
329281 return migrations , nil
330282}
331283
284+ func migrationFromFile (dir http.FileSystem , root string , info os.FileInfo ) (* Migration , error ) {
285+ path := path .Join (root , info .Name ())
286+ file , err := dir .Open (path )
287+ if err != nil {
288+ return nil , fmt .Errorf ("Error while opening %s: %s" , info .Name (), err )
289+ }
290+ defer func () { _ = file .Close () }()
291+
292+ migration , err := ParseMigration (info .Name (), file )
293+ if err != nil {
294+ return nil , fmt .Errorf ("Error while parsing %s: %s" , info .Name (), err )
295+ }
296+ return migration , nil
297+ }
298+
332299// Migrations from a bindata asset set.
333300type AssetMigrationSource struct {
334301 // Asset should return content of file in path if exists
@@ -358,14 +325,11 @@ func (a AssetMigrationSource) FindMigrations() ([]*Migration, error) {
358325 return nil , err
359326 }
360327
361- migrationData , err := ParseMigration (name , bytes .NewReader (file ))
328+ migration , err := ParseMigration (name , bytes .NewReader (file ))
362329 if err != nil {
363330 return nil , err
364331 }
365- migration := & Migration {
366- Id : name ,
367- data : migrationData ,
368- }
332+
369333 migrations = append (migrations , migration )
370334 }
371335 }
@@ -418,14 +382,11 @@ func (p PackrMigrationSource) FindMigrations() ([]*Migration, error) {
418382 return nil , err
419383 }
420384
421- migrationData , err := ParseMigration (name , bytes .NewReader (file ))
385+ migration , err := ParseMigration (name , bytes .NewReader (file ))
422386 if err != nil {
423387 return nil , err
424388 }
425- migration := & Migration {
426- Id : name ,
427- data : migrationData ,
428- }
389+
429390 migrations = append (migrations , migration )
430391 }
431392 }
@@ -437,18 +398,23 @@ func (p PackrMigrationSource) FindMigrations() ([]*Migration, error) {
437398}
438399
439400// Migration parsing
440- func ParseMigration (id string , r io.ReadSeeker ) (* MigrationData , error ) {
401+ func ParseMigration (id string , r io.ReadSeeker ) (* Migration , error ) {
402+ m := & Migration {
403+ Id : id ,
404+ }
405+
441406 parsed , err := sqlparse .ParseMigration (r )
442407 if err != nil {
443408 return nil , fmt .Errorf ("Error parsing migration (%s): %s" , id , err )
444409 }
445410
446- return & MigrationData {
447- Up : parsed .UpStatements ,
448- Down : parsed .DownStatements ,
449- DisableTransactionUp : parsed .DisableTransactionUp ,
450- DisableTransactionDown : parsed .DisableTransactionDown ,
451- }, nil
411+ m .Up = parsed .UpStatements
412+ m .Down = parsed .DownStatements
413+
414+ m .DisableTransactionUp = parsed .DisableTransactionUp
415+ m .DisableTransactionDown = parsed .DisableTransactionDown
416+
417+ return m , nil
452418}
453419
454420type SqlExecutor interface {
@@ -609,11 +575,7 @@ func (ms MigrationSet) PlanMigration(db *sql.DB, dialect string, m MigrationSour
609575 // Add missing migrations up to the last run migration.
610576 // This can happen for example when merges happened.
611577 if len (existingMigrations ) > 0 {
612- catchUp , err := ToCatchup (migrations , existingMigrations , record )
613- if err != nil {
614- return nil , nil , err
615- }
616- result = append (result , catchUp ... )
578+ result = append (result , ToCatchup (migrations , existingMigrations , record )... )
617579 }
618580
619581 // Figure out which migrations to apply
@@ -623,21 +585,18 @@ func (ms MigrationSet) PlanMigration(db *sql.DB, dialect string, m MigrationSour
623585 toApplyCount = max
624586 }
625587 for _ , v := range toApply [0 :toApplyCount ] {
626- migrationData , err := v .Data ()
627- if err != nil {
628- return nil , nil , err
629- }
588+
630589 if dir == Up {
631590 result = append (result , & PlannedMigration {
632591 Migration : v ,
633- Queries : migrationData .Up ,
634- DisableTransaction : migrationData .DisableTransactionUp ,
592+ Queries : v .Up ,
593+ DisableTransaction : v .DisableTransactionUp ,
635594 })
636595 } else if dir == Down {
637596 result = append (result , & PlannedMigration {
638597 Migration : v ,
639- Queries : migrationData .Down ,
640- DisableTransaction : migrationData .DisableTransactionDown ,
598+ Queries : v .Down ,
599+ DisableTransaction : v .DisableTransactionDown ,
641600 })
642601 }
643602 }
@@ -724,7 +683,7 @@ func ToApply(migrations []*Migration, current string, direction MigrationDirecti
724683 panic ("Not possible" )
725684}
726685
727- func ToCatchup (migrations , existingMigrations []* Migration , lastRun * Migration ) ( []* PlannedMigration , error ) {
686+ func ToCatchup (migrations , existingMigrations []* Migration , lastRun * Migration ) []* PlannedMigration {
728687 missing := make ([]* PlannedMigration , 0 )
729688 for _ , migration := range migrations {
730689 found := false
@@ -735,18 +694,14 @@ func ToCatchup(migrations, existingMigrations []*Migration, lastRun *Migration)
735694 }
736695 }
737696 if ! found && migration .Less (lastRun ) {
738- migrationData , err := migration .Data ()
739- if err != nil {
740- return nil , err
741- }
742697 missing = append (missing , & PlannedMigration {
743698 Migration : migration ,
744- Queries : migrationData .Up ,
745- DisableTransaction : migrationData .DisableTransactionUp ,
699+ Queries : migration .Up ,
700+ DisableTransaction : migration .DisableTransactionUp ,
746701 })
747702 }
748703 }
749- return missing , nil
704+ return missing
750705}
751706
752707func GetMigrationRecords (db * sql.DB , dialect string ) ([]* MigrationRecord , error ) {
0 commit comments