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 }