7
7
"fmt"
8
8
"io"
9
9
"net/http"
10
+ "os"
10
11
"path"
11
12
"regexp"
12
13
"sort"
@@ -120,59 +121,13 @@ func SetIgnoreUnknown(v bool) {
120
121
migSet .IgnoreUnknown = v
121
122
}
122
123
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
-
136
124
type Migration struct {
137
- Id string
125
+ Id string
126
+ Up []string
127
+ Down []string
138
128
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
176
131
}
177
132
178
133
func (m Migration ) Less (other * Migration ) bool {
@@ -311,14 +266,11 @@ func findMigrations(dir http.FileSystem, root string) ([]*Migration, error) {
311
266
312
267
for _ , info := range files {
313
268
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
321
272
}
273
+
322
274
migrations = append (migrations , migration )
323
275
}
324
276
}
@@ -329,6 +281,21 @@ func findMigrations(dir http.FileSystem, root string) ([]*Migration, error) {
329
281
return migrations , nil
330
282
}
331
283
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
+
332
299
// Migrations from a bindata asset set.
333
300
type AssetMigrationSource struct {
334
301
// Asset should return content of file in path if exists
@@ -358,14 +325,11 @@ func (a AssetMigrationSource) FindMigrations() ([]*Migration, error) {
358
325
return nil , err
359
326
}
360
327
361
- migrationData , err := ParseMigration (name , bytes .NewReader (file ))
328
+ migration , err := ParseMigration (name , bytes .NewReader (file ))
362
329
if err != nil {
363
330
return nil , err
364
331
}
365
- migration := & Migration {
366
- Id : name ,
367
- data : migrationData ,
368
- }
332
+
369
333
migrations = append (migrations , migration )
370
334
}
371
335
}
@@ -418,14 +382,11 @@ func (p PackrMigrationSource) FindMigrations() ([]*Migration, error) {
418
382
return nil , err
419
383
}
420
384
421
- migrationData , err := ParseMigration (name , bytes .NewReader (file ))
385
+ migration , err := ParseMigration (name , bytes .NewReader (file ))
422
386
if err != nil {
423
387
return nil , err
424
388
}
425
- migration := & Migration {
426
- Id : name ,
427
- data : migrationData ,
428
- }
389
+
429
390
migrations = append (migrations , migration )
430
391
}
431
392
}
@@ -437,18 +398,23 @@ func (p PackrMigrationSource) FindMigrations() ([]*Migration, error) {
437
398
}
438
399
439
400
// 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
+
441
406
parsed , err := sqlparse .ParseMigration (r )
442
407
if err != nil {
443
408
return nil , fmt .Errorf ("Error parsing migration (%s): %s" , id , err )
444
409
}
445
410
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
452
418
}
453
419
454
420
type SqlExecutor interface {
@@ -609,11 +575,7 @@ func (ms MigrationSet) PlanMigration(db *sql.DB, dialect string, m MigrationSour
609
575
// Add missing migrations up to the last run migration.
610
576
// This can happen for example when merges happened.
611
577
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 )... )
617
579
}
618
580
619
581
// Figure out which migrations to apply
@@ -623,21 +585,18 @@ func (ms MigrationSet) PlanMigration(db *sql.DB, dialect string, m MigrationSour
623
585
toApplyCount = max
624
586
}
625
587
for _ , v := range toApply [0 :toApplyCount ] {
626
- migrationData , err := v .Data ()
627
- if err != nil {
628
- return nil , nil , err
629
- }
588
+
630
589
if dir == Up {
631
590
result = append (result , & PlannedMigration {
632
591
Migration : v ,
633
- Queries : migrationData .Up ,
634
- DisableTransaction : migrationData .DisableTransactionUp ,
592
+ Queries : v .Up ,
593
+ DisableTransaction : v .DisableTransactionUp ,
635
594
})
636
595
} else if dir == Down {
637
596
result = append (result , & PlannedMigration {
638
597
Migration : v ,
639
- Queries : migrationData .Down ,
640
- DisableTransaction : migrationData .DisableTransactionDown ,
598
+ Queries : v .Down ,
599
+ DisableTransaction : v .DisableTransactionDown ,
641
600
})
642
601
}
643
602
}
@@ -724,7 +683,7 @@ func ToApply(migrations []*Migration, current string, direction MigrationDirecti
724
683
panic ("Not possible" )
725
684
}
726
685
727
- func ToCatchup (migrations , existingMigrations []* Migration , lastRun * Migration ) ( []* PlannedMigration , error ) {
686
+ func ToCatchup (migrations , existingMigrations []* Migration , lastRun * Migration ) []* PlannedMigration {
728
687
missing := make ([]* PlannedMigration , 0 )
729
688
for _ , migration := range migrations {
730
689
found := false
@@ -735,18 +694,14 @@ func ToCatchup(migrations, existingMigrations []*Migration, lastRun *Migration)
735
694
}
736
695
}
737
696
if ! found && migration .Less (lastRun ) {
738
- migrationData , err := migration .Data ()
739
- if err != nil {
740
- return nil , err
741
- }
742
697
missing = append (missing , & PlannedMigration {
743
698
Migration : migration ,
744
- Queries : migrationData .Up ,
745
- DisableTransaction : migrationData .DisableTransactionUp ,
699
+ Queries : migration .Up ,
700
+ DisableTransaction : migration .DisableTransactionUp ,
746
701
})
747
702
}
748
703
}
749
- return missing , nil
704
+ return missing
750
705
}
751
706
752
707
func GetMigrationRecords (db * sql.DB , dialect string ) ([]* MigrationRecord , error ) {
0 commit comments