github.com/adharshmk96/stk@v1.2.3/pkg/sqlMigrator/generator.go (about)

     1  package sqlmigrator
     2  
     3  import (
     4  	"fmt"
     5  	"os"
     6  	"path"
     7  )
     8  
     9  type Generator struct {
    10  	Name          string
    11  	NumToGenerate int
    12  	DryRun        bool
    13  	Fill          bool
    14  }
    15  
    16  func NewGenerator(name string, numToGenerate int, fill bool) *Generator {
    17  	return &Generator{
    18  		Name:          name,
    19  		NumToGenerate: numToGenerate,
    20  		Fill:          fill,
    21  	}
    22  }
    23  
    24  func (g *Generator) Generate(ctx *Context) ([]string, error) {
    25  	generatedFiles := []string{}
    26  	// Assumes that the log file exists, It is generated when context is initialized
    27  	lastMigration := LastMigration(ctx)
    28  
    29  	nextMigrations := GenerateNextMigrations(lastMigration.Number, g.Name, g.NumToGenerate)
    30  	if ctx.DryRun {
    31  		dryRunGeneration(nextMigrations)
    32  		return generatedFiles, nil
    33  	}
    34  
    35  	for _, migration := range nextMigrations {
    36  		migString := migration.String()
    37  		extention := SelectExtention(ctx.Database)
    38  
    39  		upFileName, downFileName := migration.FileNames(extention)
    40  
    41  		migration.UpFilePath = path.Join(ctx.WorkDir, upFileName)
    42  		upFileContent := ""
    43  		if g.Fill {
    44  			upFileContent = fmt.Sprintf("CREATE TABLE sample_%s_table (id INTEGER PRIMARY KEY AUTOINCREMENT, created DATETIME DEFAULT CURRENT_TIMESTAMP);", migString)
    45  		}
    46  		migration.DownFilePath = path.Join(ctx.WorkDir, downFileName)
    47  		downFileContent := ""
    48  		if g.Fill {
    49  			downFileContent = fmt.Sprintf("DROP TABLE sample_%s_table;", migString)
    50  		}
    51  		err := CreateFile(migration.UpFilePath, upFileContent)
    52  		if err != nil {
    53  			return generatedFiles, err
    54  		}
    55  
    56  		err = CreateFile(migration.DownFilePath, downFileContent)
    57  		if err != nil {
    58  			return generatedFiles, err
    59  		}
    60  
    61  		ctx.Migrations = append(ctx.Migrations, migration)
    62  		generatedFiles = append(generatedFiles, migration.UpFilePath, migration.DownFilePath)
    63  	}
    64  
    65  	return generatedFiles, nil
    66  }
    67  
    68  func (g *Generator) Clean(ctx *Context) ([]string, error) {
    69  	removedFiles := []string{}
    70  
    71  	unappliedMigrations := LoadUnappliedMigrations(ctx)
    72  
    73  	if ctx.DryRun {
    74  		dryRunGeneration(unappliedMigrations)
    75  		return removedFiles, nil
    76  	}
    77  
    78  	for _, migration := range unappliedMigrations {
    79  		upFileName, downFileName := migration.FileNames(SelectExtention(ctx.Database))
    80  
    81  		upFilePath := path.Join(ctx.WorkDir, upFileName)
    82  		downFilePath := path.Join(ctx.WorkDir, downFileName)
    83  
    84  		err := os.Remove(upFilePath)
    85  		if err != nil {
    86  			return removedFiles, err
    87  		}
    88  
    89  		err = os.Remove(downFilePath)
    90  		if err != nil {
    91  			return removedFiles, err
    92  		}
    93  
    94  		removedFiles = append(removedFiles, upFilePath, downFilePath)
    95  	}
    96  
    97  	ctx.Migrations = ctx.Migrations[:len(ctx.Migrations)-len(unappliedMigrations)]
    98  	return removedFiles, nil
    99  }
   100  
   101  func dryRunGeneration(migrations []*MigrationFileEntry) {
   102  	for _, migration := range migrations {
   103  		fileName := migration.EntryString()
   104  		fmt.Println("up\t:", fileName+"_up.sql")
   105  		fmt.Println("down:\t:", fileName+"_down.sql")
   106  	}
   107  }
   108  
   109  func GenerateNextMigrations(lastMigrationNumber int, name string, numToGenerate int) []*MigrationFileEntry {
   110  	var nextMigrations []*MigrationFileEntry
   111  
   112  	startNumber := lastMigrationNumber + 1
   113  	endNumber := lastMigrationNumber + numToGenerate
   114  
   115  	for i := startNumber; i <= endNumber; i++ {
   116  		nextMigration := &MigrationFileEntry{
   117  			Number: i,
   118  			Name:   name,
   119  		}
   120  
   121  		nextMigrations = append(nextMigrations, nextMigration)
   122  	}
   123  
   124  	return nextMigrations
   125  }