Stepper returns a function that runs SQL migrations one step at a time. Stepper cannot be closed pre-emptively, it must be run to completion (or until an error is encountered).
(db *sql.DB)
| 238 | // Stepper cannot be closed pre-emptively, it must be run to completion |
| 239 | // (or until an error is encountered). |
| 240 | func Stepper(db *sql.DB) (next func() (version uint, more bool, err error), err error) { |
| 241 | _, m, err := setup(db, migrations) |
| 242 | if err != nil { |
| 243 | return nil, xerrors.Errorf("migrate setup: %w", err) |
| 244 | } |
| 245 | |
| 246 | return func() (version uint, more bool, err error) { |
| 247 | defer func() { |
| 248 | if !more { |
| 249 | srcErr, dbErr := m.Close() |
| 250 | if err != nil { |
| 251 | return |
| 252 | } |
| 253 | if dbErr != nil { |
| 254 | err = dbErr |
| 255 | return |
| 256 | } |
| 257 | err = srcErr |
| 258 | } |
| 259 | }() |
| 260 | |
| 261 | err = m.Steps(1) |
| 262 | if err != nil { |
| 263 | switch { |
| 264 | case errors.Is(err, migrate.ErrNoChange): |
| 265 | // It's OK if no changes happened! |
| 266 | return 0, false, nil |
| 267 | case errors.Is(err, fs.ErrNotExist): |
| 268 | // This error is encountered at the of Steps when |
| 269 | // reading from embed.FS. |
| 270 | return 0, false, nil |
| 271 | } |
| 272 | |
| 273 | return 0, false, xerrors.Errorf("Step: %w", err) |
| 274 | } |
| 275 | |
| 276 | v, _, err := m.Version() |
| 277 | if err != nil { |
| 278 | return 0, false, err |
| 279 | } |
| 280 | |
| 281 | return v, true, nil |
| 282 | }, nil |
| 283 | } |