// Reset runs the down and up migration function func Reset(pipe chan interface{}, url, migrationsPath string) { pipe1 := pipep.New() go Down(pipe1, url, migrationsPath) if ok := pipep.WaitAndRedirect(pipe1, pipe, handleInterrupts()); !ok { go pipep.Close(pipe, nil) return } else { go Up(pipe, url, migrationsPath) } }
// Up applies all available migrations func Up(pipe chan interface{}, url, migrationsPath string) { d, files, migratedVersions, err := initDriverAndReadMigrationFilesAndGetMigratedVersions(url, migrationsPath) if err != nil { go pipep.Close(pipe, err) return } applyMigrationFiles, err := files.GetUnmigrated(migratedVersions) if err != nil { if err2 := d.Close(); err2 != nil { pipe <- err2 } go pipep.Close(pipe, err) return } if len(applyMigrationFiles) > 0 { for _, f := range applyMigrationFiles { pipe1 := pipep.New() go d.Migrate(f, pipe1) if ok := pipep.WaitAndRedirect(pipe1, pipe, handleInterrupts()); !ok { break } } if err := d.Close(); err != nil { pipe <- err } go pipep.Close(pipe, nil) return } else { if err := d.Close(); err != nil { pipe <- err } go pipep.Close(pipe, nil) return } }
// Migrate applies relative +n/-n migrations func Migrate(pipe chan interface{}, url, migrationsPath string, relativeN int) { d, files, version, err := initDriverAndReadMigrationFilesAndGetVersion(url, migrationsPath) if err != nil { go pipep.Close(pipe, err) return } applyMigrationFiles, err := files.From(version, relativeN) if err != nil { if err2 := d.Close(); err2 != nil { pipe <- err2 } go pipep.Close(pipe, err) return } if len(applyMigrationFiles) > 0 && relativeN != 0 { for _, f := range applyMigrationFiles { pipe1 := pipep.New() go d.Migrate(f, pipe1) if ok := pipep.WaitAndRedirect(pipe1, pipe, handleInterrupts()); !ok { break } } if err2 := d.Close(); err2 != nil { pipe <- err2 } go pipep.Close(pipe, nil) return } if err2 := d.Close(); err2 != nil { pipe <- err2 } go pipep.Close(pipe, nil) return }