github.com/kyleu/dbaudit@v0.0.2-0.20240321155047-ff2f2c940496/app/lib/database/migrate/sql.go (about) 1 // Package migrate - Content managed by Project Forge, see [projectforge.md] for details. 2 package migrate 3 4 import ( 5 "context" 6 7 "github.com/jmoiron/sqlx" 8 "github.com/pkg/errors" 9 "github.com/samber/lo" 10 11 "github.com/kyleu/dbaudit/app/lib/database" 12 "github.com/kyleu/dbaudit/app/util" 13 ) 14 15 type MigrationFile struct { 16 Title string 17 Content string 18 Tags []string 19 } 20 21 type MigrationFiles []*MigrationFile 22 23 var databaseMigrations = MigrationFiles{} 24 25 func ClearMigrations() { 26 databaseMigrations = MigrationFiles{} 27 } 28 29 func AddMigration(mf *MigrationFile) { 30 databaseMigrations = append(databaseMigrations, mf) 31 } 32 33 func RegisterMigration(title string, content string, tags ...string) { 34 AddMigration(&MigrationFile{Title: title, Content: content, Tags: tags}) 35 } 36 37 func GetMigrations() MigrationFiles { 38 return lo.Map(databaseMigrations, func(x *MigrationFile, _ int) *MigrationFile { 39 return &MigrationFile{Title: x.Title, Content: x.Content} 40 }) 41 } 42 43 func exec(ctx context.Context, file *MigrationFile, s *database.Service, tx *sqlx.Tx, logger util.Logger) (string, error) { 44 sql := file.Content 45 timer := util.TimerStart() 46 logger.Infof("migration running SQL: %v", sql) 47 _, err := s.Exec(ctx, sql, tx, -1, logger) 48 if err != nil { 49 return "", errors.Wrapf(err, "cannot execute [%s]", file.Title) 50 } 51 logger.Debugf("ran query [%s] in [%v]", file.Title, timer.EndString()) 52 return sql, nil 53 }