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  }