1 package stub 2 3 import ( 4 "go.uber.org/atomic" 5 "io" 6 "io/ioutil" 7 "reflect" 8 9 "github.com/golang-migrate/migrate/v4/database" 10 ) 11 12 func init() { 13 database.Register("stub", &Stub{}) 14 } 15 16 type Stub struct { 17 Url string 18 Instance interface{} 19 CurrentVersion int 20 MigrationSequence []string 21 LastRunMigration []byte // todo: make []string 22 IsDirty bool 23 isLocked atomic.Bool 24 25 Config *Config 26 } 27 28 func (s *Stub) Open(url string) (database.Driver, error) { 29 return &Stub{ 30 Url: url, 31 CurrentVersion: database.NilVersion, 32 MigrationSequence: make([]string, 0), 33 Config: &Config{}, 34 }, nil 35 } 36 37 type Config struct{} 38 39 func WithInstance(instance interface{}, config *Config) (database.Driver, error) { 40 return &Stub{ 41 Instance: instance, 42 CurrentVersion: database.NilVersion, 43 MigrationSequence: make([]string, 0), 44 Config: config, 45 }, nil 46 } 47 48 func (s *Stub) Close() error { 49 return nil 50 } 51 52 func (s *Stub) Lock() error { 53 if !s.isLocked.CAS(false, true) { 54 return database.ErrLocked 55 } 56 return nil 57 } 58 59 func (s *Stub) Unlock() error { 60 if !s.isLocked.CAS(true, false) { 61 return database.ErrNotLocked 62 } 63 return nil 64 } 65 66 func (s *Stub) Run(migration io.Reader) error { 67 m, err := ioutil.ReadAll(migration) 68 if err != nil { 69 return err 70 } 71 s.LastRunMigration = m 72 s.MigrationSequence = append(s.MigrationSequence, string(m[:])) 73 return nil 74 } 75 76 func (s *Stub) SetVersion(version int, state bool) error { 77 s.CurrentVersion = version 78 s.IsDirty = state 79 return nil 80 } 81 82 func (s *Stub) Version() (version int, dirty bool, err error) { 83 return s.CurrentVersion, s.IsDirty, nil 84 } 85 86 const DROP = "DROP" 87 88 func (s *Stub) Drop() error { 89 s.CurrentVersion = database.NilVersion 90 s.LastRunMigration = nil 91 s.MigrationSequence = append(s.MigrationSequence, DROP) 92 return nil 93 } 94 95 func (s *Stub) EqualSequence(seq []string) bool { 96 return reflect.DeepEqual(seq, s.MigrationSequence) 97 } 98