package pgtxtar
import (
)
func ( fs.FS) ([]*migrations.Migration, error) {
var error
var []*migrations.Migration
:= fs.WalkDir(, ".", func( string, fs.DirEntry, error) error {
if != nil {
return
}
if .IsDir() {
return nil
}
, := fs.ReadFile(, )
if != nil {
return
}
:= strings.TrimSuffix(path.Base(), path.Ext())
:= strings.SplitN(, "_", 2)
, := strconv.ParseInt([0], 10, 64)
if != nil {
= multierr.Append(, fmt.Errorf("parse version: %q", ))
return nil
}
:= txtar.Parse()
if := checkArchive(); != nil {
= multierr.Append(, fmt.Errorf("migration %q: %v", , ))
return nil
}
:= &migrations.Migration{
Version: ,
UpTx: true,
DownTx: true,
}
for , := range .Files {
switch .Name {
case "up":
.Up = migrationExec(.Data)
case "down":
.Down = migrationExec(.Data)
case "disable_tx":
.UpTx = false
.DownTx = false
}
}
= append(, )
return nil
})
return , multierr.Append(, )
}
func ( *txtar.Archive) error {
var error
:= map[string]int{}
for , := range .Files {
:= .Name
switch {
case "up", "down":
case "disable_tx":
:= bytes.TrimSpace(.Data)
if len() != 0 {
= multierr.Append(, fmt.Errorf(
"section %q must be empty", ,
))
}
default:
= multierr.Append(, fmt.Errorf(
"unknown section %q", ,
))
}
if [] == 1 {
= multierr.Append(, fmt.Errorf(
"duplicate section %q", ,
))
}
[]++
}
:= []string{"up"}
for , := range {
if [] != 0 {
continue
}
= multierr.Append(, fmt.Errorf(
"missing required section %q", ,
))
}
return
}
func ( []byte) func( migrations.DB) error {
return func( migrations.DB) error {
, := .Exec(string())
return
}
}