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  }