// Version returns the current migration version func Version(url, migrationsPath string) (version uint64, err error) { d, err := driver.New(url) if err != nil { return 0, err } return d.Version() }
// initDriverAndReadMigrationFilesAndGetVersion is a small helper // function that is common to most of the migration funcs func initDriverAndReadMigrationFilesAndGetVersion(url, migrationsPath string) (driver.Driver, *file.MigrationFiles, uint64, error) { d, err := driver.New(url) if err != nil { return nil, nil, 0, err } files, err := file.ReadMigrationFiles(migrationsPath, file.FilenameRegex(d.FilenameExtension())) if err != nil { d.Close() // TODO what happens with errors from this func? return nil, nil, 0, err } version, err := d.Version() if err != nil { d.Close() // TODO what happens with errors from this func? return nil, nil, 0, err } return d, &files, version, nil }
// Create creates new migration files on disk func Create(url, migrationsPath, name string) (*file.MigrationFile, error) { d, err := driver.New(url) if err != nil { return nil, err } versionStr := timestamp() version, err := strconv.ParseUint(versionStr, 10, 64) if err != nil { return nil, err } filenamef := "%s_%s.%s.%s" name = strings.Replace(name, " ", "_", -1) mfile := &file.MigrationFile{ Version: version, UpFile: &file.File{ Path: migrationsPath, FileName: fmt.Sprintf(filenamef, versionStr, name, "up", d.FilenameExtension()), Name: name, Content: []byte(""), Direction: direction.Up, }, DownFile: &file.File{ Path: migrationsPath, FileName: fmt.Sprintf(filenamef, versionStr, name, "down", d.FilenameExtension()), Name: name, Content: []byte(""), Direction: direction.Down, }, } if err := ioutil.WriteFile(path.Join(mfile.UpFile.Path, mfile.UpFile.FileName), mfile.UpFile.Content, 0644); err != nil { return nil, err } if err := ioutil.WriteFile(path.Join(mfile.DownFile.Path, mfile.DownFile.FileName), mfile.DownFile.Content, 0644); err != nil { return nil, err } return mfile, nil }