diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..909249c --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module git.fuyu.moe/Fuyu/migrate/v2 + +go 1.16 diff --git a/migrate.go b/migrate.go index 465a96b..9e902a8 100644 --- a/migrate.go +++ b/migrate.go @@ -5,14 +5,14 @@ import ( "database/sql" "errors" "fmt" + "io/fs" "strconv" ) // Options contains all settings type Options struct { - TableName string // Name used for version info table; defaults to DefaultTableName if not set - Schema string // Schema used for version info table; For PostgreSQL, ignored if not set - AssetPrefix string + TableName string // Name used for version info table; defaults to DefaultTableName if not set + Schema string // Schema used for version info table; For PostgreSQL, ignored if not set } // DefaultTableName is the name used when no TableName is specified in Options @@ -29,15 +29,20 @@ const fileFormat = `%04d.sql` // AssetFunc is a function that returns the data for the given name type AssetFunc func(string) ([]byte, error) -// Migrate executes migrations to get to the desired version +// Migrate executes all migrations +// Filenames need to have incrementing numbers // Downgrading is not supported as it could result in data loss -func Migrate(db *sql.DB, version int, o Options, asset AssetFunc) error { +func Migrate(db *sql.DB, o Options, assets fs.FS) error { + entries, err := fs.ReadDir(assets, `.`) + if err != nil { + panic(`failed to read list of files`) + } + version := len(entries) + if o.TableName == `` { o.TableName = DefaultTableName } - var err error - searchPath := `public` _ = db.QueryRow(`SHOW search_path`).Scan(&searchPath) @@ -74,7 +79,7 @@ func Migrate(db *sql.DB, version int, o Options, asset AssetFunc) error { } for i := v + 1; i <= version; i++ { - script, err := asset(fmt.Sprintf(o.AssetPrefix+fileFormat, i)) + script, err := fs.ReadFile(assets, fmt.Sprintf(fileFormat, i)) if err != nil { return ErrUpdatesMissing }