github.com/kubecost/golang-migrate-duckdb/v4@v4.17.0-duckdb.1/database/stub/stub.go (about)

     1  package stub
     2  
     3  import (
     4  	"io"
     5  	"reflect"
     6  
     7  	"go.uber.org/atomic"
     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 := io.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  }