this repo has no description
at main 81 lines 2.2 kB view raw
1package server 2 3import ( 4 "fmt" 5 "log" 6 7 "github.com/gocql/gocql" 8 "github.com/golang-migrate/migrate/v4" 9 "github.com/golang-migrate/migrate/v4/database/cassandra" 10 _ "github.com/golang-migrate/migrate/v4/source/file" 11) 12 13// RunMigrations applies database migrations 14func RunMigrations(session *gocql.Session, migrationsPath string) error { 15 driver, err := cassandra.WithInstance(session, &cassandra.Config{ 16 KeyspaceName: session.Query("").Consistency(gocql.One).GetConsistency().String(), 17 }) 18 if err != nil { 19 return fmt.Errorf("failed to create migration driver: %w", err) 20 } 21 22 m, err := migrate.NewWithDatabaseInstance( 23 fmt.Sprintf("file://%s", migrationsPath), 24 "cassandra", 25 driver, 26 ) 27 if err != nil { 28 return fmt.Errorf("failed to create migrate instance: %w", err) 29 } 30 31 // Get current version 32 version, dirty, err := m.Version() 33 if err != nil && err != migrate.ErrNilVersion { 34 return fmt.Errorf("failed to get migration version: %w", err) 35 } 36 37 if dirty { 38 log.Printf("WARNING: Database is in dirty state at version %d", version) 39 return fmt.Errorf("database is in dirty state, manual intervention required") 40 } 41 42 log.Printf("Current migration version: %d", version) 43 44 // Run migrations 45 if err := m.Up(); err != nil && err != migrate.ErrNoChange { 46 return fmt.Errorf("failed to run migrations: %w", err) 47 } 48 49 newVersion, _, _ := m.Version() 50 log.Printf("Migrations complete. Current version: %d", newVersion) 51 52 return nil 53} 54 55// RollbackMigration rolls back the last migration 56func RollbackMigration(session *gocql.Session, migrationsPath string) error { 57 driver, err := cassandra.WithInstance(session, &cassandra.Config{ 58 KeyspaceName: session.Query("").Consistency(gocql.One).GetConsistency().String(), 59 }) 60 if err != nil { 61 return fmt.Errorf("failed to create migration driver: %w", err) 62 } 63 64 m, err := migrate.NewWithDatabaseInstance( 65 fmt.Sprintf("file://%s", migrationsPath), 66 "cassandra", 67 driver, 68 ) 69 if err != nil { 70 return fmt.Errorf("failed to create migrate instance: %w", err) 71 } 72 73 if err := m.Steps(-1); err != nil { 74 return fmt.Errorf("failed to rollback migration: %w", err) 75 } 76 77 version, _, _ := m.Version() 78 log.Printf("Rolled back to version: %d", version) 79 80 return nil 81}