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