48 lines
1.2 KiB
Go
48 lines
1.2 KiB
Go
package migrator
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"log"
|
|
"os"
|
|
"path/filepath"
|
|
|
|
"github.com/jackc/pgx/v5"
|
|
)
|
|
|
|
func runMigration(ctx context.Context, db *pgx.Conn, migrationFile string) error {
|
|
fmt.Printf("MF: %s\n", migrationFile)
|
|
content, err := os.ReadFile(migrationFile)
|
|
if err != nil {
|
|
return fmt.Errorf("Failed to read migration file: %s", migrationFile)
|
|
}
|
|
_, err = db.Exec(ctx, string(content))
|
|
if err != nil {
|
|
return fmt.Errorf("Failed to execute migtation code: %s", err)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func Migrate(ctx context.Context, db *pgx.Conn) error {
|
|
workingDirectoryPath, err := os.Getwd()
|
|
if err != nil {
|
|
return fmt.Errorf("Failed to get current working directory in migrate tool")
|
|
}
|
|
migrationsPath := workingDirectoryPath + "/internal/migrations/"
|
|
files, err := os.ReadDir(migrationsPath)
|
|
if err != nil {
|
|
return fmt.Errorf("Failed to read migrations directory: %s", err)
|
|
}
|
|
for _, file := range files {
|
|
if filepath.Ext(file.Name()) == ".sql" {
|
|
migrationPath := filepath.Join(migrationsPath, file.Name())
|
|
fmt.Printf("Migration path: %s\n", migrationPath)
|
|
if err := runMigration(ctx, db, migrationPath); err != nil {
|
|
return err
|
|
}
|
|
log.Printf("Migration %s applied\n", file.Name())
|
|
}
|
|
}
|
|
return nil
|
|
}
|