this repo has no description
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}