github.com/dannyzhou2015/migrate/v4@v4.15.2/source/stub/stub.go (about) 1 package stub 2 3 import ( 4 "bytes" 5 "fmt" 6 "io" 7 "io/ioutil" 8 "os" 9 10 "github.com/dannyzhou2015/migrate/v4/source" 11 ) 12 13 func init() { 14 source.Register("stub", &Stub{}) 15 } 16 17 type Config struct{} 18 19 // d, _ := source.Open("stub://") 20 // d.(*stub.Stub).Migrations = 21 22 type Stub struct { 23 Url string 24 Instance interface{} 25 Migrations *source.Migrations 26 Config *Config 27 } 28 29 func (s *Stub) Open(url string) (source.Driver, error) { 30 return &Stub{ 31 Url: url, 32 Migrations: source.NewMigrations(), 33 Config: &Config{}, 34 }, nil 35 } 36 37 func WithInstance(instance interface{}, config *Config) (source.Driver, error) { 38 return &Stub{ 39 Instance: instance, 40 Migrations: source.NewMigrations(), 41 Config: config, 42 }, nil 43 } 44 45 func (s *Stub) Close() error { 46 return nil 47 } 48 49 func (s *Stub) First() (version uint, err error) { 50 if v, ok := s.Migrations.First(); !ok { 51 return 0, &os.PathError{Op: "first", Path: s.Url, Err: os.ErrNotExist} // TODO: s.Url can be empty when called with WithInstance 52 } else { 53 return v, nil 54 } 55 } 56 57 func (s *Stub) Prev(version uint) (prevVersion uint, err error) { 58 if v, ok := s.Migrations.Prev(version); !ok { 59 return 0, &os.PathError{Op: fmt.Sprintf("prev for version %v", version), Path: s.Url, Err: os.ErrNotExist} 60 } else { 61 return v, nil 62 } 63 } 64 65 func (s *Stub) Next(version uint) (nextVersion uint, err error) { 66 if v, ok := s.Migrations.Next(version); !ok { 67 return 0, &os.PathError{Op: fmt.Sprintf("next for version %v", version), Path: s.Url, Err: os.ErrNotExist} 68 } else { 69 return v, nil 70 } 71 } 72 73 func (s *Stub) ReadUp(version uint) (r io.ReadCloser, identifier string, err error) { 74 if m, ok := s.Migrations.Up(version); ok { 75 return ioutil.NopCloser(bytes.NewBufferString(m.Identifier)), fmt.Sprintf("%v.up.stub", version), nil 76 } 77 return nil, "", &os.PathError{Op: fmt.Sprintf("read up version %v", version), Path: s.Url, Err: os.ErrNotExist} 78 } 79 80 func (s *Stub) ReadDown(version uint) (r io.ReadCloser, identifier string, err error) { 81 if m, ok := s.Migrations.Down(version); ok { 82 return ioutil.NopCloser(bytes.NewBufferString(m.Identifier)), fmt.Sprintf("%v.down.stub", version), nil 83 } 84 return nil, "", &os.PathError{Op: fmt.Sprintf("read down version %v", version), Path: s.Url, Err: os.ErrNotExist} 85 }